EspoCRM customization

EspoCRM customization adapts entities, fields, layouts, formula logic and dashlets to how your teams sell and serve, while keeping the changes safe through upgrades. This page explains what the work includes, what drives its cost and what you need to provide.

On this page

What EspoCRM customization covers

EspoCRM customization means changing the shape of the application to match how your teams sell and serve customers, without modifying the core code. Most of that work happens in the admin interface: custom entities and fields in the Entity Manager, record layouts that control what each role sees, formula before-save scripts that set or validate values when a record is saved, and dashlets that put the right figures on each user's home screen. Deeper changes use custom PHP and front-end code placed in the custom directory, which keeps them separate from the core files.

Customization usually starts with one of three triggers. A new sales or service process needs stages, fields or record types that the default setup does not have. A team has outgrown its default fields and is tracking the same information in spreadsheets next to the CRM. Or the data model no longer matches the business, for example when accounts, contacts and cases are linked in a way that makes reporting unreliable. Before anyone builds, write down which trigger applies and which decisions depend on the answer, such as who owns each field and which roles must edit it.

The short answer on in-house versus partner work: small field and layout changes are often within reach of an internal administrator who has read the Entity Manager and formula documentation and can test changes in a non-production copy. Code and script design across many entities is different. Formulas and custom code interact with permissions, imports, the API and later upgrades, so an outside reviewer who has seen those interactions in other installations is usually worth the cost before the design is locked. Confirm with your own team who will maintain each change after go-live.

This section covers the customization layer only. Rule-based workflows and BPMN processes that need the Advanced Pack, single sign-on, API integrations, data migration, and version upgrades are described on their own pages, so the decisions there are not repeated here. Ask any partner to separate their estimate by these areas so that you can see which changes depend on which other work.

What the work includes

Customization touches the data model, the user interface and the code that runs behind them. Each package below produces changes that must survive the next EspoCRM upgrade, so the work is planned and recorded as it is built.

Data model design

Entities, fields, relationships, and the teams and roles that can see or edit them are designed together before anything is created in the Entity Manager. Check that every new field has a clear owner, a defined type and a reason, and that the team and role permissions are reviewed alongside the model rather than after go-live.

Layout and detail view design

Detail, list, edit and search layouts are arranged around how each role works through a record, including which panels, related lists and fields appear first. Check layouts with users from each team, since a layout that hides a required field or buries a related list causes workarounds that are hard to see later.

Formula before-save scripts

Formula Script before-save logic in the Entity Manager sets defaults, derives values and enforces rules on record save. Each script is documented with its trigger entity, the fields it reads and writes, and its failure behavior, so a reviewer can see what changes a record and in what order when several rules apply.

Dashlets and list views

Home screen dashlets and saved list views give each team its working queue and key figures. Confirm which data each dashlet exposes to each role, since a dashlet built for managers can show records a sales user is not permitted to open.

Custom PHP and front-end code

Custom server-side PHP and client-side JavaScript or templates are placed in the custom directory so they are kept apart from core files. Check that each piece has a named owner, is tested on a staging copy, and does not patch core files, because core edits are overwritten or conflict during upgrades.

Change register and upgrade checklist

Every customization is logged in a change register with its purpose, the entities and files it touches, its approver and its test status. Each entry carries an upgrade checklist, so the team knows what to retest and which core behavior it depends on before a new release is applied.

What drives cost and duration

Each row names one factor that moves EspoCRM customization effort, why it does so, and one practical way to keep it under control.

DriverWhy it moves effortHow to keep it down
Custom entities and fieldsEvery new entity needs its own layouts, list views, roles, relationships and import mapping, so effort grows faster than the field count.Reuse existing entities and fields where the meaning matches, and agree a fixed field list before the build starts.
Formula scripts and complexityFormula logic must be written, tested against edge cases and re-checked after each change, and chained scripts are hard to trace.Limit scripts to before-save logic on the entity, avoid chains across related records, and keep each script to one clear rule.
Custom PHP or front-end codeCode in the custom directory needs development, review, testing and upgrade checks, and it carries maintenance for the life of the instance.Start with configuration, Entity Manager and layouts, and approve each custom code item individually with a stated business reason.
Roles and layouts per roleEach role needs its own permission set and field visibility, and every extra layout multiplies testing with each role combination.Model access through a small set of roles and teams, and reuse one base layout with minimal per-role changes.
Integrations that depend on custom fieldsField names, types and API behavior become contracts with other systems, so each custom field change can break a connected system.Freeze field names and types used by integrations early, and document which external systems read each field.
Environments (dev, test, production)Changes must be built, promoted and verified in each environment, and differences between them cause rework and failed releases.Keep one reproducible configuration path, promote changes in the same order each time, and confirm test data resembles production.
Compliance or audit evidenceChange records, role reviews, test evidence and access exports add documentation and review steps to every change.Agree the evidence list at scoping, such as change logs and role exports, and generate it as part of normal delivery.
Edition and extensions in useOfficial extensions such as the Advanced Pack add features, reports and workflow logic that need their own design, testing and upgrade checks. Confirm current extension terms with the vendor.Decide early which extensions are in scope, and keep workflow and report logic limited to what the agreed requirements need.

Project phases and outputs

The sequence moves from agreed requirements to a customized EspoCRM instance that your own administrators can run, upgrade and extend.

  1. Gather requirements and field inventory

    We interview the business owners of sales, service and operations to map their processes, then build a field inventory listing each entity, field, role and layout they need. The client receives the signed requirements document and field inventory, and the phase closes when the business owners approve both in writing.

  2. Design data model and layouts on a test instance

    We design entities, relationships, field types, layouts and access roles in the Entity Manager on a dedicated test instance that matches the target server configuration. The client receives a data model diagram and layout mockups, and the phase closes when the business owners walk through the test instance and confirm the design.

  3. Build entities, fields, layouts and formula scripts

    We build the approved model with entities, fields, layouts, teams and Formula Script before-save logic, recording each configuration change so it can be reviewed and reproduced. The client receives a configured build on the test instance with a change log, and the phase closes when every item in the field inventory is traceable to a built element.

  4. Develop custom code and dashlets in version control

    We write any custom PHP, front-end code and dashlets inside the custom directory, keep them in a Git repository with code review, and test them against the configured model. The client receives the repository with the code, a deployment note and test results, and the phase closes when the reviewed code runs cleanly on the test instance.

  5. Run user acceptance testing with real scenarios

    Business users run scripted scenarios drawn from their daily work, such as lead qualification, quote handling and case escalation, and we fix defects found during testing. The client receives a test log with scenario results and a list of resolved issues, and the phase closes when the sponsor signs off on the scenarios.

  6. Hand over with an upgrade checklist

    We deploy the approved build to the production instance, train the named administrators, and document the configuration, custom code and extensions that an upgrade must check. The client receives the runbook, the upgrade checklist, the repository access and a handover session record, and the phase closes when the administrators run a supervised change themselves.

In-house or partner: who does what

Each row shows who usually carries a customization task, the skill it needs, and what your team must retain after go-live.

Work itemUsuallySkill needed and retained role
Business requirementsShared: partner runs workshops, your process owners sign offBusiness analysis and knowledge of your sales and service processes
Data model designShared: partner drafts entities and fields, in-house approvesBusiness analysis and EspoCRM administration
Entity Manager and layoutsIn-house once an administrator is trained, partner for initial buildEspoCRM administration
Formula before-save scriptsPartner builds the first set, in-house maintains changesFormula Script knowledge, EspoCRM administration and QA
Custom PHP and JavaScriptPartner builds in the custom directory, with source and upgrade notes handed overPHP, front-end JavaScript and code review
Dashlet designShared: in-house defines the views, partner builds themBusiness analysis and front-end JavaScript
TestingShared: in-house tests business cases, partner runs regression checksQA and business analysis
Deployment and handoverPartner runs releases, in-house takes ownership of the running systemDevOps and EspoCRM administration
Ongoing model ownershipIn-house, and the most important retained roleAn internal EspoCRM administrator who changes fields, layouts and scripts after go-live

What goes wrong and how to prevent it

Most EspoCRM customization problems come from a few repeatable habits: editing core files, adding fields without an owner, and changing logic without testing it. Each card below names one failure and the step that prevents it.

Core files edited directly

Changes made inside the EspoCRM core folders are overwritten or break when the platform is upgraded. Keep all custom PHP, front-end code and metadata overrides in the custom directory, and check that each override still loads after every upgrade in a test copy before the change reaches production.

Field sprawl in lists and reports

Every field added in the Entity Manager appears in forms, filters and reports, so unused or duplicate fields make lists slow to scan and reports hard to trust. Before adding a field, check whether an existing one fits, and review field counts per entity during each change cycle.

Formula scripts with hidden side effects

A before-save Formula Script can change related records, totals or statuses that users never see on the record they edited. Document what each script reads and writes, and test it against a copy of real data before enabling it, including records that already exist.

Layouts built per user

Layouts tailored to individual users multiply quickly, become impossible to support and hide fields from people who later need them. Design layouts per role, assign teams and roles to match, and keep individual exceptions in a short, reviewed list.

Untested edge cases

Scripts and workflows that work on a clean sample often fail on blank values, closed records, large deal values or imported history. Build a test dataset that covers these edge cases, including records from your migration, and check results after each change.

Custom code without an owner

Custom PHP, scripts and field definitions with no named owner become unsafe to change once the original builder leaves. Assign an owner to each field, script and extension, keep a change record for every modification, and confirm the handover includes these records and the test dataset.

How the work changes by starting point

A new instance gives the widest room for entity design because no records or scripts depend on earlier choices. Scope centers on modeling entities and layouts in the Entity Manager before users arrive.

  • Model before building: Decide which custom entities and fields are needed so layouts and formula scripts are written once.
  • Keep custom code in the custom directory: Starting there makes later upgrades easier to plan.
  • Design roles and teams early: Permissions decide what each user sees, so they belong in the first design pass.
  • Build test records: Without legacy data, create a sample dataset to check formulas, dashlets and before-save scripts.
  • Confirm the platform requirements: Check the server configuration docs for PHP, database and cron requirements before the build starts.

What you need to provide

Five inputs shorten the customization build more than anything else, and the first is a named business owner for each custom entity and each process the build touches, such as the Opportunity pipeline or service case handling. Owners answer which fields are required at each stage, which stage changes should trigger formula before-save scripts, and who signs off a layout. Without them, design questions wait in email and each late answer reopens earlier work. Send the current field list and the layouts exported from the Entity Manager, including detail, list and edit views, so the team can see what already exists before adding entities or fields.

The second input is a test instance on the same EspoCRM version as production, loaded with a copy of production data or a representative sample. The sample should include messy cases such as duplicate accounts, partial addresses and legacy picklist values. Formula scripts and workflow conditions behave differently on real records than on clean demo data, so rework often traces back to testing on an empty system. Also supply the reports and dashlets people use every day, since they show which views must survive the change. If reports depend on the Advanced Pack, confirm whether it is licensed for your deployment, because it is included in EspoCRM Cloud plans.

Third, provide admin accounts that are separate from everyday logins. EspoCRM's security guidance recommends avoiding admin accounts for daily work, and the build needs administrators who can change the Entity Manager and deploy custom code without exposing routine sessions. Fourth, provide a source control repository, such as Git, for everything in the custom directory. PHP and front-end changes then get reviewed, versioned and deployed the same way each time, and a later upgrade can be checked by comparing your code against the new release.

Finally, decide who approves changes after go-live. Name the approver for new fields, layout edits, formula changes and dashlet additions, and agree how urgent fixes are handled. Without that decision, administrators make production edits directly in the UI, bypass the test cycle and let the instance drift from the repository. That drift is one of the most common sources of rework in later upgrades, so the approval path should be written down before the build starts.

Frequently asked questions

How much effort does EspoCRM customization take, and what drives it?

Effort depends on how many entities, layouts, roles and integrations the scope covers, and on how far the logic departs from standard EspoCRM behavior. A few field and layout changes made in the Entity Manager sit at the low end. Formula before-save scripts, dashlets, custom PHP or front-end code in the custom directory, and checks against each upgrade add design, testing and documentation work. Ask for the effort split by item in the written scope, and confirm which items must be rechecked at each upgrade. No figure is given here because effort follows from the scope you agree.

Can our internal team customize EspoCRM without an external partner?

Yes, many teams can make entity, field and layout changes in the Entity Manager themselves, provided an administrator understands the data model and the roles that will see it. Work that needs formula scripting beyond simple fields, custom PHP, front-end code, SSO or integrations usually needs someone who can read the EspoCRM codebase and test upgrades. List the changes you expect in the first year, then check whether your team can build, test and document each one. A partner is useful when that capacity is missing or when you want an independent review of upgrade-safe code.

How long does it take to get a first customized EspoCRM version?

The schedule is set in the written scope before work starts, so the answer depends on the entities, layouts, roles, data import and integrations that the scope names. Your team's inputs also set the pace: named business owners to approve the data model, process descriptions, sample data for import, and a staging environment for testing. Ask for milestones that show the first version, the review cycle and the acceptance criteria. Delays in approvals on your side usually move the first version later.

Does custom code survive EspoCRM upgrades when placed in the custom directory?

Code placed in the custom directory is meant to stay separate from core files, which reduces the chance of losing it during an upgrade, but it is not automatically safe. Each release can change APIs, hooks or templates that custom code depends on. Review the release notes for every version between your current release and the target release, and test the custom code on a staging copy before production. Check extensions the same way. Confirm the upgrade procedure and the test plan in writing before the build starts.

When is a formula script enough, and when is custom PHP needed?

A formula script is usually enough when the logic reads and sets fields on one record, such as calculating a value, setting a status or copying a related field before save. Formula Script is EspoCRM's built-in language and runs in before-save scripts configured in the Entity Manager, in API before-save scripts, and in workflows and BPM. Move to custom PHP when the logic needs external calls, complex data access, new endpoints or behavior the formula language cannot express. Custom PHP adds code review, testing and upgrade checks, so the choice affects the effort in the scope.

Are Advanced Pack workflows included in this service or a separate scope?

Treat Advanced Pack workflows as their own scope item. They appear in the written scope only when they are named there, with each workflow and Business Process Management process listed so it can be planned and tested. The Advanced Pack is an official add-on that provides reports, Business Process Management and workflows, and it is included in all EspoCRM Cloud plans. For a self-hosted installation, confirm with EspoCRM how the Advanced Pack is licensed for your environment before you finalize the plan.

How DeployOpen delivers EspoCRM customization

DeployOpen scopes, builds, tests and documents EspoCRM customizations on infrastructure you control, under a written, fixed scope. We keep changes in the places EspoCRM supports for customization so the instance stays upgradable.

How we scope

  • The written scope lists each custom entity, field, layout, dashlet and formula script to be built for your teams.
  • We map which sales and service processes each customization supports, so every change has a named business owner.
  • The scope states which customizations sit in the custom directory and which, if any, depend on official extensions.
  • Engagements are fixed-scope, with deliverables and timelines agreed in writing before any build work starts.
  • Ask us to confirm which EspoCRM version the scope targets and how that version will be upgraded later.

How we build

  • Entities and fields are created in the Entity Manager first, so the data model is settled before layouts depend on it.
  • Formula before-save scripts are written, reviewed and tested against sample records covering normal and edge-case values.
  • Custom PHP and front-end code is kept in the custom directory, separate from core files, to protect future upgrades.
  • Each change is tested in a non-production instance with role-based user accounts that match your permission model.
  • Changes are tracked in version control so every customization can be reviewed, reverted and reproduced.

How we hand over

  • You receive documentation of each entity, field, layout, formula script and custom code file delivered.
  • The handover lists the customization inventory and the steps needed to check each item during a future upgrade.
  • Administrator walkthroughs cover how to adjust layouts and dashlets without breaking formula logic.
  • Acceptance follows the test results and checklist agreed in the written scope, before the project closes.
  • Ask for the handover package format and the list of credentials and access transferred to your team.

How we support

  • Ongoing support is available as a retainer and covers reviewing customizations before each EspoCRM upgrade.
  • Retainer work can include testing custom code and formula scripts against new EspoCRM releases in a staging copy.
  • Support requests are logged against the customization inventory so changes stay traceable over time.
  • Ask the support provider which upgrade steps they run, which your team runs, and how rollback is handled.
  • Confirm response expectations and what a retainer excludes before signing, since terms come from the written agreement.

Sources and further reading

Talk to our team.

Tell us what you're working on, whether it's a deployment, an audit, a security test or a cyber range. You'll speak with an engineer who can help you scope it.

  • 30-minute call: free, with no obligation.
  • NDA on request: we can sign before you share details.
  • Clear next steps: a scope and plan after the call.