Waypoint Booking
Merchant guide

Getting the most out of Waypoint Booking

Waypoint Booking turns BigCommerce products into bookable appointments and slots. This guide covers installing the app, setting it up for the way your business actually books time, and the API for connecting your own systems.

Three ideas run through everything below:

  • Resources are what gets booked — a staff member, a room, a piece of equipment.
  • Services are what's on offer — a named, timed offering (a 30-minute cut, a 1-hour room rental) that you link to a resource.
  • A product in your catalog is made bookable by linking it to one resource and one service. That link is what the storefront picker and checkout actually run on.
Getting started

Installing the app

Install Waypoint Booking from the BigCommerce App Marketplace (or via the install link your partner/developer gave you, if it's not yet publicly listed). Installing grants the app a set of permissions — approve the prompt to continue.

What you're approving

The app requests access to your product catalog (to make items bookable), your storefront (to inject the booking widget), your orders (to confirm bookings automatically), and your customer records (to look customers up for staff-created bookings). See Required permissions for the full list.

Once approved, BigCommerce opens the app inside your control panel and it walks you straight into the setup wizard — nothing else to configure before that.

Getting started

Setup wizard walkthrough

A seven-step guide gets you from a fresh install to a bookable product. It reopens automatically at whichever step you haven't finished — closing your browser mid-setup won't lose your place.

  1. Welcome A short explainer of what's ahead: a resource, a service, opening hours, and connecting the storefront widget and order sync. Click Get started.
  2. Add a resource Give it a Name (e.g. "Room A") and a Timezone (IANA) (e.g. America/New_York) — this is what availability and confirmations are calculated in. Add as many resources as you need before continuing; the step only advances when you click Continue, not automatically.
  3. Add a service Give it a Name (e.g. "Haircut") and a Duration (minutes). Again, add every service you need up front — the wizard doesn't force you to stop at one.
  4. Set opening hours Pick a Day, Start time, and End time for the resource selected at the top of the step (a resource picker appears once you have more than one). A resource with zero hours set has nothing bookable, so this step matters even if you plan to fine-tune it later.
  5. Connect the storefront widget One click — Register widget — injects the booking picker onto your bookable product pages via BigCommerce's Scripts API. No theme editing required.
  6. Connect order sync One click — Register order sync — registers the webhooks that confirm a booking automatically when an order is placed, and cancel it automatically if the order is later cancelled or refunded.
  7. You're set up Click Finish. The only thing left is linking an actual product to the resource/service you just created — see the next section.

You can dismiss the guide at any point and reopen it later with the Show setup guide link at the top of the Overview tab. Dismissing is per-store, so it won't nag every staff member who logs in separately.

Getting started

Making a product bookable

Catalog tab → Make products bookable.

This is the one step the wizard can't do for you, because it depends on your actual catalog. It's a bulk tool, not a one-at-a-time form:

  1. Choose a resource and a service from the two selects at the top, and optionally a Channel — leave it on All channels unless you want this link bookable on only one BigCommerce sales channel (see Multi-channel / wholesale).
  2. Search and select products in the list below — search matches name or SKU, and Select all respects an active search filter. Each row shows whether it's already linked, and to what.
  3. Click "Make Bookable (N)" to apply the resource/service/channel to every selected product at once. Re-running this on an already-linked product updates it in place — it won't create a duplicate.

To unlink, select the already-linked products and click Remove selected. The moment a product is linked, the storefront widget starts appearing on its product page automatically — no republish or cache step needed.

The dashboard

Dashboard tour

Everything lives under five tabs inside the BigCommerce control panel.

Overview

The setup guide, and a Needs attention panel that only appears when something needs a human — see Needs attention.

Catalog

Resources, Services, Availability, and Make products bookable — everything that defines what can be booked.

Bookings

The drag-to-reschedule calendar, and the full bookings list with walk-in booking creation.

Settings

Hold duration, default timezone, widget layout, and outbound notification webhooks.

Advanced Beta

Two-way Google/Outlook calendar sync — see Two-way sync before relying on it.

Core concept

Resources

Catalog → Resources. A resource is what actually gets booked.

Fields
Name
e.g. "Room A", "Jane Smith", "Camera kit #2".
Timezone (IANA)
e.g. America/New_York. All of this resource's hours, slots, and confirmations are calculated in this timezone regardless of where a shopper is browsing from.
Capacity
How many bookings can legitimately share the exact same time slot. Leave at 1 for the normal one-booking-at-a-time case; raise it for a group class or a 30-seat seminar. See Events & classes.

Each resource also has its own subscribable calendar feed URL for staff — see Add-to-calendar & feeds — and, once connected, an optional two-way sync mapping to a Google or Outlook calendar.

A resource can host more than one service (a room used for both yoga and pilates), and a service can be offered by more than one resource (three stylists all offering "Haircut") — resources and services are deliberately independent, so you're not duplicating a service's price and duration per staff member.

Core concept

Services

Catalog → Services. A service is a named offering with a fixed duration.

Fields
Name
e.g. "30-min consult".
Duration (min)
How long a booking of this service occupies its resource.
Buffer before / after
Minutes of clean-up or reset time blocked immediately before and/or after each booking. The booking itself still records the real appointment time — the buffer only affects what else can be booked around it.
Widget picker heading shows
Controls what the storefront picker's heading names — the underlying resource/service link never changes, just what a shopper reads:
  • Service and resource name (default) — "Book: Haircut (30 min) with Jane"
  • Service name only — "Book: Haircut (30 min)" — use when who performs it doesn't matter to the shopper
  • Resource name only — "Book with Jane (30 min)" — use when the resource is effectively the product
Recurring series
Checkbox: "Always book as a fixed recurring series — not a customer choice." Once checked, set Number of sessions and Repeat every (days). See Recurring courses — this is the field that turns a service into a block-booked course.

Both service-level settings — widget display and recurring series — are merchant decisions made once here, never something a shopper chooses at checkout.

Core concept

Availability

Catalog → Availability. Configured per resource, in three layers.

Recurring weekly hours

Pick a Day, Start time, and End time and click Add hours. A resource with no hours set has no bookable slots at all — this is the one thing every resource needs before it can take a booking. Within these hours, slots pack back-to-back continuously by default (a 30-minute service inside 9am–5pm hours offers 9:00, 9:30, 10:00, and so on).

Fixed booking slot times

Optional. Add exact bookable times — say 10:00, 12:00, 14:00 — instead of continuous back-to-back slots. The moment a resource has any fixed time, it switches entirely to fixed-time mode; remove them all to go back to continuous packing. Each entry either recurs on a day of the week, or (toggle One-off (specific date)) is pinned to one exact calendar date — useful for a single special session on a day the resource wouldn't normally be open at all.

One-off exceptions

Overrides the recurring hours for a single date: mark it fully closed (a holiday), or toggle Open (custom hours) and give it different hours than usual. An optional Reason is for your own reference only — shoppers never see it. Exceptions are only shown/editable for the next 180 days.

Which mode is right for you?

Continuous slots suit anything booked by the hour (rooms, consults). Fixed slot times suit anything that runs on a schedule (class times, seatings, tours). See the scenario guides for concrete examples of each.


Worked examples

Scenario guides

The same three building blocks — resources, services, availability — cover very different businesses. Here's how five common setups map onto them.

Rooms & equipment

Example: a co-working space renting out a meeting room by the hour, or a shop renting out cameras and gear.

  • Resource = the room or the specific item ("Meeting Room B", "Camera kit #2"). Capacity stays at 1 — a room can't be double-booked.
  • Service = the booking unit, e.g. "1 hour" or "Half day". Add a buffer after (10–15 minutes is typical) to cover reset/cleaning time between bookings without it eating into the booked hour itself.
  • Availability: recurring weekly hours (continuous slots), so a customer can book any hour within your opening times, not just fixed start times.

If you rent several identical items (five identical cameras), create one resource per physical unit — capacity is for one resource serving many people at once, not for pooling interchangeable inventory.

Salon & personal services

Example: a hair salon with several stylists, or any appointment-based personal service.

  • Resource = each staff member, with their own hours. Different stylists can have different weekly schedules.
  • Service = each offering ("Haircut", "Colour"), linked to whichever stylists perform it — a service can be offered by more than one resource.
  • Set widget picker heading to Resource name only if the point of booking is "with this specific person" ("Book with Jane"), or leave it on Service and resource name if both matter.
  • Add a buffer before/after per service for setup/cleanup between clients.

For "any available stylist" booking rather than a named one, set the heading to Service name only and link the service to every stylist resource — the widget books whichever resource has an open slot.

Events & classes

Example: a group fitness class, a seminar, or any session many people attend at the same time.

  • Resource = the room or instructor, with Capacity set to how many people can book that exact session (e.g. 30 for a seminar).
  • Availability: usually fixed slot times (e.g. classes at 9:00, 12:00, 18:00) rather than continuous packing, since a class runs on a schedule.
  • The storefront shows the slot as simply available or full — not a running "27 of 30 spots left" count.

To see who's coming to a given session: open the Calendar tab, click that session's booking, and use Export attendee list (CSV) — it appears automatically for any resource with capacity greater than 1, and resolves every attendee's real name and email at the moment you download it.

Recurring courses

Example: a 10-week dance course, a term of weekly swim lessons — a block of sessions sold and booked as one purchase.

  • On the Service, check "Always book as a fixed recurring series" and set Number of sessions (e.g. 10) and Repeat every (days) (e.g. 7 for weekly).
  • A shopper picking a start time books the entire series in one action — every session is reserved together, or none are, if any single week is unavailable.
  • From the Bookings tab, Cancel entire series cancels every remaining session in one click, rather than one at a time.
Not for walk-ins

Series booking only runs through the storefront widget/checkout. A staff-created walk-in booking (see Bookings & walk-ins) always creates a single session, even for a series-enabled service.

Multi-channel / wholesale

Example: a resource that should only be bookable through one storefront/channel — a wholesale-only stylist, or a service exclusive to a second brand storefront.

  • Resources and services themselves stay channel-agnostic and reusable everywhere.
  • The restriction lives on the link between a product and its resource/service: in Make products bookable, choose a specific channel instead of All channels before applying.
  • A restricted link's row shows the channel name it's limited to, so you can tell restricted links apart from open ones at a glance.

Nothing stops the same resource being linked from an unrestricted product too — if a resource must be genuinely exclusive to one channel, make sure every product you link it from is restricted to that channel.


Running day to day

The calendar

Bookings → Calendar. A drag-and-drop week/month view of every booking.

  • Filter by resource, and toggle between week and month view from the top-right of the calendar itself.
  • Drag a confirmed booking to a new day or time to reschedule it — only confirmed bookings can be dragged, and dragging can't change how long the booking runs, only when it starts. Dropping onto an already-full slot is rejected and the booking visibly snaps back to where it was.
  • Click any booking to open its details: date/time, status, the customer, and — if it's part of a recurring series — a "Series" badge.
  • From that details panel: Add to Google Calendar, Add to Outlook, and Download .ics (Apple Calendar or any other app) put that one appointment on your own calendar. Cancel booking cancels it (see the note on refunds below).
  • For a resource with capacity greater than 1, the details panel also shows Export attendee list (CSV) — see Events & classes.
Cancelling here doesn't refund the order

Cancelling a booking from the dashboard only updates its status here and frees the slot — it does not issue a refund on BigCommerce. To actually refund a customer, cancel or refund the order in BigCommerce's own admin; that automatically flips the linked booking to cancelled here too, with no extra step.

Running day to day

Bookings & walk-ins

Bookings → the list below the calendar. The full record of every booking, plus manual creation for phone/walk-in customers.

Creating a walk-in booking

Use New booking (walk-in / phone) to book directly, bypassing checkout, for a customer you're dealing with in person or over the phone.

  1. Find the customer using the search box — it searches your real BigCommerce customer records by name or email. A walk-in booking always needs a real, existing customer record; you can't type in a name and email freehand.
  2. Pick a resource, service, date, and time.
  3. Click Create booking. It's inserted immediately with no hold step, since a staff member creating this in real time isn't racing a customer's own browser session.
Requires the Customers permission

The customer search needs the Customers scope granted during install — see Required permissions. If search comes back empty for a customer you know exists, this is the first thing to check.

Filtering, rescheduling, cancelling

Filter the list by resource or status. Any confirmed booking can be Rescheduled inline (pick a new resource/service/date/time and save) or Cancelled. A booking that's part of a series shows Cancel entire series instead of a plain cancel, so you're not clicking through ten sessions one at a time.

Running day to day

Needs attention

Overview tab. Only appears when something genuinely needs a human — an empty store sees nothing here.

Orders without a matching booking

Occasionally an order comes through after its hold already expired (the customer took too long at checkout). The order is real and paid, but nothing was automatically reserved for it. Each entry names the order and the reason; follow up with the customer, create the correct booking by hand from Bookings, then click Mark resolved here to clear it.

Webhooks that kept failing

If BigCommerce's order notifications to this app fail repeatedly (six attempts over roughly two hours), the delivery is parked here rather than silently dropped. Once you believe the underlying issue is fixed, click Retry next to the entry.

Running day to day

Store settings

Settings tab. Applies across the whole store.

SettingWhat it controls
Hold duration (minutes)How long a picked slot is reserved for a shopper mid-checkout before it's released back to availability.
Default timezone (IANA)Pre-fills the timezone field whenever you create a new resource — doesn't retroactively change existing resources.
Widget layoutMonth calendar with accordion (default) or Date strip (scrollable row of days) — how the storefront picker presents dates. See below for what each looks like.
Outbound notification webhooksWhere booking events are sent, since the app no longer sends email itself — see Notification webhooks.
RemindersToggle + lead time (hours) for firing an upcoming-appointment reminder event ahead of the booking start.

Calendars

Add-to-calendar links & feeds Stable

A one-way way to see this app's bookings in Google, Outlook, or Apple Calendar. No account connection required.

One appointment at a time: from a booking's details (in the dashboard Calendar tab, or a customer's own My Bookings page on your storefront), Add to Google Calendar and Add to Outlook open a pre-filled event in that provider's own web app; Download .ics covers Apple Calendar and anything else that imports ICS files.

A whole resource's schedule: on the Resources panel, each resource has a Copy feed URL button. Subscribing to that URL (webcal-style) in any calendar app keeps that resource's upcoming bookings showing up automatically, without re-adding anything by hand. It carries no customer names or emails — just when the resource is busy. If a feed URL leaks or a staff member leaves, click Regenerate to invalidate it; anyone still subscribed to the old link stops seeing updates until they re-subscribe with the new one.

Feed window

Each feed shows a rolling window — 30 days in the past to 180 days ahead — not your entire booking history, so it stays fast to poll regardless of how long you've used the app.

Calendars

Two-way calendar sync Beta

Advanced tab. Connects a real Google or Outlook account so bookings and your calendar stay in sync in both directions.

Unlike the feed above, this is a genuine two-way connection: a booking confirmed here is pushed into your connected calendar automatically, and an event you create directly in that calendar blocks the matching time from being booked here — useful for blocking out a resource's personal time off without touching this app at all.

Connecting an account

  1. On the Advanced tab, click Connect under Google Calendar or Outlook. This opens the provider's sign-in/consent screen in a new browser tab (it can't run inside the embedded control panel).
  2. Approve access, then return to the Waypoint Booking tab — it picks up the new connection automatically.
  3. Under Resource mapping, pick a provider and a specific calendar for each resource you want synced, then click Save. A resource can sync with Google or Outlook, but not both at once.

A connected account shows as Connected with the account email; if a token expires or access is revoked, it shows Needs attention — click Reconnect to fix it. Disconnect removes the connection and unmaps every resource pointed at it (it does not delete anything already pushed into your calendar).

Before you rely on this

This is a newer capability and, as of this writing, hasn't yet been exercised against real Google/Outlook accounts end-to-end. If Connect errors out immediately or nothing seems to sync, this usually means the underlying Google/Microsoft app registration hasn't been completed on the platform side yet — contact support rather than assuming it's something wrong with your account. Until you've confirmed it working for your own store, keep using the one-way feed above as your source of truth.

Notifications

Notification webhooks

Settings tab. Waypoint Booking doesn't send email itself — it posts a signed event to a URL you control, and your own system decides what to do with it.

This is the integration point if you want a customer email, an SMS, a Slack alert, or anything else to fire when a booking is confirmed, cancelled, or coming up. It needs a small amount of setup on your side (or your developer's) to receive and act on the events — see the API guide below for the technical detail.

  1. Set a Webhook URL pointing at an endpoint your system controls, and click Save.
  2. Copy the signing secret shown below the URL field — your endpoint uses this to verify a delivery genuinely came from Waypoint Booking. Click Regenerate secret any time you need to rotate it.
  3. Click "Send test event" to fire a synthetic event at your endpoint immediately, without waiting for a real booking — useful for confirming your receiving code and signature check both work before going live.
Best-effort delivery

Each event is sent once, with a short timeout. If your endpoint is down or slow, the event is not retried or queued — treat your receiving system the way you'd treat any webhook consumer (Stripe's, GitHub's) and design for the occasional missed delivery.


API guide

Connecting your own systems

This section is for you or your developer to integrate Waypoint Booking with the rest of your stack. Hand it to whoever's writing the code.

SurfaceWho it's forStatus
Outbound notification webhook Your systems. The main integration point — react to bookings being made, cancelled, or reminders coming due. Stable
Per-resource calendar feed (.ics) Any calendar app. Read-only, no auth beyond a per-resource link. Stable
Booking ICS download A single "add to calendar" download, dashboard or storefront side. Stable
Dashboard / admin API, storefront widget API Internal — power the dashboard and the storefront picker themselves. Internal

The dashboard and storefront widget APIs are session- and hold-token-authenticated for the app's own internal use, and aren't a supported public integration surface — build against the notification webhook and calendar feed instead.

API guide

Notification webhook payloads

Every event is an HTTP POST to the URL configured in Settings, with header Content-Type: application/json and a signature header described in Verifying signatures. Every payload shares the same envelope:

{
  "event": "booking.confirmed",
  "storeHash": "abc123",
  "createdAt": "2026-07-20T14:32:00.000Z",
  "data": {
    "resource": { "id": 4, "name": "Jane Smith", "timezone": "America/New_York" },
    "service":  { "id": 9, "name": "Haircut", "durationMinutes": 30 },
    "customer": { "name": "Alex Rivera", "email": "alex@example.com" },
    "booking":  {
      "id": 512,
      "status": "confirmed",
      "startUtc": "2026-07-21T23:00:00.000Z",
      "endUtc": "2026-07-21T23:30:00.000Z",
      "seriesId": null
    }
  }
}

Series events (booking.series_confirmed / booking.series_cancelled) carry a bookings array instead of a single booking object — one entry per session in the course, sharing one seriesId.

EventFires when
booking.confirmedAn order is placed and the held slot is confirmed into a real booking.
booking.cancelledA booking is cancelled, or its order is cancelled/refunded on BigCommerce.
booking.rescheduledA confirmed booking's time (and/or resource/service) is changed, from the dashboard or the calendar drag view.
booking.series_confirmedEvery session of a recurring-course order is confirmed together, as one event.
booking.series_cancelledAn entire recurring series is cancelled at once.
booking.reminder_dueA booking crosses your configured reminder lead time (Settings → Reminders).
webhook.testOnly ever sent by clicking Send test event in Settings — filter it out of any real processing by event name.
API guide

Verifying signatures

Every request carries an x-waypoint-signature header: an HMAC-SHA256 hex digest of the raw request body, keyed by the signing secret shown in Settings. Verify it against the raw body bytes, before any JSON parsing, or the signature won't match.

// Node.js / Express example
import { createHmac, timingSafeEqual } from 'crypto';

app.post('/webhooks/waypoint-booking', express.raw({ type: 'application/json' }), (req, res) => {
  const signature = req.header('x-waypoint-signature') ?? '';
  const expected = createHmac('sha256', process.env.WAYPOINT_WEBHOOK_SECRET)
    .update(req.body) // raw Buffer, not the parsed object
    .digest('hex');

  const ok = signature.length === expected.length &&
    timingSafeEqual(Buffer.from(signature, 'hex'), Buffer.from(expected, 'hex'));

  if (!ok) return res.status(401).send('bad signature');

  const event = JSON.parse(req.body);
  // ... react to event.event / event.data
  res.sendStatus(200);
});

Treat a delivery with a bad or missing signature as untrusted and discard it — it didn't come from Waypoint Booking.

API guide

Calendar feed & ICS downloads

WhatURL shapeNotes
Per-resource feed webcal://…/api/feed/resources/<token>.ics No auth beyond the token itself — treat the URL as a secret. Regenerable from the Resources panel.
One booking (dashboard) GET /api/bookings/<id>/ics Dashboard-session authenticated.
One booking (customer) GET /api/widget/customer/bookings/<id>/ics Authorized by the shopper's own BigCommerce "current customer" token — this is what powers the Apple Calendar link on My Bookings.

These all produce standard RFC 5545 .ics files, importable by any calendar application.


Reference

Required permissions

PermissionUsed for
Products (read/write)Creating the hidden modifier/metafields that make a product bookable.
Content (read/write)Injecting the storefront widget via the Scripts API — no theme file edits.
Orders (read)Confirming a booking automatically once an order is placed.
Customers (read)The staff walk-in customer picker, and showing real customer names/emails against order-derived bookings.
If walk-in bookings or customer names aren't working

The Customers permission is a comparatively recent addition. If your store was approved before it existed, you may need to reinstall the app once for the new permission to take effect. Order-derived bookings still work without it — only the manual/walk-in flow and name/email display depend on it.

Reference

Troubleshooting & FAQ

The widget isn't showing up on a product page

Confirm the product is actually linked in Make products bookable, and that the widget is registered (Overview → setup guide, or Catalog). The widget looks for your theme's standard add-to-cart form; on a heavily customized theme it may need a small adjustment — contact support with the product URL if it's genuinely missing.

A customer's order came through but there's no booking

Check Needs attention on the Overview tab — this is exactly what "Orders without a matching booking" surfaces (usually a checkout that took longer than the hold duration). Create the booking manually and mark it resolved.

How long does confirmation take after checkout?

Up to about a minute — orders are confirmed by a background process, not instantly inside the checkout request itself, so a booking may briefly show as pending before flipping to confirmed.

Why does availability look off by an hour?

Check the resource's Timezone (IANA) field first — every hour, exception, and slot is calculated in that resource's own timezone, not your browser's or the shopper's.

Can different staff have different permissions in the app?

Not yet — any BigCommerce staff login that can open the app has full access to every panel, including Settings.

Does cancelling in the dashboard refund the customer?

No — see the note under The calendar. Refunds happen in BigCommerce's own order admin.

Reference

Known limitations

  • No remaining-capacity count shown to shoppers — a group session reads as available or full, not "27 of 30 left."
  • No built-in merchant-facing alert channel beyond the notification webhook — you (or your developer) decide how a new booking actually reaches you day to day.
  • No per-staff permission levels inside the dashboard.
  • Walk-in/manual bookings don't support recurring series — series booking is storefront-checkout only.
  • Two-way calendar sync is Beta — see the note under Two-way sync.
  • Availability is configured per resource; there's no store-wide default schedule to set once and inherit.