A services company runs its delivery work in one Airtable base: projects, the people assigned to them, and the hours they log. Two connections already feed it: a CRM integration brings in customers, and middleware brings in the ERP's service catalog and invoice statuses. Each was reasonable when it was requested, and each was built on its own, in the order the requests arrived.
The result is a billing contact email that delivery leads edit in Airtable and the CRM integration overwrites every five minutes, an integration that rewrites every customer on each of those runs, and two integrations sharing one base’s request limit and one account without anyone having added them up.
Now HR wants approved hours to go from the base to the company’s payroll system without the twice-monthly CSV export, and wants employee records to come back from payroll into the base instead of being typed in by hand. If that two-way connection is built like the first two, without anyone first deciding which payroll fields the base needs, whoever sets up the inbound side could map pay rates and bank details into the base along with the Employee IDs and statuses the base actually uses.
None of that is a build problem. It comes from not mapping system boundaries before the build: deciding, for each system, what it keeps, what Airtable sees of it, which system has the final say on anything they share, and what moves between them, how often and by what route. InAir's guide to running Airtable inside complex, high-volume system landscapes describes what this map feeds into once the build starts. This post covers what the map records, how to fill it in from evidence rather than memory, a one-page template, and the services company's map as a worked example.
The map has one row per connected system and, under it, one row per shared field. For each system, it answers five questions.
List the kinds of information the system holds: customers, products, invoices, employees, projects. For each one, decide where it lives and how much of it Airtable needs. There are four answers, and most landscapes use all of them.
|
Boundary |
What Airtable holds |
Typical case |
|---|---|---|
|
Lives in Airtable |
The full record. Airtable is where it's created and maintained. |
Projects, assignments, internal workflow |
|
ID and status only |
The other system's ID for the record and the one or two values a workflow acts on |
An employee's payroll record, an invoice's payment status |
|
Read-only copy |
The fields people need to see, which nobody in Airtable edits |
A product catalog with prices, maintained in the ERP |
|
Shared field by field |
Some fields owned by Airtable, others by the other system |
A customer record the CRM creates and the delivery team enriches |
The first decision is easy to skip, because copying everything feels safer than choosing. InAir's post on best-of-breed integration strategy makes the case for the second row with a payroll example: "Airtable does not need to store the employee's tax bracket, social security number, or bank routing details," and "It only needs to store the employee's unique ID and their operational status." Every field copied into Airtable is one more field to keep current, one more field someone can edit by accident, and one more place sensitive data can be exported from. The question for each kind of information is what the workflow in Airtable actually reads, not what might be useful one day.
Every shared field needs one system named as the one whose value is correct: the ID and status values in the second row of that table, every field in a read-only copy, and every field in the last row. The map records the answer, field by field. How to make the decision, and what to do when two systems genuinely both need to write a field, is the subject of Cross-System Source of Truth.
Record it per field, not per system. “The CRM is the source of truth for customers” holds only while Airtable’s copy is strictly read-only. Once someone in Airtable needs to record the delivery lead’s name, which the CRM doesn’t know, that field has a different owner, and a rule written per system will let the CRM’s next run overwrite it with a blank.
For each shared field, record its direction: into Airtable, out of Airtable, or both. A field that moves both ways is a field two systems write, so it goes back to question 2 for a rule. Record the route as well: the CRM writing through Airtable's API with a token, an automation in the base posting to the ERP, a one-way Airtable sync, a person pasting values between tabs. The route decides who can see a failure and what limits apply.
Record whether each connection runs when something changes, on a schedule, or by hand, and whether each run sends only the records that changed or every record every time. The second half is the one that costs capacity.
Airtable's API rate limits set two ceilings. The API is limited to 5 requests per second per base, and every integration that calls a base through the API shares that base's five. Separately, there is a limit of 50 requests per second for all traffic using personal access tokens from a given user, which also covers service accounts, so integrations that run on the same account share fifty across every base they reach. Requests that exceed either limit get a 429, and the integration must wait 30 seconds before its requests succeed again.
That's why the map records volume, not just frequency. Airtable's endpoints for creating and updating records take up to 10 records per request, so an integration that rewrites 3,000 customers every five minutes sends 300 requests a run. At 5 requests per second, that's at least a minute of the base's capacity in every five, spent mostly on records that didn't change, and every other integration using the base competes with it for what's left. An integration that sends only changed records might send three.
Exports, values re-typed from one tool into another, status updates sent by email or chat. These are part of the boundary even though no integration carries them, and they're often where the next integration request comes from. Record what moves, who moves it, how often, and what happens when that person is away. Some will become integrations. Others are better left manual with a named owner, and the map is where that's decided on purpose.
A map built from a meeting records what people remember, and that's often a version of the landscape from a year ago. Each answer should come from a conversation with the system's owner and then be checked against something that can't forget.
Questions for each system's owner:
Evidence to check the answers against:
Where the evidence and the owner's answer disagree, the evidence wins, and the disagreement goes on the map as a finding. For a landscape that has already been running for years without any record of its connections, InAir's guide to unmapped architecture covers the forensic version of this step, starting with "Do not modify any tables until you identify who is querying the database."
The map fits on one page as two tables. The first has a row per connected system.
|
System |
Business owner |
Technical owner |
Kinds of information |
Boundary for each |
Route |
Direction |
Frequency |
Changes only? |
Requests per run |
Still moved by hand |
Checked against |
|---|
The second has a row per shared field, which includes every ID and status value, every field in a read-only copy and every field shared field by field.
|
Field |
Airtable table |
Systems that write it |
Final say |
Direction |
Frequency |
Rule when they disagree |
Validated before production? |
|---|
"Systems that write it" is the column that matters most. A field with one writer needs no conflict rule, though it may still need validation. A field with two writers needs a rule in the next column, and the build can't start until it has one.
Filled in, the map answers three of the five factors in the Integration Load framework before anything is built: how many systems are connected, how often they update, and whether ownership is defined. It also records where validation is needed. How that validation works, and how failures become visible, are decisions for the build.
The services company's base holds Projects, Assignments and Time Entries, plus the Customers, Services and People tables that other systems feed. Three systems surround it. To fit the page, the tables below leave out the owner and evidence columns, and the field table leaves out frequency, which each system row already shows, and lists Service Rate as the one example from the catalog.
|
System |
Kinds of information |
Boundary |
Route |
Direction |
Frequency |
Changes only? |
Requests per run |
Still moved by hand |
|---|---|---|---|---|---|---|---|---|
|
CRM |
Customers |
Shared field by field |
CRM integration through the API, on a shared integration account |
Both |
Every 5 minutes |
No, all 3,000 customers |
300 |
Delivery leads email account managers when a project starts |
|
ERP |
Service catalog and rates; invoices |
Read-only copy (catalog); ID and status only (invoices) |
Middleware through the API, on the same integration account |
Into Airtable |
Nightly (catalog); hourly (invoices) |
Catalog: no, all 800 items. Invoices: yes |
80 nightly; usually under 5 hourly |
Finance re-types each project's start date and service into the ERP |
|
Payroll |
Employees; pay |
ID and status only (employees); stays out (pay) |
None yet, all by hand |
Both: Employee ID and status in, approved hours out |
As staff change (employees); twice a month (hours) |
n/a |
n/a |
HR types new Employee IDs and status changes into People, and exports approved Time Entries as CSV and re-types them into payroll |
Three findings come out of the rows before any field is examined. The CRM integration spends 300 requests every five minutes on 3,000 customers, most of which haven't changed, and it shares the base's 5 requests per second with the ERP middleware. Both run on the same integration account, so they also share its 50 requests per second across every base that account reaches. And the payroll connection, which started this round of work, is the only one that still runs entirely by hand, next to the most sensitive system in the landscape.
|
Field |
Airtable table |
External System |
Final say |
Direction |
Rule when they disagree |
Validated before production? |
|---|---|---|---|---|---|---|
|
Customer Name |
Customers |
CRM |
CRM |
Into Airtable |
n/a, one writer |
No |
|
Account Owner |
Customers |
CRM |
CRM |
Into Airtable |
n/a, one writer |
No |
|
Delivery Lead |
Customers |
Airtable |
Airtable |
Out to CRM |
n/a, one writer |
No |
|
Billing Contact Email |
Customers |
CRM, and delivery leads in Airtable |
Undecided |
Both, today |
Needed: delivery leads currently overwrite it |
No |
|
Service Rate |
Services |
ERP |
ERP |
Into Airtable |
n/a, one writer |
No |
|
ERP Invoice ID |
Projects |
ERP |
ERP |
Into Airtable |
n/a, one writer |
No. Needed: arrives with Invoice Status on the same feed, so it goes through the same project and customer check |
|
Invoice Status |
Projects |
ERP |
ERP |
Into Airtable |
n/a, one writer |
No. Needed: arrives keyed by project ID, which must match exactly one project for the same customer as the invoice |
|
Employee ID, Employment Status |
People |
Payroll (typed in by HR) |
Payroll |
Into Airtable |
n/a, one writer |
No |
|
Approved Hours |
Time Entries |
Airtable |
Airtable |
Out to payroll |
n/a, one writer |
No. Needed on the payroll side before hours are paid |
Billing Contact Email is the row the build can't start without. Delivery leads edit it in Airtable when a client tells them on a call, the CRM integration rewrites it from the CRM every five minutes, and whichever wrote last is what the next report shows. The map doesn't decide which value is right. It shows that someone has to, using one of the options in Cross-System Source of Truth: timestamp priority, a source-of-record hierarchy, or a reconciliation queue.
What stays out of Airtable. Pay rates, bank details, and tax information stay in payroll. Airtable gets Employee ID and Employment Status, which is all the assignment workflow reads. The Approved Hours that go out need a route that sends hours keyed by Employee ID and nothing else, so the base never needs the rest of the payroll record to make the connection work.
Which fields need a written rule? Every field with more than one writer; here, only Billing Contact Email needs a conflict rule. The rule can give the CRM the final say, have delivery leads send changes to the account owner, keep whichever value was written most recently, or send disagreements to a reconciliation queue for someone to settle.
If the rule gives the CRM the final say, delivery leads stop editing the field in Airtable, and it becomes read-only there, like Employee ID and Employment Status. Either way, the rule is written down before the connection that would enforce or break it is built.
Which connections need a validation step? Any connection where a bad value would reach something people act on before anyone could spot it. Here the clearest case is the invoice feed: an invoice whose project ID matches no project has nowhere to land and needs to be held rather than dropped.
Writes as that go to a staging table first, as in Building a Staging Layer for Third-Party Webhooks, and a script checks them before they reach production, as in Designing a Validation Script. The read-only catalog can skip the gate if the ERP already checks rates before they're published, so that the realistic failure is a run that doesn't happen and leaves yesterday's rates in place. That's a call the map makes visible rather than one it makes for you.
What each connection is allowed to send. The CRM integration moves to sending only customers that changed since its last successful run, which takes it from 300 requests a run to a handful, and the catalog does the same nightly. With both on one integration account, they also share that account's 50 requests per second, and the Billing Contact Email lock can't hold until the CRM integration writes as an account of its own, so the map points to splitting them.
What happens to the manual steps? The project start email becomes a project status field going out to the CRM alongside Delivery Lead, which already does, and it gets its own row in the shared field table before it's built. Finance's re-typing of start dates and services becomes a question for the ERP's owner: whether the ERP should read them from Airtable, or whether this is one handoff to keep manual with a named owner. The CSV export to payroll becomes the route described above: approved hours keyed by Employee ID, with nothing else from the payroll record in the base.
Once the connections are built, the map doesn't get filed away. Its system rows and shared field rows become the starting entries in an integration registry, one per integration, which adds each one's contract and keeps the record current as the landscape changes, and every new connection request starts by adding its rows to the map before anyone builds anything.
If you'd like help drawing that map for your own systems before the next connection goes in, Schedule a Discovery Call with InAir.