APIs Will Change: Catch Drift Before Your CRM Goes Quiet
APIs will change: pin versions, run contract tests on live samples, and pause the money path — never trust green executions that wrote empty CRM fields.
William Spurlock Founder — Spurlock Studios Updated 18 MIN
Yes — your automation will break when the API changes. The useful question is whether you notice before the CRM goes quiet. Green executions that write empty fields are worse than hard failures.
Spurlock Studios treats vendor drift as a scheduled certainty, not a surprise. Across 500+ automations, the graphs that survive are the ones that pin versions, assert shape after every external fetch, and pause money paths when the assertion fails. The written shape lives in schema contracts between tools. This post owns versioning, contract tests, detection, and the pause-and-fix runbook. Spine context: Production n8n handbook.
The short answer
- Expect field renames, nullability flips, enum additions, and version sunsets.
- Pin the vendor version when they offer a header or a dated URL. Do not ride
lateston a P1 connector. - Fail loud on shape mismatch — never map “whatever arrived” into production.
- Contract-test the consumer: required keys, types, and mapper output against a fresh sample, not last quarter’s pin.
- Pause irreversible paths when validators trip; patch mappings in staging first.
- Green is not correct if required fields became optional nulls and your CRM accepted blanks.
What kinds of vendor changes break workflows?
| Change type | Symptom in automation | Verified by |
|---|---|---|
| Field rename / remove | Mapping reads undefined; empty CRM fields | Schema validator |
Type change (string → null / object) | Silent coerce or crash mid-flow | Schema validator |
| Enum / status value added | IF branches miss; items stall | Contract tests + sample review |
| Auth / scope change | Sudden 401 / 403 | Error alerts + credential runbook |
| Pagination / rate behavior change | Partial syncs, timeouts | Volume heartbeats + metrics |
| Version sunset | Hard break, or a silent fall-forward | Changelog calendar |
Soft breaks (a rename that leaves optional blanks) hurt more than hard 500s. The workflow stays “green” while the system of record decays.
Vendors do not owe you a stable private field you discovered in a sandbox. If it is not in the documented, versioned contract, do not build a P1 write on it.
Why does a green execution still write empty CRM fields?
Automation rails often treat HTTP 200 as success. Vendors often return 200 with a body that no longer matches what you pinned six months ago. If you only check status codes:
- The node succeeds.
- Your Set / Mapper writes
nullinto required CRM fields. - Downstream sales tools show empty companies.
- Nobody opens the execution because nothing failed.
n8n pinned data makes this worse during tests: yesterday’s shape passes; today’s live payload does not. Pins are fixtures for branch logic. They are not proof the vendor is stable. Production executions ignore pins and hit the live API — which is exactly when the rename shows up.
| Check you run | What it proves | What it hides |
|---|---|---|
| HTTP 200 / node green | The vendor answered | The body still matches your map |
| Editor run against a pin | Your graph handles that fixture | Live keys, types, and enums |
| CRM row created | A write happened | Required fields are populated |
| Error rate flat | Nothing threw | Empty-field rate is climbing |
A contract is a shape plus a failure policy. Status codes are neither.
How do vendors actually version APIs?
Versioning is not one pattern. The pin you set, and the failure you get when you miss the window, depend on the vendor. Read the primary docs; do not invent a house style and assume Stripe, HubSpot, and Shopify share it.
| Vendor | How you pin | Support window (as of Aug 2026) | Miss the window |
|---|---|---|---|
| Stripe | Stripe-Version header, or the account default in Workbench | Dated majors (breaking) plus monthly compatible releases inside a major. Current documented version: 2026-07-29.dahlia | Dashboard default can move when someone upgrades. Webhooks use the version set at endpoint creation, which can diverge from your request pin |
| HubSpot | Date prefix /YYYY-MM/ on REST paths starting 30 Mar 2026 (example: /2026-03/) | New GA every March and September. Current for 6 months, then Supported, then Unsupported at 18 months | Legacy v1–v4 URLs still exist for now. Unsupported versions are not a stability promise |
| Shopify | Version in the request URL (2026-04, quarterly) | Stable versions supported at least 12 months, with ≥9 months of overlap | Shopify falls forward: a retired version is served as the oldest accessible stable. Your pin becomes a lie |
| GitHub REST | X-GitHub-Api-Version header | At least 24 months after a newer version ships. 2026-03-10 is current; requests with no header still default to 2022-11-28 | Unsupported version → 410 Gone |
| Twilio | Date in the path (/2010-04-01) on core REST; other products use /v1 | The 2010 date is famously sticky; do not generalize that calm to every Twilio product | Unversioned or v1 surfaces can move without a dated pin |
Stripe publishes what it considers backward-compatible versus a breaking major. HubSpot announced the date-based shift on the developer changelog: 18 months of support per version, breaking changes twice a year. Shopify posts deprecations on the developer changelog and will fall forward rather than hard-fail an expired URL.
Three operator facts fall out of that table:
- A pin is a request, not a guarantee. Shopify can fulfill a different version than you asked for. Check
X-Shopify-API-Versionon the response. - Webhooks are a second pin. Stripe events follow the webhook endpoint’s version, not whatever your HTTP Request node sent this morning.
- Unversioned surfaces are a shorter leash. Shopify’s own docs mark Ajax, Liquid, OAuth, and several others as unversioned — they can change any time.
Should I pin API versions or ride latest?
Pin whenever the vendor offers a versioned API or header. Riding latest is a choice to accept surprise on someone else’s release day.
| Practice | Do | Do not |
|---|---|---|
| Pin API versions | Set the header or URL version on every P1 connector | Assume “latest” is safer because you want new fields |
| Dual-run a new version | Call old and new in staging; diff mapper output | Flip the production pin on changelog day |
| Webhook versions | Match the webhook pin to the request pin | Upgrade requests and leave the endpoint on last year’s version |
| Unversioned APIs | Put them on a weekly sample-diff cadence | Treat them like Stripe because the brand is big |
| Account-level defaults | Override per request so a dashboard click cannot move you | Rely on Workbench / portal defaults as the only pin |
Stripe is explicit: test a new API version before you commit the account upgrade. GitHub is explicit: read the breaking-changes page for the target version, then change the header. Shopify is explicit: update every quarter, and watch the response header for fall-forward.
If the vendor has no version story, you do not get a free pass. You get a tighter validator and a named human on the changelog.
What does a vendor call a breaking change?
“Breaking” is a vendor word. Stripe publishes the list. Other vendors rhyme with it. Use their list when you decide whether a changelog entry is a pin-flip or a rebuild.
Stripe treats as backward-compatible:
| Compatible (monthly release) | Breaking (dated major) |
|---|---|
| New API resources | Removed resources or methods |
| New optional request parameters | New required request parameters |
| New properties on existing responses | Removed or renamed response properties |
| Property order changes | Type changes on existing properties |
| Opaque ID length/format changes (up to 255 chars) | Semantic changes to existing fields |
| New event types (your listener must ignore unknowns) | Event payload shape changes that your handler assumes |
That table is why “we got a new field” is not an incident and “the field we map is now an object” is. Adding a property does not break a validator that asserts required keys. Removing one does. Changing company from a string to null does.
GitHub’s breaking-changes page is the upgrade guide for a specific dated version — read that page before you flip X-GitHub-Api-Version. Shopify deprecates across supported stables and removes in a later quarter; something deprecated in 2026-10 can disappear in 2027-01. HubSpot’s date versions are immutable once shipped: you migrate by changing the path prefix, not by hoping /2026-03/ grew a new required field.
Operator rule: if the changelog does not name a field you map, you still run the weekly sample diff. Compatible additions are safe for old clients. They are not a promise the vendor left your mapped fields alone.
What is a contract test for an automation?
A schema contract says what the payload must look like. A contract test is the repeating proof that live traffic still matches that contract — and that your mapper still emits the CRM row you think it emits.
Pact is the gold standard when you own both sides: the consumer writes example request/response pairs, the provider verifies them. Consumer-driven contracts exist so you do not wait for a full integration environment to learn the provider moved a field. You cannot make HubSpot or Stripe join your Pact broker. For third-party SaaS, the consumer still writes the test. The provider just will not run it for you.
| Test | You own both APIs | You consume a vendor API |
|---|---|---|
| Pact / CDC | Yes — publish and verify | Consumer half only; treat as fixtures |
| OpenAPI breaking diff (oasdiff) | Yes — fail CI on ERR | Yes, when the vendor publishes a spec you can snapshot |
| JSON Schema / Zod assert on live body | Yes | Yes — this is the default for n8n / Make / Zapier |
| Mapper-output snapshot | Yes | Yes — assert the CRM row shape, not just the inbound JSON |
| Weekly key-set hash | Optional | Yes — cheap drift tripwire |
Minimum consumer contract test for a P1 connector:
- Record a production-like payload (scrub PII). Store it next to the workflow, dated.
- Assert required keys and types with JSON Schema or Zod.
- Run the mapper against that payload. Assert the outbound CRM fields (names, types, non-empty requireds).
- Once a week, fetch a fresh live sample. Fail if keys disappear, types flip, or the mapper output changes.
- If the vendor ships OpenAPI, run
oasdiff breakingagainst last month’s snapshot.oasdiffclassifies definite breaks asERRand will exit non-zero with--fail-on ERR.
That is not a platform team. That is a Code node, a dated JSON file, and a calendar row.
A Code node assertion that belongs on the write path (shape only — adapt field names to your contract):
const body = $json;
const missing = ["id", "email", "company"].filter((k) => {
const v = body[k];
return v == null || v === "";
});
if (missing.length) {
throw new Error(`contract: missing ${missing.join(",")}`);
}
if (typeof body.company !== "string") {
throw new Error("contract: company must be string");
}
return [{ json: body }];
Throw, do not coerce. Coercion is how empty CRM fields get a green execution.
What a contract test is not:
- An editor run against a pin from launch day.
- A status-code check.
- A “we subscribed to the changelog” checkbox with no owner.
- A full end-to-end that writes to production CRM “to be sure.”
How do I detect schema drift without a platform team?
You do not need an oasdiff pipeline on day one. Operators need four cheap controls, in this order:
- Validator node immediately after every external fetch (Zod, JSON Schema, or a Code node that asserts required keys and types).
- Mapper-output assert before any CRM / money write.
- Sample diff weekly: store last-known-good payload hash / key set; alert when keys disappear or types flip.
- Changelog subscription for each critical connector (vendor email, RSS, status page, GitHub releases) with a named owner.
| Control | Catches | Misses |
|---|---|---|
| Hard validator on required fields | Renames, type flips, nulls | Semantic meaning changes (status: open now means something else) |
| Mapper-output assert | You mapped the new key to the wrong CRM property | Vendor kept the key and changed the business meaning |
| Weekly key-set diff | New/removed fields | Value-domain shifts inside the same keys |
| Changelog calendar | Announced sunsets | Silent undocumented edits |
| Volume heartbeat | Sync went quiet | Wrong data at the same volume |
Start with validators on money and CRM paths. Expand to enrichment later. If you only have time for one control this week, put the validator on the write path — not on the Slack notify.
What does the pause-and-fix runbook look like on field-rename day?
When a validator fails or a changelog says a field moved:
- Pause the production workflow (or gate irreversible nodes).
- Capture one failing payload + execution ID into your failure store / DLQ.
- Diff old contract vs new payload — list every mapping that breaks.
- Patch mappings in staging against live (or freshly recorded) samples — not against pins alone.
- Replay a small batch of DLQ items; confirm CRM rows look correct.
- Promote and unpause; watch the next hour of volume and empty-field rate.
- Update the written contract, the contract-test fixtures, and the changelog note with date + owner.
| Step | Done looks like | Common skip |
|---|---|---|
| Pause | Irreversible nodes cannot fire | “Just this one mapping, live” |
| Capture | Raw body + execution ID stored | Screenshot of the error toast |
| Diff | Written list of broken maps | Vibes from one payload |
| Patch in staging | Tests pass on a fresh sample | Editor run on the launch-day pin |
| Replay | DLQ batch matches expected CRM shape | Unpause and “keep an eye on it” |
| Promote | Volume + empty-field rate in band | No watch window |
| Write it down | Contract + fixture + owner dated | “We’ll remember” |
Do not hot-fix a live money path during peak hours because Slack feels urgent. Pause is cheaper than a weekend of CRM cleanup.
Overnight severity — who gets woken, what waits until morning — lives in when automation fails overnight. This page is the first-hour mechanical work after the validator already screamed.
How do I run a connector health review?
Run this monthly for every P1 connector. Quarterly is fine for enrichment. Review immediately after a vendor “platform update” email or a jump in empty-field rate.
- API version still supported (if versioned). Confirm the pin you think you have is the pin the vendor received.
- Response version header matches the request pin (Shopify fall-forward; Stripe webhook vs request).
- Changelog reviewed since last check. Deprecation dates are on the shared calendar.
- Validator still matches production samples, not just the fixture file.
- Contract tests ran against a sample recorded this month.
- OAuth scopes unchanged; refresh still works across the token lifetime you care about.
- Error rate and empty-field rate within baseline.
- Staging credentials separate from production.
- Named owner for this connector. Unowned connectors do not get reviews.
If empty-field rate climbs while error rate stays flat, you are already in a soft break. Do not wait for the monthly slot.
When do I rebuild vs patch mappings?
| Signal | Prefer |
|---|---|
| One or two fields renamed | Patch mappings + update fixtures and tests |
| Vendor new API version with a migration guide | Dual-run old vs new, then cut over |
| Core object model changed (contact vs company split) | Rebuild the sync spine |
| Auth model changed (user OAuth → app install) | Credential redesign + pause dependents |
| You cannot describe the contract on one page | Rebuild until you can |
| Mapping layer is a pile of one-off exceptions | Rebuild. Patches are compounding interest |
Patch when the contract is still true. Rebuild when you are stacking exceptions on exceptions.
A version bump with a vendor migration guide is not automatically a rebuild. Dual-run it. If mapper output is identical on a held-out sample set, you are doing a pin flip, not a rewrite. If entities split or writes now target two objects, stop patching.
How do I dual-run a version cutover?
Do this in staging, on a held-out sample set, before anyone touches the production pin.
- Keep the current pin on the production workflow. Do not “just try the new version” on live writes.
- Clone the fetch + validate + map slice in staging. Point the clone at the new version (header or URL).
- Feed both slices the same record IDs (or the same recorded payloads if the vendor will not replay).
- Diff inbound keys, types, and mapper output. List every mismatch.
- Patch the clone until mapper output matches the last-known-good CRM shape — or until you can explain each intentional difference.
- Replay a small DLQ / sample batch through the clone. Confirm CRM rows in a staging portal.
- Flip the production pin (and the webhook pin, if separate). Watch volume, empty-field rate, and the response version header for an hour.
- Keep the old pin documented for 72 hours if the vendor offers a rollback window. Stripe does, in Workbench, for 72 hours after an account upgrade.
| Dual-run result | Next move |
|---|---|
| Inbound keys identical, mapper output identical | Pin flip. Update the calendar row. |
| New optional fields only | Pin flip. Do not map them on day one unless a write needs them. |
| Required field renamed | Patch mappings + fixtures, then flip. |
| Type flip on a mapped field | Patch or rebuild. Do not flip until the assert passes. |
| Object model split | Stop. This is a rebuild, not a cutover. |
| Response version header ≠ requested version | You are already on a fall-forward. Treat it as an unplanned upgrade. |
Skip the dual-run and you are betting the migration guide listed every field you map. Guides miss the undocumented key you should not have used — and the documented key whose type quietly changed.
Failure mode: the CRM goes quiet
What breaks: HubSpot (or any CRM) renames company_name → company. Your Zap / Make / n8n path keeps creating contacts with blank company. Sales stops trusting the board. Support blames “the automation” without an error screenshot because there is none.
What it costs: days of dirty data, manual backfill, and a frozen pipeline while someone re-maps under pressure. The executions stay green the whole time.
What you do instead:
- Validator fails closed on missing
company. - Items land in DLQ with the raw payload.
- Overnight severity rules from automation fails overnight page or morning-triage based on blast radius.
- Pause-and-fix runbook above — not a live guess in production.
- After the patch, add a contract test that would have failed on the old mapper with the new payload. If you only fix the map, the next rename repeats the week.
The expensive part is not the rename. The expensive part is learning about it from a sales standup.
Why do staging samples beat pinned nostalgia?
Pinned data is useful for branch logic. It is dangerous as your only regression suite. n8n is explicit: pins save you from re-hitting the vendor while you build. Production activations fetch live data. A green editor run on a pin proves nothing about Tuesday’s payload.
Minimum staging habit for critical connectors:
- Record a fresh production-like payload monthly (scrub PII).
- Run validators + mappers against that sample in staging.
- Diff mapper output against last known good CRM row shape.
- If the vendor published a new OpenAPI or changelog entry, run the breaking diff and the dual-run before you touch production.
- Only then promote mapping changes.
| Fixture | Use it for | Retire it when |
|---|---|---|
| Launch-day pin | Branch coverage, “what if null” edits | It is older than 30 days on a P1 connector |
| Dated live sample | Contract tests, mapper snapshots | Replaced by this month’s sample |
| Vendor OpenAPI snapshot | oasdiff / changelog triage | Vendor ships the next spec |
| Synthetic edge cases | Enum misses, empty arrays, extra keys | The live sample already covers them |
If your staging proof still uses a pin from launch day, you are testing your memory of the API — not the API.
What belongs on a change calendar?
You do not need Jira theater. A shared doc row per connector is enough:
Connector | Status page | Changelog URL | Pinned version | Response version | Next review | Owner
CRM sync | ... | ... | 2026-03 | 2026-03 | 2026-03-01 | Alex
Billing | ... | ... | 2026-07-29.dahlia | 2026-07-29.dahlia | 2026-03-01 | Sam
Shop | ... | ... | 2026-04 | check header | 2026-03-01 | Riley
When a deprecation date appears, add a dual-run task immediately — not the week of the sunset. Shopify will fall forward. GitHub will 410. Stripe will keep serving your pin until you upgrade the account or the webhook endpoint. Those are three different incidents. The calendar row is how you remember which one you have.
Changelog subscriptions without an owner are decoration. The control is “Alex reads HubSpot’s changelog every Monday and files a dual-run if a field you map is named.” Unread mail is not a control.
How is OAuth and scope drift different?
Field renames are schema drift. Sudden 401 / 403 after a vendor “security update” is often scope or app-install drift. Same pause instinct, different patch:
- Pause dependents that cannot succeed without auth.
- Reconnect in staging with the new scopes.
- Prove refresh works across the token lifetime you care about.
- Promote credentials, then unpause.
Do not DLQ-storm overnight on a 401. Auth breaks are pause events, not infinite retry events. A dedicated credential lifecycle spoke covers refresh mechanics; here the rule is simpler: treat scope changes like breaking API changes.
| Symptom | Likely cause | First move |
|---|---|---|
| 200 + empty required fields | Schema / mapping drift | Pause writes, run contract tests |
| 401 / 403 burst | Scope, app install, or expired refresh | Pause dependents, fix creds in staging |
| 410 | Version sunset (GitHub-style) | Read breaking-changes, pin a supported version |
| 200 + response version ≠ request version | Fall-forward (Shopify-style) | Treat as an unplanned version upgrade |
| Volume drop, errors flat | Trigger quiet or pagination change | Heartbeat + sample fetch, not a mapper tweak |
How does this differ from schema contracts?
Schema contracts define the agreed shape between systems and how to version that agreement. This post assumes you have (or will write) that contract — then focuses on pinning the vendor version, proving the contract still holds, and what humans do in the first hour when it does not.
| Layer | Owns | Failure if missing |
|---|---|---|
| Schema contract | Required keys, types, enums, reject policy | You cannot say what “valid” means |
| Version pin | Which vendor contract you asked for | You drift when they ship |
| Contract test | Proof the live body and mapper still match | You learn from sales, not from CI |
| Pause-and-fix | First-hour human procedure | You hot-fix production at peak |
Contracts without detection are paperwork. Detection without a pause policy is a louder incident. Version pins without tests are a false sense of safety — especially on vendors that fall forward.
Soft break signals to watch weekly
Hard errors announce themselves. Soft breaks whisper. Watch these metrics even when error counts look fine:
| Signal | Healthy-ish | Investigate |
|---|---|---|
| Empty required CRM fields | Near zero | Rising week over week |
| Downstream “missing company” tickets | Rare | Clustering after a vendor update |
| Validator fail rate | Spike then zero after patch | Low steady drip you ignore |
| Execution success rate | Stable | Stable while business outcomes drop |
| Payload key count | Stable | Sudden drop or surge |
Response API-Version header | Equals your pin | Differs — you already upgraded unwillingly |
| Contract-test suite | Green on this month’s sample | Skipped, or still on the launch fixture |
Business outcome drop with green executions is the smoking gun for schema drift. Add the version-header mismatch to that list. It is the Shopify-shaped version of the same lie.
FAQ
Should I pin API versions?
Yes, whenever the vendor offers a versioned API or header. Pinning delays surprise sunsets and gives you a migration window. Unversioned “latest” endpoints belong on a shorter review cadence, with weekly sample diffs, because you have no pin to hide behind. Match webhook pins to request pins so Stripe (and anyone else who versions events separately) cannot split your graph in two.
Do changelogs actually help?
They help if a named owner reads them on a schedule and turns deprecations into calendar work. Unread changelog mail is not a control. Pair changelog review with validators and contract tests so silent edits still fail loud. Subscribe to the vendor’s developer changelog, not the marketing newsletter.
What is a contract test when I do not own the API?
A consumer assertion: required keys, types, and mapper output against a dated live sample. Pact is the right tool when you own both sides. Against HubSpot or Stripe, you still write the consumer half — you just cannot make the vendor verify it. Refresh the sample monthly. If the vendor publishes OpenAPI, diff it with oasdiff and fail on ERR.
How is this different from schema contracts?
Schema contracts define the shape you expect and the reject policy. This runbook covers pinning the vendor version, detecting when reality diverges, and pausing production until mappings are fixed. Use both. A contract with no test is a document. A test with no pause policy is a pager you ignore.
How often should I review critical connectors?
Monthly for P1 money and CRM paths; quarterly for enrichment. Review immediately after any vendor “platform update” email, a jump in empty-field rates, or a response version header that does not match your pin. The monthly slot is the floor, not the only trigger.
When do I rebuild vs patch mappings?
Patch when a few fields moved and the object model is intact. Dual-run a vendor version bump with a migration guide before you call it a rewrite. Rebuild when entities split, auth models change, or your mapping layer is a pile of one-off exceptions nobody can explain on one page.
CTA
Vendor APIs are not stable pets. Pin the version, prove the contract on a fresh sample, then show you can pause and fix without inventing data.
If you want a drift review on your critical connectors, start at automation or book the $500 Automation Audit.
What questions does this article answer?
- Should I pin API versions?
- Yes, whenever the vendor offers a versioned API or header. Pinning delays surprise sunsets and gives you a migration window. Unversioned "latest" endpoints belong on a shorter review cadence, with weekly sample diffs, because you have no pin to hide behind. Match webhook pins to request pins so Stripe (and anyone else who versions events separately) cannot split your graph in two.
- Do changelogs actually help?
- They help if a named owner reads them on a schedule and turns deprecations into calendar work. Unread changelog mail is not a control. Pair changelog review with validators and contract tests so silent edits still fail loud. Subscribe to the vendor's developer changelog, not the marketing newsletter.
- What is a contract test when I do not own the API?
- A consumer assertion: required keys, types, and mapper output against a dated live sample. Pact is the right tool when you own both sides. Against HubSpot or Stripe, you still write the consumer half — you just cannot make the vendor verify it. Refresh the sample monthly. If the vendor publishes OpenAPI, diff it with oasdiff and fail on `ERR`.
- How is this different from schema contracts?
- Schema contracts define the shape you expect and the reject policy. This runbook covers pinning the vendor version, detecting when reality diverges, and pausing production until mappings are fixed. Use both. A contract with no test is a document. A test with no pause policy is a pager you ignore.
- How often should I review critical connectors?
- Monthly for P1 money and CRM paths; quarterly for enrichment. Review immediately after any vendor "platform update" email, a jump in empty-field rates, or a response version header that does not match your pin. The monthly slot is the floor, not the only trigger.
- When do I rebuild vs patch mappings?
- Patch when a few fields moved and the object model is intact. Dual-run a vendor version bump with a migration guide before you call it a rewrite. Rebuild when entities split, auth models change, or your mapping layer is a pile of one-off exceptions nobody can explain on one page.
Last reviewed
Automation
Automation After the show is not you at 1 a.m.
Post-show onboarding — thank-you, join path, merch nudge — belongs in a human-gated n8n rail, not your thumb at load-out.
Automation Paperwork that is not the plant
Invoice and PO matching, intake, and support triage in n8n with Metrc fences — the paperwork operators hate, not a menu widget.
Automation Saturday still books — the missed-call rail for trades
A missed-call text-back that routes zip and books a slot beats voicemail and Saturday desk coverage you cannot keep staffed. If a kid is cheaper, say so.
Automation Why doesn’t worker concurrency cap my n8n sub-workflows
Worker concurrency does not cap n8n sub-workflows. Each Execute Workflow child is a new execution the production limit skips, usually on the parent worker.
Will's Journal in your inbox.
What I learned this week building for shops, floors, and houses.
You're on the list.
Sign-up failed — try again.
By subscribing, you agree to the Privacy Policy.