Webhooks
Periode can notify your own systems when something happens by sending a
webhook — an HTTP POST from Periode’s backend to a URL you control. There
are two webhooks:
- Booking webhook — fires when a booking is completed, and again if it later changes (for example when it is cancelled).
- Subscription webhook — fires when a subscription is activated, when a following invoice is paid, and when the subscription is cancelled.
Both are configured per product: a webhook is only sent for products where you have filled in a webhook URL.
How a webhook request looks
Every webhook is an HTTP POST with a JSON body. Periode sends these headers:
content-type:application/jsonx-api-key: your merchant shared secretshared_secret: your merchant shared secret, sent as an additional compatibility header
Use the x-api-key header to verify the request really came from Periode —
compare it to your shared secret before trusting the payload. You can find your
shared secret under
Settings > Developer.
Your endpoint should respond with 200 or 201. If it returns anything
else, or times out, Periode retries the delivery a number of times (roughly 10
attempts) before giving up, so a temporary outage on your side will not lose the
event.
Booking webhook
How it works
When a booking is completed, Periode POSTs the full booking to your URL. The
body is the same booking object the Booking API returns, plus a startsAt field
with the start of the booking as an ISO timestamp (for example
2026-09-04T13:30:00, in the booking’s own timezone). For active bookings
(state booked) the body also includes a cancelUrl. If the booking later
changes, Periode sends the booking again with the updated data.
How to enable it
- Open the booking product
(
Booking > Products, thenEditon the product). - Go to the Admin section.
- Fill in the Webhook url field with your endpoint.
- Save.
From now on, completed bookings for that product are posted to your URL. The webhook is enabled per product — repeat for each product you want to receive.
Subscription webhook
How it works
Periode POSTs the subscription to your URL when the agreement is activated,
each time a following invoice is set to paid, and when the agreement is
cancelled. The body is the subscription object (the same shape the Merchant
API returns for a subscription).
One extra header is included:
is-initial:trueon the first (activation) webhook for a subscription,falseon every webhook after that.
How to enable it
- Open the subscription product
(
Subscription > Products, thenEditon the product). - Go to the API section.
- Fill in Webhook for payments (for developers) with your endpoint.
- Save.
Testing your webhook
See the exact payload
You do not have to wait for a real event to know what the JSON will look like. In
Settings > Integrations,
use Preview booking webhook or Preview subscription webhook: enter an
existing booking or subscription ID and Periode returns the exact JSON it would
send on the webhook. Copy it and build your integration against real data.
Test the whole flow with a free product
To see a live webhook actually reach your endpoint, create a test product with a price of 0 (free). A free product can be booked or subscribed to without a real payment, so you can complete the flow yourself end to end and watch the webhook fire against your URL — without spending anything. Delete or disable the test product when you are done.