Key takeaways
Map the business process and source of truth before choosing an app or custom build. Define the records, directions, triggers, identifiers, error handling, security, ownership and reconciliation process. Then test the smallest useful flow with realistic data before expanding it to the whole catalogue or order volume.
- Map the business process and choose a source of truth for every important field before picking a connector.
- Use stable identifiers and explicit mappings, and make event handlers idempotent.
- Design errors, retries and reconciliation as part of the product rather than an afterthought.
- Test the smallest useful flow with realistic and ugly data before expanding it.
- Budget for ownership, not only the first build.
Start with the workflow, not the connector
Write the process as people experience it. A wholesale order may begin with an account approval, use a customer-specific price, reserve inventory, create a fulfilment request, send tracking back to the buyer and update an accounting record. A product feed may begin in a PIM, publish selected fields to Shopify and send a different subset to a marketplace. Each sentence contains a data decision that an app listing usually leaves out.
For each step, name the actor, record, trigger and expected result. “Connect Shopify to the ERP” is a destination; “when an order is paid, create one fulfilment-ready order with the Shopify order ID and the customer’s tax context” is a testable requirement. Keep the first version narrow. A precise order flow is easier to observe and repair than a vague promise to synchronize everything.
Choose a source of truth for every important field
A field should have one authoritative owner, even when several systems display it. The PIM may own a product’s material and care instructions; Shopify may own the storefront title; the ERP may own cost and available-to-sell inventory; a fulfilment system may own shipment status. If two systems can edit the same value, specify which update wins and how a human resolves a conflict.
Do this at field level rather than system level. A system can be authoritative for inventory but only a consumer of customer-service notes. Record the rule in a data dictionary with field name, format, owner, direction, frequency, validation and example. This document becomes more valuable than the connector itself when staff change, an app is replaced or a new sales channel is added.
| Record | Possible owner | Questions to settle |
|---|---|---|
| Product content | PIM or Shopify | Which fields are editorial, which are channel-specific and who approves publication? |
| Inventory | ERP, WMS or Shopify | Is the value available-to-sell, on-hand or reserved, and how quickly must it update? |
| Customer profile | Shopify or CRM | Which identifier links records, and which consent rules govern marketing fields? |
| Order status | Shopify and fulfilment system | Which events are visible to the customer and which are operational only? |
Use stable identifiers and explicit mappings
Names are for people; identifiers are for systems. Map Shopify product IDs, variant IDs, SKUs, order IDs, customer IDs and location IDs to the corresponding keys in the connected system. Do not assume a SKU is globally unique because a business may reuse one across markets or legacy data. Preserve the Shopify ID when an order travels to a warehouse, and store the external ID when the response returns.
Document transformations beside the mapping. A system may use kilograms while a product field displays grams, or may expect a tax code that Shopify does not store directly. Define rounding, timezone, character encoding, empty values and enumeration changes. Reject an ambiguous record with a visible error rather than silently choosing the first match. A small mapping table prevents an apparently successful sync from creating the wrong product or customer.
- Use immutable IDs for joins and human-readable fields for display.
- Version mapping rules when an external system changes its schema.
- Keep an example payload for every critical direction.
- Decide whether a missing value means unknown, intentionally empty or invalid.
- Never log access tokens or unnecessary personal data while debugging a mapping.
Pick the right transport for the change
A scheduled import is useful for a catalogue refresh or a nightly reconciliation. A webhook is better when the connected system should react soon after an order or product event. A direct request from the storefront can be appropriate for a small, user-visible lookup, but it makes the buying journey depend on another service’s latency and availability. A queue or middleware layer can absorb spikes and centralize retries when the workflow warrants it.
Shopify’s Admin APIs and webhooks have specific authentication, versioning and delivery behaviour. Read the current documentation for the API surface you use and design for a duplicate event or a delayed response. “Real time” is not a business requirement until you can state the allowed delay and what happens in the meantime. For a delivery estimate, stale data may be unacceptable; for a reporting export, a daily batch may be the safer choice.
Make event handlers idempotent
An event can arrive again. A request can time out after the external system has already accepted it. If processing a paid order twice creates two fulfilment requests, the integration is unsafe even when it works in the happy path. Store an event or operation key, check it before applying a side effect and make the operation safe to repeat. The key may combine the Shopify event identity with the version of the action you are performing.
Idempotency does not mean ignoring changes. If the same record arrives with a new version, compare the version or updated timestamp and process the newer state. Keep a small state machine for important flows: received, validated, submitted, acknowledged, reconciled, failed or needs review. This makes a dashboard meaningful and gives a support person a place to start when an order appears stuck.
Design errors as part of the product
Every integration fails sometimes: a token expires, a rate limit is reached, a required field is missing, an SKU has no match or a third-party service is down. Separate transient failures from data failures. Retry a transient network error with a bounded backoff; route an invalid tax code to a review queue with the record and reason. Retrying a permanent error forever hides the actual problem and can amplify duplicate work.
Give the team a useful error message. “Sync failed” is not enough; “Order 1042 was not sent because the shipping country has no mapped tax region; fix the mapping and retry” points to an action. Keep the original payload or a safe diagnostic reference, the attempt count, timestamps and external response. Provide a manual replay that uses the same idempotent path, so a human does not edit production data to force a second attempt.
A connection is not reliable because it rarely fails. It is reliable when failure is visible, bounded and recoverable.
Respect API limits and version changes
Shopify and connected services publish limits and version schedules. Avoid a design that sends one request per field or repeatedly fetches the entire catalogue when a bulk or incremental approach is available. Queue work, respect response headers and make backoff behaviour observable. A test that passes with ten products can fail when a merchant imports ten thousand.
Pin API versions according to the provider’s support policy and plan upgrades as normal maintenance. Read changelogs before changing a query or mutation; a successful request can still return a changed shape. Keep a contract test with representative responses and run it against a safe environment. Do not hide a version upgrade inside a theme release where nobody can see what changed or roll it back.
Secure the connection and reduce its reach
Request the smallest scopes and permissions the workflow needs. A product feed should not need order write access. Keep credentials in the platform intended for secrets, rotate them according to the owner’s policy and document which person or team can revoke them. Treat webhooks and callbacks as untrusted input: verify the provider’s signature, validate the expected topic and store only the fields required for the job.
Separate development, staging and production credentials. Redact tokens, payment details and personal information from logs. Decide how long event payloads and error diagnostics remain available and who can view them. A support dashboard should help repair an order without becoming a second customer database. Include a security review when a custom app, middleware service or private customer-data flow is introduced.
- List each scope beside the feature that requires it.
- Verify webhook signatures before parsing or queueing the payload.
- Use least-privilege staff and app access for operational tools.
- Keep customer-data retention and deletion behaviour documented.
- Test a revoked credential and a replayed callback before launch.
Decide where logic belongs
A small Shopify Flow automation, an app extension, a serverless handler, a middleware service or a full custom application can all be reasonable. Put logic where it can be tested, secured, observed and edited by the team that owns it. A theme should not contain private credentials or business rules that must also run for draft orders, admin edits and other channels. Conversely, moving a one-field notification into a new service can create more operational work than it removes.
Describe the boundary in plain language. Shopify owns the customer-facing product and checkout; the ERP owns accounting and purchasing; middleware translates identifiers, queues events and records outcomes. A boundary is useful only if each side can evolve without guessing what the other side expects. Record the inputs, outputs, failure contract and contact for every boundary.
Treat common Shopify connections as different products
An ERP connection usually needs order, inventory, customer and financial mappings, plus reconciliation. A PIM connection needs editorial ownership, media handling, validation and publishing states. A CRM connection needs consent, identity resolution and a decision about which customer events are appropriate to share. A 3PL connection needs fulfilment status, tracking, locations, partial shipments and exception handling. An analytics connection needs event definitions, consent and a measurement plan.
Do not reuse a generic “sync” requirement across them. A feed that sends product descriptions to a marketplace may intentionally omit internal notes. A fulfilment update may be allowed to change a customer-visible status but not an order’s payment state. Interview the people who operate each system and write examples from their day. Their exceptions expose more architecture than the happy-path diagram.
| Connection | Critical questions | Useful first slice |
|---|---|---|
| ERP or accounting | Which tax, currency, discount and refund facts must reconcile? | One paid order to a test account with a reconciliation report |
| PIM | Which fields and media are approved before publication? | One product family with validation and a human publish step |
| 3PL or WMS | How are locations, partial fulfilments and tracking represented? | One order through allocation, shipment and customer update |
| CRM or marketing | What consent, identity and event boundaries apply? | One explicitly permitted customer event with deletion handling |
Compare an app with a custom integration honestly
An app can shorten the path to a supported workflow and reduce the amount of code your team owns. The tradeoff may be limited mapping, vendor-specific data models, recurring cost, slower support or a feature that only works for a theme. A custom integration can fit the business more closely, but it also creates responsibility for hosting, security, version updates, monitoring and recovery.
Make a comparison table before installing anything. Read the app’s scopes, privacy terms, data retention, rate behaviour, support process and export or uninstall behaviour. Test its critical states in a development store. An app that imports an order correctly but cannot represent a partial refund is not a complete order integration for a business that needs partial refunds.
- Required records and directions are supported, not just named in marketing copy.
- The merchant can export or recover the data the app creates.
- App scopes, recurring costs and support response fit the operating model.
- The integration has a documented owner after the initial implementation.
- A failed connection does not block a customer from understanding their order.
Test with real shapes and ugly states
Create a fixture set that reflects the catalogue and operations: a product with many variants, a missing image, a discontinued SKU, a guest checkout, a company account, a discount, a refund, a partial shipment, two currencies and a long address. Include an accented name and a timezone boundary. Test new records, updates, deletes and retries. A synthetic object with perfect fields proves very little.
Run the flow end to end in a safe environment and inspect both sides. Confirm the right IDs, totals, taxes, inventory, customer visibility and audit entries. Then interrupt it deliberately: revoke a credential, return a rate limit, remove a mapping and send the same event twice. The expected result should be written down before the test. Otherwise a team can mistake a quiet failure for a pass.
Observe the journey, not just the request
A request log tells you that a call happened. An integration view should tell you which business record it belonged to, what state it reached, how long it waited, how many times it retried and whether a human needs to act. Use a correlation ID across Shopify, middleware and the external system. Track counts for received, completed, retried, failed and reconciled operations; break them down by flow and reason.
Set alerts around impact rather than noise. A spike in invalid SKUs, a growing queue, missing fulfilment acknowledgements or a reconciliation difference deserves attention. A single transient timeout may not. Keep dashboards accessible to the people who fix the work. Explain what a healthy value means and link an alert to the runbook that describes the first checks.
Plan reconciliation from day one
Even a well-designed event flow can miss a delivery or encounter a record that was edited manually. Reconciliation compares the source and destination for a defined period or set of records and reports differences. It is not a second, uncontrolled sync. Decide which differences are expected, which system wins and whether the repair is automatic or reviewed.
For orders, a useful report may compare paid orders in Shopify with accepted orders in the fulfilment or accounting system, including status and total. For inventory, compare a location-aware available-to-sell value at a stated time. For product content, compare the approved version and publication status. A report with no owner becomes another inbox; assign a cadence and a person who can close a difference.
Make the editor and operator experience explicit
Integration quality is partly measured in the admin tasks people can complete without a developer. Show a content editor how to publish a product, a support person how to replay a failed order and an operations lead how to reconcile inventory. Capture the labels, permissions and error copy they see. If a workflow depends on a hidden spreadsheet or a developer remembering a command, it is not finished.
Design the safe path first. A replay should show what will happen and which record it affects. A bulk change should preview the count and validation failures. A delete or unpublish operation should explain the downstream effect. These details reduce support load and protect the data model the integration was built to keep consistent.
Budget for ownership, not only the first build
The initial estimate should include discovery, mapping, access, development, fixtures, QA, launch monitoring and documentation. The operating estimate should include app or hosting cost, API version work, credential rotation, alert review, reconciliation, support and changes in connected systems. Binevi’s published service menu includes custom integrations, Shopify app development, ongoing support and blocks of hours; the right shape depends on the flow and the ownership your team needs.
Ask an agency to price the smallest useful slice and identify the next boundary. A catalogue import and a fulfilment flow may share identifiers but have different risk. Separating them can make launch safer. Conversely, building two tiny connectors without a common mapping and observability layer can cost more over time. Compare the operating model as carefully as the day-one quote.
A delivery sequence that keeps decisions visible
- Discovery: map the workflow, records, owners, constraints and measurable acceptance criteria.
- Architecture: choose the transport, boundaries, identifiers, permissions, state model and recovery approach.
- Prototype: run one representative record through a safe environment and inspect both systems.
- Build: implement validation, idempotency, retries, logging, dashboards and operator controls together.
- Verify: test realistic payloads, duplicate events, missing mappings, rate limits, revoked credentials and partial outcomes.
- Launch: release a narrow flow, monitor it with an owner and keep a repair path available.
- Operate: reconcile on a schedule, review API changes and update the data dictionary when the business changes.
The integration brief to hand to a developer
Write the brief so a person who did not attend the sales call can implement and test it. Include the business outcome, systems and accounts, records, source of truth per field, direction and trigger, examples, limits, permissions, retention, failure states, reconciliation, acceptance tests, launch plan and owner. Link the current Shopify API documentation and the external system’s contract. Mark assumptions visibly and give them an owner.
A good brief can say “we do not know yet”. That is safer than hiding a decision about refunds, inventory reservations or consent in a ticket. Resolve unknowns in discovery, then update the examples and acceptance tests. When the integration is handed over, the brief becomes the first page of its runbook and the starting point for a future change.
| Brief field | Example of a useful statement |
|---|---|
| Trigger | When an order is paid, queue one fulfilment submission within the agreed delay. |
| Source of truth | The ERP owns available-to-sell inventory; Shopify displays the last accepted value by location. |
| Failure | An unmapped SKU is held for review with its order ID and a replay action; it is not retried indefinitely. |
| Acceptance | A duplicate event produces one external order and one successful reconciliation record. |
What to do when the connection is already messy
Do not begin by replacing every app. Freeze new scope long enough to map the current flows and identify the records that can affect money, customers and inventory. Export a sample of successful and failed records, list duplicate identifiers and ask operators which manual steps keep the business running. The ugly workaround may be compensating for a missing source-of-truth decision rather than a bad connector.
Stabilize one high-impact flow first. Add correlation IDs, an error queue and reconciliation before changing its transport. Remove an app only after you know what data it owns, how its outputs are recovered and which pages or workflows depend on it. A staged cleanup gives the team evidence and a rollback point. It also creates a clearer brief for the next integration instead of carrying the same ambiguity into a new stack.
Questions to answer before approval
- Which system is authoritative for every field that can change?
- What is the acceptable delay for each record and what can the customer see meanwhile?
- What happens if a request succeeds but the response is lost?
- How are duplicate events, partial outcomes and manual edits represented?
- Who can replay, reconcile, rotate credentials and approve a mapping change?
- Which personal, payment or operational data is stored, logged or sent to another vendor?
- How will a Shopify API version or app change be tested before production?
- What is the smallest launch slice that proves the architecture?
Frequently asked questions
Should I use a Shopify app or build a custom integration?
Use the option that supports the required records, states, permissions, recovery and ownership. An app may be the best fit for a supported workflow; custom work may be justified when mapping, controls or operating requirements are specific. Compare the ongoing responsibility, not just the initial build time.
How do I know which system should own inventory?
Start with the operational process: where are reservations, locations, purchase receipts, fulfilment changes and manual adjustments recorded? Choose one authoritative available-to-sell value and document how other systems receive it. The answer depends on the business process and stock model, not on a universal Shopify setting.
Can a webhook guarantee that every event is processed?
A webhook is a delivery mechanism, not a guarantee that your handler completes the business action. Verify the callback, acknowledge it correctly, queue the work, make processing idempotent and reconcile important records. The provider’s current webhook documentation should guide the delivery and retry design.
What should an integration dashboard show?
Show the business record, current state, attempts, last error, correlation ID, timestamps and whether a human needs to act. Add counts for received, completed, retried, failed and reconciled operations by flow. A dashboard should lead to a safe repair action rather than expose raw credentials or unnecessary customer data.
Sources and further reading
Keep exploring
