Airtable makes a nice product-photo inbox. A supplier adds a record, drops an image into an attachment field, fills in the SKU, and the operations team can see the whole queue without opening an engineering ticket. It is much nicer than a spreadsheet full of filenames that only exist on somebody’s desktop.
The trap is treating an Airtable attachment URL like permanent storage. It is not. The useful download links expire, a record can enter the same trigger view more than once, and writing the processed attachment back can accidentally wake the automation up again. The workflow needs to grab the source while it is fresh, keep explicit state, and know the difference between “API call finished” and “Airtable actually stored the result.”
We’ll build the flow with Airtable as the record system, a no-code automation tool or small worker as the file mover, and BackgroundErase as the image processor. The exact connector can change. The fields and failure rules should not.
Base design
Use Airtable for state, not as a forever URL clipboard.
- Trigger only when a source attachment exists and the processing status is
Ready. - Download the attachment immediately; Airtable’s API download URLs expire.
- Key each run by record ID plus source attachment ID or a stored source fingerprint.
- Write the processed image to a different field from the original.
- Update status last, after Airtable confirms the new attachment is present.
01
Give the table a real processing contract
Start with fields that explain what the automation is doing. A single attachment field plus a checkbox called “Done” is not quite enough. You need to preserve the source, store the result separately, and leave enough detail to recover from a run that failed halfway through.
| Field | Type | Purpose |
|---|---|---|
| SKU | Single line text | Stable business identifier for naming and review |
| Source photo | Attachment | Original image; never overwritten by the automation |
| Processed photo | Attachment | Transparent PNG or final catalog derivative |
| Processing status | Single select | Draft, Ready, Processing, Complete, Needs review |
| Source fingerprint | Text | Attachment ID plus size, or a content hash when available |
| Attempt count | Number | Bounded retry tracking |
| Last error | Long text | Useful failure message, not merely “step failed” |
| Processed at | Date/time | Completion and reconciliation marker |
Keep Source photo and Processed photo separate. If the result replaces the source field, you lose the easiest recovery path and make the trigger conditions much harder to reason about. Originals are cheap compared with asking a supplier to find the same photo again.
02
Use a trigger that waits for a complete record
“When record created” sounds right until a person creates the row, spends thirty seconds finding the image, and adds the attachment after the automation has already inspected an empty field. A better trigger is “when record matches conditions” or “when record enters a view,” where the conditions require a source attachment, a usable SKU, and Processing status = Ready.
If you use a view trigger, lock the view and treat entry as an event, not membership as a guarantee. Airtable notes that records already inside the view do not fire when the automation is first turned on, while records that leave and re-enter can trigger again. Its current recommendations are in the official When record enters a view guide.
Good trigger condition
Source photo is not empty, SKU is not empty, Processed photo is empty, and Processing status is Ready.
First action
Atomically or as early as possible set status to Processing and store the source fingerprint being claimed.
Bad trigger condition
Any update to the record. The workflow’s own status and attachment writes will then look like fresh work.
Backfill path
Move existing records through Ready deliberately or run a scheduled reconciliation. Do not expect a newly enabled trigger to discover history.
03
Download Airtable attachments while the URL is alive
An attachment object includes useful metadata such as filename, MIME type, size, attachment ID, and a download URL. The download URL is convenient precisely because an external worker can fetch it without an Airtable browser session. It is also temporary. Airtable says API attachment download URLs expire after a short period and recommends downloading the file before that happens. Read the current details in Airtable’s attachment URL behavior guide.
Fetch the source near the beginning of the run. Do not save its airtableusercontent.com URL in a queue for tomorrow, send it to a long-delay approval step, or treat it as a CDN address. If the workflow needs durable source storage, download the bytes and copy them to S3, Drive, R2, or another object store you control.
Source attachment snapshot
{
"recordId": "recA1B2C3",
"attachmentId": "attSource123",
"filename": "supplier-chair-04.jpg",
"type": "image/jpeg",
"size": 2841942,
"sourceFingerprint": "attSource123:2841942"
}Before calling the image API
- Require exactly one source attachment, or split multiple attachments into separate jobs with their own identities.
- Check the declared MIME type and the response
Content-Typeafter download. - Reject an HTML login page or expired-link response before it becomes an API upload.
- Preserve the original filename and attachment ID in the job log.
- Record the downloaded byte count so a truncated body is visible.
04
Pass file bytes through the automation
The HTTP action needs to do two different binary operations: download the source as a file, then upload that file as multipart form data. In the BackgroundErase request, the binary property maps to image_file. Send format=png, channels=rgba, and whichever size or crop options your catalog standard requires. The API key belongs in a secret or credential field and travels in the x-api-key header.
Equivalent multipart request
curl -f "https://api.backgrounderase.com/v2" \
-H "x-api-key: $BACKGROUNDERASE_API_KEY" \
-F "[email protected]" \
-F "format=png" \
-F "channels=rgba" \
--output supplier-chair-04-clean.pngConfigure the response as a file. If the connector assumes JSON, it may base64-encode the body, display it as unreadable text, or discard it without a useful file output. Check for a 2xx status, an image/* content type, and a nonempty body before continuing. The status badge on the HTTP step is not a visual-quality review, but it should at least prove you received an image.
Meter records, not trigger deliveries
A production Airtable automation needs Business or Enterprise API access; Starter is the manual Studio plan. Build the estimate from unique attachment versions, not raw trigger deliveries, because a replayed automation should reuse the existing result. Check current pricing before a large catalog run.
05
Write the result back without a disappearing attachment
The processed response is raw PNG bytes, while many Airtable record-update actions expect an attachment URL. You have two practical choices. Upload the PNG to durable object storage and give Airtable a fetchable URL, or use Airtable’s direct attachment upload API where your integration can make the low-level request. Airtable documents that direct endpoint in its Web API reference.
External storage plus URL
Best no-code fit. Upload the PNG to S3, Drive, or another file store, then provide a URL Airtable can fetch. Keep it alive until Airtable has copied the attachment.
Direct attachment upload
Best when a worker can call Airtable’s content endpoint with the required base, record, and field identifiers and encode the file correctly.
Do not mark the job complete immediately after sending the Airtable update. Re-read the record or inspect the action response and confirm the Processed photo field contains a new attachment ID. Airtable can accept a record update and still fail to fetch an inaccessible remote file afterward. A URL that needs an Authorization header is not fetchable just because your workflow could fetch it.
Safe commit order
- Upload or stage the processed PNG and retain its durable object key.
- Update the Processed photo field while preserving any attachments the business intends to keep.
- Confirm Airtable has stored a new attachment ID and usable filename.
- Set Source fingerprint, Processed at, and Processing status to Complete.
- Delete a temporary staging object only after Airtable’s copy is confirmed.
06
Make reruns predictable
Use the Airtable record ID as the job container and the source fingerprint as the job version. If the record fires again with the same fingerprint and already has a confirmed processed attachment, return success without another BackgroundErase call. If the source attachment changes, generate a new fingerprint and process the new version deliberately.
Processing state machine
Draft
-> Ready
-> Processing
-> Complete
-> Needs review
-> Retry scheduled
-> ProcessingA status field alone is not a lock if two automation runs can read Ready before either writes Processing. For low volume, the risk may be acceptable if the connector serializes runs. For higher volume, claim the fingerprint in a database or queue with a uniqueness constraint. Airtable remains the team-facing truth, while the job store prevents two workers from paying to clean the same chair.
Do not use the processed URL as identity
Airtable attachment download URLs rotate and expire. The attachment ID, source size, filename, and your own stored hash are better signals. If identity changes because a temporary URL changed, every reconciliation run will look like a brand-new catalog.
07
Separate retries from review
A failed image needs either another attempt or another decision. Those are different queues. Timeouts, 429 responses, and temporary 5xx errors can be retried with backoff. Missing attachments, expired URLs, corrupt files, unsupported types, and unclear visual outputs need a person or a new source.
| Problem | What to record | Next step |
|---|---|---|
| Attachment URL expired | Attachment ID and download status | Refresh record and fetch a new URL |
| Source field empty | Record ID and trigger time | Return to Draft or Needs review |
| API 429 | Attempt count and retry time | Honor Retry-After |
| API 4xx input error | Status and readable response body | Needs review |
| Output URL not fetched | Staging key and Airtable response | Fix access; retry writeback only |
| Duplicate run | Existing fingerprint and output attachment ID | Return existing result |
Add a saved Needs review view with the source thumbnail, error, attempt count, and a button or status change that sends the record back to Ready. The operations team should not need access to the automation tool to rescue an image. The best no-code workflow leaves its sharp edges visible in the system people already use.
For modest catalogs, Airtable can comfortably remain the control board. When thousands of records land at once or several workers need to claim jobs concurrently, put the work on a durable queue and sync status back. The base can still be the friendly front end. It just does not have to cosplay as a lock manager.
The clean handoff
Airtable should tell the truth about every image.
Keep the original attachment, process its bytes while the URL is fresh, confirm the returned file, and commit the new Airtable attachment before declaring victory. With explicit fingerprints and review states, reruns become routine instead of expensive guesswork.
Read the API docs