Airtable meets Shopify for accurate product inventory
Product updates shouldn’t feel like whack-a-mole. But one change in your spreadsheet turns into five edits in Shopify, a missed inventory adjustment, and a “why is this still live?” message from your team.
This Airtable Shopify sync hits eCommerce Managers hard. Agency teams running multiple storefronts feel it too. And a small business owner doing “quick updates” between calls knows the pain by heart.
This workflow makes Airtable your product source of truth and keeps Shopify products, variants, and inventory aligned. You’ll see exactly how it works, what you need, and where teams usually get stuck.
How This Automation Works
The full n8n workflow, from trigger to final output:
n8n Workflow Template: Airtable meets Shopify for accurate product inventory
flowchart LR
subgraph sg0["Manual Launch Flow"]
direction LR
n0@{ icon: "mdi:play-circle", form: "rounded", label: "Manual Launch Trigger", pos: "b", h: 48 }
n1["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Shopify Lookup Product"]
n2@{ icon: "mdi:swap-horizontal", form: "rounded", label: "Check Product Presence", pos: "b", h: 48 }
n3["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Shopify Generate Product"]
n4["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Shopify Fetch Locations"]
n5@{ icon: "mdi:cog", form: "rounded", label: "Completion Marker", pos: "b", h: 48 }
n6@{ icon: "mdi:swap-vertical", form: "rounded", label: "Iterate Records", pos: "b", h: 48 }
n7["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Shopify Modify Product"]
n8["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Airtable Flag Synced"]
n9["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Adjust Inventory Level"]
n10["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Set Initial Inventory"]
n11["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/airtable.svg' width='40' height='40' /></div><br/>Airtable Retrieve Rows"]
n12["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Update Variant Details"]
n13["<div style='background:#f5f5f5;padding:10px;border-radius:8px;display:inline-block;border:1px solid #e0e0e0'><img src='https://flowpast.com/wp-content/uploads/n8n-workflow-icons/graphql.png' width='40' height='40' /></div><br/>Create Variant Details"]
n6 --> n5
n6 --> n1
n0 --> n4
n2 --> n7
n2 --> n3
n4 --> n11
n1 --> n2
n11 --> n6
n3 --> n13
n7 --> n12
n13 --> n10
n12 --> n9
n10 --> n8
n9 --> n8
n8 --> n6
end
%% Styling
classDef trigger fill:#e8f5e9,stroke:#388e3c,stroke-width:2px
classDef ai fill:#e3f2fd,stroke:#1976d2,stroke-width:2px
classDef aiModel fill:#e8eaf6,stroke:#3f51b5,stroke-width:2px
classDef decision fill:#fff8e1,stroke:#f9a825,stroke-width:2px
classDef database fill:#fce4ec,stroke:#c2185b,stroke-width:2px
classDef api fill:#fff3e0,stroke:#e65100,stroke-width:2px
classDef code fill:#f3e5f5,stroke:#7b1fa2,stroke-width:2px
classDef disabled stroke-dasharray: 5 5,opacity: 0.5
class n0 trigger
class n2 decision
class n8,n11 database
classDef customIcon fill:none,stroke:none
class n1,n3,n4,n7,n8,n9,n10,n11,n12,n13 customIcon
The Problem: Inventory and product updates drift across tools
When Airtable is where your catalog lives, Shopify can quietly become “the place things go wrong.” Someone updates a title, a price, or stock-on-hand in Airtable, but the Shopify product stays unchanged. A week later you’ve got mismatched descriptions, duplicate products because a handle changed, and inventory that looks fine in one tool and totally wrong at checkout. The real cost isn’t just time spent fixing it. It’s the mental overhead of second-guessing every product edit and the revenue risk when customers buy items that aren’t actually available.
It adds up fast. Here’s where it usually breaks down in day-to-day operations.
- Teams copy and paste product fields into Shopify, which invites typos and inconsistent formatting.
- Inventory gets updated in the wrong place, so Shopify shows stock that doesn’t match what you can ship.
- Duplicate listings appear when there’s no reliable “match key” between Airtable and Shopify.
- People stop trusting the catalog, then everything slows down because every change needs a double-check.
The Solution: Create and update Shopify products from Airtable (with inventory)
This workflow turns Airtable into your controlled publishing queue for Shopify. It starts by pulling product rows from an Airtable “products” table, but only the ones you’ve marked for syncing (a simple true/false field). For each record, it looks up the matching Shopify product using the slug field (Shopify calls this the handle). If the product exists, the workflow updates it and adjusts the variant details. If it doesn’t exist, it creates the product, creates variant details, and then sets inventory at your store’s default location. Finally, it flags the Airtable record as synced so the same row doesn’t get pushed again.
The workflow kicks off from n8n, fetches your Shopify locations once, then iterates through Airtable records in batches. From there it chooses “create” or “update,” then applies inventory changes and marks the Airtable row complete. Clean loop. Clear ownership.
What You Get: Automation vs. Results
| What This Workflow Automates | Results You’ll Get |
|---|---|
|
|
Example: What This Looks Like
Say you manage 40 products and you update 10 of them each week. Manually, you might spend about 10 minutes per product to update Shopify fields, double-check the handle, and adjust inventory, which is roughly 100 minutes weekly. With this workflow, you update Airtable once, flip the sync flag, and run the automation; your hands-on time is closer to 10 minutes total, then Shopify updates in the background. That’s about 1.5 hours back every week, plus fewer mistakes that lead to customer support headaches.
What You’ll Need
- n8n instance (try n8n Cloud free)
- Self-hosting option if you prefer (Hostinger works well)
- Airtable for your products table and sync flag
- Shopify Admin API (GraphQL) to create/update products and inventory
- Shopify Admin API access token (create a custom app in Shopify admin)
Skill level: Intermediate. You’ll connect Airtable + Shopify credentials and confirm a few field mappings like slug/handle and stock quantities.
Don’t want to set this up yourself? Talk to an automation expert (free 15-minute consultation).
How It Works
A manual run starts the sync. You launch the workflow in n8n (many teams later swap this for a scheduled or webhook trigger). Before it touches products, it fetches your Shopify locations so inventory updates land in the right place.
Airtable records are pulled and filtered. The workflow retrieves rows from your Airtable products table, and you control what moves by setting the sync field to true. That keeps random edits from instantly changing live storefront data.
Shopify is updated with create-or-update logic. For each Airtable record, n8n looks up a Shopify product using the Airtable slug (which Shopify treats as the handle). If it’s found, it updates product and variant details; if not, it creates them.
Inventory is set, then Airtable is marked done. Inventory gets set at the default location, and the Airtable row is flagged as synced so the workflow can move on to the next item without reprocessing old records.
You can easily modify the “sync” rules to support approvals, scheduled publishing, or separate tables for draft vs. active products based on your needs. See the full implementation guide below for customization options.
Step-by-Step Implementation Guide
Step 1: Configure the Manual Trigger
Start the workflow manually so you can test and validate the product sync before scheduling it.
- Add the Manual Launch Trigger node as the workflow trigger.
- Leave default settings as-is since this node requires no parameters.
- Confirm the first connection flows from Manual Launch Trigger to Shopify Fetch Locations.
Step 2: Connect Airtable and Load Source Records
Pull the product rows from Airtable that are flagged for syncing.
- Open Airtable Retrieve Rows and set Operation to
search. - Set Filter By Formula to
syncso only rows marked for sync are returned. - Under Options → Fields, include
title,description,company,status,slug,price,compare_at_price,sku,stock_on_hand, andtype. - Credential Required: Connect your
airtableTokenApicredentials in Airtable Retrieve Rows. - Ensure the flow continues from Shopify Fetch Locations to Airtable Retrieve Rows, then to Iterate Records.
[YOUR_ID], update them or the search will return no records.Step 3: Retrieve Shopify Context and Iterate Records
Fetch the Shopify location once, then iterate through Airtable rows to check for existing products.
- Open Shopify Fetch Locations and confirm Endpoint is
https://store99563.myshopify.com/admin/api/2025-04/graphql.json. - Credential Required: Connect your
httpHeaderAuthcredentials in Shopify Fetch Locations. - In Iterate Records, keep default batch settings to loop through each Airtable row.
- Open Shopify Lookup Product and set Variables to
={ "handle" : "{{ $json.slug }}" }so it searches by the Airtable slug. - Credential Required: Connect your
httpHeaderAuthcredentials in Shopify Lookup Product. - In Check Product Presence, verify the condition checks
={{ $json.data.productByHandle }}with the exists operator.
Step 4: Configure Product Create/Update Branches and Variant Updates
Route existing products to updates and new products to creation, then update variant details in Shopify.
- From Check Product Presence, connect the true output to Shopify Modify Product and the false output to Shopify Generate Product.
- In Shopify Modify Product, set Variables to the provided expression block, including
"id" : "{{$('Shopify Lookup Product').item.json.data.productByHandle.id}}"and fields mapped from Iterate Records. - In Shopify Generate Product, set Variables to the provided expression block, including
"title": " {{ $('Iterate Records').item.json.title }} "and"handle": "{{ $('Iterate Records').item.json.slug }}". - Open Update Variant Details and confirm Variables uses
{{ $json.data.productUpdate.product.id }}and fields from Iterate Records (price, compare_at_price, sku). - Open Create Variant Details and confirm Variables uses
{{ $json.data.productCreate.product.id }}and fields from Iterate Records. - Credential Required: Connect your
httpHeaderAuthcredentials to all Shopify GraphQL nodes (8+ nodes handling lookup, create/update, variants, and inventory).
Step 5: Set Inventory Levels and Flag Airtable as Synced
Update inventory for both new and existing products, then mark the Airtable row as synced.
- In Set Initial Inventory, verify Variables uses
{{ $('Shopify Generate Product').item.json.data.productCreate.product.variants.edges[0].node.inventoryItem.id }},{{ $('Shopify Fetch Locations').item.json.data.locations.edges[0].node.id }}, and{{ $('Iterate Records').item.json.stock_on_hand }}. - In Adjust Inventory Level, verify Variables uses
{{ $('Shopify Modify Product').item.json.data.productUpdate.product.variants.edges[0].node.inventoryItem.id }}, the same location ID, and{{ $('Iterate Records').item.json.stock_on_hand }}. - Configure Airtable Flag Synced with Operation set to
updateand map the record ID to={{ $('Iterate Records').item.json.id }}. - Credential Required: Connect your
airtableTokenApicredentials in Airtable Flag Synced. - Confirm the flow returns from Airtable Flag Synced to Iterate Records, and then to Completion Marker when finished.
Step 6: Test and Activate Your Workflow
Run a manual test to verify product creation, updates, and Airtable sync flags before activating.
- Click Execute Workflow and trigger Manual Launch Trigger to run a test.
- Verify Airtable Retrieve Rows returns records with
syncenabled. - Check Shopify: existing products should go through Shopify Modify Product → Update Variant Details → Adjust Inventory Level, while new products go through Shopify Generate Product → Create Variant Details → Set Initial Inventory.
- Confirm Airtable Flag Synced updates the record so
syncis cleared or set appropriately. - Once validated, switch the workflow to Active for production use.
Common Gotchas
- Shopify GraphQL credentials can expire or miss required scopes. If things break, check your custom app permissions and the Admin API access token in n8n first.
- If you’re using Wait nodes or external rendering, processing times vary. Bump up the wait duration if downstream nodes fail on empty responses.
- Handles are unforgiving. If your Airtable slug changes (or contains spaces), Shopify matching fails and you can accidentally create duplicates instead of updating the existing product.
Frequently Asked Questions
About an hour if your Airtable base and Shopify access are ready.
No. You’ll mostly map fields and paste in an API token.
Yes. n8n has a free self-hosted option and a free trial on n8n Cloud. Cloud plans start at $20/month for higher volume. You’ll also need to factor in Shopify/Airtable plan limits (and API rate limits) if you’re syncing lots of products.
Two options: n8n Cloud (managed, easiest setup) or self-hosting on a VPS. For self-hosting, Hostinger VPS is affordable and handles n8n well. Self-hosting gives you unlimited executions but requires basic server management.
Yes, and honestly it’s a common upgrade. Keep using the sync checkbox, but only set it to true when a second field like “approved_by” is filled in, or when status equals DRAFT/ACTIVE. You can also add a second Airtable table for pending changes, then only push to Shopify after approval. In n8n, this is usually just extra conditions before the Shopify GraphQL create/update nodes.
Usually it’s the Admin API token or missing scopes on the Shopify custom app. Regenerate the token, confirm the workflow’s GraphQL nodes point at your store’s correct URL, and make sure permissions cover products, inventory, and locations. If you’re pushing lots of updates at once, rate limiting can also cause intermittent failures, so batching helps.
Hundreds at a time is typical; the practical limit is Shopify API rate limits and how you batch records in n8n.
Often, yes. This workflow leans on Shopify’s GraphQL Admin API, which is where the “real” product and inventory control lives, and n8n handles branching logic (create vs. update) without forcing you into expensive multi-step task chains. Self-hosting is a big deal if you run lots of syncs, because executions aren’t metered the same way. Zapier or Make can still be fine for simple pushes, like “create product when row is added,” but inventory/location updates get messy fast. If you want help deciding, Talk to an automation expert.
Once Airtable is the source of truth and Shopify stays aligned, product updates stop being a weekly fire drill. Set it up, run it when you need it, and move on to work that actually grows the store.
Need Help Setting This Up?
Our automation experts can build and customize this workflow for your specific needs. Free 15-minute consultation—no commitment required.