Configuration in the database, not in the code
Six systems that never talk to each other, three API grammars, and every connection written by hand: each new source costs more than the last. The problem is not the amount of code — it is where the field correspondences live.
TL;DR
- Connecting 6 applications point-to-point can require up to 30 data translators; with a canonical data model, 12 are enough (Hohpe & Woolf, Enterprise Integration Patterns).
- A mapping-driven sync engine separates two kinds of work: connectors, which are code, and field-to-field correspondences, which are data.
- We run this pattern in production: a Python engine orchestrated on Trigger.dev, configuration stored in Airtable, six CRM/ERP systems consolidated into a single source of truth. A new source means a new mapping, not new code.
- The Google SRE Workbook describes configuration as the human-computer interface that modifies a system's behavior: a mapping table is exactly that interface, editable by the people who know the fields, not the APIs.
- Expressing business rules in decision tables is an industry standard published by the OMG (DMN), not a workaround.
- The average company deploys 101 applications (Businesses at Work study, commissioned and published by Okta, 2025): point-to-point integration does not survive that sprawl.
Thirty translators for six systems
Let us state a falsifiable thesis up front: in an integration, only the connectors deserve code. Field correspondences — which source field feeds which target field, through which transformation — are business data. They belong in a database, not in a source file. If renaming a field or plugging in a new source requires a deployment, data has leaked into the code.
The arithmetic already points that way. Connecting n applications pairwise requires up to n(n−1) data translators; introducing a canonical data model brings that number down to 2n. For six applications, that is 30 versus 12 — the example comes straight from the reference book Enterprise Integration Patterns (Canonical Data Model pattern).
| Connected applications | Point-to-point translators — n(n−1) | With a canonical model — 2n |
|---|---|---|
| 4 | 12 | 8 |
| 6 | 30 | 12 |
| 8 | 56 | 16 |
The canonical model fixes the combinatorics; the code/data separation fixes the upkeep. A connector is written once per API grammar, then stabilizes. Correspondences never stop evolving: new fields, new values, new sources. Context makes the bill worse: the average company deploys 101 applications, according to the Businesses at Work 2025 study, commissioned and published by Okta. Nobody will ever maintain the point-to-point tangle of a portfolio that size.
Not code, not environment variables: data
The classic objection comes from the twelve-factor manifesto: "strict separation of config from code," hence environment variables. But twelve-factor is about deployment configuration — credentials, service URLs, resources — that is, whatever is likely to vary between deploys. A field mapping does not vary between deploys: it varies with the business.
The Google SRE Workbook frames the question at the right level:
"Configuration is a human-computer interface for modifying system behavior." — The Site Reliability Workbook, ch. 14
The same chapter holds that having both code and data — but separating the two — is optimal, and recommends phrasing configuration options in terms of business goals rather than implementation details. That is precisely what a mapping table does: it asks questions for people who know the data — does source A's work email feed the referential's email field? — never questions about code (endpoints, pagination, authentication). This is what makes configuration-driven integration extensible by non-developers: what they edit is narrow, declarative, and readable.
Six CRM/ERP systems, one engine, one table
We run this pattern in production to consolidate heterogeneous systems. A sync engine written in Python, orchestrated on Trigger.dev, reads its configuration from an Airtable base and connects six CRM and ERP systems to a single source of truth — including a SaaS CRM with custom properties (HubSpot), an ERP whose API implements OData 4.0, an OASIS standard (Dynamics 365), and a legacy line-of-business application that exposes a SOAP/XML API. Three API grammars; one table of correspondences. Syncing multiple CRMs then comes down to adding mapping rows, not code. On the team side: zero manual re-entry.
Each row of the table is a Message Translator — the other founding pattern from Hohpe & Woolf — declared as data instead of coded:
{
"source_system": "crm_a",
"source_field": "work_email",
"transformation": "lowercase, strip whitespace",
"target_entity": "person",
"target_field": "email",
"merge_key": "email",
"direction": "source to referential",
"active": true
}
In ETL terms — extract, transform, load into a unified store, per Microsoft's definition — the connectors extract, the table declares the transformations, the engine loads the referential. The orchestrator brings what a scheduled script does not: queues, automatic retries, real-time monitoring (Trigger.dev describes itself as an open source background jobs framework). We documented the criteria that justify this level of tooling in when to industrialize an automation.
One honest design detail: the Airtable Web API enforces a documented limit of 5 requests per second per base. So the configuration is read at the start of a run and cached — never per record. A configuration layer is read rarely and edited often: exactly the usage profile of a database.
Rules in tables: a proven standard
Storing business rules in tables may sound improvised. It is the opposite. DMN (Decision Model and Notation), a standard published by the Object Management Group, exists precisely to specify business decisions "in unambiguous decision tables," readable by business users. On the research side, Rahm & Bernstein established back in 2001 that schema matching is a fundamental problem of data integration, "typically performed manually." The mapping table does not eliminate that work: it makes it explicit, versionable, and reviewable, instead of scattering it across code.
The difference from a generic rules engine lies in scope:
- no implicit chaining between rules;
- no full expression language;
- a flat mapping — source, transformation, target — executed by an observable orchestrator.
Users map; they do not program. That narrow scope is what keeps the "extensible by non-developers" promise, where overly broad scopes tend to break it.
It is also how older systems become first-class sources again: SOAP 1.2 is a W3C Recommendation from 2003, still spoken by applications in production. The connector absorbs the grammar; the table only sees fields. Same move as modernizing a legacy ERP without replacing it: you wrap the existing system, you do not rewrite it.
The cost of doing nothing — Every point-to-point integration added today is combinatorial debt: at six systems, the full tangle represents up to 30 translators to maintain, and the seventh can add 12 at once (Hohpe & Woolf). Meanwhile, the average portfolio reaches 101 applications (Okta, 2025). And every hard-coded correspondence mobilizes a developer, a deployment, and a regression test — sometimes just to rename a single field.
The mapping table, field by field
Here is the anonymized structure of our mapping table — the one driving the mapping-driven sync of our six sources into the referential. It fits in nine fields.
| Field | Role | Example |
|---|---|---|
| Source system | Designates the connector to invoke | crm_a |
| Source entity | Object read from the source | contact |
| Source field | Exact field extracted | work_email |
| Transformation | Rule applied in flight: normalization, formatting, value lookup table | lowercase + trim |
| Target entity | Referential object being fed | person |
| Target field | Exact field written | email |
| Merge key | Decides "same record or new one?" | normalized email |
| Sync direction | Which system is authoritative, which way data flows | source → referential |
| Active | Per-row switch, no deployment needed | true / false |
Three everyday operations become table edits: plugging in a source (add rows), fixing a correspondence (edit a row), suspending a suspicious flow (deactivate a row). Routine changes move from code review to table review. This clean separation between a stable engine and living configuration is a constant principle of how we build.
The limits of this approach
Connectors remain code: a new API grammar (SOAP, OData, proprietary REST) still takes developer work. A flat table cannot express everything: rich conditional logic, fuzzy deduplication, and multi-step orchestration live in the engine, not in the configuration. The configuration itself becomes a production asset: without change history, controlled edit rights, and a test dataset, you relocate the risk instead of reducing it. Finally, the pattern has an entry cost: below two or three stable systems, a direct script often remains the right choice — which is exactly what our industrialization criteria help decide.
Key takeaways
- Integration work has two natures: stable, rare connectors (code) and living, numerous correspondences (data). The whole pattern is about never mixing the two.
- A field mapping is neither code nor deployment configuration: it is business data, which is stored, versioned, and edited in a database.
- The decisive test for an integration architecture: if plugging in a source or renaming a field requires a deployment, the data lives in the wrong place.
Consolidating heterogeneous systems does not mean rewriting everything: it mostly means deciding where the correspondences live. Putting configuration in the database gives teams control over their flows without turning them into developers. Ownward helps companies perform better through technology — and above all, take back control.
Sources
- Canonical Data Model, Enterprise Integration Patterns — Gregor Hohpe & Bobby Woolf, enterpriseintegrationpatterns.com, 2003. Accessed August 12, 2026.
- Configuration Design and Best Practices, The Site Reliability Workbook, ch. 14 — Google / O'Reilly, 2018. Accessed August 12, 2026.
- A survey of approaches to automatic schema matching — Erhard Rahm & Philip A. Bernstein, The VLDB Journal (Springer), 2001. Accessed August 12, 2026.
- Decision Model and Notation (DMN) — Object Management Group. Accessed August 12, 2026.
- Introduction, official Trigger.dev documentation — Trigger.dev. Accessed August 12, 2026.
- Rate limits, Airtable Web API — Airtable. Verified August 12, 2026.
- Overview of the Dataverse Web API — Microsoft Learn. Accessed August 12, 2026.
- CRM Properties API — HubSpot Developers. Accessed August 12, 2026.
- SOAP Version 1.2 Part 1: Messaging Framework — W3C, Recommendation 2003 (2nd edition 2007). Accessed August 12, 2026.
- Extract, transform, load (ETL), Azure Architecture Center — Microsoft Learn. Accessed August 12, 2026.
- Factor III: Config, The Twelve-Factor App — Adam Wiggins / Heroku, 12factor.net. Accessed August 12, 2026.
- Businesses at Work 2025 — Okta (study commissioned and published by Okta), March 12, 2025. Accessed August 12, 2026.
Proprietary facts (mapping-driven sync engine, six consolidated CRM/ERP systems, configuration in Airtable): Ownward internal data, 2026.
Facts checked on August 12, 2026.
All trademarks belong to their respective owners. This article is neither sponsored nor endorsed by the vendors mentioned.
Is this on your desk right now?
Tell us where you stand. We reply with concrete elements — what we would do first, in your business.
Keep reading
All insightsSeptember 11, 2026 · 7 min read
Govern a Base Like an Internal Product
A spreadsheet updated by hand every Monday, a base built one evening that became critical: most business tools are born without an owner or rules. As long as nobody answers for them, they are not tools that last — they are shadow IT on borrowed time.
September 1, 2026 · 6 min read
Airtable as scaffolding: build what you plan to take down
In 2025, half of IT projects run over deadline, budget or scope, and nearly one in five is abandoned. Yet every internal tool starts as if it were definitive. Owning the temporary — a no-code base built in days, designed to be taken down — remains the decision nobody dares to claim.