ml-connector
IFS CloudShopify

IFS Cloud and Shopify integration

IFS Cloud runs your manufacturing and finance back-office. Shopify runs your direct-to-customer sales channel. Connecting the two keeps inventory, pricing, and customer records aligned, and turns Shopify orders into invoices in IFS automatically. New customers created in Shopify register in IFS's customer master, orders from Shopify flow into IFS as sales orders and eventually GL postings for revenue recognition, and IFS inventory levels sync back to Shopify to prevent overselling.

How IFS Cloud works

IFS Cloud exposes customers, sales orders, pricing, GL accounts, and company codes through OData v4 REST APIs with a tenant-specific subdomain (https://<tenant>.ifs.cloud). Authentication uses OAuth2 Client Credentials with a 60-minute token lifetime. IFS recommends keeping result sets under 5000 elements and enforces optimistic concurrency control via ETag headers on PATCH and POST mutations. There is no standard webhook API, so integration relies on polling the OData endpoint filtered by modified timestamps or state fields.

How Shopify works

Shopify exposes orders, customers, transactions, payments, and inventory through the Shopify Admin API available in both GraphQL and legacy REST formats. Authentication uses OAuth2 with offline tokens (long-lived, never expire) and online tokens (tied to merchant session). Shopify publishes webhooks for order lifecycle events (created, updated, paid, fulfilled, cancelled), customer changes, and payment disputes, and includes a webhook deduplication header (X-Shopify-Webhook-Id). Return 401 on bad signature to ensure Shopify stops retrying invalid calls.

What moves between them

The main flow is from Shopify into IFS. Orders created or updated in Shopify trigger webhooks that ml-connector receives, maps to IFS sales order structure (customer, line items, pricing), and posts into IFS with the customer company code and GL account mapping. Customers created in Shopify are synced into IFS customer master on a daily schedule. In the reverse direction, IFS customer master data (pricing, terms, credit limit) can be polled and synced back to Shopify product catalogs on a schedule. Payment events from Shopify are recorded in IFS as cash application or AR line-item reduction.

How ml-connector handles it

ml-connector stores OAuth2 credentials for both systems encrypted and refreshes the IFS token every 55 minutes (before the 60-minute expiry). On the Shopify side it validates webhook signatures with the shared secret and returns 401 if the HMAC fails, then processes idempotent order payloads using the X-Shopify-Webhook-Id for deduplication. For IFS mutations, it reads the target sales order or customer record first to capture the ETag header, then submits the PATCH or POST with that ETag to enforce optimistic concurrency and detect conflicting updates. Shopify's rate limits are respected with exponential backoff, and IFS rate-limit 429 responses trigger the same retry logic. Customer company code is a required configuration setting since IFS requires it on every financial entity. The integration maps Shopify order line items to IFS sales order lines, tracking each mapped order pair in a dedup table so that a Shopify order webhook arriving twice does not create duplicate IFS orders.

A real-world example

A small-to-medium manufacturing company sells primarily through a direct Shopify storefront but maintains IFS Cloud for production planning, cost accounting, and financial reporting. Before the integration, when an order came in through Shopify, the order entry team manually created a sales order in IFS, entered the same line items and quantities by hand, and matched customer names across the two systems. Each month during close, reconciliation uncovered order-entry discrepancies and the team had to trace missing or double-entered orders. With IFS and Shopify connected, each Shopify order automatically creates an IFS sales order with the customer linked to IFS's customer master, the order flows through the IFS fulfillment and billing cycle, and revenue is recognized in the GL without re-keying. Inventory levels from IFS production pull back to Shopify hourly, and stock-outs trigger automatic product disable.

What you can do

  • Automatically create or update sales orders in IFS when orders are placed or updated in Shopify.
  • Sync Shopify customer records to IFS customer master with linked company code and payment terms.
  • Map line-item prices and quantities from Shopify to IFS sales order structure and GL revenue accounts.
  • Handle IFS optimistic concurrency (ETag) and Shopify webhook signature validation and dedup.
  • Receive Shopify order, customer, and payment webhooks and post corresponding GL transactions in IFS on a schedule.

Questions

How does ml-connector handle the differences between Shopify orders and IFS sales orders?
Shopify orders are retail-oriented with a single customer and fulfillment status. IFS sales orders map to manufacturing-based line items and GL accounts. ml-connector maps each Shopify order to one IFS sales order, with each Shopify line item becoming an IFS sales order line. Shopify customer name, email, and address map to IFS customer master, and the company code (configured per integration) is applied to all IFS transactions from that Shopify tenant.
What happens if IFS rejects a PATCH due to an ETag mismatch?
IFS ETag mismatch means another process updated the record between the read and the write. ml-connector catches the 412 Precondition Failed response, re-reads the current record with the fresh ETag, reapplies the mapping changes, and retries the PATCH. This ensures concurrent updates do not lose data.
Does the integration support Shopify's legacy REST API or only GraphQL?
ml-connector uses the Shopify GraphQL Admin API (the recommended path) for reads and mutations. Webhook payloads from Shopify are delivered in JSON regardless of API choice. IFS is polled via OData v4 REST only; there is no IFS GraphQL endpoint.

Related integrations

Connect IFS Cloud and Shopify

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started