How it works
- You register one or more endpoints from the admin panel or with the
Admin API (
POST /admin/webhooks,systempermission), choosing the events. - Vellaro sends a
POSTto your URL on every subscribed event, with a JSON payload describing the event and the resource. - The request is signed: verify the signature with your secret before trusting the content.
- Respond with
2xxwithin 10 seconds to acknowledge receipt; failed deliveries are retried.
secret (whsec_...), shown only once: store it right
away. Later reads only show secret_last_four.
URL rules
The URL must be https to a public host, with no credentials in the URL. The check runs on save (with a DNS lookup) and again on every delivery:
A delivery to a destination that meanwhile resolves to an internal network ends as
failed,
with no further attempts. Redirects are not followed: a 3xx counts as a failure.
Events
GET /admin/webhooks/events returns the list of events you can subscribe to:
Test deliveries carry the
webhook.test event, which can’t be subscribed to.
Payload
product.* events, data contains id, name, slug, and is_active. For the full
detail, read the resource again with the Admin API.
Verifying the signature
Every request carries these headers:
Compute the signature over the received bytes, not over re-serialized JSON, compare it in
constant time, and reject timestamps that are too old.
Retries and idempotency
- Any response other than
2xx(redirects included), a timeout, or a network error is a failed attempt. The delivery is retried with growing waits (1, 2, 4, 8, and 16 minutes). - Attempts of the same delivery share the same
X-Vellaro-Delivery. A manual redelivery instead creates a new delivery with the same payload: make your processing idempotent (for example onevent,data.id, andoccurred_at). - Answer
2xxright away and do the heavy work in a queue.
Management tools
All routes live under/admin/webhooks/{id} (system permission); a webhook of another store
answers 404.
Each delivery in the log has
event_type, status, attempt, response_status,
next_retry_at, delivered_at, and response_body: a safe excerpt of your endpoint’s
response (at most 256 printable characters), enough to recognize the error.
Webhooks are not needed for delivering digital products: after payment, the API
issues signed download links, documented in the API Reference.