Skip to main content

Event Types

VitaRelay emits the core order and intake events below. Every order/intake.reviewed payload includes event (the type) and occurred_at (ISO 8601 timestamp); the newer intake.submitted event uses the versioned envelope shown in its section. Storefront integrations also receive the full order lifecycle (order.cancelled, order.fulfilled, order.payment_failed) and subscription lifecycle events. Deliveries generated by the sandbox also include "sandbox": true.
In live, order_id, patient_id, and escript_id are UUIDs and order_number is the real order number. In sandbox, ids look like sandbox_ord_…, sandbox_pat_…, and sandbox_int_….

Order events

order.paid

Fires when the order’s card-on-file charge succeeds.

order.shipped

Fires when the order ships and tracking is attached.

order.delivered

Fires when the carrier reports delivery.

order.exception

Fires when the carrier reports a delivery problem (failed attempt, return to sender, address issue, and similar).

Intake events

Subscription events

Subscription webhooks use the versioned envelope and may include: subscription.created, subscription.updated, subscription.paused, subscription.resumed, subscription.canceled, subscription.renewed, subscription.payment_failed, and subscription.rx_hold. shop.item.updated fires when subscription settings change. Every subscription event’s data includes: subscription_id, patient_id, item_kind, item_id, quantity, cadence, status, paused_reason, next_charge_at. Event-specific extras: reason (paused), skipped_next (updated), order_id + charged_cents (renewed), order_id + held_item_count (rx_hold), and for subscription.payment_failed: order_id, attempt, max_attempts, next_retry_at, final. subscription.payment_failed fires on every failed attempt (retries after 2 and 3 more days). The third failure sets final: true, next_retry_at: null, and also emits subscription.paused with reason: "payment_failed".
subscription.renewed, subscription.payment_failed, and subscription.rx_hold are never emitted while patient billing is in dry-run mode (no real charge happens). Created/updated/paused/resumed/canceled events emit normally in dry-run.

intake.reviewed

Intake reviewed / prescription signed. Fires the moment a prescriber signs the escript — this is the “Rx cleared” signal you should key fulfillment off of.

intake.submitted

Fires the moment a patient completes a hosted (“Mode B”) intake via the intake.telemedcomplete.com link. Use it to know a self-served intake is in and ready to route to the IDN. PHI-free: it carries ids, category, and status only — never the patient’s answers. This event uses the versioned envelope (type + event + api_version + created_at + data).

Sandbox deliveries

Events generated by the simulated sandbox lifecycle are identical in shape but carry "sandbox": true and sandbox ids:
Never treat a payload with "sandbox": true as a real clinical or financial event.