Link parameters
Every booking product has a public booking page. By adding path segments and
query parameters to its URL you can preselect a date, a time, the number of
seats and which price tiers are used, hide the page header when you embed it,
and — with autoBook — send the customer straight to payment.
Gift card and punch pass products have their own purchase pages, which take an
autoPay parameter in the same spirit.
This is the reference for everything those pages read. It is useful for campaign links, “book again” links in your own emails, links from your own website or app, and iframe embeds.
The booking URL
https://minside.periode.no/booking/<merchantId>/<bookingManifestId>
You can append a date, and a date plus a time:
/booking/<merchantId>/<bookingManifestId>/<date>
/booking/<merchantId>/<bookingManifestId>/<date>/<time>
There is also a short link that only needs the product id:
https://minside.periode.no/b/<bookingManifestId>
The short link redirects to the full booking URL, but it drops everything after the
?. Use the full/booking/...URL whenever you add query parameters.
Path segments
merchantId(required): your merchant id.bookingManifestId(required): the booking product id.date(optional):YYYY-MM-DD. Opens the calendar on that date. Dates more than two days in the past are ignored, and the page falls back to today in the product’s time zone.time(optional):HH:mm, zero-padded, in the product’s time zone (e.g.09:00, not9:00). Preselects that start time. It must match a bookable start time for the selected length — otherwise the date opens with no time selected. Atimecan only be given together with adate.
Preset link
/booking-preset/<merchantId>/<bookingManifestId>/<initialAmount>/<initialLength>
initialAmount(number): how many seats to preselect on the default price tier.initialLength(number): the session length to preselect, in decimal hours (1.5= 1 hour 30 minutes). Must be one of the lengths configured on the product. On products that require the customer to pick a length before any times are shown, this satisfies that requirement so the times appear immediately.
This route has no date/time segments — use the query parameters below to preselect anything else.
Preselecting the order
-
quantity(number): the total number of seats. Periode keeps whatever is already preselected and fills the rest on the most expensive tier the customer is allowed to book, up to the product’s capacity and max order size. Example:?quantity=4. -
quantities(JSON): selects specific price tiers, as a JSON array of{ "id": <tier id>, "amount": <seats> }. Theidis the numericidof the tier in the product’sdiscountsarray (see Pricing & memberships in the Integrations guide). Products with no price tiers use the single rowid: -1. URL-encode the value:?quantities=%5B%7B%22id%22%3A1%2C%22amount%22%3A2%7D%2C%7B%22id%22%3A2%2C%22amount%22%3A1%7D%5Dwhich is
[{"id":1,"amount":2},{"id":2,"amount":1}]— 2 seats on tier 1 and 1 seat on tier 2. A malformed value is ignored rather than breaking the page.quantitiesonly takes effect together withautoBook. It is the exact order sent straight to payment. WithoutautoBookit is ignored, usequantity(a total) to preselect seats on the normal booking page. If the customer is not entitled to every tier inquantities(e.g. a member price they don’t hold),autoBookdoes not fire and the page falls back to the normal flow with only the totalquantityset, so they can sign in or adjust. -
code(string): prefills the discount / gift card code field, and the field is opened so the customer can see it. The code is applied on the payment step. Example:?code=SUMMER25. -
from/to(YYYY-MM-DD): preselects the arrival and departure dates on multi-day (cross-day) products. Ignored on other product types.
Skipping to payment
-
autoBook: when set (e.g.?autoBook=true), the page continues to the next step on its own — no “Book now” click — as soon as everything needed for a valid booking is in place.The link has to state the whole order — a
dateand atimein the path andquantitiesin the query. Auto-book never guesses a slot or a number of seats, so a link missing any of the three falls back to the normal page.It then only skips ahead when the booking would go through on a normal click:
- the date is inside the product’s own start and end dates, and the slot is far enough ahead to satisfy the product’s lead time,
- the order passes the product’s rules — seats selected, within capacity and max order size, any required resource and extra products chosen,
- the customer is entitled to every selected price tier, including memberships granted through another membership,
- if the product requires a membership, the customer is signed in and that membership is active,
- the product does not require a booking code.
If any of that is missing the page simply renders as usual, so the customer can log in, become a member, or adjust the order. When several payment methods are configured, the first one is used.
/booking/<merchantId>/<productId>/2026-09-14/18:00?quantities=...&autoBook=true -
days(number): the length of the stay on multi-day (cross-dayandmany-days) products, used together withautoBook. It must be within the product’s own minimum and maximum, and every day of the stay must be inside the product’s dates with room for the whole order — otherwise the link falls back to the normal page. Ignored on other product types, where a booking is always one day.
Access and identity
bookingCode(string): for products protected by a booking code. Opens the code dialog with the code filled in, so the customer only has to confirm.waitlistId(string): marks the booking as a converted waitlist entry — the waitlist entry is closed and its reserved spot released when the booking completes. Periode puts this on the link in the “a spot opened up” message; you do not build it yourself.token(JWT): only for products with a webhook integration. A JWT signed with your merchant shared secret that vouches for the customer from your system (user_id, a standardexp, and optionally name, email and phone). A valid token marks the booking as a member booking, so it may book members-only sessions, and it is owned by that external user instead of a Periode account, so the customer is not asked to log in. The token is remembered per merchant in the browser. See Validating an external membership (JWT) in the Booking API guide for the full setup: the shared secret, the claims, and the linked product used to price and track the channel.
Layout, language and embedding
isSlim=true: hides the merchant header banner. Use it when the booking page is embedded in an iframe on your own site, or opened inside an app, and you already show your own navigation.fromApp: tells Periode the page was opened from your app. Combined with adateandtimeit renders the compact view: the description and the calendar are collapsed behind a “date · time / Edit” summary, since the customer already picked the slot in the app.platform(iosorandroid): used together withfromAppto send the customer back into the app after payment.lang: forces the page language. One ofno,en,de,fr,nl,sv,da. Anything else is ignored and the customer’s own language is kept.
Campaign tracking
The booking page also picks up the ad and analytics parameters — gclid,
fbclid, client_id and session_id — and remembers them while the
customer books. They are described in the
GA4 and Meta tracking guide, together with how to forward them if your ads
point at your own site first.
ad_user_data (granted or denied) and ad_user_data_at (ISO 8601 in
UTC) carry the customer’s tracking consent from your own cookie banner or app.
Both are stored on the booking and returned in the bookings API and the webhook,
the answer as a boolean and the timestamp as sent. They are described in the
GA4 and Meta tracking guide.
Examples
Open a specific slot with two adult tickets:
/booking/<merchantId>/<productId>/2026-09-14/18:00?quantity=2
A member link that goes straight to payment when the customer is signed in with an active membership, and shows the normal page when they are not:
/booking/<merchantId>/<productId>/2026-09-14/18:00?quantities=%5B%7B%22id%22%3A2%2C%22amount%22%3A1%7D%5D&autoBook=true
An English campaign link with a discount code, embedded without the header:
/booking/<merchantId>/<productId>?code=SUMMER25&lang=en&isSlim=true
A two-night stay preselected on an accommodation product:
/booking/<merchantId>/<productId>?from=2026-09-14&to=2026-09-16
Good to know
- Parameters are read once, when the page opens. Once the customer picks a
time, Periode rewrites the address bar to the clean
/booking/<merchantId>/<productId>/<date>/<time>form (keepinglang). The parameters stay in effect for that visit, but a customer who reloads the page from the rewritten address starts without them. - The page remembers a customer’s selection for 15 minutes — seats, code,
extra products, resource and length — so they can log in or become a member
and come back without losing their order.
quantitydoes not override that memory (quantitiesruns throughautoBook, which skips the page entirely). AnautoBooklink clears that memory, so a link that falls back to the normal page starts from the link’s own order rather than an older visit’s. - The short
/b/<productId>link drops query parameters. Use the full/booking/...URL for anything on this page. - Unknown parameters are ignored, so it is safe to leave your own tracking parameters on the link.
Gift card and punch pass links
Gift cards and punch passes are bought on their own pages:
https://minside.periode.no/gift-card/<giftCardManifestId>
https://minside.periode.no/m/<merchantId>/punch-pass/<punchPassManifestId>
Both accept autoPay, a JSON object naming the whole purchase. When it is
complete the page fills the form in and submits it, so the customer lands on
payment without a click. As with autoBook, the first payment method configured
on the product is used. URL-encode the value.
Gift cards
/gift-card/<giftCardManifestId>?autoPay={"priceChoice":50000,"email":"ola@example.no"}
priceChoice(number): the gift card value in minor units (50000= 500 kr). It must be one of the amounts configured on the product — the same values the API takes aspriceChoices: [{ price }], given here as the plain number.email(string): the buyer’s email, the address the gift card is sent to.
Punch passes
/m/<merchantId>/punch-pass/<punchPassManifestId>?autoPay={"punches":10,"email":"ola@example.no"}
punches(number): how many punches to buy. It must match thenumberOfPunchesof one of the product’s choices.email(string): the buyer’s email.
When the customer is stopped instead
autoPay only pays when nothing is left to decide. The page renders as usual —
with whatever the link did supply already filled in — when:
- the choice does not match one the product offers, the
emailis missing, or the product has no payment method configured; - the product asks the buyer for anything else the link cannot supply. A gift
card whose
buyerScopesrequire a name, phone number or address stops for those fields, and a product that requires accepting terms and conditions always stops for the checkbox — a link is never allowed to accept terms on the customer’s behalf; - a punch pass that attaches to the buyer’s account is opened by someone who is not signed in. The page shows the sign-in step first.
Gift card products configured with a free amount only, and no fixed
priceChoices, cannot be auto-paid — there is no choice for the link to name.