All documentation

    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-checkout function using price ID aeo_pass_7day. Access is tracked in the aeo_passes table 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 via SubscriptionCheckoutDialog, backed by the create-subscription-checkout function. Users must be signed in; if not, they're redirected to /signup with the intended plan encoded in the return URL.
    • Managing an existing subscription: create-portal-session looks up the user's Stripe customer ID from the subscriptions table and opens the Stripe Customer Portal, where the customer can update payment methods, change/cancel plans and view invoices. Billing.tsx also renders in-app usage/plan-comparison views and a "Manage Account" link, alongside a BillingHistory component that reads billing/payment history from Stripe.
    • One-off purchases (AEO pass, LTD tiers, Managed Services) all use Stripe's embedded_page Checkout 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 active flag and optional expires_at expiry.
    • An applies_to scope of subscription, one_off, or both, 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.