Flows
A flow is a managed integration pipeline — for example, syncing Shopify orders into NetSuite, or pushing newly-canonicalized customers into Klaviyo. Each flow has a source, a destination, a schedule, a mapping, and a state. APIXX runs it on your behalf; you watch it.
What's a flow
Think of a flow as a contract: "Every 15 minutes, pull new orders from this Shopify store, normalize them, and upsert them into NetSuite as Sales Orders." The flow owns the schedule, the field mapping, and the error-handling policy. Each invocation is a run.
Anatomy
| Component | Required | Description |
|---|---|---|
| Source connector | yes | Where records are read from. |
| Destination connector | yes | Where records are written to. Use APIXX Data for canonical-only flows. |
| Entity | yes | What's being moved — order, customer, product, custom. |
| Schedule | yes | Continuous, cadence-based, on-demand, or webhook-driven. |
| Filter | no | Server-side predicate applied at read time (e.g. status=paid). |
| Mapping | yes | Field-level transform from source schema to canonical or destination schema. |
| Error policy | no | Retry, dead-letter, or fail-fast. Defaults to retry-with-backoff. |
| SLO | no | Target freshness and success rate. Drives alerting. |
Schedules
| Schedule | Cadence | When to use |
|---|---|---|
| Continuous | Sub-minute via push/poll hybrid | High-volume commerce orders, fraud signals. |
| Every 5 / 15 / 60 min | Cron-style | Most operational flows. 15 min is the default. |
| Hourly / daily | Cron-style | Reporting, slow-moving reference data. |
| On-demand | Manual trigger only | Backfills, ad-hoc imports. |
| Webhook-driven | Event from source system | Stripe payments, Shopify order_create. |
Filters
Filters are server-side predicates that scope what the flow reads — e.g. status = paid AND created_at > cursor. They run on the source system whenever possible (so Shopify only sends matching orders), with a client-side fallback for systems without a query API.
Mappings
Mappings translate source fields to canonical or destination fields. The Mapping Console suggests an initial map using field-name and sample-data heuristics; you approve, edit, or override. Common transforms ship built-in:
- Casting — string ↔ number ↔ date ISO 8601.
- Currency normalization — minor units, ISO 4217 codes.
- Enum mapping — Shopify
financial_status→ canonicalorder.payment_status. - Concatenation / templating —
{first_name} {last_name}. - Lookup — join against a reference table (e.g. country code → region).
- Custom JS expression — sandboxed, 200ms budget per record.
Dependencies
Flows can declare a dependency on another flow — useful when downstream data requires upstream canonical records to exist. Example: a NetSuite Customer push flow depends on Shopify Customer ingest succeeding within the last hour.
State & lifecycle
| State | Behavior | How to change |
|---|---|---|
| active | Runs on schedule. | Pause from the flow header. |
| paused | Schedule suspended; no new runs. | Resume to re-enable. In-flight runs complete first. |
| error | Flow is failing systemically — usually a dependency or mapping issue. | Auto-clears after 3 consecutive successes. |
| draft | Saved but never activated. | Edit and click Activate. |
Health & SLOs
Open any flow to see throughput, success rate, and latency charts over the last 24h, 7d, and 30d. If you set an SLO (e.g. "95% of runs succeed and complete within 90s"), Flow alerts your contact channel when the burn rate exceeds the budget.
Best practices
- Start narrow. Filter to a small slice of records during development; widen after validation.
- Pause before backfills. Pause the live flow, run a one-off backfill flow with overlap, then resume.
- Pin mappings. Once stable, lock the mapping version so AI suggestions don't silently change behavior.
- Watch the partial-run rate. Frequent partials usually point to a single bad mapping rule.
- Document intent. Use the flow description field — your future self will thank you.
