Start here
Core concepts
Organizations, roles, modules, publishing and timezones. The words the rest of these pages assume.
Six ideas carry the whole platform. They are worth ten minutes now, because every module reuses them and none of them is explained twice.
Organization
The tenant. One restaurant, one clinic, one shop. Every row in the system belongs to exactly one organization, and no query crosses the boundary: an API key issued for one organization cannot see another, no matter what id is passed alongside it.
A person can be a member of several organizations with a different role in each. The dashboard switches between them; the API does not, because a key belongs to one.
- Identified by
- A UUID, stable for the life of the account
- Carried in
- The URL for public endpoints, the API key otherwise
- Owns
- Content, orders, reservations, keys, payouts, members, settings
Members and roles
People are invited to an organization by email and land on one of three roles. Roles govern the dashboard and the session-authenticated endpoints behind it. They have nothing to do with API key scopes, which are a separate system described in Authentication.
| Role | Can do | Cannot do |
|---|---|---|
owner | Everything within their organization: settings, members, modules, keys, payouts. | Assign the admin role, or reach another organization. |
admin | Everything an owner can, plus assigning the admin role. | Nothing within the organization. |
manager | Day to day work: content, orders, reservations, bookings. | Organization settings, members, API keys, payouts. |
Modules and feature flags
Each module is a flag on the organization. Turning one on adds its area to the dashboard, its panel to settings and its endpoints to the API. Turning it off removes all three.
An endpoint belonging to a module that is off answers 403, not 404 and not an empty list. Treat it as "this customer does not use that feature" and render your page without the section. It is not an error your visitor should ever read about.
Content types and items
Content Management is the module the others lean on. A content type is a schema your customer defines: a name, a slug and a set of fields. A content item is one entry of that type.
The slug matters more than it looks. It is how you ask for one type instead of all of them, and the single most common integration bug is leaving it out. See Content Management.
Catalogs live here too. A restaurant menu is a content type; an order line references a content item by id, and the server prices it from that item. There is no second product table to keep in sync.
Draft and published
An item is either a draft or published. The API returns published items only, which is the point: your customer can write next week's menu today without it appearing on the site tonight.
The practical consequence is that "it is in the dashboard but not on my site" is almost always a draft, not a bug. Check the status before you check your code.
Time and timezone
Every timestamp crossing the API is ISO 8601 in UTC. That includes what you send: a reservation at 18:00 local time is sent as the UTC instant it corresponds to.
Calendar rules are different. Opening hours, closed days and slot times are expressed as a local date and a wall clock time, because "closed on 25 December" means the venue's 25 December. The zone they resolve against is a property of the organization, set under Settings then Organization then General, and returned as calendar_timezone from the reservation settings endpoint.
Money and prices
Prices are decimal numbers in the organization's currency, not cents. The server is authoritative for every amount that ends up on a payment screen: you send item ids and quantities, and the total comes back. That is the quote, on Online Ordering — the checkout commits an order and answers with the order, not with a price list.
A price you send is ignored rather than trusted, which is deliberate. It means a stale cached menu on your site cannot undercharge, and a manipulated cart in a browser cannot either. Show your own prices per line if you like, but take the amount due from the server rather than adding them up. Tax follows the same rule, in Tax.