Why Your FSC Org Is Over-Customized (And What To Do About It)
The customization debt accumulates quietly — one trigger at a time, one custom object at a time. Here's how to diagnose how over-customized your FSC org is and a framework for unwinding it.
Every FSC org starts clean. Then, one sprint at a time, the customization accumulates. A trigger here because a validation rule 'wouldn't be flexible enough.' A custom object there because the SI wasn't sure the native FSC object could handle the edge case. A Flow that was supposed to be temporary. Two years later, your Salesforce admin is afraid to change anything because they don't know what breaks what.
Over-customization in FSC isn't a technical problem. It's a governance problem that expresses itself as a technical problem. This article explains how to identify it, measure it, and start unwinding it — without breaking your production org.
What Over-Customization Actually Looks Like
The symptoms are specific and recognizable if you know what to look for:
- Advisors describe workarounds casually — 'oh, for that you have to go to this other tab first, then come back here.' Workarounds are evidence of UI failure, which is often evidence of data model failure underneath.
- Your Salesforce admin has a personal 'gotcha' list — undocumented edge cases that break things if you do them in the wrong order.
- Salesforce releases cause anxiety rather than excitement, because you're not sure which custom code will break when the platform updates.
- A significant portion of support tickets are Salesforce-related — advisors confused by UI, data not appearing where expected, errors that require admin intervention.
- Your integration team touches FSC every time a new banking product launches, because the product mapping is bespoke.
- Nobody can fully describe what the Apex triggers on Account do. 'It does something important with sharing, I think.'
Measuring Your Customization Ratio
Before you can fix over-customization, you need to measure it. The metric we use is the customization ratio: the proportion of your FSC org's behavioral logic that lives in custom code vs. configuration.
A rough proxy you can generate without a full metadata scan:
| Category | Count Custom | Count Native | Custom % |
|---|---|---|---|
| Apex classes (active) | — | — | target: <20% LOC in triggers |
| Custom objects on Account | — | — | any >0 warrants review |
| Custom fields on FinancialAccount | — | — | target: <15 |
| Active Flows | — | — | flag any that replicate FSC automation |
| Custom sharing rules | — | — | target: 0 (use FSC sharing engine) |
| Custom report types | — | — | flag if duplicating FSC standard reports |
Pull this from Setup → Schema Builder, Developer Console, or use Salesforce CLI metadata describe. The raw counts matter less than what's in them. A 500-line Apex class that handles a genuinely complex integration is fine. Fifty 10-line triggers that could each be replaced by a validation rule are not.
The Three Categories of Unnecessary Customization
Category 1: OOB Ignorance
Custom code that was written because the developer didn't know FSC had a native solution. The most common examples: custom referral objects (FSC has native Referral), custom household grouping logic (FSC has Relationship Groups), custom advisor assignment rules (FSC has the Financial Account Role model), custom activity logging objects (FSC has Interaction Summaries).
These are the highest-priority candidates for remediation because they have the clearest native replacement. The migration path is usually: create the native records, migrate existing data, switch UI references, deprecate the custom object.
Category 2: Solved-Problem Rebuilds
Custom code that solves a problem that Salesforce platform (not just FSC) already solves. Custom validation logic that could be Validation Rules. Custom field update logic that could be a Record-Triggered Flow. Complex security rules that are actually just Object-level permissions configured wrong. Email notifications built in Apex when a standard Alert would suffice.
These are lower priority than Category 1 but still important because they're the ones that fail silently on platform upgrades and become undocumented behavior.
Category 3: Legitimate Custom (Don't Touch)
Custom code that handles genuinely complex, bank-specific business logic that has no native equivalent. A proprietary credit scoring model that integrates with an internal risk system. A complex loan origination workflow specific to your product mix. A custom integration with a legacy core banking platform with a non-standard API.
This code deserves documentation, test coverage, and proper ownership — but it's not a candidate for removal. The goal of remediation is not to eliminate all custom code. It's to eliminate custom code that replicates native capability.
A Remediation Prioritization Framework
Not everything can be fixed at once. Prioritize using two axes:
- Impact — how much does this customization hurt? Measure by: advisor complaints, admin time to maintain, frequency of bugs, data quality issues downstream.
- Migration complexity — how hard is it to replace? A custom referral object with 1,000 records and 3 downstream reports is harder to migrate than the same object with 100 records and no reports.
High impact + low complexity: fix now. These are your quick wins — visible improvements to the org with contained risk. Low impact + high complexity: document and defer. Don't spend 3 months migrating a custom object that nobody complains about. High impact + high complexity: design carefully, execute in phases.
How to Unwind Customization Without Breaking Production
The fear of touching a production FSC org is justified. But it's manageable with the right approach:
- 1.Build native alongside custom first — create the Referral records, configure the Relationship Groups, set up Interaction Summaries in a sandbox. Let them coexist with the custom objects. This validates the native path before you migrate anything.
- 2.Migrate data in phases — move a subset of historical records to the native object. Test that advisors can find them, that reports work, that integrations aren't broken. Then expand.
- 3.Use feature flags via Custom Settings — this lets you switch traffic between old and new at the record level without a deployment. Slow rollout with instant rollback.
- 4.Deprecate, don't delete — hide old custom objects from the UI, remove them from page layouts, set to read-only. Don't delete until you've run for 60 days with zero usage.
- 5.Test sharing explicitly — any data model change can affect sharing behavior. Rebuild your sharing test suite before any migration.
The Governance Problem You Also Have to Solve
Remediation without governance change just delays the next accumulation cycle. The decisions that led to over-customization — defaulting to custom code, bypassing OOB features, under-investing in FSC knowledge — will recur unless the governance process changes.
Three governance changes that prevent recurrence: a pre-build checklist that requires explicit FSC OOB evaluation before any custom development is scoped; an FSC-competent reviewer on every architecture review (not just a Salesforce generalist); and a technical debt score that is reviewed quarterly by the CTO or Salesforce Owner — not just tracked in a backlog that never gets prioritized.
Have an FSC situation to discuss?
30 minutes. No pitch. Honest conversation.
If this article resonated, chances are you're dealing with exactly the patterns it describes. Let's talk through your specific situation — free.