Plans and Billing
Rank Pilot AI SEO is sold on a tiered subscription model, backed by Stripe for
all payment flows. This page documents the tiers, prices and purchase flows
exactly as implemented in the codebase (src/pages/Pricing.tsx,
src/pages/Billing.tsx, src/pages/LtdOffer.tsx, src/contexts/RegionPricingContext.tsx
and the relevant Supabase edge functions).
Subscription tiers
Tier names, descriptions and feature lists live in tierMeta in
src/pages/Pricing.tsx, while the actual prices and feature flags are stored
in the subscription_plans and plan_features database tables. Base (GB)
monthly prices, per PRICE_CONFIG.plans in RegionPricingContext.tsx, are:
- Free — £0/mo. Basic Site Audit, daily rank tracking & alerts, basic Autopilot (suggestions only), unlimited scans/crawls, PDF/CSV export and Google Tools. No credit card required.
- Growth — £30/mo (GB) / $29 (US) / €29 (EU). Adds the full technical SEO audit, AI keyword research, competitor & backlink analysis, AI content generation, and Auto-Fix for meta/alt text/schema (20 pages/month), plus API access.
- Pro — £60/mo (GB) / $59 (US, EU). Adds 500 AI content credits, full Autopilot (push to CMS), Auto-Fix up to 100 pages/month, custom AI prompts and a priority/faster AI model.
- Enterprise — £170/mo (GB) / $169 (US, EU). Everything unlimited: 500 keyword-research credits, unlimited Auto-Fix, Auto-Fix for Core Web Vitals (lazy-load, defer, CLS), white-label reports and API access.
Yearly billing gives a 20% discount, calculated client-side as
monthly × 12 × 0.8. Prices are shown in the visitor's detected currency
(GBP/USD/EUR, with an "OTHER" fallback) via RegionPricingContext; a
LocalCurrencyNotice banner explains the conversion.
All paid plans currently ship with a 30-day money-back guarantee, stated on the pricing page.
Free trial
Every paid tier (Growth, Pro) offers a 3-day free trial — the pricing
page's call-to-action reads "Start 3-Day Free Trial". Enterprise instead
prompts visitors to "Contact Us for Trial". Trial state is tracked on the
user_subscriptions table (is_trial, trial_end_at, trial_tier); while a
trial is active and unexpired, usePlanFeatures and the check-feature-access
edge function treat the user as being on trial_tier rather than their base
tier. If a trial lapses without conversion, the account drops back to Free.
AEO / GEO Pass
AEO ("Answer Engine Optimisation") / GEO mode — llms.txt generation, JSON-LD
schema, GEO rewrites and four-layer AEO scoring — is gated separately from the
main tiers (src/hooks/useAeoAccess.ts, src/components/AeoAccessGate.tsx):
- Enterprise subscribers get AEO included at no extra cost, but only on an active paid subscription — it is locked during an Enterprise trial.
- Pro subscribers (or Enterprise trialists) can unlock it by buying a
7-day AEO Access Pass for £49.99, a one-off Stripe Checkout created by
the
create-aeo-pass-checkoutfunction using price IDaeo_pass_7day. Access is tracked in theaeo_passestable and expires automatically after 7 days. - Free and Growth users must first upgrade to Pro before they can buy the pass.
Lifetime deal (LTD)
src/pages/LtdOffer.tsx implements a time-boxed, one-off "pay once, use
forever" campaign (not linked from standard navigation, noindexd):
- Pro Lifetime — £479 (vs £60/month regular — roughly 6 months' equivalent), up to 10 websites, full AI Autopilot, 200 daily-tracked keywords, AI Content Suite, SEO Marketing Plan Creator and priority support.
- Enterprise Lifetime — £1,350 (vs £170/month), unlimited websites, plus agency multi-client dashboard, white-label PDF reports, a Managed Services discount, API/BYOK integrations and dedicated account support.
The offer runs on a hard-coded campaign window and countdown timer; checkout
is created by the create-ltd-checkout function (price IDs ltd_pro_gbp /
ltd_enterprise_gbp) and settles as a single Stripe payment that upgrades the
account permanently with no recurring charge.
Managed services
For customers who want SEO work done for them rather than self-serve, the
create-managed-checkout edge function sells a "Managed Services" package
priced (in GBP, configurable via the managed_services_config table, with
these as defaults):
- Setup fee: £150 for the first website, plus £80 for each additional
site (
setup_total = 15000 + 8000 × (websites − 1), in pence). - Monthly management (optional): £99 per website per month.
If monthly management is selected the Stripe session runs in subscription
mode (the setup fee is billed once on the first invoice, then the recurring
line item continues monthly); otherwise it's a single payment-mode charge
for the setup fee only. Region-adjusted headline figures (used for marketing
copy) are £99/$129/€119 per month and £150/$199/€179 setup, per
PRICE_CONFIG.managedMonthly / managedSetup. Every attempt also writes a
managed_services enquiry row for the team's audit trail before payment
completes.
Checkout and customer portal flow
- Subscriptions: the Pricing page maps each tier/billing-period/currency
combination to a Stripe price ID (e.g.
growth_monthly_usd) and opens an embedded Stripe Checkout viaSubscriptionCheckoutDialog, backed by thecreate-subscription-checkoutfunction. Users must be signed in; if not, they're redirected to/signupwith the intended plan encoded in the return URL. - Managing an existing subscription:
create-portal-sessionlooks up the user's Stripe customer ID from thesubscriptionstable and opens the Stripe Customer Portal, where the customer can update payment methods, change/cancel plans and view invoices.Billing.tsxalso renders in-app usage/plan-comparison views and a "Manage Account" link, alongside aBillingHistorycomponent that reads billing/payment history from Stripe. - One-off purchases (AEO pass, LTD tiers, Managed Services) all use
Stripe's
embedded_pageCheckout UI mode inline in a dialog, rather than a redirect.
Discount codes
Promo/discount codes are stored in a discount_codes table and validated
server-side by supabase/functions/_shared/validatePromoCode.ts before being
attached to any Stripe session — the client-facing allow_promotion_codes
flag is always left false, so Stripe's own promo box can't be used to redeem
arbitrary coupons. Each code has:
- An
activeflag and optionalexpires_atexpiry. - An
applies_toscope ofsubscription,one_off, orboth, enforced per-flow (e.g. a subscription-only code is rejected on the Managed Services or AEO-pass one-off checkouts). - Separate Stripe promotion-code IDs for sandbox and live environments.
Users enter a code in the PromoCodeField shown inside each checkout dialog;
a valid code re-creates the Stripe session with the discount applied, and an
invalid one clears the field and falls back to the undiscounted checkout.