Airtable upsert with fieldsToMergeOn: one row per Sume job id
Airtable's performUpsert merges on 1-3 fields. Merge on a Sume job_id field so webhook retries update one row instead of creating duplicates.

Yes: Airtable's update-records endpoint supports performUpsert, which matches on fieldsToMergeOn and updates the one matching record or creates a new one (Airtable API, read 2026-10-02). Put the Sume job_id in a text field and merge on it, and a retried Sume webhook updates the same row instead of adding a duplicate.
How performUpsert behaves
The failure on multiple matches matters here: if two rows already share a job id, the write-back fails loudly instead of picking one.
| Rule | What the page says |
|---|---|
| Merge fields | 1 to 3 field names or IDs in fieldsToMergeOn |
| Unsupported field types | Computed fields such as formulas, lookups, rollups |
| Supported types | Number, text, long text, single select, multiple select, date |
| No match | A new record is created |
| One match | That record is updated |
| More than one match | The request fails |
| Response | Adds createdRecords and updatedRecords arrays |
Why Sume needs it
Sume retries a job webhook when your endpoint returns non-2xx or times out (up to 10 attempts in total). The docs say to treat job_id as the idempotency key on your side. An upsert keyed on that id is the Airtable form of that advice.
A Redeliver call, POST /v1/jobs/{job_id}/webhook/redeliver, re-sends the real terminal event with a fresh timestamp and signature. With an upsert, that second delivery just rewrites the same row.
Setup
- Add a single-line text field such as
sume_job_id. Do not make it a formula or lookup. - On submit, store the job id returned in the first response, since every Sume mode returns the id immediately.
- On the webhook, verify the signature first, then send an upsert with
fieldsToMergeOn: ["sume_job_id"]and the result URL and status as fields. - Use
typecastonly if you need Airtable to convert strings; it is off by default on Airtable's side.
Limits to remember
Airtable says it may throttle upserts differently from standard requests, so keep your write rate conservative. And an upsert only protects Airtable: it does not stop a duplicate paid submit. For that, send an Idempotency-Key on the Sume submit and reuse it only for exact retries.
Sources
Related posts
More in Integrations
- Amp MCP server: amp mcp remote add with a bearer token file for Sume
Add Sume's hosted MCP to Amp with amp mcp remote add --auth bearer --bearer-token-file, so the Sume API key never appears in a command line.
- Apps Script doPost and the Sume webhook signature: what you can verify
An Apps Script web app doPost documents the body but no headers, and Sume signs in headers. Treat the callback as a hint and re-read the job with your key.
- Apps Script 90-minute daily trigger runtime: polling Sume jobs
Consumer Google accounts get 90 minutes of trigger runtime a day. Poll Sume jobs from one time-driven trigger that scans the sheet, not one trigger per row.
- Apps Script UrlFetch 20,000 calls a day: budget Sume polling
Consumer Apps Script allows 20,000 UrlFetch calls a day and 90 minutes of trigger time. One Sume bulk run per sheet plus a slow poll fits well inside both.
Written by Sume