Landing Page Builder
The landing page builder is a drag-and-drop composer for your public loyalty landing (/landing/{tenantSlug}) and per-campaign landings (/landing/c/{slugOrId}). Pick blocks from the palette, configure them, save, publish. No code.
This is an Enterprise plan feature, controlled by the App.LandingPageBuilder capability. Lower plans still see auto-generated landing pages but cannot customise them block-by-block.
When to use it
- You want a campaign landing that matches the rest of your brand, not the platform default.
- You want different layouts per campaign (e.g. a hero-heavy launch landing vs a leaderboard-heavy in-progress landing).
- You want to A/B test landing structure against your current default.
How it works
Each landing is described by an opaque EntityPageDefinition JSON document keyed to either a Tenant (your global landing) or a Campaign (per-campaign landing). When the public render runs, it looks up the campaign page first and falls back to the tenant page if the campaign has no custom layout. You can save as many drafts as you want; the public page only shows the saved version.
Step-by-step
Edit the tenant landing
- Log in as a tenant admin on an Enterprise tenant.
- Go to Loyalty → Landing pages. (The menu entry is hidden when the Enterprise capability is off.)
- The editor opens with the gridster canvas. Existing blocks are shown; an empty canvas is fine for a first run.
- Drag a block from the palette onto the grid.
- Click the block to open the configuration dialog — fill in the block-specific fields (texts, image URLs, colours, target IDs).
- Save the page. The Public landing URL updates immediately.
Edit a campaign landing
- Open the campaign you want to customise.
- Click Landing → Edit landing.
- The same editor opens, but saves are scoped to that campaign. The page falls back to the tenant landing for any block you don't override.
Preview without saving
The editor has an inline ephemeral preview that renders the current canvas as a public-facing page in a separate panel. The preview never writes to the database — it's purely in-memory, so you can iterate freely.
Lock and version history
- Lock edit mode by default — the editor opens read-only and you need to toggle into edit mode from the toolbar. This avoids accidental edits when sharing the screen.
- Block lock — pin individual blocks so they can't be moved or removed by mistake.
- Version history — the editor keeps the last 10 saved versions. Restore any of them in one click; the current state becomes a new version, so a restore is reversible.
Built-in blocks
Out of the box the registry ships 22 blocks. The most-used ones:
| Block | Purpose |
|---|---|
| Hero | Branded title + subtitle + CTA + image. Top of most landings. |
| Branding header | Logo + nav links. |
| Game zone | Embed a campaign game (spin wheel, scratch card, etc.). |
| Game leaderboard | Real-time leaderboard for a specific game. Configurable: gameId, top N, window in days, avatars on/off. Backed by the public endpoint /api/public/game-leaderboard/{id}. |
| Sports prediction | Embed the fixtures + leaderboard from a sports-prediction campaign. Configurable: campaignId, heading. |
| Instant-win reveal | Animated reveal of the participant's instant-win outcome. |
| Coupon reveal | Show a unique coupon code per participant. |
| Registration form | Configurable signup form — phone, date-of-birth + min age, T&C checkbox, marketing opt-in. |
| Rewards grid | Tiles from the rewards catalogue with point cost. |
| Tiers grid | Show loyalty tiers with thresholds. |
| Stats | Three or four highlight numbers (members, campaigns won, points earned…). |
| Testimonials | Quoted testimonials with photos. |
| Steps / How it works | Numbered walkthrough. |
| FAQ | Collapsible question/answer list. |
| Image gallery / UGC gallery / Social wall | Visual content from upload, members, or social listening. |
| Video embed | YouTube/Vimeo/MP4. |
| Share | Social-share buttons (Twitter/X, WhatsApp, Facebook, LinkedIn). |
| Countdown | Counter to a target datetime. |
| Footer CTA | Bottom-of-page nudge with button. |
| Spacer | Vertical breathing room. |
A new starter palette of 10 built-in templates is also available from the toolbar — pick one and the canvas pre-populates with a complete page you can then refine.
Advanced features
Theme presets
One-click style packs change colours, fonts, and spacing across all blocks. Useful when launching a new brand line — pick the preset that's closest, then fine-tune.
Style controls
Per-block colour, font, and spacing controls. Backed by the same design tokens as theme presets.
Responsive preview
Toolbar buttons toggle the preview between desktop / tablet / mobile viewports. A responsive issues panel flags blocks that don't render well on mobile (e.g. a 6-column grid that wraps into 12 awkward rows on a phone).
SEO and sharing panel
Configure page-level title, description, Open Graph image, and Twitter card — with a live preview of how the link will look pasted into Twitter/X, WhatsApp, or LinkedIn.
AI copywriting assist
Generate first-draft text for a hero, FAQ, or testimonial block from a one-line description. Powered by Anthropic.
Image and video uploads
The TipTap-based rich-text fields and landing blocks accept image and video uploads through the platform's media pipeline (stored in the tenant's blob storage). No external CDN setup needed.
Password-protected preview links
Share a draft landing with a stakeholder without making it public. The preview URL is gated by a password you set — anyone with the link still needs the password.
Limits and gotchas
- Enterprise plan only. Lower plans get the auto-generated default landing.
- One saved page per (Tenant, Campaign). You can't have two named variants of the campaign landing — for that, use the A/B test variants feature.
- Custom HTML is not supported. Blocks are typed; you can't paste an arbitrary
<script>or<iframe>. (Use the External game flow for sandboxed third-party games.) - Per-block A/B is not yet supported. Today A/B is at the whole-page level.
- Image URLs in blocks. The block config takes URLs; for in-editor upload use the media upload widget in TipTap fields. (Direct in-block upload is on the roadmap.)
- Permission:
Pages.Loyalty.LandingPages.