Overview
Your platform pushes events to Vambe as they happen. Each event is a canonical JSON payload — you map your own data onto Vambe’s shape, so there is no per-provider code on Vambe’s side. All inbound endpoints are:| Event | Path | Purpose |
|---|---|---|
| Order | /events/order | A paid/created order. |
| Checkout | /events/checkout | An abandoned checkout to recover. |
| Fulfillment | /events/fulfillment | A shipment created/updated. |
| Product upsert | /events/product | Create or update a product. |
| Product delete | /events/product/delete | Remove a product. |
Authenticating your webhooks
Every request must be signed with your app’s signing secret (thesigning_secret from
Create Your App).
Compute an HMAC-SHA256 (hex) over the string {timestamp}.{rawBody} and send:
| Header | Value |
|---|---|
x-vambe-timestamp | Current time in epoch milliseconds. |
x-vambe-signature | HMAC_SHA256(signing_secret, "{timestamp}.{rawBody}") as hex. |
2xx response means the event was accepted. Retry on any non-2xx — Vambe is idempotent
on the entity’s external id.
The envelope
Every payload is an envelope with two optional routing fields plus the entity:Your identifier for the merchant store. Used to resolve the installation (see below).
Your event id. Advisory today; reserved for explicit de-duplication.
Resolving the installation
A single app can be installed by many merchants, so Vambe must map each webhook to the right installation:- Multi-store: send
external_store_idmatching theexternal_idVambe captured from youraccount_info_url. Vambe resolves by(app, external_id). - Single installation: if the app has exactly one installation, it resolves automatically
even without
external_store_id.
404.
Order
POST /api/public/apps/{appId}/events/order
The customer phone is the most important field: it is how Vambe links the order to the
WhatsApp contact. Send it in E.164 format when possible. Products are matched by
external_product_id against the catalog you synced.Checkout (abandoned)
POST /api/public/apps/{appId}/events/checkout
customer.phone and recover_url are required for recovery: Vambe resolves (or creates) the
contact by phone and records the abandoned checkout with its recovery link.Fulfillment
POST /api/public/apps/{appId}/events/fulfillment
| Field | Notes |
|---|---|
order_external_id | Links the shipment to the order. |
fulfillment_external_id | Unique id of this fulfillment (Vambe upserts on it). |
type | delivery or pickup (defaults to delivery). |
Products
Products are incremental — each event affects only the product you send. Vambe never deletes the rest of your catalog from a webhook.Upsert (create or update)
POST /api/public/apps/{appId}/events/product
(external_id, store): a new external_id is created, an existing one is
updated. Product embeddings (for AI search and recommendations) run automatically.
Delete
POST /api/public/apps/{appId}/events/product/delete
Catalog over webhook is the push model. If you’d rather have Vambe pull your full
catalog instead, that is handled by the
products_list outbound capability — talk to the
Vambe team about which model fits your platform.