Sync Shopify orders to ShipStation and Monday.com with Make.com, using ShipStation webhooks, idempotent upserts, partial shipment handling, and tracking updates.
Introduction
If you run a Shopify store and use ShipStation for fulfilment and Monday.com for operations, you already know the pain: orders arrive in Shopify, ShipStation creates shipments and tracking, and someone must copy tracking numbers and fulfilment status into Monday.com. Manual updates are slow, error prone, and break when an order is partially fulfilled.
This post shows a practical Make.com workflow to sync Shopify orders through ShipStation into Monday.com using ShipStation webhooks. You will get a repeatable, idempotent pattern that handles partial shipments, matches line items, pushes tracking updates, and keeps your Monday.com Orders board accurate without manual work.
By the end you'll have the exact trigger logic, field mappings, and production-ready gotchas to build this integration.
What You'll Need
- Shopify store admin access, with order IDs available in ShipStation payloads
- ShipStation account with webhooks enabled and API credentials (ShipStation often requires a paid plan for webhooks)
- Monday.com account with an Orders board and an API token (GraphQL) that can create and update items
- Make.com account to orchestrate the scenario, with the ability to call ShipStation APIs and Monday.com GraphQL
- A durable deduplication store: Google Sheets, Make.com Data Store, or a small database
Notes: ShipStation webhooks and Monday.com GraphQL each have rate limits. Build with backoff and batching where possible.
How It Works (The Logic)
Trigger: ShipStation emits order or shipment webhooks to Make.com. Make.com validates and archives the webhook, looks up the Shopify order ID or ShipStation order/shipment ID, then performs an idempotent upsert on the Monday.com Orders board. For shipment events the scenario updates fulfilment status, appends tracking numbers, and updates per-line shipped quantities if you track them. Every run records the processed ShipStation event_id so retry deliveries do not cause duplicate work.
Flow summary: ShipStation webhook → archive + validate → dedupe by event_id → (optional) fetch canonical order from ShipStation → upsert Monday.com item (create or update) → audit and notify.
Step-by-Step Setup
- Define canonical keys and design the Monday.com board
Pick stable external keys. Use Shopify order_id as the canonical external_id and also store ShipStation order_id and shipment_id. On your Monday.com Orders board create these columns:
- Shopify Order ID (text)
- ShipStation Order ID (text)
- Status (status)
- Amount (number)
- Tracking (text or link)
- Carrier (text)
- Shipped lines summary (long text)
- Last updated (date)
Note the column IDs; you will reference them in GraphQL change_column_values mutations. Keep the column structure stable after launch.
- Create a Make.com scenario with a ShipStation webhook trigger
Create a Make.com scenario and add a custom webhook (or use the ShipStation connector if available). Subscribe to ShipStation events for orders and shipments (ORDER_NOTIFY and SHIP_NOTIFY equivalents). Save the incoming payload and headers immediately to an archive store (Google Sheets, Drive, or Make.com Data Store) with event_id and timestamp.
Why archive first: it gives you a replayable raw snapshot for debugging and manual reprocessing if anything fails.
- Validate payloads and extract core keys
Parse the webhook to extract event_id, shipstation_order_id or shipment_id, and the merchant_order_number or Shopify order_id. Also extract shipment details if present: tracking_number, carrier_code, shipped_at, and items array.
If the Shopify order_id is missing from the webhook, call ShipStation’s Get Order API with the ShipStation order id to fetch the canonical order record.
- Deduplicate by event_id
Before mutating Monday.com, check your dedupe store for event_id. If the event_id already exists, do nothing. If not present, insert a provisional record marking it as processing. This prevents double application on webhook retries.
Implementation tip: keep event records for a reasonable retention period (30 days or more) and include a run_id for traceability.
- Optionally fetch canonical order state from ShipStation
Webhook snapshots are often sufficient. For accurate line-item reconciliation during partial shipments, call ShipStation's Get Order endpoint and use the returned order plus shipments list to compute shipped quantities per SKU. Match by SKU or external line item id rather than array index.
Common gotcha: ShipStation and Shopify may order items differently; always match line items by SKU or product id.
- Upsert into Monday.com via GraphQL
- Search Monday.com: use the GraphQL query items_by_column_values for the Orders board to find an item where Shopify Order ID equals the incoming Shopify order id.
- Router:
- If item exists: call change_column_values mutation to update columns in one payload. Map fields such as status, tracking (append new tracking entries), carrier, shipped lines summary, and last updated.
- If item does not exist: call create_item mutation including the Shopify Order ID and initial fields.
Field mapping examples:
- Tracking column ← append "Carrier: TrackingNumber" for each new shipment
- Status ← map ShipStation states to your board statuses (for example
shipped→Shipped, partial shipments →Partially Shipped) - Shipped lines summary ← build a short string like "SKU123 x 1 shipped; SKU456 x 2 pending"
Gotcha: build a single change_column_values mutation with a JSON columns map to avoid multiple small API calls and reduce rate-limit exposure.
- Handle partial shipments correctly
If the shipping event indicates a partial shipment, compute the sum of shipped quantities for each line. Only set Orders board status to Shipped when shipped quantities equal ordered quantities. Until then, set Partially Shipped and include the shipped lines summary for clarity.
- Post notifications and append an audit row
For exceptions, high-value orders, or important tracking updates, post a Slack notification. Always append an audit row to your log store with: event_id, shopify_order_id, shipstation_order_id, monday_item_id, run_status, and timestamp. This makes the flow auditable and re-runnable.
- Retry, backoff, and error handling
Implement exponential backoff for transient Monday.com 429s or 5xxs. On permanent failures write an error state to the audit log and notify ops with the archived raw payload id so someone can manually reprocess.
- Test thoroughly
Simulate and test:
- New Shopify order imported and appearing in Monday.com
- Partial shipment then a subsequent shipment that completes the order
- Tracking number updates
- Duplicate webhook delivery to validate idempotency
Use ShipStation test webhooks or sandbox if available and validate Monday.com updates and log rows.
Real-World Business Scenario
A mid-market retail brand implemented this pattern to remove manual fulfilment updates. Partial shipments updated per-line shipped quantities and set a Partially Shipped status; when remaining lines shipped the board automatically moved to Shipped. The team eliminated a daily 90-minute reconciliation task and reduced packing errors.
Common Variations
- Mirror updates back to Shopify: after confirming a ShipStation shipment, call Shopify’s fulfillment API to mark the order as fulfilled and include the tracking number so customers see tracking in their storefront.
- Sub-items for line-item fulfilment in Monday.com: create sub-items per SKU when the order is created and update sub-items on shipment events for detailed per-SKU workflows.
- Enrichment and routing: call enrichment services to flag enterprise customers and route their orders to a specialised Monday.com board or alert channel.
Where to go next
This pattern uses ShipStation webhooks as the source of truth for shipping events, Make.com as the orchestration layer, and Monday.com for operations. For related patterns and notification ideas see our Shopify → Google Sheets + Slack sync: How to Automatically Sync Shopify Orders to Google Sheets and Slack Using Make.com, and for a comparable board-upsert approach from WooCommerce webhooks see: How to Create Monday.com Order Items from WooCommerce Using WooCommerce Webhooks and Make.com.
Olmec Dynamics builds these production automations for real businesses. If you want help implementing ShipStation → Make.com → Monday.com syncs with idempotency, monitoring, and runbooks, you can see what we do at https://olmecdynamics.com and get in touch.