Reserve with Google
Guests reserve directly from Google Search and Google Maps — Onboard is the credited reservation partner and writes the booking in real time.
When a guest finds a participating restaurant on Google, the listing shows a "Reserve a table" button next to the address and hours. The guest picks party size and time inside Google's UI — the booking itself runs through Onboard and lands in the live floor plan within seconds.
Google's reservation-partner programme. Bookings are credited to Onboard as the reservation partner ("Reservations via partner") and tagged with source google_reserve.
Architecture
The integration runs in two directions: Google crawls three feeds containing restaurants, services and availability; Google calls the Onboard booking server when a guest books or modifies a reservation.
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| merchants feed | GET | — | — | One entry per opted-in location — address, Place ID, hours. |
| services feed | GET | — | — | One service per active reservation type (indoor, terrace, lounge …). Locations without types fall back to a single "Dine-in" service. |
| availability feed | GET | — | — | 30 days × probed party sizes × reservation types. Google crawls this feed on a schedule. |
| booking server | POST | — | — | Endpoints for liveness, availability, create, update, status, list — HTTP Basic Auth. |
Reservation types map to Google services
The tabbed picker in Google's Reserve dialog ("Restaurant / Terrace / Lounge") is sourced from active reservation types. Each type becomes one service entry in the services feed. The availability feed probes per type, so "Terrace 18:30" only appears when an outdoor-mapped table is actually free.
Real-time availability
As soon as a slot is booked through the public widget or the dashboard, Onboard fires a notifyAvailabilityChange() update against Google's mapsbooking.googleapis.com. The slot drops out of the Reserve dialog within seconds — the 15-minute sync cron remains as a safety net.
Data model
| Name | Type | Required | Default | Description |
|---|---|---|---|---|
| locations.rwg_enabled | boolean | — | — | Per-location toggle. |
| locations.google_place_id | string | — | — | Google My Business Place ID for the location (operator-supplied). |
| locations.rwg_merchant_id | uuid | — | — | Partner-side ID we ship to Google. Defaults to the location UUID. |
| reservations.google_booking_id | string | — | — | Opaque Google booking identifier. Doubles as the idempotency key. |
| reservations.source = 'google_reserve' | enum value | — | — | Set automatically for every Google-originated booking. Filterable in reports. |
Opting a restaurant in
- 1
Activate reservation types
Make sure the relevant types (indoor, terrace, …) are active and mapped to tables. The Google integration mirrors what the widget already shows. - 2
Open the integration page
Reservations → Integrations → Google — available to admin and manager roles. - 3
Toggle the location on and paste its Place ID
Find the Place ID via Google's Place ID Finder. Onboard validates the format before saving. - 4
Wait for the next crawl
Google typically polls the feeds every few hours. Availability changes are additionally pushed every 15 minutes.
Endpoints (technical reference)
All endpoints live under /api/google-reservations/.... The feeds are public (no PII), the booking endpoints sit behind HTTP Basic Auth (GOOGLE_RWG_BASIC_USER / GOOGLE_RWG_BASIC_PASS). Outbound pushes use a GOOGLE_RWG_SERVICE_ACCOUNT_JSON. Until those env vars are set, the booking server returns 503 and the notifier logs fire-and-forget — convenient for staging setups.