PastBehavior / Research
Research 023 · Enterprise platforms · August 2026
Download PDF

Where should customer complexity live?

What history shows about scaling a standardized product as enterprise customers demand more complexity.

Enterprise customers create exceptions. The question is not whether those exceptions exist, because they always do. It is where the work created by them ends up. Complexity does not disappear when a company holds its architecture. It gets assigned somewhere, sometimes without anyone deciding.

The executive question

Where did the last customer’s complexity go?

The five destinations

Follow the work

A requirement that does not fit the product has to be absorbed by someone. There are five places it can go, and each produces a different company.

DestinationWhat it meansWho carries the workWhere the cost appearsScaling risk
Product configuration
What it means

The platform already has a model for the requirement. The customer sets values inside a schema the vendor owns.

Who carries it

The vendor builds and maintains the abstraction; customers reuse it.

Cost appears

Mostly in product and platform R&D, with relatively low incremental cost per customer.

Scaling risk

The schema stops fitting, and requirements start arriving that have no place to go.

Controlled extensions
What it means

Customers or partners add behavior inside a runtime and a contract the vendor defines and versions.

Who carries it

The customer or an app developer, inside the vendor’s boundary.

Cost appears

In platform engineering, and in the vendor’s testing surface.

Scaling risk

The contract has no version or no deprecation path, so the extension becomes permanent.

Customer environment
What it means

Custom code, workflows, and integrations accumulate in the customer’s own instance or estate.

Who carries it

The customer’s IT organization.

Cost appears

Nowhere in the vendor’s accounts. In the customer’s cost of change.

Scaling risk

Customer-specific code can accumulate outside the vendor’s visibility while the vendor’s own release metrics remain healthy.

Implementation partners
What it means

Systems integrators configure, integrate, and migrate, often billing the customer directly.

Who carries it

The partner’s consultants.

Cost appears

On the partner’s income statement and the customer’s budget.

Scaling risk

The vendor loses sight of how its product is actually deployed, and inherits partner quality.

Vendor services
What it means

The vendor’s own people configure, integrate, migrate, and support each enterprise customer.

Who carries it

The vendor’s services organization.

Cost appears

Immediately, in services gross margin.

Scaling risk

Growth becomes headcount-bound, and delivery capacity gates new logos.

Why it matters financially

Software margins do not tell you what complexity costs

Two companies, two structures, and in both cases the software economics and the deployment economics sit far apart inside the same business.

Guidewire · FY2025
70%Subscription and support gross margin
13%Services gross margin

The software and the work required to deploy it can have completely different economics inside one company, in one year, across one customer base.

Zuora · FY2019
77%Subscription gross margin
55%Blended gross margin
25%Professional services as a share of revenue

When the vendor carries implementation itself, the cost surfaces in its own accounts. Zuora disclosed a quarter in which services cost more to deliver than they generated.

What history shows

Four things the record actually supports

Each rests on a company’s own filings, changelogs, or documentation rather than on commentary about them.

Build the abstraction before the variations arrive

Adyen

Adyen supports more than 100 payment methods on one platform, and those methods behave differently from each other in flow, failure, and settlement. Its own documentation shows a payment method being requested and configured per store, with bulk actions for adding several at once.

The hundredth payment method entered a model that already existed. A genuinely novel requirement would require the model itself to change.

DiagnosticWhen a large customer asks for something unusual, are you adding another instance to an existing model, or inventing a new model?

Know what you can take back

Salesforce

Salesforce retires old API versions on a published schedule, and retired calls fail outright. Its own retirement notice states that the retirement does not include Apex classes, Apex triggers, Visualforce pages, or versioned metadata components in managed packages.

Old tenant-resident code is not swept up by that mechanism. Salesforce holds a hard boundary at the integration layer and declines to enforce one inside the customer’s instance.

DiagnosticWhich customer-specific behaviors could you actually retire, and which have effectively become permanent?

Build the replacement before removing the old surface

Shopify

Checkout extensibility became available on all Shopify Plus stores on 30 January 2023. Fourteen days later Shopify announced that checkout.liquid was deprecated and would stop working for in-checkout pages on 13 August 2024.

Merchants had a supported destination in market before the deprecation was announced, then roughly eighteen months before the first enforcement date.

DiagnosticIf you removed your hardest-to-maintain customization surface, what would customers migrate to?

Decide who carries the implementation labor

nCino · Guidewire · Zuora

nCino’s filings describe systems integrators performing most implementation for enterprise and larger regional institutions, billing those customers directly, while nCino delivers services itself at the small end. Guidewire cut a full-year revenue outlook in March 2024 because partners were leading cloud engagements faster than expected. Zuora kept the work in-house.

Implementation complexity can be moved. It cannot be declared gone.

DiagnosticWhose employees do the work for your largest customers, and whose invoice carries it?
The decision

Where should the complexity go?

None of these is superior to the others. They carry different costs, and the cost of choosing by accident is higher than the cost of choosing any one of them deliberately.

Put it in the product when

  • The requirement repeats across customers
  • It fits a general abstraction you can name
  • You can own and version it
  • Each new instance should get cheaper

Put it in an extension layer when

  • Customer variation is legitimate and specific
  • You cannot predict every use case
  • Behavior can sit inside a stable contract
  • You know how that contract will evolve

Put it with partners when

  • Implementation labor is substantial
  • Deployment needs domain expertise you lack
  • You want to preserve software economics
  • The work can be done without fragmenting the product

Keep it in vendor services when

  • The implementation knowledge is strategically valuable
  • The product is still learning from deployments
  • The work cannot yet be standardized
  • You are knowingly accepting the margin trade

Services intensity is not automatically failure. Guidewire has run the last two of these together, taking capped-fee implementations to accelerate cloud migration while shifting engagements to partners. Adyen absorbed enormous variation on one platform for two decades. Workday combined a single codeline with a customer extension platform for years. The pattern is deliberate placement rather than elimination.

The failure mode

The dangerous state is accidental complexity

The dangerous state is not customization itself. It is customer-specific work accumulating somewhere without anyone deliberately deciding that is where it should live.

Engineers repeatedly add one-off logic for a named account
Customer-created behavior has quietly become impossible to remove
Services hours rise while the work is still called configuration
Implementation moved to partners and nobody measures what customers now pay
New requirements keep needing new concepts rather than new values
Old behavior cannot be retired because there is no supported migration path

Each of these is survivable alone. What makes them costly together is that none of them arrives as a decision. They surface later, as a deployment timeline nobody can explain.

Triage

How to route a new requirement

Four questions, then one test that matters more than the route you took to reach it.

01

Does a general model already exist?

Yes → configuration. Add the instance and move on.

02

Will the requirement repeat?

Yes → expand the product abstraction now, while there is one instance to design against.

03

Can it live inside a controlled extension boundary?

Yes → extension layer, on a versioned contract you can later change.

04

If not, who should carry the work?

Vendor services · Partner · Customer

Then the test: is that destination intentional, measured, and priced accordingly?

Know what the product absorbs.Know what customers can create.Know what can be removed.Know who carries the remaining labor.
Self-assessment

Five questions for your own company

Answerable this week by people who already know. Mark each honestly.

Question one

When the last three large customers asked for something unusual, did engineers add an instance to a model that already existed, or invent a new one?

Question two

Which customer-specific behaviors could you actually remove, and on what notice?

Question three

If you eliminated your most problematic customization surface, what would customers move to?

Question four

Who performs the majority of implementation work for your largest customers, and on whose invoice does it appear?

Question five

Are implementation economics improving as you scale, or moving off your financial statements?

Unresolved complexity

Answer the five above. This is not a maturity score. It measures how much of your customer complexity currently has a destination somebody can name.

A company can maintain one codebase, one release cadence, and one version of its product long after customer complexity has moved somewhere the architecture diagram does not show.

It may be sitting in customer code, in an implementation partner’s delivery practice, in a services organization, or in a product abstraction that absorbed it successfully years ago and never made a sound.

So ask where the last customer’s complexity went. And whether that is where you intended it to go.