Overview
The landing (home) page is a single MDX entry composed from reusable sections (Hero, Feature Grid, Pricing, Testimonials, etc.). CTAs support Buy (one-time), Subscribe (recurring), Waitlist dialog, and Link. Pricing cards pull live plans from Supabase.
Location and permissions
- Collection: landing
- Path:
content/landing
- Creation/Deletion: disabled (one canonical entry managed in repo).
- SEO: full SEO object available on the entry.
The landing entry is meant to be unique. If you need additional marketing pages, create them via the Pages collection instead.
How it renders
app/page.tsx
loads the landing entry and generates metadata from its SEO.LandingPageSections
maps each section to a React component.- The Subscription section receives
subscriptionPlans
from Supabase viafetchSubscriptionPlansWithCurrent()
. - Preview: if Next.js draft mode is enabled, a simple “Preview Mode” page is shown.
Common fields used by many sections
- id — optional anchor (e.g.
pricing
). Useful for in-page links/#pricing
. - header — shared object with
label
,title
,subtitle
. - listItems — reusable list with
text
,type
(accent/default/etc.), optionalbadge
. - CTA button — one of: Buy, Subscribe, Waitlist, Link.
Limit one CTA per section where applicable. Template validation enforces it.
CTA button types
- Buy — requires Lemon Squeezy Variant ID. Starts one-time checkout via
startCheckoutAction
. - Subscribe — requires Lemon Squeezy Variant ID. Starts recurring checkout via
createSubscriptionAction
. - Waitlist — opens the JoinWaitlistDialog; posts email via
joinWaitlistAction
. - Link —
href
pluslinkType
(internal or external).
The Buy/Subscribe buttons redirect to Lemon Squeezy. If a user isn’t signed in for subscriptions, they’re redirected to Sign up, preserving the selected variant_id
.
Subscription section
- The Subscription section doesn’t hardcode prices. It renders the plans supplied by
fetchSubscriptionPlansWithCurrent()
. - Plans come from the Supabase table
subscription_plans
(with monthly/yearly rows and optional badges/benefits). - The UI exposes a billing cycle toggle and per-plan Get
Plan
button that triggers the subscription checkout.
Update prices in Lemon Squeezy (product/variant). Keep the Variant ID in your Supabase subscription_plans
table in sync. Names, badges and notes are managed in Supabase, not the CMS.
Section catalog
Hero
- Fields:
motto
,headlineIntro
,headlineValue
,headlineContrast
,subheadline
,image
, optionalsocialProof
(highlight, text, rating, avatars). - CTA: single button (Buy / Subscribe / Waitlist / Link).
- Tips: keep headlines short; use
image
for an app screenshot or illustration.
Feature grid
- A compact grid of features (title + description + optional icon/image).
- Good for quick scannability after the hero.
Feature cards
- Cards with
title
,description
, and an Image Block (src
,alignment
Left/Right). - Optional
badges
per card. - Works well for “What’s included” or “Use cases”.
Feature tabs
- Tabbed content. Choose a
defaultTab
, then define tabs with:value
(from predefined keys),label
,icon
(Lucide key), andcontent
(title
,listItems
,image
, optionallinks
). - Use this to group deep feature sets without overwhelming the page.
Icons must match keys in the Lucide map. If you add a new key, update the options list used in Tina.
Contrast
- Two columns: Left (Negative) vs Right (Positive) with titles and
listItems
. - Perfect for “Before vs After” messaging.
Key metrics
- Up to 3 metrics (
value
, optionalsuffix
orunit
+ position, and alabel
). - Example:
120
+hrs
→ “saved per month”.
The template enforces a maximum of 3 metrics for readability.
Product
- Section header tailored for pricing promos.
- Products list with
name
,price
, optionaloldPrice
,highlightLabel
,listItems
, a single checkoutButton (Buy/Subscribe/Waitlist), and optionalcheckoutNote
. - Use for one-time deals or bundles separate from your subscription plans.
Only one checkout button is allowed per product card. Provide a Lemon Squeezy Variant ID when using Buy/Subscribe.
Subscription
- Uses Supabase plans injected from the server (see Pricing and plans above).
- Includes a billing cycle toggle and plan PrimaryButton wired to subscription checkout.
- Shows “Your current plan” on the active plan.
Demo video
- Fields:
videoUrl
,posterImage
, optionalheader
. - Keep the video short; ensure hosting allows hotlinking/embeds.
Social proof
- Two lists: awards (type + link) and logos (company keys).
- Great for trust bars, partner walls, or badges.
Showcase
- Grid of projects with
image
,name
,link
, andwebsite
. - Use it to show what customers have built or example templates.
Testimonials grid
- Mixed testimonials: text or video cards.
- Text item:
quote
,image
(asset), optionalavatar
,name
,alias
, and source (platform + URL). - Video item:
quote
,videoUrl
,posterImage
,name
,starRating (1–5)
.
Testimonials
- Simple list of testimonials with
avatar
,name
,useCase
,quote
. - Ideal when you prefer fewer, larger quotes over a grid.
FAQ
- Accordion of Questions where each item has
question
+answer
(rich text). - Keep answers short; link to docs for details.
Pain points
- A list of lines (rich text) with inline highlight marks for emphasis.
- Optional single
link
at the end (label
,href
).
Stack formula
- Show your tech stack as a list of libraries from a predefined options set.
- Good for “Built with X + Y + Z” visuals.
Linking to sections
- Set an
id
on any section (e.g.pricing
) and link to it with either: - A Link CTA using
/#pricing
- Any internal anchor from elsewhere on the site
Keep IDs kebab-case and unique. Avoid spaces (use features-pro
rather than Features Pro
).
SEO on the landing
- The landing entry includes the full SEO object (title, description, Open Graph).
app/page.tsx
callsgenerateSeoMetadata()
to convert Tina SEO into Next.js Metadata.- OG image is customizable per entry.
Keep both descriptions ≤ 160 chars and prefer OG images sized 1280×640 (WebP).
Best practices
- Write headlines for clarity first; emojis and flair are optional.
- Avoid renaming or removing sections during active tests; anchor links may break.
- Keep media small (optimize images, use poster images for videos).
- For Buy/Subscribe CTAs, verify the Variant ID matches Lemon Squeezy.
- Update plans in Supabase rather than hardcoding prices in CMS.