{"id":2836,"date":"2025-11-19T17:21:42","date_gmt":"2025-11-19T12:21:42","guid":{"rendered":"https:\/\/devdiligent.com\/blog\/?p=2836"},"modified":"2026-07-21T18:06:55","modified_gmt":"2026-07-21T13:06:55","slug":"perfex-crm-module-development-guide","status":"publish","type":"post","link":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/","title":{"rendered":"Perfex CRM Module Development Guide 2026: Save Time &amp; Build Better CRM Modules"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-post\" data-elementor-id=\"2836\" class=\"elementor elementor-2836\">\n\t\t\t\t<div class=\"elementor-element elementor-element-26458bf9 e-flex e-con-boxed e-con e-parent\" data-id=\"26458bf9\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6ac79986 elementor-widget elementor-widget-text-editor\" data-id=\"6ac79986\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p><\/p>\n<p class=\"wp-block-paragraph\">This guide shows exactly how to build and integrate Perfex CRM modules with <a href=\"https:\/\/devdiligent.com\/codeigniter-web-development-services.php\">CodeIgniter<\/a>, covering directory structure, hooks, security best practices, controllers, models, views, and deployment, without guesswork.<\/p>\n<p><a href=\"https:\/\/devdiligent.com\/blog\/perfex-crm-setup-automation-2026\/\">Perfex CRM<\/a>, built on the <strong>CodeIgniter<\/strong> PHP framework, supports a modular architecture that allows developers to build custom modules to extend its core functionality. As the official Perfex CRM documentation notes, modules can include controllers, models, views, language files, libraries, hooks, and more.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">In this guide, we\u2019ll walk through how to <strong>structure<\/strong>, <strong>build<\/strong>, and <strong>deploy<\/strong> a custom module in Perfex CRM, covering all the major parts: initialization, controllers, models, views, hooks, language files, options, security, and even payment gateway integration.<\/p>\n<p><!-- Top-of-Page CTA: Perfex CRM Module Starter Pack --><\/p>\n<div style=\"margin: 30px 0; padding: 22px; background: #f8fafc; border-left: 5px solid #2563eb; border-radius: 6px; text-align: center;\">\n<p style=\"font-size: 17px; font-weight: 600; color: #0f172a; margin-bottom: 10px;\">Kickstart Your Perfex CRM Development Today!<\/p>\n<p style=\"font-size: 15px; color: #334155; margin-bottom: 16px;\">Get your <strong>Free Perfex CRM Module Starter Pack<\/strong> \u2014 pre-built templates and a checklist to speed up your project.<\/p>\n<p><a style=\"display: inline-block; background: #2563eb; color: #ffffff; padding: 12px 28px; font-size: 16px; font-weight: bold; text-decoration: none; border-radius: 6px;\" href=\"https:\/\/devdiligent.com\/#contact\"> \u27a4 Get Free Perfex CRM Module Starter Pack <\/a><\/p>\n<\/div>\n<p><img fetchpriority=\"high\" decoding=\"async\" class=\"alignnone size-full wp-image-3889\" src=\"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/12\/Perfex-CRM-Module-Prerequisites-Setup.png\" alt=\"perfex crm module prerequisites &amp; setup\" width=\"1376\" height=\"768\" title=\"Perfex CRM Module Development Guide 2026: Save Time &amp; Build Better CRM Modules\" srcset=\"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/12\/Perfex-CRM-Module-Prerequisites-Setup.png 1376w, https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/12\/Perfex-CRM-Module-Prerequisites-Setup-300x167.png 300w, https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/12\/Perfex-CRM-Module-Prerequisites-Setup-1024x572.png 1024w, https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/12\/Perfex-CRM-Module-Prerequisites-Setup-768x429.png 768w\" sizes=\"(max-width: 1376px) 100vw, 1376px\" \/><\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">1. Perfex CRM Module Prerequisites &amp; Setup<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Before you start:<\/p>\n<p><\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\"><\/ol>\n<\/li>\n<\/ol>\n<p>\u00a0<\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\">\n<li><strong>Perfex CRM Version<\/strong>: Make sure you\u2019re using a version that supports modules (module documentation is valid from <strong>v2.3.2+<\/strong>).<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\">\n<li><strong>Enable Development Mode<\/strong>: To catch errors or warnings, turn on development mode in your Perfex CRM instance.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\">\n<li><strong>Familiarity with CodeIgniter<\/strong>: Since Perfex is based on CodeIgniter, knowing its MVC structure, how controllers and models work, and how to access the <code>$CI<\/code> instance is very important.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">2. Module Directory Structure<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Every module lives under the <code>modules\/<\/code> directory in your Perfex CRM installation. <a href=\"https:\/\/help.perfexcrm.com\/module-basics\/amp\/\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">Perfex CRM+1<\/a> Here is a typical structure:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>modules\/\n  my_module\/\n    my_module.php           \/\/ init file\n    controllers\/\n      Admin_my_module.php   \/\/ admin controller\n      Clients_my_module.php \/\/ client area controller (optional)\n    models\/\n      My_module_model.php\n    views\/\n      admin\/\n        index.php\n      public\/\n        index.php\n    libraries\/\n      My_module_lib.php\n    language\/\n      english\/\n        my_module_lang.php\n    assets\/\n      css\/\n      js\/\n<\/code><\/pre>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>The <strong>init file<\/strong> (<code>my_module.php<\/code>) is mandatory. Its name <em>must match<\/em> the module folder name.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Controllers: separate admin (<code>AdminController<\/code>) and client (<code>ClientsController<\/code>) controllers.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Models: for database interaction.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Views: separate views for admin and client.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Libraries: for shared logic or helper classes.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Language files: store translatable text.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Assets: CSS \/ JS if your module needs UI.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">3. Perfex CRM Module Init File (Metadata + Hooks)<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">The <strong>init file<\/strong> is the starting point. It provides the module\u2019s metadata, and where you register activation, deactivation, and uninstall hooks.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Example <code>modules\/my_module\/my_module.php<\/code> :<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\ndefined('BASEPATH') or exit('No direct script access allowed');\n\n\/*\nModule Name: My Module\nDescription: This is a sample custom module for Perfex CRM.\nVersion: 1.0.0\nRequires at least: 2.3.*\nAuthor: Your Name\n*\/\n\nregister_activation_hook('my_module', 'my_module_activate');\nregister_deactivation_hook('my_module', 'my_module_deactivate');\nregister_uninstall_hook('my_module', 'my_module_uninstall');\n\nfunction my_module_activate() {\n    \/\/ Code to run when module is activated\n    \/\/ e.g., create database tables\n}\n\nfunction my_module_deactivate() {\n    \/\/ Code to run when module is deactivated\n}\n\nfunction my_module_uninstall() {\n    \/\/ Code to run when module is uninstalled (cleanup)\n}\n\n\/\/ Hooks \/ filters example\nhooks()-&gt;add_action('admin_init', 'my_module_admin_init');\n\nfunction my_module_admin_init() {\n    \/\/ add menu items or other admin logic\n}\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Key points:<\/strong><\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Use <strong>unique function prefixes<\/strong> (e.g., <code>my_module_<\/code>) to avoid collisions.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>You can register Cron tasks, payment gateways, or language files using helper functions provided by Perfex.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">4. Controllers<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Controllers handle HTTP logic. For modules, you typically create controllers under <code>controllers\/<\/code>.<\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li><strong>AdminController<\/strong>: for staff \/ admin side.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li><strong>ClientsController<\/strong>: for client portal side.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Example <code>modules\/my_module\/controllers\/Admin_my_module.php<\/code>:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\ndefined('BASEPATH') or exit('No direct script access allowed');\n\nclass Admin_my_module extends AdminController\n{\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function index()\n    {\n        $data['title'] = 'My Module Admin Page';\n        $this-&gt;load-&gt;view('my_module\/admin\/index', $data);\n    }\n\n    public function save_settings()\n    {\n        $CI = &amp;get_instance();\n        \/\/ Use models or libraries to save module-specific data\n        $this-&gt;load-&gt;model('my_module\/my_module_model');\n        $this-&gt;my_module_model-&gt;save_settings($CI-&gt;input-&gt;post());\n        set_alert('success', 'Settings saved.');\n        redirect(admin_url('my_module'));\n    }\n}\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\">f you want a <strong>client-side controller<\/strong>, you might do:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\ndefined('BASEPATH') or exit('No direct script access allowed');\n\nuse app\\services\\ValidatesContact;\n\nclass Clients_my_module extends ClientsController\n{\n    use ValidatesContact;\n\n    public function dashboard()\n    {\n        $data['my_info'] = 'Hello, client!';\n        $this-&gt;load-&gt;view('my_module\/public\/index', $data);\n    }\n}\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Note: If you extend <code><strong>ClientsController<\/strong><\/code>, you can use the <strong><code>ValidatesContact<\/code> <\/strong>trait to ensure only logged-in contacts access controller methods.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">5. Models<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Models live in <code>modules\/my_module\/models\/<\/code>, and you use them to interact with the database.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Example <code>My_module_model.php<\/code>:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\ndefined('BASEPATH') or exit('No direct script access allowed');\n\nclass My_module_model extends CI_Model\n{\n    public function __construct()\n    {\n        parent::__construct();\n    }\n\n    public function save_settings($data)\n    {\n        \/\/ For example, store settings in perfex options table\n        foreach ($data as $key =&gt; $value) {\n            add_option('my_module_' . $key, $value);\n        }\n    }\n\n    public function get_settings()\n    {\n        $settings = [];\n        $settings['foo'] = get_option('my_module_foo');\n        $settings['bar'] = get_option('my_module_bar');\n        return $settings;\n    }\n}\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Use Perfex helper functions like <code>add_option()<\/code>, <code>get_option()<\/code>, <code>update_option()<\/code> for storing module settings.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Prefix your option names (e.g., <code>my_module_foo<\/code>) to avoid conflicting with Perfex core or other modules.<\/p>\n<p><!-- Mid-Content CTA: Perfex CRM Consultation --><\/p>\n<div style=\"margin: 35px 0; padding: 24px; background: #eef6ff; border-radius: 8px; text-align: center;\">\n<h2 style=\"font-size: 22px; margin-bottom: 12px; color: #0f172a;\">Need Help with Perfex CRM Development?<\/h2>\n<p style=\"font-size: 16px; color: #334155; margin-bottom: 16px;\">We offer tailored Perfex CRM module services that cut development time and boost reliability. Let our experts guide your project from start to finish.<\/p>\n<p><a style=\"display: inline-block; background: #2563eb; color: #ffffff; padding: 12px 28px; font-size: 16px; font-weight: bold; text-decoration: none; border-radius: 6px;\" href=\"https:\/\/devdiligent.com\/#contact\"> \u27a4 Book a Free Consultation <\/a><\/p>\n<\/div>\n<p>\u00a0<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">6. Views<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Your views folder should contain separate subfolders for admin and public (client side).<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">For example:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>modules\/my_module\/views\/\n  admin\/\n    index.php\n  public\/\n    index.php\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Admin view (index):<\/strong> <code>modules\/my_module\/views\/admin\/index.php<\/code>:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php defined('BASEPATH') or exit('No direct script access allowed'); ?&gt;\n&lt;div class=\"panel_s\"&gt;\n  &lt;div class=\"panel-body\"&gt;\n    &lt;h4&gt;&lt;?php echo $title; ?&gt;&lt;\/h4&gt;\n    &lt;form action=\"&lt;?php echo admin_url('my_module\/save_settings'); ?&gt;\" method=\"post\"&gt;\n      &lt;div class=\"form-group\"&gt;\n        &lt;label for=\"foo\"&gt;Foo&lt;\/label&gt;\n        &lt;input type=\"text\" name=\"foo\" id=\"foo\" value=\"&lt;?php echo isset($settings['foo']) ? $settings['foo'] : ''; ?&gt;\" class=\"form-control\"&gt;\n      &lt;\/div&gt;\n      &lt;button type=\"submit\" class=\"btn btn-primary\"&gt;Save&lt;\/button&gt;\n    &lt;\/form&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Public\/Client view:<\/strong> <code>modules\/my_module\/views\/public\/index.php<\/code>:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php defined('BASEPATH') or exit('No direct script access allowed'); ?&gt;\n&lt;div class=\"my-module-client-dashboard\"&gt;\n  &lt;h3&gt;Welcome to My Module&lt;\/h3&gt;\n  &lt;p&gt;&lt;?php echo $my_info; ?&gt;&lt;\/p&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p><\/p>\n<h2 class=\"wp-block-heading\">7. Language Files<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">To support translations, create language files under <code>modules\/my_module\/language\/[language]\/<\/code>.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">For example: <code>modules\/my_module\/language\/english\/my_module_lang.php<\/code><\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\n\n# English\n$lang['my_module_title'] = 'My Module';\n$lang['my_module_settings_saved'] = 'Settings have been saved successfully.';\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Use your language variables in views and controllers to support internationalization.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">Working With Hooks (Actions &amp; Filters)<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Perfex CRM provides hooks (similar to WordPress-style) that you can use to execute code at various points.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Some common hook functions:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>hooks()-&gt;add_action('hook_name', 'my_function', $priority = 10);\nhooks()-&gt;add_filter('filter_name', 'my_filter_function', $priority = 10, $accepted_args = 1);\nhooks()-&gt;do_action('hook_name', $params = '');\nhooks()-&gt;apply_filters('filter_name', $value, $params = []);\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\">For example, to add a menu item when the admin panel loads:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>hooks()-&gt;add_action('admin_init', function() {\n    $CI = &amp;get_instance();\n    $CI-&gt;app_menu-&gt;add_sidebar_menu_item('my_module', [\n        'name'     =&gt; 'My Module',\n        'collapse' =&gt; false,\n        'position' =&gt; 20,\n        'href'     =&gt; admin_url('my_module'),\n        'icon'     =&gt; 'fa fa-puzzle-piece',\n    ]);\n});\n<\/code><\/pre>\n<p><\/p>\n<h2 class=\"wp-block-heading\">9. Module Options \/ Settings<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">As mentioned, use <code>add_option()<\/code>, <code>get_option()<\/code>, and <code>update_option()<\/code> to manage settings in the module. These store values in <code>tbloptions<\/code> table in Perfex database.<\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li><strong>add_option($name, $value, $autoload)<\/strong> \u2014 add a new option.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li><strong>get_option($name, $default = null)<\/strong> \u2014 retrieve an option.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li><strong>update_option($name, $value)<\/strong> \u2014 update or create option if it doesn\u2019t exist (from v2.3.3+).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">10. Security Best Practices<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">When developing modules, you must ensure security:<\/p>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Validate and sanitize all input data (e.g., from forms).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Use CodeIgniter\u2019s built-in CSRF protection. Note: Perfex enables CSRF by default; ensure your forms work with it. <a href=\"https:\/\/help.perfexcrm.com\/category\/modules\/?utm_source=chatgpt.com\" target=\"_blank\" rel=\"noreferrer noopener\">Perfex CRM<\/a><\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Use <code>defined('BASEPATH') or exit('No direct script access allowed');<\/code> at the top of your PHP files to prevent direct access.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Use <strong>parameterized queries<\/strong> when accessing the database (via CI\u2019s Query Builder) to avoid SQL Injection.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">11. Module Upgrading<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">When you release a new version of your module, you can handle upgrades via the <code>init<\/code> file version header. Perfex CRM compares the version in the init file with what\u2019s already installed.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">In the <code>register_activation_hook<\/code>, you can include logic to run database migrations or other setup for the new version.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Example:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>function my_module_activate() {\n    $CI = &amp;get_instance();\n    $CI-&gt;db-&gt;query(\"ALTER TABLE `\" . db_prefix() . \"my_module_table` ADD COLUMN `new_field` VARCHAR(255) NULL;\");\n}\n<\/code><\/pre>\n<p><\/p>\n<h2 class=\"wp-block-heading\">12. Payment Gateway Module (Optional)<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">If you want to build a <strong>custom payment gateway module<\/strong>, Perfex provides support for this.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Steps:<\/strong><\/p>\n<p><\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\"><\/ol>\n<\/li>\n<\/ol>\n<p>\u00a0<\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\">\n<li>Create a folder <code>\/modules\/my_gateway\/libraries\/<\/code> and a class named e.g. <code>My_gateway_gateway.php<\/code>. The filename must end with <code>_gateway.php<\/code>.<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\">\n<li>In your init file, register the payment gateway:<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>register_payment_gateway('my_gateway', 'my_gateway');<\/code><\/pre>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\"><\/ul>\n<\/li>\n<\/ul>\n<p>\u00a0<\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>In your gateway library class, define methods like <code>process_payment($data)<\/code> to handle the payment logic.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>Optionally, create a controller under <code>controllers\/<\/code> for handling redirects or webhook callbacks.<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<ul class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ul class=\"wp-block-list\">\n<li>If your gateway needs a webhook callback endpoint, you may need to <strong>exclude that URL from CSRF protection<\/strong> (since webhooks might POST data).<\/li>\n<\/ul>\n<\/li>\n<\/ul>\n<p><\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">Example: Full \u201cSimple Module\u201d Walk\u2011Through<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Putting it all together, here is a short walkthrough to build a <strong>very simple \u201cHello World\u201d<\/strong> module.<\/p>\n<p><\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\"><\/ol>\n<\/li>\n<\/ol>\n<p>\u00a0<\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\">\n<li><strong>Create directory<\/strong>: <code>modules\/hello_world\/<\/code><\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<ol class=\"wp-block-list\">\n<li style=\"list-style-type: none;\">\n<ol class=\"wp-block-list\">\n<li><strong>Init File<\/strong>: <code>hello_world.php<\/code>:<\/li>\n<\/ol>\n<\/li>\n<\/ol>\n<p><\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\ndefined('BASEPATH') or exit('No direct script access allowed');\n\n\/*\nModule Name: Hello World\nDescription: A simple demo module for Perfex CRM.\nVersion: 1.0.0\nRequires at least: 2.3.*\nAuthor: Your Name\n*\/\n\nregister_activation_hook('hello_world', 'hello_world_activate');\nregister_deactivation_hook('hello_world', 'hello_world_deactivate');\n\nfunction hello_world_activate() {\n  \/\/ Module installed \/ activated\n}\n\nfunction hello_world_deactivate() {\n  \/\/ Module deactivated\n}\n\nhooks()-&gt;add_action('admin_init', 'hello_world_add_menu');\nfunction hello_world_add_menu() {\n  $CI = &amp;get_instance();\n  $CI-&gt;app_menu-&gt;add_sidebar_menu_item('hello_world', [\n    'name' =&gt; 'Hello World',\n    'href' =&gt; admin_url('hello_world'),\n    'position' =&gt; 50,\n    'icon' =&gt; 'fa fa-smile'\n  ]);\n}\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Controller<\/strong>: <code>modules\/hello_world\/controllers\/Admin_hello_world.php<\/code>:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\ndefined('BASEPATH') or exit('No direct script access allowed');\n\nclass Admin_hello_world extends AdminController\n{\n  public function index()\n  {\n    $data['title'] = _l('hello_world_title'); \/\/ use language\n    $this-&gt;load-&gt;view('hello_world\/admin\/index', $data);\n  }\n}\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Model<\/strong>: optional, but you could create <code>Hello_world_model<\/code> if needed.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>View<\/strong>: <code>modules\/hello_world\/views\/admin\/index.php<\/code>:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php defined('BASEPATH') or exit('No direct script access allowed'); ?&gt;\n&lt;div class=\"panel_s\"&gt;\n  &lt;div class=\"panel-body\"&gt;\n    &lt;h4&gt;&lt;?php echo $title; ?&gt;&lt;\/h4&gt;\n    &lt;p&gt;Hello, this is my custom module!&lt;\/p&gt;\n  &lt;\/div&gt;\n&lt;\/div&gt;\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Language<\/strong>: <code>modules\/hello_world\/language\/english\/hello_world_lang.php<\/code>:<\/p>\n<p><\/p>\n<pre class=\"wp-block-code\"><code>&lt;?php\n$lang['hello_world_title'] = 'Hello World Module';\n<\/code><\/pre>\n<p><\/p>\n<p class=\"wp-block-paragraph\">After you upload this module (zipped) into <strong>Setup \u2192 Modules<\/strong> in your Perfex admin UI, install and activate it, you should see a new <strong>\u201cHello World\u201d<\/strong> menu item in the sidebar, and clicking it will display the simple page.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">14. Testing &amp; Debugging<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Use <strong>development mode<\/strong> (enabled earlier) to catch PHP errors &amp; deprecated function warnings.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Log via CodeIgniter\u2019s logging (e.g., <code>log_message('debug', 'my_module debug info');<\/code>) for debugging.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Use browser dev tools to debug JS or view assets if your module includes CSS\/JS.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Check database after activation if you&#8217;re creating tables or options, to ensure they exist.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">15. Best Practices for Module Development<\/h2>\n<p><\/p>\n<figure class=\"wp-block-table\">\n<table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th>Best Practice<\/th>\n<th>Description<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td><strong>Prefix functions and classes<\/strong><\/td>\n<td>Prevent naming collisions with core or other modules.<\/td>\n<\/tr>\n<tr>\n<td><strong>Security<\/strong><\/td>\n<td>Use CSRF protection, sanitize inputs, prevent direct access.<\/td>\n<\/tr>\n<tr>\n<td><strong>Use hooks<\/strong><\/td>\n<td>Leverage <code>hooks()-&gt;add_action<\/code> and <code>hooks()-&gt;add_filter<\/code> for clean integration.<\/td>\n<\/tr>\n<tr>\n<td><strong>Versioning<\/strong><\/td>\n<td>Use module version in the init file and handle upgrades.<\/td>\n<\/tr>\n<tr>\n<td><strong>Separation of concerns<\/strong><\/td>\n<td>Keep controllers, models, views, and libraries well organized.<\/td>\n<\/tr>\n<tr>\n<td><strong>Internationalization<\/strong><\/td>\n<td>Use language files for UI strings.<\/td>\n<\/tr>\n<tr>\n<td><strong>Maintain compatibility<\/strong><\/td>\n<td>Test module against new versions of Perfex, because major updates may break modules.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><\/p>\n<h2 class=\"wp-block-heading\">16. Advanced Use Cases<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Payment Gateway Module<\/strong>: As covered, create a custom gateway by providing a library and controller.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Cron \/ Scheduled Tasks<\/strong>: You can register cron tasks in the init file to run background jobs.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Custom Libraries<\/strong>: Add PHP classes in <code>libraries\/<\/code> for business logic.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Language Packs<\/strong>: Add support for multiple languages by creating additional language subfolders.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\"><strong>Module Dependencies<\/strong>: If your module depends on other modules or libraries, check for their existence in activation hook.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">17. Packaging &amp; Distribution<\/h2>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Once your module is ready, <strong>zip the module folder<\/strong>.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">The zip should preserve the structure under <code>modules\/my_module\/...<\/code>.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">Install via <strong>Perfex CRM Admin \u2192 Setup \u2192 Modules \u2192 Upload Module<\/strong>.<\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">After uploading, click <strong>Install<\/strong> and then <strong>Activate<\/strong>. <a href=\"https:\/\/support.corbitaltech.dev\/articles\/step-by-step-guide-installing-modules-in-perfex-crm\" target=\"_blank\" rel=\"nofollow noreferrer noopener\">support.corbitaltech.dev<\/a><\/p>\n<p><\/p>\n<p class=\"wp-block-paragraph\">If you&#8217;re distributing (e.g., via CodeCanyon), clearly document version, requirements, and update process.<\/p>\n<p><\/p>\n<h2 class=\"wp-block-heading\">18. Troubleshooting Common Issues<\/h2>\n<p><\/p>\n<figure class=\"wp-block-table\">\n<table class=\"has-fixed-layout\">\n<thead>\n<tr>\n<th>Problem<\/th>\n<th>Possible Cause<\/th>\n<th>Solution<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Module not showing in list<\/td>\n<td>Init file name mismatch or header missing<\/td>\n<td>Ensure <code>modules\/&lt;name&gt;\/&lt;name&gt;.php<\/code> exists, headers are correct.<\/td>\n<\/tr>\n<tr>\n<td>CSRF token errors on form<\/td>\n<td>CSRF protection is enabled<\/td>\n<td>Use CI form helper, include CSRF token, or adjust CSRF settings.<\/td>\n<\/tr>\n<tr>\n<td>Controller 404<\/td>\n<td>Wrong class name or path<\/td>\n<td>Check controller file name, class extends correct base (AdminController or ClientsController).<\/td>\n<\/tr>\n<tr>\n<td>Settings not saving<\/td>\n<td>Option keys wrong<\/td>\n<td>Use <code>add_option<\/code> \/ <code>update_option<\/code> with correctly prefixed names.<\/td>\n<\/tr>\n<tr>\n<td>Security vulnerability<\/td>\n<td>Unsanitized input<\/td>\n<td>Validate, sanitize, and escape inputs before database usage.<\/td>\n<\/tr>\n<\/tbody>\n<\/table>\n<\/figure>\n<p><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-d0b2acc e-flex e-con-boxed e-con e-parent\" data-id=\"d0b2acc\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1d6e024 elementor-widget elementor-widget-text-editor\" data-id=\"1d6e024\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<!-- Bottom CTA: Perfex CRM Module Download -->\n<div style=\"margin: 50px 0; padding: 30px; background: #0f172a; color: #ffffff; border-radius: 8px; text-align: center;\">\n<h2 style=\"font-size: 26px; margin-bottom: 15px;color: #ffffff;\">Want to Speed Up Your Perfex CRM Development?<\/h2>\n<p style=\"font-size: 17px; line-height: 1.6; max-width: 700px; margin: 0 auto 22px;\">Get our Free Perfex CRM Module Template + Checklist \u2014 ready to plug into your next project and start building faster, smarter, and error-free.<\/p>\n<a style=\"display: inline-block; background: #38bdf8; color: #0f172a; padding: 14px 34px; font-size: 17px; font-weight: bold; text-decoration: none; border-radius: 6px;\" href=\"https:\/\/devdiligent.com\/#contact\"> \u27a4 Download Now <\/a><\/div>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-6df3203 e-flex e-con-boxed e-con e-parent\" data-id=\"6df3203\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-84a1688 elementor-widget elementor-widget-text-editor\" data-id=\"84a1688\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<h2 class=\"wp-block-heading\">Conclusion<\/h2>\n<h2><!-- \/wp:heading --><!-- wp:paragraph --><\/h2>\n<p><a href=\"https:\/\/devdiligent.com\/custom-crm-development-services.php\">Developing a <strong>custom module in Perfex CRM<\/strong><\/a> gives you the flexibility to extend the CRM exactly as your business needs, whether you&#8217;re adding a simple admin page, integrating a payment gateway, or building a full client-facing feature. By following the modular structure, using CodeIgniter conventions, and leveraging Perfex\u2019s hooks and helper functions, you can build robust, maintainable, and upgrade-friendly modules.<\/p>\n<h2><!-- \/wp:paragraph --><!-- wp:paragraph --><\/h2>\n<p>Here\u2019s a quick recap:<\/p>\n<h2><!-- \/wp:paragraph --><!-- wp:list {\"ordered\":true} --><\/h2>\n<ol class=\"wp-block-list\"><!-- wp:list-item --><p><\/p>\n<li>Set up your module directory under <code>modules\/<\/code>.<\/li>\n<p><!-- \/wp:list-item --><!-- wp:list-item --><\/p>\n<li>Create an init file with metadata and hooks.<\/li>\n<p><!-- \/wp:list-item --><!-- wp:list-item --><\/p>\n<li>Build controllers, models, views, and optionally libraries &amp; language files.<\/li>\n<p><!-- \/wp:list-item --><!-- wp:list-item --><\/p>\n<li>Use <code>add_option \/ get_option<\/code> for settings.<\/li>\n<p><!-- \/wp:list-item --><!-- wp:list-item --><\/p>\n<li>Secure your module, handle CSRF, and version your module.<\/li>\n<p><!-- \/wp:list-item --><!-- wp:list-item --><\/p>\n<li>Package your module as a zip for installation.<\/li>\n<p><!-- \/wp:list-item --><!-- wp:list-item --><\/p>\n<li>Test thoroughly, especially after Perfex updates.<\/li>\n<\/ol>\n<h2 class=\"wp-block-heading\">FAQ&#8217;s About Perfex CRM Module Development:<\/h2>\n<p><!-- \/wp:heading --><!-- wp:html --><\/p>\n<p><script type=\"application\/ld+json\">\n{\n  \"@context\": \"https:\/\/schema.org\",\n  \"@type\": \"FAQPage\",\n  \"name\": \"FAQ's About Perfex CRM Module Development Guide\",\n  \"mainEntity\": [\n    {\n      \"@type\": \"Question\",\n      \"name\": \"What is a Perfex CRM module?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"A module is an add-on that extends Perfex CRM with custom features.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I build my own Perfex CRM module?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, Perfex allows full custom module development.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Which programming language does Perfex CRM use?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Perfex CRM is built using PHP with the CodeIgniter framework.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Where do I place a new module in Perfex CRM?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Place your module inside the modules directory of Perfex CRM.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Perfex CRM support custom APIs?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, you can create and extend Perfex CRM API endpoints.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Do I need coding experience to develop Perfex modules?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, PHP, MVC structure, and CodeIgniter knowledge are required.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I create a module installation file?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Create an init file such as mymodule.php containing install and activate logic.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I add custom menus in Perfex CRM?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, using hooks like admin_init and admin_head.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Perfex CRM support module activation or deactivation?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, each module includes activation and deactivation functions.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I build admin and customer views in the module?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, create separate view folders for admin and public users.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I add custom database tables in Perfex modules?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, using migrations or manual SQL schema creation.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I load module models in Perfex CRM?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Use the load model function: $this->load->model('module\/module_model');\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I include CSS and JS in my module?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, store them in the module's assets folder and load them via views.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Perfex CRM support language files?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, modules support language folders such as language\/english\/module_lang.php.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"How do I debug a Perfex CRM module?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Enable debugging in CodeIgniter or use log_message() for custom logs.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I integrate third-party APIs in a Perfex module?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, through custom libraries, controllers, and API calls.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Does Perfex CRM allow module updates?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, modules can include versioning and upgrade scripts.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Where can I find Perfex module documentation?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"The official docs are available at help.perfexcrm.com.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can modules affect system performance?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, poorly optimized modules can slow down Perfex CRM.\"\n      }\n    },\n    {\n      \"@type\": \"Question\",\n      \"name\": \"Can I sell my custom Perfex CRM module?\",\n      \"acceptedAnswer\": {\n        \"@type\": \"Answer\",\n        \"text\": \"Yes, many developers sell modules on marketplaces like CodeCanyon.\"\n      }\n    }\n  ]\n}\n<\/script><\/p>\n<p><!-- \/wp:html --><!-- wp:paragraph --><\/p>\n<p><\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-75f8a73 e-flex e-con-boxed e-con e-parent\" data-id=\"75f8a73\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7cb4bfb elementor-widget elementor-widget-n-accordion\" data-id=\"7cb4bfb\" data-element_type=\"widget\" data-settings=\"{&quot;default_state&quot;:&quot;expanded&quot;,&quot;max_items_expended&quot;:&quot;one&quot;,&quot;n_accordion_animation_duration&quot;:{&quot;unit&quot;:&quot;ms&quot;,&quot;size&quot;:400,&quot;sizes&quot;:[]}}\" data-widget_type=\"nested-accordion.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t<div class=\"e-n-accordion\" aria-label=\"Accordion. Open links with Enter or Space, close with Escape, and navigate with Arrow Keys\">\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1300\" class=\"e-n-accordion-item\" open>\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"1\" tabindex=\"0\" aria-expanded=\"true\" aria-controls=\"e-n-accordion-item-1300\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 1. What is a Perfex CRM module? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1300\" class=\"elementor-element elementor-element-5852c4a e-con-full e-flex e-con e-child\" data-id=\"5852c4a\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1300\" class=\"elementor-element elementor-element-b5f7700 e-flex e-con-boxed e-con e-child\" data-id=\"b5f7700\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-07d88a3 elementor-widget elementor-widget-text-editor\" data-id=\"07d88a3\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>A module is an add-on that extends Perfex CRM with custom features.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1301\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"2\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1301\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 2. Can I build my own Perfex CRM module? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1301\" class=\"elementor-element elementor-element-5feb02f e-con-full e-flex e-con e-child\" data-id=\"5feb02f\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1301\" class=\"elementor-element elementor-element-fab97aa e-flex e-con-boxed e-con e-child\" data-id=\"fab97aa\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-59cd74a elementor-widget elementor-widget-text-editor\" data-id=\"59cd74a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, Perfex allows full custom module development.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1302\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"3\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1302\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 3. Which programming language does Perfex CRM use? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1302\" class=\"elementor-element elementor-element-8dfa711 e-con-full e-flex e-con e-child\" data-id=\"8dfa711\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1302\" class=\"elementor-element elementor-element-7168e51 e-flex e-con-boxed e-con e-child\" data-id=\"7168e51\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4a5ec24 elementor-widget elementor-widget-text-editor\" data-id=\"4a5ec24\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>It is built with <strong data-start=\"459\" data-end=\"490\">PHP (CodeIgniter framework)<\/strong>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1303\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"4\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1303\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 4. Where do I place a new module in Perfex CRM? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1303\" class=\"elementor-element elementor-element-8f1c60c e-con-full e-flex e-con e-child\" data-id=\"8f1c60c\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1303\" class=\"elementor-element elementor-element-13e9ef5 e-flex e-con-boxed e-con e-child\" data-id=\"13e9ef5\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-bf5e844 elementor-widget elementor-widget-text-editor\" data-id=\"bf5e844\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Upload the module into the <code data-start=\"574\" data-end=\"585\">\/modules\/<\/code> directory.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1304\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"5\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1304\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 5. Does Perfex CRM support custom APIs? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1304\" class=\"elementor-element elementor-element-4263be1 e-con-full e-flex e-con e-child\" data-id=\"4263be1\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1304\" class=\"elementor-element elementor-element-e983d03 e-flex e-con-boxed e-con e-child\" data-id=\"e983d03\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dd0dc0e elementor-widget elementor-widget-text-editor\" data-id=\"dd0dc0e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, you can create and extend API endpoints.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1305\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"6\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1305\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 6. Do I need coding experience to develop Perfex modules? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1305\" class=\"elementor-element elementor-element-a705b22 e-con-full e-flex e-con e-child\" data-id=\"a705b22\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1305\" class=\"elementor-element elementor-element-8e6564e e-flex e-con-boxed e-con e-child\" data-id=\"8e6564e\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-739c62b elementor-widget elementor-widget-text-editor\" data-id=\"739c62b\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, basic PHP, MVC, and CodeIgniter knowledge is required.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1306\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"7\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1306\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 7. How do I create a module installation file? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1306\" class=\"elementor-element elementor-element-18968ee e-con-full e-flex e-con e-child\" data-id=\"18968ee\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1306\" class=\"elementor-element elementor-element-7b89e47 e-flex e-con-boxed e-con e-child\" data-id=\"7b89e47\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-170e1ee elementor-widget elementor-widget-text-editor\" data-id=\"170e1ee\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use the main module init file e.g., <code data-start=\"905\" data-end=\"919\">mymodule.php<\/code>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1307\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"8\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1307\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 8. Can I add custom menus in Perfex CRM? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1307\" class=\"elementor-element elementor-element-802e99f e-con-full e-flex e-con e-child\" data-id=\"802e99f\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1307\" class=\"elementor-element elementor-element-4a64c05 e-flex e-con-boxed e-con e-child\" data-id=\"4a64c05\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7c40596 elementor-widget elementor-widget-text-editor\" data-id=\"7c40596\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, using hooks like <code data-start=\"991\" data-end=\"1003\">admin_init<\/code> and <code data-start=\"1008\" data-end=\"1020\">admin_head<\/code>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1308\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"9\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1308\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 9. Does Perfex CRM support module activation\/deactivation? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1308\" class=\"elementor-element elementor-element-1755840 e-con-full e-flex e-con e-child\" data-id=\"1755840\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1308\" class=\"elementor-element elementor-element-8a4ee75 e-flex e-con-boxed e-con e-child\" data-id=\"8a4ee75\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ddd7008 elementor-widget elementor-widget-text-editor\" data-id=\"ddd7008\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, each module includes activation and deactivation functions.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-1309\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"10\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-1309\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 10. Can I build admin and customer views in the module? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1309\" class=\"elementor-element elementor-element-47b1a34 e-con-full e-flex e-con e-child\" data-id=\"47b1a34\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-1309\" class=\"elementor-element elementor-element-20191b9 e-flex e-con-boxed e-con e-child\" data-id=\"20191b9\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-16cb28e elementor-widget elementor-widget-text-editor\" data-id=\"16cb28e\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, via the <code data-start=\"1229\" data-end=\"1243\">views\/admin\/<\/code> and <code data-start=\"1248\" data-end=\"1263\">views\/public\/<\/code> folders.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13010\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"11\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13010\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 11. Can I add custom database tables in Perfex modules? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13010\" class=\"elementor-element elementor-element-f166665 e-con-full e-flex e-con e-child\" data-id=\"f166665\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13010\" class=\"elementor-element elementor-element-8dbff9d e-flex e-con-boxed e-con e-child\" data-id=\"8dbff9d\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-7878a60 elementor-widget elementor-widget-text-editor\" data-id=\"7878a60\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, using migration files or manual schema creation.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13011\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"12\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13011\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 12. How do I load module models in Perfex CRM? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13011\" class=\"elementor-element elementor-element-3d10503 e-con-full e-flex e-con e-child\" data-id=\"3d10503\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13011\" class=\"elementor-element elementor-element-074827e e-flex e-con-boxed e-con e-child\" data-id=\"074827e\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-83c12b7 elementor-widget elementor-widget-text-editor\" data-id=\"83c12b7\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Use <code data-start=\"1448\" data-end=\"1497\">$this-&gt;load-&gt;model('module_name\/module_model');<\/code>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13012\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"13\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13012\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 13. Can I include CSS and JS in my module? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13012\" class=\"elementor-element elementor-element-d283156 e-con-full e-flex e-con e-child\" data-id=\"d283156\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13012\" class=\"elementor-element elementor-element-5b1b59a e-flex e-con-boxed e-con e-child\" data-id=\"5b1b59a\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-9892a62 elementor-widget elementor-widget-text-editor\" data-id=\"9892a62\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, through assets and view loading functions.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13013\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"14\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13013\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 14. Does Perfex CRM support language files in modules? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13013\" class=\"elementor-element elementor-element-e0ff232 e-con-full e-flex e-con e-child\" data-id=\"e0ff232\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13013\" class=\"elementor-element elementor-element-4325d84 e-flex e-con-boxed e-con e-child\" data-id=\"4325d84\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-f7c044a elementor-widget elementor-widget-text-editor\" data-id=\"f7c044a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, via <code data-start=\"1668\" data-end=\"1702\">language\/english\/module_lang.php<\/code>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13014\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"15\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13014\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 15. How do I debug a Perfex CRM module? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13014\" class=\"elementor-element elementor-element-13f9abf e-con-full e-flex e-con e-child\" data-id=\"13f9abf\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13014\" class=\"elementor-element elementor-element-9295835 e-flex e-con-boxed e-con e-child\" data-id=\"9295835\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-502315a elementor-widget elementor-widget-text-editor\" data-id=\"502315a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Enable CodeIgniter debugging or use <code data-start=\"1787\" data-end=\"1802\">log_message()<\/code>.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13015\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"16\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13015\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 16. Can I integrate third-party APIs in a Perfex module? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13015\" class=\"elementor-element elementor-element-7b132c1 e-con-full e-flex e-con e-child\" data-id=\"7b132c1\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13015\" class=\"elementor-element elementor-element-5a40bc8 e-flex e-con-boxed e-con e-child\" data-id=\"5a40bc8\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-ebb8339 elementor-widget elementor-widget-text-editor\" data-id=\"ebb8339\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, through custom libraries and controllers.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13016\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"17\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13016\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 17. Does Perfex CRM allow module updates? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13016\" class=\"elementor-element elementor-element-9c69ac2 e-con-full e-flex e-con e-child\" data-id=\"9c69ac2\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13016\" class=\"elementor-element elementor-element-3c129c4 e-flex e-con-boxed e-con e-child\" data-id=\"3c129c4\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-1067ab6 elementor-widget elementor-widget-text-editor\" data-id=\"1067ab6\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, modules can include versioning and update scripts.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13017\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"18\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13017\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 18. Where can I find Perfex module documentation? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13017\" class=\"elementor-element elementor-element-e8cbe61 e-con-full e-flex e-con e-child\" data-id=\"e8cbe61\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13017\" class=\"elementor-element elementor-element-f840ad9 e-flex e-con-boxed e-con e-child\" data-id=\"f840ad9\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-dff9019 elementor-widget elementor-widget-text-editor\" data-id=\"dff9019\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>At the official docs: help.perfexcrm.com.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13018\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"19\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13018\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 19. Can modules affect system performance? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13018\" class=\"elementor-element elementor-element-c27c716 e-con-full e-flex e-con e-child\" data-id=\"c27c716\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13018\" class=\"elementor-element elementor-element-7ba0b4c e-flex e-con-boxed e-con e-child\" data-id=\"7ba0b4c\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-d4c652d elementor-widget elementor-widget-text-editor\" data-id=\"d4c652d\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, poorly written code can slow the CRM down.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13019\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"20\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13019\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 20. Can I sell my custom Perfex CRM module? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13019\" class=\"elementor-element elementor-element-1c25b2f e-con-full e-flex e-con e-child\" data-id=\"1c25b2f\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13019\" class=\"elementor-element elementor-element-1f340fe e-flex e-con-boxed e-con e-child\" data-id=\"1f340fe\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-8a68951 elementor-widget elementor-widget-text-editor\" data-id=\"8a68951\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, many developers sell modules on marketplaces like CodeCanyon.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13020\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"21\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13020\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 21. Where can I find Perfex CRM documentation? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13020\" class=\"elementor-element elementor-element-0ba4888 e-con-full e-flex e-con e-child\" data-id=\"0ba4888\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13020\" class=\"elementor-element elementor-element-6012cb6 e-flex e-con-boxed e-con e-child\" data-id=\"6012cb6\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-32551ab elementor-widget elementor-widget-text-editor\" data-id=\"32551ab\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Perfex CRM documentation is available on its official website and support portal, covering setup, configuration, and module usage.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13021\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"22\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13021\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 22. What is Perfex CRM module development? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13021\" class=\"elementor-element elementor-element-7d39ec9 e-con-full e-flex e-con e-child\" data-id=\"7d39ec9\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13021\" class=\"elementor-element elementor-element-b3aa841 e-flex e-con-boxed e-con e-child\" data-id=\"b3aa841\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-fe07a66 elementor-widget elementor-widget-text-editor\" data-id=\"fe07a66\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Perfex CRM module development involves creating custom modules that extend Perfex\u2019s core functionality using its modular architecture, which is built on the CodeIgniter PHP framework. Developers define a module structure (controllers, models, views, language files, and an init file with hooks) to add new features or integrations while staying compatible with Perfex updates.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13022\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"23\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13022\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 23. Where can I find Perfex CRM hooks documentation? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13022\" class=\"elementor-element elementor-element-ea83d76 e-con-full e-flex e-con e-child\" data-id=\"ea83d76\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13022\" class=\"elementor-element elementor-element-3288f5d e-flex e-con-boxed e-con e-child\" data-id=\"3288f5d\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-76fb655 elementor-widget elementor-widget-text-editor\" data-id=\"76fb655\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Perfex CRM hooks documentation is available in the official Perfex Help Center under the \u201cAction Hooks\u201d section, which explains how to register and use hooks in custom modules.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13023\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"24\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13023\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 24. What are hooks in Perfex CRM? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13023\" class=\"elementor-element elementor-element-2c9dd04 e-con-full e-flex e-con e-child\" data-id=\"2c9dd04\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13023\" class=\"elementor-element elementor-element-697c5e8 e-flex e-con-boxed e-con e-child\" data-id=\"697c5e8\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6890e85 elementor-widget elementor-widget-text-editor\" data-id=\"6890e85\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Hooks in Perfex CRM are extension points that let you run custom code before or after specific system events, so you can change behaviour without modifying core files.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13024\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"25\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13024\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 25. How do I add a custom hook in Perfex CRM? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13024\" class=\"elementor-element elementor-element-5750d30 e-con-full e-flex e-con e-child\" data-id=\"5750d30\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13024\" class=\"elementor-element elementor-element-0c26a9b e-flex e-con-boxed e-con e-child\" data-id=\"0c26a9b\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-4d2d702 elementor-widget elementor-widget-text-editor\" data-id=\"4d2d702\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>You typically use functions like\u00a0<code>hooks()-&gt;add_action()<\/code>\u00a0or\u00a0<code>hooks()-&gt;add_filter()<\/code>\u00a0inside your module\u2019s init file to attach your callback to a named hook.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13025\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"26\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13025\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 26. Is there a complete list of Perfex CRM hooks? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13025\" class=\"elementor-element elementor-element-b5db8ed e-con-full e-flex e-con e-child\" data-id=\"b5db8ed\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13025\" class=\"elementor-element elementor-element-dd3b500 e-flex e-con-boxed e-con e-child\" data-id=\"dd3b500\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-736d123 elementor-widget elementor-widget-text-editor\" data-id=\"736d123\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Yes, developers maintain updated hook lists on GitHub that catalogue most available hooks, which you can use alongside the official documentation to find the right hook name.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t\t<details id=\"e-n-accordion-item-13026\" class=\"e-n-accordion-item\" >\n\t\t\t\t<summary class=\"e-n-accordion-item-title\" data-accordion-index=\"27\" tabindex=\"-1\" aria-expanded=\"false\" aria-controls=\"e-n-accordion-item-13026\" >\n\t\t\t\t\t<span class='e-n-accordion-item-title-header'><div class=\"e-n-accordion-item-title-text\"> 27. Why should I use hooks instead of editing core Perfex files? <\/div><\/span>\n\t\t\t\t\t\t\t<span class='e-n-accordion-item-title-icon'>\n\t\t\t<span class='e-opened' ><i aria-hidden=\"true\" class=\"fas fa-minus\"><\/i><\/span>\n\t\t\t<span class='e-closed'><i aria-hidden=\"true\" class=\"fas fa-plus\"><\/i><\/span>\n\t\t<\/span>\n\n\t\t\t\t\t\t<\/summary>\n\t\t\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13026\" class=\"elementor-element elementor-element-9583352 e-con-full e-flex e-con e-child\" data-id=\"9583352\" data-element_type=\"container\">\n\t\t<div role=\"region\" aria-labelledby=\"e-n-accordion-item-13026\" class=\"elementor-element elementor-element-639436b e-flex e-con-boxed e-con e-child\" data-id=\"639436b\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-257835a elementor-widget elementor-widget-text-editor\" data-id=\"257835a\" data-element_type=\"widget\" data-widget_type=\"text-editor.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<p>Using hooks keeps your customisations upgrade-safe, because your logic lives in modules rather than modified core code, reducing breakage when Perfex CRM is updated.<\/p>\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/details>\n\t\t\t\t\t<\/div>\n\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t<div class=\"elementor-element elementor-element-8291184 e-flex e-con-boxed e-con e-parent\" data-id=\"8291184\" data-element_type=\"container\">\n\t\t\t\t\t<div class=\"e-con-inner\">\n\t\t\t\t<div class=\"elementor-element elementor-element-6dd0196 elementor-button-info elementor-align-center elementor-widget elementor-widget-button\" data-id=\"6dd0196\" data-element_type=\"widget\" data-widget_type=\"button.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t\t\t\t\t<div class=\"elementor-button-wrapper\">\n\t\t\t\t\t<a class=\"elementor-button elementor-button-link elementor-size-sm\" href=\"https:\/\/calendar.google.com\/calendar\/appointments\/schedules\/AcZssZ2Su3CfE5QYBlxQVMP1HH54lIdu9yMIeoaZyrWc7XiWe2YKSeCchAp_fKftVWc9WYF3AUfKGX_E?gv=true\">\n\t\t\t\t\t\t<span class=\"elementor-button-content-wrapper\">\n\t\t\t\t\t\t\t\t\t<span class=\"elementor-button-text\">Book an appointment<\/span>\n\t\t\t\t\t<\/span>\n\t\t\t\t\t<\/a>\n\t\t\t\t<\/div>\n\t\t\t\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Learn how to build custom modules in Perfex CRM with a complete developer guide, code structure, hooks, API integration, and a free module template. Perfect for beginners and advanced developers looking to extend Perfex CRM with powerful custom features in 2026.<\/p>\n","protected":false},"author":2,"featured_media":3605,"comment_status":"closed","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"_uag_custom_page_level_css":"","site-sidebar-layout":"default","site-content-layout":"","ast-site-content-layout":"default","site-content-style":"default","site-sidebar-style":"default","ast-global-header-display":"","ast-banner-title-visibility":"","ast-main-header-display":"","ast-hfb-above-header-display":"","ast-hfb-below-header-display":"","ast-hfb-mobile-header-display":"","site-post-title":"","ast-breadcrumbs-content":"","ast-featured-img":"","footer-sml-layout":"","theme-transparent-header-meta":"","adv-header-id-meta":"","stick-header-meta":"","header-above-stick-meta":"","header-main-stick-meta":"","header-below-stick-meta":"","astra-migrate-meta-layouts":"set","ast-page-background-enabled":"default","ast-page-background-meta":{"desktop":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"ast-content-background-meta":{"desktop":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"tablet":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""},"mobile":{"background-color":"var(--ast-global-color-5)","background-image":"","background-repeat":"repeat","background-position":"center center","background-size":"auto","background-attachment":"scroll","background-type":"","background-media":"","overlay-type":"","overlay-color":"","overlay-opacity":"","overlay-gradient":""}},"footnotes":""},"categories":[28,88],"tags":[58,25,61,610,212,210,611,266,609,614,613,612],"class_list":["post-2836","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-crm-guide","category-development","tag-crm-for-small-businesses","tag-crm-implementation-steps","tag-perfex-crm","tag-perfex-crm-best-practices","tag-perfex-crm-developer-guide","tag-perfex-crm-for-agencies","tag-perfex-crm-hooks-and-controllers","tag-perfex-crm-module-development","tag-perfex-crm-module-development-tutorial-2026","tag-perfex-crm-module-troubleshooting","tag-perfex-crm-modules-codeigniter","tag-perfex-crm-security-tips"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Perfex CRM Module Development Guide 2026<\/title>\n<meta name=\"description\" content=\"Learn how to build secure, scalable Perfex CRM modules with step-by-step guidance, best practices, and real developer tips \u2014 so you ship faster and avoid costly mistakes.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Perfex CRM Module Development Guide 2026\" \/>\n<meta property=\"og:description\" content=\"Learn how to build secure, scalable Perfex CRM modules with step-by-step guidance, best practices, and real developer tips \u2014 so you ship faster and avoid costly mistakes.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/\" \/>\n<meta property=\"og:site_name\" content=\"Blog | DevDiligent\" \/>\n<meta property=\"article:published_time\" content=\"2025-11-19T12:21:42+00:00\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-21T13:06:55+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png\" \/>\n\t<meta property=\"og:image:width\" content=\"1600\" \/>\n\t<meta property=\"og:image:height\" content=\"896\" \/>\n\t<meta property=\"og:image:type\" content=\"image\/png\" \/>\n<meta name=\"author\" content=\"Grace Fox\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Written by\" \/>\n\t<meta name=\"twitter:data1\" content=\"Grace Fox\" \/>\n\t<meta name=\"twitter:label2\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data2\" content=\"11 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"Article\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/#article\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/\"},\"author\":{\"name\":\"Grace Fox\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#\\\/schema\\\/person\\\/bfeaaad3e80aa5bfe72503bca4eb0369\"},\"headline\":\"Perfex CRM Module Development Guide 2026: Save Time &amp; Build Better CRM Modules\",\"datePublished\":\"2025-11-19T12:21:42+00:00\",\"dateModified\":\"2026-07-21T13:06:55+00:00\",\"mainEntityOfPage\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/\"},\"wordCount\":2286,\"publisher\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#organization\"},\"image\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Perfex-CRM-Module-Development-Guide-2026-1.png\",\"keywords\":[\"CRM for Small Businesses\",\"CRM Implementation Steps\",\"Perfex CRM\",\"Perfex CRM best practices\",\"Perfex CRM Developer Guide\",\"Perfex CRM for Agencies\",\"Perfex CRM Hooks and Controllers\",\"Perfex CRM Module Development\",\"Perfex CRM Module Development Tutorial 2026\",\"Perfex CRM Module Troubleshooting\",\"Perfex CRM Modules CodeIgniter\",\"Perfex CRM Security Tips\"],\"articleSection\":[\"CRM Guide\",\"Development\"],\"inLanguage\":\"en-US\"},{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/\",\"url\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/\",\"name\":\"Perfex CRM Module Development Guide 2026\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Perfex-CRM-Module-Development-Guide-2026-1.png\",\"datePublished\":\"2025-11-19T12:21:42+00:00\",\"dateModified\":\"2026-07-21T13:06:55+00:00\",\"description\":\"Learn how to build secure, scalable Perfex CRM modules with step-by-step guidance, best practices, and real developer tips \u2014 so you ship faster and avoid costly mistakes.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/#primaryimage\",\"url\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Perfex-CRM-Module-Development-Guide-2026-1.png\",\"contentUrl\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/11\\\/Perfex-CRM-Module-Development-Guide-2026-1.png\",\"width\":1600,\"height\":896,\"caption\":\"perfex crm module development guide 2026 (1)\"},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/perfex-crm-module-development-guide\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Perfex CRM Module Development Guide 2026: Save Time &amp; Build Better CRM Modules\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#website\",\"url\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/\",\"name\":\"Blog | DevDiligent\",\"description\":\"Expert Insights on CRM, Software Development, and Business Growth\",\"publisher\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#organization\"},\"alternateName\":\"Insights & Strategies: The DevDiligent Blog\",\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#organization\",\"name\":\"Blog | DevDiligent\",\"url\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/cropped-logo.png\",\"contentUrl\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/uploads\\\/2025\\\/10\\\/cropped-logo.png\",\"width\":1094,\"height\":228,\"caption\":\"Blog | DevDiligent\"},\"image\":{\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#\\\/schema\\\/logo\\\/image\\\/\"}},{\"@type\":\"Person\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/#\\\/schema\\\/person\\\/bfeaaad3e80aa5bfe72503bca4eb0369\",\"name\":\"Grace Fox\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/litespeed\\\/avatar\\\/edb17d2818613da44b7974ec17203abb.jpg?ver=1790749229\",\"url\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/litespeed\\\/avatar\\\/edb17d2818613da44b7974ec17203abb.jpg?ver=1790749229\",\"contentUrl\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/wp-content\\\/litespeed\\\/avatar\\\/edb17d2818613da44b7974ec17203abb.jpg?ver=1790749229\",\"caption\":\"Grace Fox\"},\"url\":\"https:\\\/\\\/devdiligent.com\\\/blog\\\/author\\\/tayyaba_batool\\\/\"}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Perfex CRM Module Development Guide 2026","description":"Learn how to build secure, scalable Perfex CRM modules with step-by-step guidance, best practices, and real developer tips \u2014 so you ship faster and avoid costly mistakes.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/","og_locale":"en_US","og_type":"article","og_title":"Perfex CRM Module Development Guide 2026","og_description":"Learn how to build secure, scalable Perfex CRM modules with step-by-step guidance, best practices, and real developer tips \u2014 so you ship faster and avoid costly mistakes.","og_url":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/","og_site_name":"Blog | DevDiligent","article_published_time":"2025-11-19T12:21:42+00:00","article_modified_time":"2026-07-21T13:06:55+00:00","og_image":[{"width":1600,"height":896,"url":"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png","type":"image\/png"}],"author":"Grace Fox","twitter_card":"summary_large_image","twitter_misc":{"Written by":"Grace Fox","Est. reading time":"11 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"Article","@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/#article","isPartOf":{"@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/"},"author":{"name":"Grace Fox","@id":"https:\/\/devdiligent.com\/blog\/#\/schema\/person\/bfeaaad3e80aa5bfe72503bca4eb0369"},"headline":"Perfex CRM Module Development Guide 2026: Save Time &amp; Build Better CRM Modules","datePublished":"2025-11-19T12:21:42+00:00","dateModified":"2026-07-21T13:06:55+00:00","mainEntityOfPage":{"@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/"},"wordCount":2286,"publisher":{"@id":"https:\/\/devdiligent.com\/blog\/#organization"},"image":{"@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png","keywords":["CRM for Small Businesses","CRM Implementation Steps","Perfex CRM","Perfex CRM best practices","Perfex CRM Developer Guide","Perfex CRM for Agencies","Perfex CRM Hooks and Controllers","Perfex CRM Module Development","Perfex CRM Module Development Tutorial 2026","Perfex CRM Module Troubleshooting","Perfex CRM Modules CodeIgniter","Perfex CRM Security Tips"],"articleSection":["CRM Guide","Development"],"inLanguage":"en-US"},{"@type":"WebPage","@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/","url":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/","name":"Perfex CRM Module Development Guide 2026","isPartOf":{"@id":"https:\/\/devdiligent.com\/blog\/#website"},"primaryImageOfPage":{"@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/#primaryimage"},"image":{"@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/#primaryimage"},"thumbnailUrl":"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png","datePublished":"2025-11-19T12:21:42+00:00","dateModified":"2026-07-21T13:06:55+00:00","description":"Learn how to build secure, scalable Perfex CRM modules with step-by-step guidance, best practices, and real developer tips \u2014 so you ship faster and avoid costly mistakes.","breadcrumb":{"@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/#primaryimage","url":"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png","contentUrl":"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png","width":1600,"height":896,"caption":"perfex crm module development guide 2026 (1)"},{"@type":"BreadcrumbList","@id":"https:\/\/devdiligent.com\/blog\/perfex-crm-module-development-guide\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/devdiligent.com\/blog\/"},{"@type":"ListItem","position":2,"name":"Perfex CRM Module Development Guide 2026: Save Time &amp; Build Better CRM Modules"}]},{"@type":"WebSite","@id":"https:\/\/devdiligent.com\/blog\/#website","url":"https:\/\/devdiligent.com\/blog\/","name":"Blog | DevDiligent","description":"Expert Insights on CRM, Software Development, and Business Growth","publisher":{"@id":"https:\/\/devdiligent.com\/blog\/#organization"},"alternateName":"Insights & Strategies: The DevDiligent Blog","potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/devdiligent.com\/blog\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":"Organization","@id":"https:\/\/devdiligent.com\/blog\/#organization","name":"Blog | DevDiligent","url":"https:\/\/devdiligent.com\/blog\/","logo":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/devdiligent.com\/blog\/#\/schema\/logo\/image\/","url":"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/10\/cropped-logo.png","contentUrl":"https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/10\/cropped-logo.png","width":1094,"height":228,"caption":"Blog | DevDiligent"},"image":{"@id":"https:\/\/devdiligent.com\/blog\/#\/schema\/logo\/image\/"}},{"@type":"Person","@id":"https:\/\/devdiligent.com\/blog\/#\/schema\/person\/bfeaaad3e80aa5bfe72503bca4eb0369","name":"Grace Fox","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/devdiligent.com\/blog\/wp-content\/litespeed\/avatar\/edb17d2818613da44b7974ec17203abb.jpg?ver=1790749229","url":"https:\/\/devdiligent.com\/blog\/wp-content\/litespeed\/avatar\/edb17d2818613da44b7974ec17203abb.jpg?ver=1790749229","contentUrl":"https:\/\/devdiligent.com\/blog\/wp-content\/litespeed\/avatar\/edb17d2818613da44b7974ec17203abb.jpg?ver=1790749229","caption":"Grace Fox"},"url":"https:\/\/devdiligent.com\/blog\/author\/tayyaba_batool\/"}]}},"uagb_featured_image_src":{"full":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png",1600,896,false],"thumbnail":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-150x150.png",150,150,true],"medium":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-300x168.png",300,168,true],"medium_large":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-768x430.png",768,430,true],"large":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-1024x573.png",1024,573,true],"1536x1536":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-1536x860.png",1536,860,true],"2048x2048":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1.png",1600,896,false],"ultp_layout_landscape_large":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-1200x800.png",1200,800,true],"ultp_layout_landscape":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-870x570.png",870,570,true],"ultp_layout_portrait":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-600x896.png",600,896,true],"ultp_layout_square":["https:\/\/devdiligent.com\/blog\/wp-content\/uploads\/2025\/11\/Perfex-CRM-Module-Development-Guide-2026-1-600x600.png",600,600,true]},"uagb_author_info":{"display_name":"Grace Fox","author_link":"https:\/\/devdiligent.com\/blog\/author\/tayyaba_batool\/"},"uagb_comment_info":0,"uagb_excerpt":"Learn how to build custom modules in Perfex CRM with a complete developer guide, code structure, hooks, API integration, and a free module template. Perfect for beginners and advanced developers looking to extend Perfex CRM with powerful custom features in 2026.","_links":{"self":[{"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/posts\/2836","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/comments?post=2836"}],"version-history":[{"count":30,"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/posts\/2836\/revisions"}],"predecessor-version":[{"id":4873,"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/posts\/2836\/revisions\/4873"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/media\/3605"}],"wp:attachment":[{"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/media?parent=2836"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/categories?post=2836"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/devdiligent.com\/blog\/wp-json\/wp\/v2\/tags?post=2836"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}