Docs menu and search Link parameters

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, not 9:00). Preselects that start time. It must match a bookable start time for the selected length — otherwise the date opens with no time selected. A time can only be given together with a date.
/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> }. The id is the numeric id of the tier in the product’s discounts array (see Pricing & memberships in the Integrations guide). Products with no price tiers use the single row id: -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%5D

    which 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.

    quantities only takes effect together with autoBook. It is the exact order sent straight to payment. Without autoBook it is ignored, use quantity (a total) to preselect seats on the normal booking page. If the customer is not entitled to every tier in quantities (e.g. a member price they don’t hold), autoBook does not fire and the page falls back to the normal flow with only the total quantity set, 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 date and a time in the path and quantities in 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-day and many-days) products, used together with autoBook. 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 standard exp, 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 a date and time it 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 (ios or android): used together with fromApp to send the customer back into the app after payment.
  • lang: forces the page language. One of no, 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 (keeping lang). 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. quantity does not override that memory (quantities runs through autoBook, which skips the page entirely). An autoBook link 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 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 as priceChoices: [{ 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 the numberOfPunches of 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 email is 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 buyerScopes require 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.