Skip to content
InstallableShopify + BrightPearl bundle — 3 flows, settings tab included

Every Shopify order in your ERP, with the run record to prove it.

Bindato connects your storefront to the systems that ship, stock and invoice — with installable bundles, a trigger→action flow engine, and a run record for every order, fulfillment and stock change.

Connectors
7
Bundles
6
Installable
2
orders · fulfillments · inventoryERP · WMS · marketplace · shipping
  • Shopify
  • NetSuite
  • BrightPearl
  • Amazon
  • ShipStation
  • Shiptheory
  • Cin7

Every beam is a run: a trigger, its steps, and a record you can open.

How it works

Three steps from an empty account to a running integration.

No connector code to write. The work is confirming the settings that decide how your orders map.

  1. 1

    Connect accounts

    Authorise Shopify and the other system. Credentials are encrypted before they are stored and the connection is health-checked on save.

  2. 2

    Install a bundle and confirm its settings

    A bundle clones ready-made flows into your account, then blocks them until you have worked through its Settings tab: warehouses, price lists, order statuses — picked from your live account.

    • General
    • Inventory
    • Prices
    • Orders
    • +3 more
  3. 3

    Runs, records and errors you can read

    Every trigger becomes a run with a step-by-step record. A failed step shows the payload it received; you fix the data and retry, or resolve and move on.

Three glass cubes threaded by beams of light — connect, configure, run.
Settings confirmed
Success1.4 s

Platform

Built like an ops tool, not a form builder.

The four things a merchant relies on at peak trading, and the numbers behind them.

Flow engine

Trigger → action, with conditional branches and a split step that fans one record set into per-item child runs. Transient failures retry with exponential backoff; permanent ones stop the flow and say why.

  • up to 5 retries
  • backoff capped at 30 s
  • retries 429 · 500 · 502 · 503
  • split ≤ 10,000 items per run
+6.1%
4,812
Runs, last 7 days
vs. previous 7 days
+0.4 pt
99.2%
Success rate
vs. previous 7 days
−3
7
Failed runs
vs. previous 7 days
1.6 sper run
Median duration

Recent runs

FlowStatus
Shopify order → NetSuite sales orderSuccess
NetSuite fulfillment → Shopify fulfillmentSuccess
NetSuite inventory → Shopify inventory levelPartial
Shopify order → BrightPearl sales order (split by location)Failed
BrightPearl goods-out shipped → Shopify fulfillment (per location)Success
Sample data. Layout and controls are the product's own.
How it works

Settings tab

A bundle with a settings schema blocks its flows until the merchant has worked through its Settings tab and confirmed it. Sections are gated by master toggles, dropdowns are filled from the live account, and mapping tables enforce per-table uniqueness rules.

  • flows blocked until confirmed
  • live options from both accounts
  • validated on the server

Shopify + BrightPearl · Settings

5/7 confirmed
  • General
    2 settings
    Confirmed
  • Inventory
    4 settings · gated by a master toggle
    Confirmed
  • Prices
    2 settings · gated by a master toggle
    Confirmed
  • Orders
    24 settings · gated by a master toggle
    Confirmed
  • Fulfillment
    2 settings · gated by a master toggle
    Confirmed
  • Payments
    2 settings
    Needs review
  • Refunds
    6 settings · gated by a master toggle
    Needs review
Flows in this bundle stay blocked until every section is confirmed. Mapping tables are validated against the live account, not a build-time list.
Sample data. Layout and controls are the product's own.
How it works

Run records

Each run keeps a row per step with the input it received and the output it produced. Errors are their own queue: resolve, ignore, reopen — or edit the payload and retry from the failing step.

  • per-step payloads
  • resolve · ignore · reopen
  • retry from the failing step

Run 01J9…K3Q

Shopify order → NetSuite sales order

Failed
  1. triggertrigger

    order.created · webhook, signature verified

    12 ms
  2. has-skuconditional

    every line item carries a SKU → true

    1 ms
  3. create-sales-orderaction

    createSalesOrder · 422 after 1 attempt (not retryable)

    840 ms
Error on create-sales-order — input the step received
{ "externalId": "5827113", "currency": "GBP",
  "customerEmail": "", "lineItems": [ … 3 ] }
→ 422 customerEmail is required
  • Edit payload & retry
  • Resolve
  • Ignore
Sample data. Layout and controls are the product's own.
How it works

Tenant isolation

Every tenant-scoped table carries Postgres row-level security, forced so even the table owner is bound, with a tenant_isolation policy. The API refuses to boot if any table is missing one.

  • FORCE RLS on 12 tables
  • checked at boot
  • app role, never superuser

One request, four checks

postgres · rls
  1. 1. Session → tenantrequireAuth

    Every authenticated request resolves to one tenant id before any query runs.

  2. 2. Transaction-scoped contextwithTenantContext

    Queries run inside a transaction that sets the tenant id for the connection's lifetime, as the app role — never the table owner.

  3. 3. Row-level security on 12 tablesFORCE ROW LEVEL SECURITY

    RLS is enabled AND forced, with a tenant_isolation policy on each table. Another tenant's row is not a 403 — it does not exist to the query.

  4. 4. Boot gateassertTenantIsolation

    The API refuses to start if any scoped table is missing RLS, is not forced, or has no policy. Isolation is checked, not assumed.

Sample data. Layout and controls are the product's own.
How it works

In the code today

Counted from the registry, not the pitch deck.

Three numbers the site reads from the same modules the product ships. They change when the code does.

Connectors
7

Shopify, NetSuite, Amazon and 4 more, each with its triggers and actions declared in code.

Flow templates
6

Cloned into your account by the 2 installable bundles; the rest are declared and gain flows over time.

Settings fields
42

Across 7 sections in 1 bundle with a settings schema — every one confirmed before a flow runs.

FAQ

Questions merchants ask first.

Do I need to write code?
No. Installing a bundle clones its flows into your account; your work is confirming the Settings tab. The flow builder is there when you want to change a mapping or add a step, and the connector SDK exists for teams that want to add a system we do not cover yet.
What happens when a run fails?
The run is marked failed at the step that failed, with the input that step received and the error the far system returned. Transient errors (rate limits, 5xx) are retried automatically with exponential backoff. Anything left over lands in the error queue where you can edit the payload and retry, or resolve or ignore it.
Which Shopify plan do I need?
Bindato connects with your shop domain and an Admin API access token from a custom app you create in the Shopify admin. If your plan lets you create a custom app, it works; we do not require Shopify Plus.
How are my credentials stored?
Encrypted before they reach the database. Each connection's credentials are sealed with their own random data key using AES-256-GCM, and that data key is wrapped by a master key held outside the database. They are decrypted on the server only when a flow runs or a connection is tested; the dashboard is never sent the plaintext.
What is the Settings tab?
The part of a bundle that decides how your data maps: which warehouse feeds stock, which price list applies, how Shopify payment methods and carriers map to the other system. The bundle's flows stay blocked until every section is confirmed, so nothing runs against a guessed default.

See one order flow end to end.

Thirty minutes with a Shopify store you control. We connect it, install a bundle, and walk the run record together.