A company buys a COTS CRM platform and heavily customizes it to match its exact sales process by directly modifying core workflow logic. Eighteen months later, upgrading to the vendor's new major version breaks most of the customizations. What went wrong in how the customization was done, and how should it have been managed instead?
answer
- core layer vs extension layer
- core hacking breaks on upgrade
- use vendor's sanctioned extension points
- support voided by core modification
- customize only the differentiating slice
basics
~20 sThey edited the software's core parts directly instead of using the vendor's safe, supported ways to customize it, like plugins or settings. The next update assumed nobody touched the core, so it broke. Use only supported extension points instead.
solid answer
~40 sThe customization was done by modifying the vendor's core code or workflow engine directly rather than through the supported extension surface -- plugin APIs, configuration, scripting sandboxes, or webhooks the vendor explicitly maintains compatibility for across versions. When customization lives outside the vendor's supported boundary, every vendor upgrade is effectively an unversioned breaking change to code the team doesn't control and can't preview. The fix is to treat the COTS product as a platform with a stable public contract: push customization through its documented extension points, keep custom logic in separately versioned code the team owns, and only customize the thin slice of behavior that is genuinely differentiating, buying the rest as-is. This mirrors the same core-vs-commodity discipline applied at the customization layer rather than at the build-vs-buy layer.
go deeper
Should understand at a basic level that bought software has a 'right way' to customize it (settings, plugins) versus editing it directly, and that editing it directly is risky.
Should be able to identify, for a real platform they've used, which specific extension mechanisms exist and steer a customization request toward them.
Should design the customization strategy proactively during vendor evaluation and set organizational guardrails (review gates, POCs) before contract signature, not just react after a broken upgrade.
Should recognize this as a recurring instance of the core-vs-commodity discipline applied one layer deeper, and generalize the lesson across every COTS/SaaS relationship the organization holds, not just the one that broke.
## The failure pattern This failure pattern -- often informally called 'the COTS customization trap' or 'core hacking' -- happens when a team treats a bought platform's internals as if they were the team's own codebase, editing workflow engines, database schemas, or core business logic files directly instead of working through the interfaces the vendor designed for extension. It is one of the most common and expensive failure modes in enterprise software adoption, and it shows up across CRM, ERP, and content-management deployments alike. ## Core layer and extension layer Mechanistically, most mature COTS/SaaS platforms ship two layers: - **a core layer** the vendor owns, tests, and evolves under their own release schedule - **an extension layer** -- plugin APIs, configuration-driven workflow builders, scripting sandboxes (e.g., a CRM's formula/Apex-like language), webhooks, and custom-field frameworks -- that the vendor explicitly commits to keeping stable or migrating forward across versions. When customization stays inside the extension layer, a major version upgrade is the vendor's problem to keep compatible, because that's the contract the vendor is selling. When customization instead patches or overrides the core layer directly (modifying vendor source, injecting SQL that assumes a specific internal schema, monkey-patching a workflow class), the team has silently taken on the vendor's own maintenance burden without any of the vendor's foresight into what the next release will change. ## Why teams do it anyway This pattern exists because business stakeholders reasonably want the bought tool to fit their process exactly, and the extension layer sometimes feels slower or more limited than just editing the thing directly, especially under deadline pressure. Teams rationalize core modification as a shortcut, not realizing they are trading a one-time convenience for a recurring, compounding liability. ## The trade-off The trade-off is stark once framed correctly. - **Customizing through supported extension points** costs more up front -- the extension APIs are often less flexible than raw code access, forcing some workflow compromises, and the team has to learn the vendor's specific extension model. In exchange, upgrades remain the vendor's responsibility, support tickets stay valid (many vendors refuse support once core files are modified), and the customization survives version changes because the vendor tests the extension layer's backward compatibility as part of shipping every release. - **Modifying the core layer directly** is faster today and gives unlimited flexibility, but every subsequent vendor release becomes an unplanned, uncontrolled migration project, support contracts are frequently voided, and the team ends up doing bespoke-software maintenance work while still paying full SaaS/license fees for a product they can no longer safely upgrade. ## In production In production, this failure shows up as: - an upgrade that was supposed to be a routine, low-risk vendor release turning into a multi-week fire drill because dozens of core-modified workflows silently broke - a vendor support ticket being rejected with 'this system has been modified outside supported parameters, please restore to baseline before we can assist' - a company deliberately staying multiple major versions behind current because nobody can afford the migration, which then means missing security patches and losing features other customers get for free Over time this often forces exactly the outcome the company was trying to avoid by buying in the first place -- a de facto in-house maintenance team, but now maintaining someone else's codebase instead of one designed for extension. ## A real-world pattern A well-known real-world pattern of this is enterprise ERP and CRM deployments where organizations directly modified vendor source code (a practice long associated with heavily customized SAP and PeopleSoft installations) rather than using the vendor's sanctioned customization layers (like SAP's user-exits/BAdIs or Salesforce's Apex/Lightning framework), and later found upgrades so expensive and risky that they either skipped years of releases or undertook costly 're-implementation' projects to strip out the core modifications and rebuild the same behavior through supported extension points. Some of these projects took longer and cost more than the original implementation, because untangling years of accumulated core patches from a live production system, without breaking the business processes running on it, is inherently riskier than building against a stable interface from day one. ## The lesson The lesson generalizes beyond any single vendor incident: when buying a platform, the build-vs-buy discipline of protecting only the genuinely differentiating slice of work applies again, one layer deeper, at the customization layer itself. Customize the thin part of the workflow that is truly unique to the business, through the vendor's supported extension surface, and accept the vendor's default behavior for everything else, rather than re-fighting the commodity-vs-differentiating battle by hand-editing code that the vendor never intended anyone outside their own release process to touch.
- How can a team detect, before signing the contract, whether a COTS product's extension layer is rich enough to avoid needing core modification later?During evaluation, map the team's must-have workflow requirements against the vendor's documented extension APIs, configuration options, and scripting sandbox specifically, not just the product's marketing feature list, and ask the vendor directly whether similar customizations by other customers survived recent major version upgrades. A proof-of-concept that implements the two or three hardest customization requirements using only supported extension points before signing is the strongest signal.
- Is it ever acceptable to modify a vendor's core code directly?Only in narrow, explicitly acknowledged cases -- for example, a fully self-hosted open-source product where the team consciously takes on fork-maintenance responsibility, budgets for merging upstream changes, and treats the result as effectively an in-house build going forward. For closed-source or SaaS products this is essentially never acceptable since there's no legal or technical path to safely maintain a fork.
- What organizational practice helps prevent teams from drifting into core modification under deadline pressure?A customization review gate that requires any change touching the vendor platform to be classified as either 'uses a supported extension point' or 'requires vendor core change,' with the latter needing explicit sign-off that acknowledges the upgrade risk being accepted, makes the trade-off visible instead of letting it happen silently in a rushed pull request.
It's like buying a car and welding custom brackets directly onto the engine block instead of using the manufacturer's accessory mounting points -- it works fine until the next scheduled service, when the mechanic can't safely work on an engine that's been altered outside spec, and the warranty is void.
saying these in an interview costs you the question
- Doesn't distinguish between the vendor's core layer and its supported extension layer
- Treats direct source modification as equivalent to using a plugin API
- Has no plan for how customizations survive the vendor's next major release
- Assumes vendor support remains valid after modifying core code
- Customizes the entire workflow instead of only the genuinely differentiating slice