Connect accounts
Authorise Shopify and the other system. Credentials are encrypted before they are stored and the connection is health-checked on save.
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.
Every beam is a run: a trigger, its steps, and a record you can open.
7 connectors, one flow engine
How it works
No connector code to write. The work is confirming the settings that decide how your orders map.
Authorise Shopify and the other system. Credentials are encrypted before they are stored and the connection is health-checked on save.
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.
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.

Bundles
Each bundle is a set of flow templates for a pair of connectors. Installable bundles run today; the others are declared in code and appear here as they gain flows.
Platform
The four things a merchant relies on at peak trading, and the numbers behind them.
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.
| Flow | Status |
|---|---|
| Shopify order → NetSuite sales order | Success |
| NetSuite fulfillment → Shopify fulfillment | Success |
| NetSuite inventory → Shopify inventory level | Partial |
| Shopify order → BrightPearl sales order (split by location) | Failed |
| BrightPearl goods-out shipped → Shopify fulfillment (per location) | Success |
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.
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.
Shopify order → NetSuite sales order
order.created · webhook, signature verified
every line item carries a SKU → true
createSalesOrder · 422 after 1 attempt (not retryable)
{ "externalId": "5827113", "currency": "GBP",
"customerEmail": "", "lineItems": [ … 3 ] }
→ 422 customerEmail is requiredEvery 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.
Every authenticated request resolves to one tenant id before any query runs.
Queries run inside a transaction that sets the tenant id for the connection's lifetime, as the app role — never the table owner.
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.
The API refuses to start if any scoped table is missing RLS, is not forced, or has no policy. Isolation is checked, not assumed.
In the code today
Three numbers the site reads from the same modules the product ships. They change when the code does.
Shopify, NetSuite, Amazon and 4 more, each with its triggers and actions declared in code.
Cloned into your account by the 2 installable bundles; the rest are declared and gain flows over time.
Across 7 sections in 1 bundle with a settings schema — every one confirmed before a flow runs.
Security
No badges. An architecture: row-level security, envelope-encrypted credentials and signed-webhook verification, described plainly.
FAQ
Thirty minutes with a Shopify store you control. We connect it, install a bundle, and walk the run record together.