The cost of custom Salesforce development is set less by lines of code than by decisions made before anyone writes them. The biggest drivers are whether the need truly requires code, how clear the requirement is, data model complexity and the number of systems involved. Next come volume-aware design, testing and security duties, UI scope, deployment tooling, handover and upkeep across each Salesforce release.
Why does custom work cost more than configuration?
Code carries obligations that clicks do not: unit tests, peer review, a deployment pipeline and a developer who understands it later. Every one of those obligations is a cost line, even when the feature itself looks small.
So the first cost driver is a decision, not a task. Before scoping Apex or a Lightning Web Component, someone should confirm that Flow, validation rules, dynamic forms or an AgentExchange app cannot do the job. Our guide on when to customize Salesforce covers that decision in depth. This article assumes the answer was code, and looks at what moves the effort once you are past that gate.
Which factors move the effort the most?
Most custom work is driven by a handful of factors that compound each other. The table below shows each one and what tends to push it higher.
| Driver | What raises the effort | What keeps it contained |
|---|---|---|
| Config-vs-code decision | Code chosen by habit or because a developer was available | A documented reason why declarative tools fall short |
| Requirement clarity | Rules described verbally, edge cases discovered during build | Written acceptance criteria with worked examples |
| Data model | Many-to-many links, record types with different rules, rollups across objects | A reviewed entity diagram signed off before build |
| Systems touched | Callouts to several external APIs, each with its own auth and error behaviour | One integration pattern reused across endpoints |
| Data volume | Large batch loads, bulk updates, triggers firing on mass edits | Bulk-safe design and realistic test data from day one |
| Test coverage | Tests written last, fragile tests tied to org data | Test classes written alongside the code with their own data |
| Security review | Exposed endpoints, guest users, AgentExchange listing | Sharing and field access enforced in code from the start |
| UI complexity | Custom components replacing standard pages, many device layouts | Standard Lightning pages with a few targeted components |
| DevOps setup | No source control, manual change sets, several sandboxes out of sync | Source-tracked repository and a repeatable deployment path |
| Handover | Knowledge held by one developer, no comments or runbook | Documentation delivered as part of each piece of work |
| Ongoing maintenance | Deprecated API versions, overlapping triggers, release surprises | Regular sandbox testing against each preview release |
How much does requirement clarity really matter?
It matters more than almost any technical factor. A vague requirement gets built twice: once as the developer imagined it, then again as the business meant it.
Clear requirements for custom work go beyond a user story. They state the trigger event, the records affected, the expected outcome and what should happen when data is missing or wrong. A commission rule, for example, should come with three or four sample deals and the exact split each one should produce. Worked examples become test cases, which cuts both build and testing effort.
Why does the data model drive so much of the build?
Every custom object, relationship and record type multiplies the code paths a developer must handle and test. A simple object with a lookup is cheap; a web of junction objects with role-based visibility is not.
Our broker-dealer client shows the shape of this. The firm needed to track both sides of capital-raising deals, meaning the issuers seeking money and the investors putting it in. The build included custom Engagement and Investment objects, junction objects for many-to-many relationships, and separate contact record types for each party: issuers, investors and the firm's associated persons.
On top of that model sat record-triggered and loop-based flows that created engagements and generated commission-split records. Validation rules enforced compliance stage gates before deals went to market. The result was a production environment with more than five custom objects, built to grow from 10 to more than 40 users. Much of the logic ran in Flow rather than Apex, which is a reminder that a custom data model does not automatically mean custom code.
How do integrations and data volume change the code?
Each external system adds authentication, error handling and retry logic, and high volumes force bulk-safe patterns throughout. Both expand the design and testing work well beyond the happy path.
Salesforce runs code in a shared, multi-tenant environment, so it enforces governor limits on queries, records processed and callouts per transaction. Code written for one record at a time can pass every test and then fail when someone mass-updates records. Designing for volume means bulkified triggers, asynchronous processing such as Queueable or Batch Apex where it fits, and selective queries on large objects.
Integration code itself has its own cost profile, covered in our separate guide to integration cost drivers. For custom development, the point is that every callout inside Apex also needs mock responses for testing, since unit tests cannot call real endpoints.
What are Salesforce's testing and coverage requirements?
Salesforce blocks an Apex deployment to production unless unit tests cover at least 75% of Apex code. All of those tests must also pass. Every trigger also needs some coverage.
That threshold is a floor, not a quality target. Tests written only to reach the number tend to execute code without checking results. Useful tests assert outcomes, cover bulk scenarios, test negative cases and run as users with limited permissions. Budget for that kind of test writing as part of the build, not as a task at the end.
When does security review add cost?
Security work grows when code is exposed to people outside your org or published for others to install. Internal-only code still needs secure patterns, but the review burden is lighter.
Apex runs in system context by default, so developers must deliberately enforce sharing rules, object permissions and field-level security. Experience Cloud sites with guest or external users raise the stakes, since a careless query can expose records publicly. Managed packages listed on AgentExchange (formerly AppExchange) go through Salesforce's own security review, which adds scanning, remediation and documentation work. Unmanaged packages skip that review but give up upgradeability, which shifts cost into maintenance.
How does UI complexity affect the build?
A custom Lightning Web Component costs more than a configured page, and the gap widens with each interaction, device and state it must handle. Replacing standard record pages entirely is the most expensive route.
Cost rises with features such as inline editing across related records, drag-and-drop, offline behaviour, mobile layouts and accessibility requirements. Experience Cloud customization adds branding, navigation and logic for external users on top. A common middle path is to keep standard Lightning pages and add one or two focused components where users truly need something different.
Do DevOps and handover belong in the quote?
Yes. Source control, a deployment pipeline and written handover are part of the build, not optional extras, and leaving them out moves cost into later work.
If your org has no source control, the first custom project often has to set it up. That can mean a Git repository, a branching approach and a Salesforce DX project structure. It can also mean a sandbox strategy and a CI job that runs tests on each change. It is a one-time cost that lowers the cost of every later change.
Handover should cover what each component does, why it exists, which settings it depends on and how to change it safely. Without it, your next developer spends paid hours reverse-engineering decisions instead of building.
What does custom code cost after go-live?
Custom code needs regular attention because Salesforce ships three major releases a year. Each one can change behaviour that your code relies on, so someone should test against it.
Release preview sandboxes let a team run tests before the release reaches production. Beyond releases, Apex classes and components are pinned to API versions that Salesforce eventually retires, so older code must be updated over time. Business change adds more work: a new product line or pricing rule often means editing code that was written for the old rules.
Shortcuts taken during the build show up here as technical debt. Hard-coded record IDs make later changes slower and riskier. So do triggers and flows competing on one object, and tests that never assert anything. Our guide to reducing technical debt covers how to pay that down once it exists.
How can you lower custom development cost without creating debt?
Spend less by narrowing scope and reusing patterns, not by skipping tests, reviews or documentation. Cutting quality steps only defers the cost and adds interest.
- Challenge every code request with a declarative option first, and record why it was rejected.
- Write acceptance criteria with real sample records before the build starts.
- Freeze the data model early, since late changes ripple through code, tests and layouts.
- Use one trigger framework per object so logic lives in a predictable place.
- Prefer standard pages with small custom components over full custom interfaces.
- Set up source control and automated tests on the first project, not the third.
- Store configurable values in custom metadata types instead of hard-coding them.
- Phase the work so the most valuable component reaches users first and informs the rest.
- Ask for documentation and a handover session in the same scope as the code.
What should you ask before accepting a quote?
A good quote for custom work explains what will be built in code and why, and how quality will be proven. These questions expose gaps quickly.
- Which requirements need code, and which declarative options were ruled out?
- What data volumes is the design built and tested for?
- How will tests check outcomes, bulk operations and restricted users, beyond meeting the coverage minimum?
- How is sharing and field-level security enforced inside the code?
- Is source control, a deployment pipeline or a sandbox refresh plan included?
- What documentation and handover will we receive, and in what format?
- Who tests our custom components against each seasonal release once the project ends?
- If packaging is planned, is it managed or unmanaged, and who owns the package afterwards?
- How are change requests handled when requirements shift during the build?
Packaging and Experience Cloud licensing rules vary by edition and agreement, so confirm those details with your Salesforce account team. Want a second opinion on a custom development scope? Abstrakt Solutions, a Salesforce Select partner, can review it with you.

