HomeShopify & E-commerceHow to Sync Shopify Orders to…

How to Sync Shopify Orders to Airtable With n8n

How to Sync Shopify Orders to Airtable With n8n









Sending your Shopify orders to Airtable with n8n gives you a live, filterable order database that updates the moment a customer checks out. This guide builds a three-node workflow: a Shopify trigger fires on every new order, a Set node flattens the fields you care about, and an Airtable upsert writes one clean row per order. No CSV exports, no manual copy-paste, and no duplicate rows when Shopify resends the same webhook twice.

What it does

Every time a shopper completes checkout, Shopify fires an orders/create event. This workflow catches that event, pulls out the fields that actually matter for reporting, and writes them into an Airtable table as a single row. Because it uses an upsert keyed on the Shopify order ID, a resent webhook updates the existing row instead of creating a second one.

The result is an Airtable base that mirrors your order history in real time. You get order number, customer name, email, order total, currency, financial status, fulfillment status, a readable line-item summary, and the order date, all typed and sortable. From there you can build filtered views (unfulfilled orders, orders over $200, orders from repeat buyers) or link the table to inventory and customer tables you already keep in Airtable.

Why it beats the default

Shopify already lets you export orders, but the export is a manual CSV: you click, you wait, you download, and the file is stale the second you open it. If you want a shared, always-current view for a virtual assistant or a fulfillment partner, a static CSV is the wrong tool.

Airtable fixes that. It gives you typed fields, saved views, grouping, and a mobile app, plus linked records so an order row can point at a product or customer record elsewhere in the base. Pairing it with n8n means the sync is event-driven, not scheduled, so a row appears within seconds of checkout. This is part of a wider pattern of n8n Shopify automation that keeps your back office in sync without paid connector apps.

If you are already logging orders to a spreadsheet, this is the natural upgrade. A flat sheet cannot group by fulfillment status, filter to a date range, and stay readable at the same time. Airtable can.

What you need

  • An n8n instance, either n8n Cloud or a self-hosted install.
  • A Shopify store with a custom app created through the 2026 Shopify Dev Dashboard. If you have not connected Shopify to n8n yet, follow how to connect Shopify to n8n in 2026 first, then come back here.
  • An Airtable account. The free plan is fine to start.
  • An Airtable base with a table whose column names match the fields below. Create the columns before you run the workflow so the mapping resolves cleanly.

Build time is about 20 minutes from scratch, or under 10 minutes if you import the ready-made template at the end of this guide.

Node-by-node list

# Node Type Job
1 Shopify Trigger shopifyTrigger Fires on every new order (orders/create)
2 Map Order Fields set (v3.4) Flattens the order payload into ten clean fields
3 Upsert to Airtable airtable (v2.1) Writes or updates one row, matched on Order ID
┌───────────────────────────────────────────────────────────┐
│  SHOPIFY ORDERS TO AIRTABLE                                │
│                                                           │
│  [Shopify Trigger] → [Map Order Fields] → [Upsert Airtable]│
│    orders/create        Set v3.4            match: Order ID │
└───────────────────────────────────────────────────────────┘

Step-by-step build

  1. Create a new workflow in n8n and add a Shopify Trigger node. Select your Shopify credential (created via the Dev Dashboard method linked above), then set the topic to orders/create. n8n registers the webhook with Shopify automatically when you activate the workflow.
  2. Add a Set node named Map Order Fields and connect the trigger to it. Switch the node to “Manual Mapping” and add one assignment per field you want in Airtable. Use these values:
    • Order ID (string): ={{ $json.id }}
    • Order Number (string): ={{ $json.name }}
    • Customer Name (string): ={{ (($json.customer && $json.customer.first_name) || '') + ' ' + (($json.customer && $json.customer.last_name) || '') }}
    • Email (string): ={{ $json.email }}
    • Total (number): ={{ Number($json.total_price) }}
    • Currency (string): ={{ $json.currency }}
    • Financial Status (string): ={{ $json.financial_status }}
    • Fulfillment Status (string): ={{ $json.fulfillment_status || 'unfulfilled' }}
    • Items (string): ={{ ($json.line_items || []).map(i => i.quantity + 'x ' + i.title).join(', ') }}
    • Order Date (string): ={{ $json.created_at }}
  3. In Airtable, create a table with columns that match those field names exactly. Set Total to a Number or Currency field and Order Date to a Date field; the rest can stay single-line text.
  4. Add an Airtable node named Upsert to Airtable and connect the Set node to it. Choose your Airtable Personal Access Token credential, set Resource to Record and Operation to Upsert, then pick your base and table from the dropdowns.
  5. Set the matching column to Order ID. This is what turns a repeated webhook into an update instead of a duplicate. Map each remaining column to the matching field from the Set node, for example Order Number to ={{ $json['Order Number'] }}.
  6. Save the workflow and toggle it Active. n8n registers the Shopify webhook at this point, so the trigger only fires on orders placed after activation.
  7. Place a test order (or use Shopify’s “Create order” in the admin) and watch a new row appear in Airtable within a few seconds.
Tip: After a successful test order, open the execution in n8n and expand the Shopify Trigger output. Every field you might ever want (shipping address, discount codes, note attributes, tags) is in that payload, ready to add as another assignment.

The order fields written to Airtable

Column Type Example
Order ID Text 5123456789012
Order Number Text #1042
Customer Name Text Emily Rodriguez
Email Text emily.rodriguez@outlook.com
Total Number 148.00
Currency Text USD
Financial Status Text paid
Fulfillment Status Text unfulfilled
Items Text 2x Ceramic Mug, 1x Gift Box
Order Date Date 2026-07-26T14:30:00-04:00
Note: Column names in Airtable must match the assignment names in the Set node character for character. A trailing space or a lowercase letter is enough to make the mapping silently skip that field.

Common mistakes

  • No matching column on the upsert. If you leave the operation on Create, or forget to set Order ID as the match field, every webhook retry adds a duplicate row. Always upsert on Order ID.
  • Mismatched column names. Airtable will not error on a name that does not exist; it just drops the value. Create the columns first and copy the names exactly.
  • Total stored as text. If the Airtable column is single-line text, you cannot sum or filter it numerically. Use a Number or Currency field and keep the Number() wrapper in the Set node.
  • Expecting a fulfillment status on new orders. A brand-new order is almost always unfulfilled, and Shopify sends null. The || 'unfulfilled' fallback keeps the column readable.
  • Using the old custom-app auth. Shopify removed the legacy admin custom-app flow. Create the app through the 2026 Dev Dashboard, as covered in the connection guide linked earlier.

Cost at realistic volume

The stack is close to free for a small store. Self-hosted n8n is free; n8n Cloud starts around $24 per month and its Starter tier covers roughly 2,500 workflow executions, which is 2,500 orders. One order equals one execution here, so a store doing 500 orders a month uses a fifth of that allowance.

Airtable’s free plan holds 1,000 records per base. At 500 orders a month you fill that in two months, so a growing store will want the Team plan (about $20 per seat per month) which raises the limit to 50,000 records per base. Until then, the free tier is enough to prove the workflow out. There are no per-order connector fees, which is the main saving over a paid Shopify-to-Airtable app.

Get the Shopify Orders to Airtable template

The guide above is free to follow, node by node. If you would rather skip the build, the ready-to-import template drops straight into n8n with the trigger, field mapping, and upsert already wired, so you only add your credentials and base ID.

Download the template ($12) →

Instant download · Works on n8n Cloud and self-hosted. Want it built and connected for you? See our done-for-you setup service.

Frequently asked questions

Do I need a paid Airtable plan for this workflow?

No. The Airtable free plan holds up to 1,000 records per base, which covers a young store for months. When you outgrow it, the Team plan raises the limit to 50,000 records per base. The workflow itself is identical on either plan.

Will Shopify resending a webhook create duplicate rows?

No, as long as you keep the upsert set to match on Order ID. Shopify occasionally retries a webhook, and an upsert updates the existing row instead of adding a new one. If you switch the operation to create, you will get duplicates on every retry.

Can I add more Shopify fields to the Airtable table later?

Yes. Add a new assignment in the Map Order Fields node pointing at the Shopify field you want, create a matching column in Airtable with the same name, then map it in the Upsert node. The order payload includes shipping address, discount codes, tags, and more.

Does this replace the Shopify order CSV export?

For most reporting it does. The CSV export is a manual, static snapshot, while this workflow keeps an Airtable base current in real time. You can still export the Airtable view to CSV any time you need a file, so you lose nothing by switching.

What if I already send orders to Google Sheets?

You can run both, or replace the Sheets step. Airtable adds typed fields, filtered views, linked records, and a mobile app that a flat sheet cannot match. The build is nearly the same, so switching the final node from Google Sheets to Airtable takes a few minutes.

Related guides