How it works

Follow these 8 simple steps to start syncing Shopify products to Airtable automatically

Shopify logo icon

Product Updated

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: This trigger captures every product modification in Shopify, enabling real-time Airtable synchronization that keeps your product database current whether changes come from manual edits, bulk updates, or app integrations.

When a product is updated in Shopify (any field changes including title, description, price, inventory, variants, images, or tags), this trigger activates the workflow and captures complete product data including {{shopify.id}}, {{shopify.title}}, {{shopify.image.src}}, and all product properties. The workflow runs for every product update in your store.

Get Products

App connector: Airtable • Time to complete: 5 minutes
Why this matters: Retrieves existing product records from Airtable to enable the workflow to determine whether to create new records or update existing ones, preventing duplicate product entries.

This step lists all records from the "Products" table in your Airtable base. Setup requirement: You need an Airtable base with two tables: "Products" and "Variants". The template provides a pre-configured Airtable base you can copy—click the Airtable template link, make a copy to your workspace, then select that copied base in the workflow configuration. The Products table should have columns for Product ID, Title, and Images. The Variants table should have columns for Variant ID, SKU, Title, Product (linked record to Products table), Price, and Compare At.

Product Fields

App connector: Transform • Time to complete: 0 minutes (Auto-configured)
Why this matters: Maps Shopify product data into the field structure expected by Airtable, preparing the data for upsert operation with proper field names and values.

This transform step creates a mapping object with three fields: "Product ID" ({{shopify.id}}), "Title" ({{shopify.title}}), and "Images" ({{shopify.image.src}}). This structured data is passed to the next step for upserting to Airtable. The transform ensures data is in the exact format Airtable expects for record creation or updates.

Upsert Product To Airtable

App connector: Code • Time to complete: 0 minutes (Auto-configured)
Why this matters: Creates or updates the product record in Airtable using intelligent upsert logic that searches by Product ID to determine whether this is a new product or an existing one requiring updates.

This custom code step implements an "upsert" operation (update if exists, insert if new) for the Products table. It uses the table_name "Products", field_name "Product ID", and field_value {{shopify.id}} to search Airtable for an existing record.

If a record with this Product ID exists, it updates that record with the current product data from the transform step.

If no record exists, it creates a new one. The code returns the Airtable record (including its Airtable record ID as {{airtable_product_upsert.id}}) which is needed to link variants to this product in subsequent steps.

Upsert logic (from airtable_product_upsert.js):

1. Search Airtable for record where Product ID matches {{shopify.id}}
2. If found: Update existing record with current product fields
3. If not found: Create new record with product fields
4. Return the Airtable record with its ID

Get List of Product Variants

App connector: Shopify • Time to complete: 0 minutes (Auto-configured)
Why this matters: Fetches all variants associated with the product from Shopify to ensure complete variant data synchronization, including newly added variants or updated pricing for existing variants.

This step retrieves all variants for the product using {{shopify.id}} as the product identifier. It returns an array of variants as {{shopify_1}} with each variant containing properties like {{variant.id}}, {{variant.sku}}, {{variant.title}}, {{variant.price}}, and {{variant.compare_at_price}}. This comprehensive variant data enables the workflow to sync all variant details to Airtable.

Loop

App connector: Loop • Time to complete: 0 minutes (Auto-configured)
Why this matters: Processes each product variant individually, ensuring every variant gets its own Airtable record with current pricing, SKU, and details regardless of how many variants the product has.

This loop step iterates through each variant in the {{shopify_1}} array. For every variant, the loop executes the subsequent transform and upsert steps using {{loop.id}}, {{loop.sku}}, {{loop.title}}, {{loop.price}}, and {{loop.compare_at_price}}. This enables variant-level tracking and reporting in Airtable.

Variant Fields

App connector: Transform • Time to complete: 0 minutes (Auto-configured)
Why this matters: Maps Shopify variant data into Airtable field structure, including the critical link to the parent product record that creates the relationship between Products and Variants tables.

This transform step creates a mapping object with six fields: "SKU" ({{loop.sku}}), "Title" ({{loop.title}}), "Variant ID" ({{loop.id}}), "Product" ({{airtable_product_upsert.id}}), "Price" ({{loop.price}}), and "Compare At" ({{loop.compare_at_price}}). The "Product" field uses the Airtable record ID from step 4, creating a linked record relationship between the Variants table and Products table. This enables Airtable views and filters that show which variants belong to which products.

airtable logo icon

Upsert Variant (Custom Code)

App connector: Airtable • Time to complete: 0 minutes (Auto-configured)
Why this matters: Creates or updates the variant record in Airtable using upsert logic, maintaining accurate variant data including pricing changes, SKU updates, and the relationship to the parent product.

This custom code step implements an "upsert" operation for the Variants table. It uses table_name "Variants", field_name "Variant ID", and field_value {{loop.id}} to search for an existing variant record.

If found, it updates with current variant data from the transform step.

If not found, it creates a new variant record. The Product field (containing {{airtable_product_upsert.id}}) links the variant to its parent product in Airtable.

Upsert logic (from airtable_variant_upsert.js):

1. Search Airtable for record where Variant ID matches {{loop.id}}
2. If found: Update existing record with current variant fields
3. If not found: Create new record with variant fields (including product link)
4. Return the updated/created Airtable record

Make it your own

Customize this workflow even further:

Sync additional product fields
Modify the "Product Fields" transform to include additional Shopify product properties like vendor, product_type, tags, or description, creating richer Airtable records for more comprehensive product management.
Add inventory tracking
Include variant inventory quantities in the "Variant Fields" transform and add inventory_quantity to the Variants table, enabling stock level monitoring and reorder planning in Airtable.
Create collection relationships
Add steps that retrieve product collections from Shopify and create a Collections table in Airtable with linked records, enabling collection-based filtering and reporting.
Track sync history
Add a "Last Synced" timestamp field to both tables that updates with each sync, providing visibility into when product data was last refreshed from Shopify.

Frequently asked questions

Will this sync my existing products or only updates?
This workflow syncs products when they're updated after you activate it. To sync your entire existing catalog, you'd need to either manually edit each product in Shopify (triggering updates) or create a separate one-time workflow that retrieves all products and processes them through the same upsert logic.
What happens if I delete a product in Shopify?
Product deletions don't trigger this workflow, so deleted products remain in Airtable. To handle deletions, create a companion workflow triggered by "Product Deleted" that searches Airtable by Product ID and deletes matching records.
Can I customize the Airtable tables or add custom fields?
Yes, you can add additional columns to the Products and Variants tables in Airtable and modify the transform steps to map additional Shopify data to those columns. Just ensure the base structure (Product ID in Products, Variant ID and Product link in Variants) remains intact for the upsert logic to work.
What is a template?
MESA templates are fully pre-configured workflows built and vetted by Shopify Experts. Unlike competitor templates that provide basic scaffolds requiring extensive setup, MESA templates come with all data variables properly mapped, required fields configured, and steps ready to activate. You can turn them on immediately and start automating.
Can I customize a template?
Absolutely! While our templates work out-of-the-box, every step can be personalized to match your exact business requirements. Add conditional logic, integrate additional apps, or build more sophisticated workflows. MESA's templates provide a solid foundation that you can expand as needed.
Are templates free?
Yes! Our entire library of expert-built, production-ready templates is free to use. Unlike platforms that charge for premium templates or provide only basic scaffolds, MESA gives you access to hundreds of fully-configured, vetted workflows at no additional cost.

Ready to start syncing Shopify products to Airtable automatically?

Join thousands who've automated their work and saved an average of 3.5 hours every week.

Start with this template — It's free
7-day free trial • 12 min setup • Cancel anytime