Legal Pages
The platform ships three public legal pages for every tenant and a per-campaign terms-of-participation mechanism for consent capture in loyalty and raffle flows.
Public pages
Three URLs are served by the platform on the public site:
/legal/privacy— Privacy Policy./legal/terms— Terms of Service./legal/cookies— Cookies Policy.
The three pages share a navigation shell so a visitor can flip between them with one click. They're linked from the public landing footer.
The Cookies page documents four categories of cookies the platform uses:
- Strictly necessary — session, CSRF, locale.
- Analytics — Google Analytics 4 (opt-in via the cookie banner).
- Preference — UI choices (opt-in via the cookie banner).
- Third-party — Google, Meta, Stripe (opt-in via the cookie banner).
Campaign terms (per-campaign T&C)
When a member participates in a campaign — registers, claims an instant-win, enters a raffle — you may need to record their explicit consent to a specific terms version (e.g. "Spring 2026 raffle terms v3").
The platform models this as a terms version per campaign:
- A campaign has zero or more versions of its terms.
- One version can be active at a time.
- A
MemberConsentrow is written whenever theaccept_termsaction runs in a conversation flow — tying that member to the active version.
The active version can be linked from anywhere via a public URL:
GET /api/public/legal-terms/{campaignSlug}
GET /api/public/legal-terms/{campaignSlug}/{version}
Both URLs are anonymous — participants can read the legal bases before registering, no account required. The admin Copy public link button gives you the URL to drop in flows, emails, or QR codes.
Step-by-step
Configure the public legal pages
The three public pages are seeded from default templates the first time the tenant goes live. To customise the content:
- Go to Organization → Legal pages (host admin) or Settings → Legal (tenant admin).
- Open Privacy, Terms, or Cookies.
- Edit the content. The platform uses a Mustache renderer, so you can include placeholder variables for tenant name, address, contact email, etc.
- Save. The public URL updates immediately.
Create a campaign terms version
- Open the campaign.
- Go to Legal → Terms versions and click New version.
- Enter the version label (e.g.
v1.0) and the body. - Set the version to Active. (You can keep older versions around for audit.)
- The public link is shown — copy it into your conversation flow or landing page.
Capture consent
In the conversation flow, add the accept_terms action at the point where the contact agrees to participate. The platform looks up the campaign's currently-active terms version and writes a MemberConsent row pinning the member to that version.
Limits and gotchas
- Active version is enforced.
accept_termsthrows if no terms version is active for the campaign. Create and activate the version before launching the flow. - Old consents stay tied to the version that was active when they were signed. Even if you publish v4 next month, last month's consents remain on v3 — which is correct for legal evidence.
- Public URLs are anonymous and indexable unless you add a
noindexdirective yourself. If your terms are sensitive, gate them behind the member portal instead. - The Mustache renderer is sandboxed. You can't run arbitrary code in templates, only substitute named variables.