Skip to content

Common Data Model vs Per-Customer Data Model: Architecting Unified APIs for Enterprise SaaS

Evaluate unified API architectures to handle bespoke enterprise schemas, custom fields, and custom objects without writing integration-specific code.

Sidharth Verma Sidharth Verma · · 5 min read
Common Data Model vs Per-Customer Data Model: Architecting Unified APIs for Enterprise SaaS

Your unified API vendor promised you a single canonical schema for CRM contacts. The demo worked flawlessly. Then a $400K enterprise prospect shared their Salesforce org: 147 custom fields on Contact, a Deal_Registration__c custom object driving their partner pipeline, and a Forecast_Override__c rollup field that the CFO checks every Monday morning.

Your unified schema maps first_name, last_name, and email. Everything else is dropped or shoved into an opaque remote_data blob. Engineering estimates "six weeks minimum" to add support via custom code. Sales loses the quarter.

If you are evaluating unified API architectures, you are likely trying to solve this exact problem: how to handle bespoke enterprise schemas, custom fields, and custom objects without reverting to writing custom integration code.

This is the architectural fork every B2B SaaS integration team eventually hits: do you standardize on a common data model, or do you architect for per-customer data models? The right answer is not "pick one." It is understanding where each model earns its keep, where standard schemas fail in enterprise environments, and how to architect an integration layer that adapts to infinite schema variations using declarative transformations.

The Enterprise Integration Trap: Why Rigid Schemas Kill Deals

Enterprise buyers do not purchase isolated software. They purchase nodes in a massive, interconnected graph of data. Companies already use 106 SaaS applications on average, and in large enterprises that number can exceed 131. Every one of those systems has a schema shaped by years of admin customization, acquisitions, and business-specific processes. The Salesforce org you integrate with in month one is not the Salesforce org you integrate with in month twelve.

Integration quality is a primary driver of software purchasing decisions and pipeline velocity. 90% of B2B buyers either agree or strongly agree that a vendor's ability to integrate with their existing technology significantly influences their decision to add them to the shortlist. Furthermore, industry data indicates that 51% of B2B buyers explore new vendors specifically because of poor integration with their existing technology stack.

The business impact is highly tangible: businesses with 5 or more integrations are willing to pay 20% more for the same core product. But this willingness to pay is contingent on the integration actually supporting their specific business processes.

If your "integration works" story collapses the moment a prospect's systems administrator pastes their custom object schema into Slack, you are not just losing the technical review. You are losing the deal. The fork in the road is architectural. A common data model trades depth for uniformity. A per-customer data model trades uniformity for the ability to match any customer's actual data. Choosing wrong at the platform layer is expensive; you cannot bolt one onto the other later without a complete rewrite.

What is a Common Data Model (CDM) in APIs?

An common data model (also called a canonical data model) in APIs is a standardized, intermediary schema that sits between your application and every third-party API you integrate with. Instead of writing bespoke data transformation logic for Salesforce, then HubSpot, then Pipedrive, you map each provider's response to one shared schema.

You map all disparate systems into one abstract contact resource with predictable fields like id, first_name, email_addresses [], and phone_numbers []. Your application code reads and writes against that single schema, and the mapping layer handles translation in both directions.

This architecture exists to solve the N-squared integration problem. Without a common data model, connecting N systems requires mapping between every pair, scaling at roughly N². Introducing a canonical data model collapses that to 2N. Each new system only needs to be mapped twice: once to translate its native format into the canonical model, and once to translate the canonical model back.

An CDM works beautifully for the commodity 80%:

  • Standard CRM fields: name, email, phone, company, title
  • HRIS employee records: start date, department, manager
  • Ticketing objects: subject, status, priority, assignee
  • Accounting entities: invoice, line item, tax, customer

These exist in almost every provider, mean roughly the same thing, and can be normalized without much loss. If your product only needs to read the commodity 80%, a common data model is highly effective. It is faster to ship, simpler to reason about, and lets your product engineers pretend the underlying provider doesn't exist. If HubSpot changes their API version, the unified API provider updates the mapping, and your application code remains untouched.

The problem starts the moment your enterprise buyer says, "but we also need this field."

Where the Common Data Model Breaks Down in B2B SaaS

The reality of enterprise SaaS is that custom fields, custom objects, and bespoke schemas are the rule, not the exception. A canonical schema is, by definition, the intersection of all providers. It cannot represent what only one provider (or one customer's instance of one provider) has. They flatten highly customized environments into a rigid structure.

In enterprise Salesforce, HubSpot, or NetSuite environments, the 20% you cannot represent is exactly where the actual business logic lives. Three failure modes consistently show up in production:

1. Custom fields disappear. Salesforce admins routinely add hundreds of custom fields with the __c suffix. HubSpot orgs create custom properties. NetSuite deploys custom record types. A rigid CDM silently drops them, or dumps them into an unstructured custom_fields bag your product code cannot reason about.

2. Custom objects have no place to live. A Deal_Registration__c object with foreign keys to Account, Opportunity, and Partner__c is not a contact. It is not an opportunity. It is not anything your canonical model knows about. Standard unified APIs simply do not have a canonical resource for it, which is why enterprise teams increasingly seek a unified API that doesn't use standardized data models for custom objects.

3. Field semantics diverge between customers of the same provider. Customer A uses the Description field on Contact for meeting notes. Customer B uses it for GDPR consent records. Same provider, same field, incompatible meaning. A single canonical mapping cannot serve both without breaking one of them.

FAQ

What is the difference between a common data model and a per-customer data model in unified APIs?
A common data model exposes a single canonical schema shared across all providers and customers, which works well for standard fields but drops custom fields and objects. A per-customer data model uses that canonical schema as a base and layers per-environment and per-account overrides on top, mapping each customer's bespoke fields dynamically without forking code.
When should I choose a common data model over a per-customer data model?
Choose a pure common data model if your product only reads and writes standard commodity fields (name, email, invoice totals) and your target market is SMBs with minimal customization. If you sell into enterprises where administrators routinely add custom objects, you need a per-customer data model layered on top.
How do unified APIs handle custom fields without writing integration-specific code?
Modern unified API architectures store mappings as declarative configuration—typically JSONata expressions—in a database, and resolve them through an override hierarchy at request time. Adding a customer's custom field becomes a configuration change scoped strictly to that account, not a code deploy.
Does a per-customer data model break the abstraction that makes unified APIs valuable?
No. The unified interface your application calls stays constant. Your product code still calls `GET /unified/crm/contacts` and receives a predictable shape. The mapping layer beneath it handles the bespoke transformations invisibly.
How should rate limits be handled when querying custom objects through a unified API?
The unified API should pass HTTP 429 errors straight through to the caller and surface standardized rate-limit signals via the IETF `ratelimit-limit`, `ratelimit-remaining`, and `ratelimit-reset` headers. Silent retries at the API layer cause cascading timeouts and hide upstream limits from your application.

More from our Blog