Where it lives
Sidebar Automations (/{org}/dashboard/automations), after Carrier Requests. Click a row (or Edit) to open /{org}/dashboard/automations/:id.


Automations list — name, status, trigger, action count, and New automation
List
Columns
Filters
Header filter (data-testid="filters.trigger"). Shared chrome: Search and filters.


Filters — Search, Status (Draft / Active / Paused)
Empty state
When the API returns no rows: icon, title No automations yet, description Create your first automation to run actions when shipments are dispatched. Button Create automation (opens the same modal as New automation).Row menu
data-testid="table.row-actions":


Row menu — Edit, Test run, Delete
Create
Click New automation. Modal idcreate-automation-modal. Title New automation. Subtitle: Start with a shipment.dispatched trigger and wire up actions on the canvas. That subtitle is copy only — the saved graph starts empty. You add a trigger yourself.


New automation — Name, Description, Create automation
triggerType empty, graph: { nodes: [], edges: [] }.
Plan caps (from Manage → Pricing Plans): Standard 5 automations, Growth 20, Pro 50. Hitting the cap opens Unlock more automations — You’ve reached your plan’s automation limit. Upgrade to build more automated workflows. See Billing and usage.
Enable, pause, and rename
Status in the list is Draft / Active / Paused. In the builder the status control is a two-state toggle:Delete
Row menu Delete. Title Delete automation. Body: Are you sure you want to delete ""? This will also remove its run history. Type DELETE to enable Delete. Toast Automation deleted / Failed to delete automation.

Delete automation — type DELETE to confirm
Builder
/{org}/dashboard/automations/:id. Full viewport — no app sidebar. On viewports below md: title The automation builder isn’t available on mobile, description Open Zippendo on a computer to create and edit automations., button Back to automations.
Missing automation: Automation not found / It may have been deleted. / Back to automations.
Empty canvas hint: Drag elements from the panel or click the grid button to get started.


Empty builder — Go back, Paused toggle, Save, Execute workflow, empty-canvas hint
Top bar
Left rail
Canvas settings
Popover title Canvas. Description Preferences for building workflows. Stored inlocalStorage as zippendo-automation-canvas-settings.
Elements palette
Title Nodes. Groups Triggers, Actions, Conditions, Flow (with a count). Click or drag onto the canvas. A singleton already on the canvas (every trigger is singleton — one per graph) shows badge Added and cannot be added again. Empty search: No elements match / Try a different search term. (search input is not shown in the current palette.)

Elements palette — Triggers, then Actions


Connected graph — trigger, field match, apply rule, delay, Slack, and Exit
Validation (blocks save, activate, and Execute workflow)
Templates
Text fields that mention{{field}} interpolate with {{path}} or {{ nested.path }} (dot notation). Missing paths become empty strings.
The inspector Sample payload for shipment/order triggers is flattened (reference, orderNumber). Live events are nested:
shipment.updated is an app webhook event only — see Webhooks.
Triggers
Every trigger: no inspector fields. Copy: This trigger fires whenever the{event} event occurs. No configuration required. Then Sample payload and Use {{ field }} to reference payload values in downstream actions.
Only active automations whose triggerType matches the event run. Brand-scoped automations run only for that brand’s events; org-wide automations run for every brand.


Shipment Created inspector — sample payload, no configuration
Shipment Created
Registry: Shipment Created — Fires when a new shipment is created. Category Shipments. Eventshipment.created. Fires when you create a shipment (dashboard or API).
Inspector sample: shipmentId, reference, orderNumber, customerName, carrier, status, createdAt. Live payload is { shipment: <shipment> }.
Shipment Dispatched
Registry: Shipment Dispatched — Fires when a shipment is dispatched. Canvas label on this node: Shipment dispatched / Zippendo · shipments. Eventshipment.dispatched. Fires when a shipment is sent.
Inspector sample: shipmentId, reference, orderNumber, customerName, trackingNumber, carrier, dispatchedAt. Live payload is { shipment: <shipment> }.
Shipment Cancelled
Registry: Shipment Cancelled — Fires when a shipment is cancelled. Eventshipment.cancelled. Fires when a pending shipment is deleted (dashboard delete). It does not fire when the Cancel Shipment action sets status to cancelled.
Inspector sample: shipmentId, reference, customerName, cancelledAt. Live payload: { shipment: { id, reference, status: "cancelled" } }.
Shipment Error
Registry: Shipment Error — Fires when a shipment encounters an error. Eventshipment.error. Fires when send/booking fails.
Inspector sample: shipmentId, reference, carrier, errorMessage, errorAt. Live payload also includes orderNumber, errorCode, and nested shipment.
Order Created
Registry: Order Created — Fires when a new order is created. Category Orders. Eventorder.created.
Inspector sample: orderId, orderNumber, customerName, customerEmail, totalAmount, currency, createdAt. Live payload is { order: <order> }.
Order Updated
Registry: Order Updated — Fires when an order is updated. Eventorder.updated.
Inspector sample: orderId, orderNumber, customerName, status, updatedAt. Live payload is { order: <order> }.
Tracking Updated
Registry: Tracking Updated — Fires when tracking information is updated. Category Tracking. Eventtracking.updated. Fires on carrier tracking ingest.
Inspector sample: shipmentId, reference, trackingNumber, carrier, trackingStatus, updatedAt. Live payload is already flat and also has trackingEvent.
Conditions
Field Match
Palette: Field Match — Check if a field matches a value. Category Logic. Handles TRUE / FALSE. Both must be connected.

Field Match — Field, Operator, Value
Number(...).
Flow
Branch
Palette: Branch — Split flow based on a condition. Same inspector as Field Match (Field, Operator, Value). Handles TRUE / FALSE. Both must be connected.Delay
Palette: Delay — Wait for a specified duration before continuing. The run status becomeswaiting until the delay elapses, then continues.


Delay — Duration and Unit
Exit
Palette: Exit — Ends the workflow when this path is reached. No outgoing connector. Inspector: When execution reaches this node, the workflow path completes successfully. Connect all branches to an Exit before saving. At least one reachable Exit is required to save.Actions
Send Slack Message
Palette: Send Slack Message — Sends a message to a Slack channel via webhook. Category Integrations. Canvas label: Send Slack message / Slack · incoming webhook. This is an incoming-webhook URL, not a connected Slack integration (that node is Send Slack Notification).

Send Slack Message — Slack webhook URL and Message
Send Webhook
Palette: Send Webhook — Sends an HTTP request to an external URL.Update Shipment Reference
Palette: Update Shipment Reference — Updates the reference field on a shipment.Apply Shipping Rule
Palette: Apply Shipping Rule — Applies a shipping rule to the shipment. SetsshippingRuleId on the shipment. It does not re-run checkout condition matching. Same apply as the order/shipment Configure modal — Apply a shipping rule. Field list for the rule itself: Shipping rule fields.


Apply Shipping Rule — select a rule from the organization
Dispatch Shipment
Palette: Dispatch Shipment — Dispatches the shipment for delivery. No fields. Inspector: that description plus No additional configuration needed. Worker: pending or on-hold → dispatched. Already dispatched is a no-op. Other statuses fail. Related: Send a shipment.Cancel Shipment
Palette: Cancel Shipment — Cancels the shipment. No fields. Worker sets status to cancelled. This does not emitshipment.cancelled (that event is delete-of-pending). Related: Hold, cancel, or delete a shipment.
Set Shipment On Hold
Palette: Set Shipment On Hold — Places the shipment on hold. No fields. Worker: pending → on_hold. Already on hold is a no-op. Other statuses fail.Assign Carrier
Palette: Assign Carrier — Assigns a carrier to the shipment.carrierId into the shipment’s carrierSettings JSON. It does not pick a product, services, or additional parameters. Prefer Apply Shipping Rule when you need a full setup.
Print Shipping Label
Palette: Print Shipping Label — Prints the shipping label for the shipment. Category Printing.Print Document
Palette: Print Document — Prints a document for the shipment.Create Return Shipment
Palette: Create Return Shipment — Creates a return shipment. Dropdown lists inbound rules only.Create Shipment from Order
Palette: Create Shipment from Order — Creates a new shipment from the order. Use on an Order Created / Order Updated path (needsorderId / order.id).
Integration actions
These use a connected integration from Integrations. Connect first: Connect Slack, Klaviyo, and other apps. Dropdown lists active connections for that provider. Empty: No items available. Shared inspector:shipment.created, …) unless you override it on Klaviyo / Customer.io / Mailchimp.
Runs
Runs in the top bar. Header Recent runs. Empty: No runs yet / Click Test run to simulate an execution. (The builder button is Execute workflow.)

Runs popover — empty state until you execute
automations.execute with event: manual.test and {} as the payload. Shipment/order actions that need an id will fail on that empty payload.
When a run exists, the row shows trigger event, relative time, N step(s), and duration. Expand for node logs. Node log statuses: success, failed, skipped. Run statuses the list styles: Running, Success, Failed. A delay puts the run in waiting until it resumes.
Errors the UI surfaces
Related
- Journey: Shipping rules · Returns
- Shipping rule fields · Apply a shipping rule · Auto-print
- Inbound and returns · Hold, cancel, or delete a shipment · Send a shipment
- Connect Slack, Klaviyo, and other apps · Schedule a pickup
- Search and filters · Create a brand · Billing and usage
- Automations overview · Building an automation · Runs and debugging
- Automation not triggering