From 57d8cf13b555dc374b6cdd1d970e2a6e1a06703c Mon Sep 17 00:00:00 2001 From: Daniel Ehrhardt Date: Mon, 5 Oct 2026 22:56:09 +0200 Subject: [PATCH] Founding 100 launch offer with a 14-day trial This is what is live on usegodmode.com since 2026-10-05. --- apps/website/.env.example | 2 + apps/website/marketing/grand-slam-offer.md | 117 +++++++++++ .../website/src/components/sections/Faq.astro | 9 +- .../src/components/sections/FinalCta.astro | 7 +- .../src/components/sections/Hero.astro | 8 +- .../src/components/sections/Pricing.astro | 198 +++++++++++++----- apps/website/src/config/site.ts | 24 ++- apps/website/src/lib/db.ts | 16 ++ apps/website/src/pages/api/checkout.ts | 14 +- apps/website/src/pages/api/offer.ts | 15 ++ apps/website/src/pages/checkout/success.astro | 36 +++- apps/website/src/pages/legal/refunds.astro | 12 +- apps/website/src/pages/legal/terms.astro | 13 +- apps/website/src/scripts/main.ts | 18 ++ apps/website/src/styles/components.css | 59 ++++++ 15 files changed, 473 insertions(+), 75 deletions(-) create mode 100644 apps/website/marketing/grand-slam-offer.md create mode 100644 apps/website/src/pages/api/offer.ts diff --git a/apps/website/.env.example b/apps/website/.env.example index cdd4992..6f9e27a 100644 --- a/apps/website/.env.example +++ b/apps/website/.env.example @@ -7,3 +7,5 @@ PUBLIC_X_EVENT_CHECKOUT= PUBLIC_X_EVENT_LEAD= PUBLIC_X_EVENT_PRICING= PUBLIC_CF_BEACON= +# Optional Cal.com or Calendly link for the Founding 100 setup call (otherwise booked by email) +PUBLIC_FOUNDING_BOOKING_URL= diff --git a/apps/website/marketing/grand-slam-offer.md b/apps/website/marketing/grand-slam-offer.md new file mode 100644 index 0000000..704ec0e --- /dev/null +++ b/apps/website/marketing/grand-slam-offer.md @@ -0,0 +1,117 @@ +# Godmode Grand Slam Offer (Hormozi, $100M Offers) + +Live since 2026-10-05 (site + X ads F1/F2). Goal: an offer so good that saying no feels stupid, without lowering the price. + +## 1. Where we stand (data since 2026-10-04) + +| | | +|---|---| +| Ad visitors | 373 (321 mobile = 86%, 37 desktop) | +| Scrolled to any section | 32 visitors (~9%) | +| Saw pricing | 14 views | +| Checkout starts | 10 (9 from mobile, 0 from desktop) | +| Real paid orders | 0 | + +What it means: people click, but the offer gives them no reason to act now, and most of them are on a phone where they cannot install a desktop app. Today we sell "software for $39/mo". Hormozi's rule: never discount, raise the value until the price looks like a mistake. + +## 2. Value equation, today vs. the new offer + +Value = (Dream outcome x Perceived likelihood) / (Time delay x Effort and sacrifice) + +| Lever | Today | New offer | +|---|---|---| +| Dream outcome | "AI coworker" (vague) | "10 hours back every week. Your first AI employee, working by Friday." | +| Perceived likelihood | New product, no reviews, AI agents have burned people before | Founder builds your first agents with you, outcome guarantee, "we build it if it doesn't run" | +| Time delay | Install, configure, figure out what to automate | First agent running in 48 hours, 9 ready-made agents, 25 copy-paste automations | +| Effort and sacrifice | Desktop install from a phone, Claude plan on top, setup alone | Start on the phone, we send the download to your inbox, setup done with you, runs on the Claude plan you already pay for | + +## 3. Objections -> solutions -> bonuses + +| Objection (before / during / after) | Solution in the offer | +|---|---| +| "I'm on my phone" (86% of traffic) | Claim the seat on the phone, setup link and download land in your inbox, book the setup slot right on the success page | +| "I don't know what to automate" | Founder setup session: you leave with 3 automations running | +| "AI agents never work for real" | Running-in-48-hours guarantee + 10-hours-back guarantee | +| "Is it safe to give it my passwords?" | Already solved by the vault; lead with it in copy ("the AI never sees your passwords") | +| "Another subscription, plus Claude" | Founding price locked for life; "turns the Claude plan you already pay for into an employee" | +| "Who are you? New company" | Direct line to the founder, private founders group, roadmap votes | +| "It'll get worse / pricier later" | Price lock + every update included | + +## 4. The offer + +Name (MAGIC: Magnetic reason, Avatar, Goal, Interval, Container): + +**Godmode Founding 100: Hire your first AI employee this week. 10 hours back every week, or you pay nothing.** + +### What you get + +| | Comparable value | +|---|---| +| Godmode Pro, every feature: browser and computer use, its own Mac VMs, vault + 2FA, unlimited agents and automations, Slack/Telegram/Teams | $468/yr (list price) | +| Bonus 1, Your First AI Employee, built with you: 20-min 1:1 setup with the founder, you leave with 3 automations running | $300 (automation freelancers charge $100+/h, 3 builds) | +| Bonus 2, The Hire-in-a-Click library: 9 ready-made agents + the 25-automation playbook | $250 | +| Bonus 3, Founding price lock: $29/mo (yearly) or $39/mo, never goes up while you stay | $240/yr once list goes to $49/$59 | +| Bonus 4, Direct line to the founder: private Founders group, your feature requests jump the queue | $500/yr (priority support tier) | +| **Total comparable value** | **$1,758 in year one** | +| **You pay today** | **$0**, 14 days free, then $29/mo billed yearly or $39 monthly | + +### Guarantees (stacked) + +1. **14 days free.** Cancel in two clicks before day 14, pay nothing. +2. **Running in 48 hours, or we build it for you.** If your first automation isn't running 48 hours after you install, the founder sets it up with you personally. (Service guarantee, costs us time, not money.) +3. **10 hours back in 30 days, or every cent back.** Set up 3 automations (we help), and if Godmode hasn't saved you 10 hours in your first 30 paid days, email us for a full refund and keep the agents you built. (Conditional outcome guarantee; replaces the current 14-day refund for founders.) + +### Scarcity and urgency (both real) + +- **100 seats**, because the founder runs every setup session personally. Counter on the page reads from the orders table (we already had /api/offer for the old lifetime counter). +- **Closes October 31 or at seat 100**, whichever first. After that: list price $59/mo or $49/mo yearly, no setup session, standard 14-day refund. + +## 5. Why it's "too good to be true" and still profitable + +- Cost of the bonuses is mostly founder time: 100 x 20 min = 33 hours, spread over 4 weeks. Bonus 2 already exists in the product. Bonus 3 costs nothing until we raise the price. +- The outcome guarantee costs at most one refund of $39 / $348 per unhappy buyer. With a 7-day trial we have 0 paid; any lift beats that. +- Setup calls are the best product research we can buy: 100 founders telling us what they automate. +- Founders who are set up with 3 running automations churn far less (Hormozi's "virtuous cycle": commitment, results, retention). + +## 6. Funnel changes the offer needs + +1. Hero, pricing and final CTA switch to the Founding 100 stack with a live "x of 100 seats left" counter. +2. Mobile: primary button "Claim my founding seat", subline "Start on your phone. We'll send the download to your inbox." +3. Success page: book the setup slot (Cal.com or Calendly link) + download link + "first 3 automations" checklist; same in the welcome email. +4. Stripe: trial 7 -> 14 days for founding checkouts; tag subscriptions with `founding=1` metadata for the price lock. +5. Legal: refunds page gets the founding guarantee terms (30 paid days, 3 automations, full refund). +6. Ads: new creatives with the value stack and the guarantee as hook; land on `https://usegodmode.com/?utm_...#pricing`. + +## 7. Ad copy (X, under 280 chars) + +**A, "too good to be true"** +> This is either a pricing mistake or the best $29 you'll spend this year. +> An AI employee that logs in, clicks and finishes your busywork. +> I set up your first 3 automations with you. 10 hours back in 30 days or full refund. +> 100 founding seats. + +**B, guarantee first** +> 10 hours back in your first 30 days, or every cent back. +> Godmode is an AI coworker that uses your computer like you do: your browser, your logins, your apps. +> 14 days free. Founding price locked for life. 100 seats. + +**C, founder voice** +> I'll personally set up your first AI employee. +> 20 minutes, you leave with 3 automations running. If it doesn't save you 10 hours in a month, you get every cent back. +> First 100 founders only. Then the price goes up. + +**D, math** +> Executive assistant: $76,590/yr. +> Godmode: $348/yr, works nights and weekends, never sees your passwords. +> Founding 100: setup done with you, price locked for life, 10 hours back or your money back. + +**E, phone traffic** +> Reading this on your phone? Good. +> Claim a founding seat in 30 seconds, we send the Mac/Windows download to your inbox and set up your first 3 automations with you. +> 14 days free. 100 seats. + +## 8. What would make it even stronger later + +- Proof: after the first 10 setups, screenshot real "hours saved" numbers and use them as the next ad wave. +- Weekly group "build session" (one-to-many) once 1:1 setups run out, so the bonus scales past 100. +- Annual-only "Founding 100 Pro+" with a done-for-you agent per quarter, as an upsell for the 10% who want more. diff --git a/apps/website/src/components/sections/Faq.astro b/apps/website/src/components/sections/Faq.astro index 8294cf4..25ad28e 100644 --- a/apps/website/src/components/sections/Faq.astro +++ b/apps/website/src/components/sections/Faq.astro @@ -1,6 +1,6 @@ --- import Words from '../ui/Words.astro'; -import { PRICING, SITE } from '@/config/site'; +import { FOUNDING, PRICING, SITE } from '@/config/site'; const { monthly, yearly } = PRICING.plans; @@ -10,6 +10,11 @@ const faqs: { key: string; q: string; a: string }[] = [ q: 'What exactly do I get?', a: `The Godmode desktop app for macOS, Windows and Linux (plus the headless server with its web dashboard), a license key, and every feature on this page, in every plan. Godmode Pro is $${monthly.price} a month, or $${yearly.price} a year ($${yearly.perMonth} a month), with every update while you’re subscribed.`, }, + { + key: 'founding', + q: 'What is the Founding 100?', + a: `Our launch offer for the first ${FOUNDING.seats} customers, open until ${FOUNDING.endLabel}. You get Godmode Pro plus a ${FOUNDING.setupMinutes}-minute 1:1 setup call with the founder (you leave with ${FOUNDING.setupAutomations} automations running), the ready-made agents and playbook, a private founders group, and your price locked for as long as you stay subscribed. After the offer closes, Godmode Pro costs $${FOUNDING.listPrice.monthly} a month or $${FOUNDING.listPrice.yearly} a month billed yearly.`, + }, { key: 'trial', q: 'How does the free trial work?', @@ -63,7 +68,7 @@ const faqs: { key: string; q: string; a: string }[] = [ { key: 'refund', q: 'What if it’s not for me?', - a: `During the trial, just cancel and you’re never charged. After your first payment, on any plan, email us within ${PRICING.guaranteeDays} days and we’ll refund it in full — no questions, no forms. Subscriptions can be cancelled anytime and keep working until the end of the period you paid for.`, + a: `During the trial, just cancel and you’re never charged. After your first payment, on any plan, email us within ${PRICING.guaranteeDays} days and we’ll refund it in full — no questions, no forms. Founding members get more: set up ${FOUNDING.setupAutomations} automations (we help), and if Godmode hasn’t saved you ${FOUNDING.outcomeHours} hours in your first ${FOUNDING.outcomeDays} paid days, we refund everything you paid. Subscriptions can be cancelled anytime and keep working until the end of the period you paid for.`, }, { key: 'invoice', diff --git a/apps/website/src/components/sections/FinalCta.astro b/apps/website/src/components/sections/FinalCta.astro index a041a13..e203f7a 100644 --- a/apps/website/src/components/sections/FinalCta.astro +++ b/apps/website/src/components/sections/FinalCta.astro @@ -3,7 +3,7 @@ import Words from '../ui/Words.astro'; import Icon from '../ui/Icon.astro'; import Character from '../ui/Character.astro'; import CheckoutButton from '../ui/CheckoutButton.astro'; -import { PRICING, yearlySavings } from '@/config/site'; +import { FOUNDING, PRICING, yearlySavings } from '@/config/site'; ---
@@ -18,7 +18,8 @@ import { PRICING, yearlySavings } from '@/config/site';

- Hand it the busywork today. Tomorrow morning, it’s done — and your crew knows how you like it. + Claim a founding seat today. The founder sets up your first {FOUNDING.setupAutomations} automations with you, and if + Godmode doesn’t give you {FOUNDING.outcomeHours} hours back in {FOUNDING.outcomeDays} days, you pay nothing.

@@ -26,7 +27,7 @@ import { PRICING, yearlySavings } from '@/config/site';

- No charge today · cancel anytime before day {PRICING.trialDays} · secure checkout with Stripe + $0 today · price locked for life · {FOUNDING.seats} founding seats, closes {FOUNDING.endLabel}

diff --git a/apps/website/src/components/sections/Hero.astro b/apps/website/src/components/sections/Hero.astro index 8a89760..90cf146 100644 --- a/apps/website/src/components/sections/Hero.astro +++ b/apps/website/src/components/sections/Hero.astro @@ -4,7 +4,7 @@ import Words from '../ui/Words.astro'; import Icon from '../ui/Icon.astro'; import Character from '../ui/Character.astro'; import CheckoutButton from '../ui/CheckoutButton.astro'; -import { PRICING } from '@/config/site'; +import { FOUNDING, PRICING } from '@/config/site'; import chat from '@/assets/shots/chat.png'; --- @@ -54,9 +54,9 @@ import chat from '@/assets/shots/chat.png'; diff --git a/apps/website/src/components/sections/Pricing.astro b/apps/website/src/components/sections/Pricing.astro index 6f1619b..c3032f7 100644 --- a/apps/website/src/components/sections/Pricing.astro +++ b/apps/website/src/components/sections/Pricing.astro @@ -2,7 +2,7 @@ import Words from '../ui/Words.astro'; import Icon from '../ui/Icon.astro'; import CheckoutButton from '../ui/CheckoutButton.astro'; -import { PRICING, SITE, yearlySavings } from '@/config/site'; +import { FOUNDING, PRICING, SITE } from '@/config/site'; const { monthly, yearly } = PRICING.plans; const included = [ @@ -18,39 +18,99 @@ const included = [ const cards = [ { plan: 'yearly', - name: 'Yearly', + name: 'Founding yearly', featured: true, - chip: `Best value · save ${yearlySavings}%`, + chip: `Save $${monthly.price * 12 - yearly.price}`, price: yearly.perMonth, - was: monthly.price, - billed: `Billed $${yearly.price} yearly`, - perks: [`$${monthly.price * 12 - yearly.price} less per year than monthly`, 'Every feature and every update', 'Cancel anytime in two clicks'], + billed: `Billed $${yearly.price} yearly, locked for life`, + after: `$${FOUNDING.listPrice.yearly}/mo after ${FOUNDING.endLabel}`, }, { plan: 'monthly', - name: 'Monthly', + name: 'Founding monthly', featured: false, - chip: 'Most flexible', + chip: 'Flexible', price: monthly.price, - was: null, - billed: 'Billed monthly', - perks: ['Pay as you go, month by month', 'Every feature and every update', 'Switch to yearly anytime'], + billed: 'Billed monthly, locked for life', + after: `$${FOUNDING.listPrice.monthly}/mo after ${FOUNDING.endLabel}`, }, ] as const; +const stack = [ + { + tag: 'Core', + title: 'Godmode Pro, every feature', + text: 'The AI coworker that uses your computer like you do. Every update while you’re subscribed.', + value: `$${monthly.price * 12}`, + per: '/yr', + }, + { + tag: 'Bonus 1', + title: 'Your first AI employee, built with you', + text: `A ${FOUNDING.setupMinutes}-minute 1:1 setup call with the founder. You leave with ${FOUNDING.setupAutomations} automations running.`, + value: '$300', + per: '', + }, + { + tag: 'Bonus 2', + title: 'The hire-in-a-click library', + text: '9 ready-made agents (invoices, inbox, research, leads, QA…) and the 25-automation playbook. Paste, run, done.', + value: '$250', + per: '', + }, + { + tag: 'Bonus 3', + title: 'Founding price, locked for life', + text: `Your price never goes up while you stay. After ${FOUNDING.endLabel} it’s $${FOUNDING.listPrice.monthly}/mo, or $${FOUNDING.listPrice.yearly}/mo yearly.`, + value: `$${(FOUNDING.listPrice.yearly - yearly.perMonth) * 12}`, + per: '/yr', + }, + { + tag: 'Bonus 4', + title: 'A direct line to the founder', + text: 'The private founders group. Your feature requests jump the queue.', + value: '$500', + per: '/yr', + }, +]; +const total = monthly.price * 12 + 300 + 250 + (FOUNDING.listPrice.yearly - yearly.perMonth) * 12 + 500; +const guarantees = [ + { + icon: 'gift', + title: `${PRICING.trialDays} days free`, + text: `Nothing charged today. Cancel in two clicks before day ${PRICING.trialDays} and you pay nothing.`, + }, + { + icon: 'timer', + title: `Running in ${FOUNDING.runningHours} hours`, + text: `If your first automation isn’t running ${FOUNDING.runningHours} hours after you install, the founder sets it up with you.`, + }, + { + icon: 'shield-check', + title: `${FOUNDING.outcomeHours} hours back, or every cent back`, + text: `Set up ${FOUNDING.setupAutomations} automations (we help). If Godmode hasn’t saved you ${FOUNDING.outcomeHours} hours in your first ${FOUNDING.outcomeDays} paid days, you get a full refund.`, + }, +]; ---
-
-

10 Pricing

- -

- Every feature in every plan. No seats, no credits, no caps. +

+

10 Founding 100

+ +

+ The founder sets it up with you, the price is locked for life, and if it doesn’t give you {FOUNDING.outcomeHours} + hours back in {FOUNDING.outcomeDays} days, you pay nothing. Only for the first {FOUNDING.seats} founders.

-
+
+ + Founding seats + Closes {FOUNDING.endLabel} +
+ +
{ cards.map((c, i) => (
@@ -64,15 +124,9 @@ const cards = [

${c.price} / month - {c.was && ( - - ${c.was} - - )} -

-

- {c.billed}

+

{c.billed}

+

{c.after}

-

No charge today. Cancel anytime before day {PRICING.trialDays}.

-
-
    - {c.perks.map((f, j) => ( -
  • - - {f} -
  • - ))} -
+

$0 today. Every bonus below included.

)) }
-
-

Included in every plan

-
    +
    +
    +

    Everything a founding seat gets you

    + +
    +
      { - included.map((f) => ( -
    1. - - {f} + stack.map((s, i) => ( +
    2. + {s.tag} +
      +

      {s.title}

      +

      {s.text}

      + {i === 0 && ( + + )} +
      +

      + {s.value} + {s.per} +

    3. )) } -
+ +
+
+

Comparable value, year one

+

+ ${total.toLocaleString('en-US')} +

+
+
+

You pay today

+

$0

+
+
-
- -

- Try first, then a {PRICING.guaranteeDays}-day guarantee. Cancel during the trial and pay nothing. - After your first payment, email us within {PRICING.guaranteeDays} days for a full refund. -

-
+ { + guarantees.map((g) => ( +
+ +

+ {g.title} + {g.text} +

+
+ )) + } +
+ +

- Runs on your Claude plan. Sign in with Claude Pro or Max, or use an Anthropic API key — not - included. Details + Runs on the Claude plan you already have. Sign in with Claude Pro or Max, or use an + Anthropic API key — not included. Details

- +

- Business-ready. Invoice with your VAT ID, paid securely via Stripe. Card, Apple Pay, Google Pay - & more. + On your phone? Claim your seat now. The welcome page sends the Mac or PC download + to your inbox in one tap, and you book your setup call right there.

-

- Need it for a team? Talk to us. +

+ Comparable values are what the same thing costs elsewhere: Godmode’s monthly price for a year, an automation freelancer + at $100/h, a priority support tier. Founding seats count checkouts since October 5; the offer closes at seat + {FOUNDING.seats} or on {FOUNDING.endLabel}, whichever comes first. Need it for a team? + Talk to us.

diff --git a/apps/website/src/config/site.ts b/apps/website/src/config/site.ts index e65ceec..bdf81db 100644 --- a/apps/website/src/config/site.ts +++ b/apps/website/src/config/site.ts @@ -25,7 +25,7 @@ export const isPlan = (v: unknown): v is Plan => v === 'monthly' || v === 'yearl export const PRICING = { currency: 'USD', - trialDays: 7, + trialDays: 14, guaranteeDays: 14, plans: { monthly: { @@ -47,6 +47,28 @@ export const PRICING = { }, } as const; +/** + * Founding 100: the launch offer. Seats are checkouts started after `start` (see foundingTaken). Subscriptions keep + * their Stripe price, so the price lock holds as long as founders aren't migrated to a new price. + */ +export const FOUNDING = { + seats: 100, + start: Date.UTC(2026, 9, 5, 20, 0), + // End of October 31 in US Pacific time, so the deadline is never early anywhere. + end: Date.UTC(2026, 10, 1, 7, 0), + endLabel: 'October 31', + setupMinutes: 20, + setupAutomations: 3, + runningHours: 48, + outcomeHours: 10, + outcomeDays: 30, + listPrice: { monthly: 59, yearly: 49 }, + // Optional scheduling page (Cal.com, Calendly…) for the setup call; without it founders book by email. + bookingUrl: import.meta.env.PUBLIC_FOUNDING_BOOKING_URL ?? '', +} as const; + +export const foundingOpen = (taken: number, now = Date.now()) => now < FOUNDING.end && taken < FOUNDING.seats; + /** Percent saved by paying yearly instead of monthly, rounded down so the claim is never overstated. */ export const yearlySavings = Math.floor((1 - PRICING.plans.yearly.price / (PRICING.plans.monthly.price * 12)) * 100); diff --git a/apps/website/src/lib/db.ts b/apps/website/src/lib/db.ts index 58f3747..dc7959e 100644 --- a/apps/website/src/lib/db.ts +++ b/apps/website/src/lib/db.ts @@ -138,6 +138,22 @@ export async function syncSubscription(sub: Stripe.Subscription) { .run(); } +/** + * Founding seats taken: paid or pending subscriptions since the offer started, plus checkouts opened in the last half + * hour, so the cap can't be oversold by buyers checking out at once. + */ +export async function foundingTaken(minLivemode: number, since: number): Promise { + const row = await db() + .prepare( + `SELECT COUNT(*) AS n FROM orders + WHERE plan IN ('monthly', 'yearly') AND COALESCE(comp, 0) = 0 AND livemode >= ? AND created_at >= ? + AND (status IN ('paid', 'pending') OR (status = 'open' AND created_at > ?))`, + ) + .bind(minLivemode, since, Date.now() - 30 * 60 * 1000) + .first<{ n: number }>(); + return Number(row?.n ?? 0); +} + /** A free license issued from /admin: a non-expiring `lifetime` order that never touches Stripe or revenue. */ export async function insertComp(o: { email: string; name: string | null; licenseKey: string; livemode: number }) { const id = `comp_${[...crypto.getRandomValues(new Uint8Array(12))].map((b) => b.toString(16).padStart(2, '0')).join('')}`; diff --git a/apps/website/src/pages/api/checkout.ts b/apps/website/src/pages/api/checkout.ts index 6589118..8da9f19 100644 --- a/apps/website/src/pages/api/checkout.ts +++ b/apps/website/src/pages/api/checkout.ts @@ -1,10 +1,11 @@ import type { APIRoute } from 'astro'; import type Stripe from 'stripe'; import { env } from 'cloudflare:workers'; -import { isPlan, PRICING, priceLabel, siteBase, trialCancelBy, type Plan } from '@/config/site'; +import { FOUNDING, foundingOpen, isPlan, PRICING, priceLabel, siteBase, trialCancelBy, type Plan } from '@/config/site'; import { flag, priceFor, stripe } from '@/lib/stripe'; import { newLicenseKey } from '@/lib/license'; -import { insertOpenOrder, type Attribution } from '@/lib/db'; +import { foundingTaken, insertOpenOrder, type Attribution } from '@/lib/db'; +import { minLivemode } from '@/lib/entitlement'; import { allowed, BOTS } from '@/lib/limit'; export const prerender = false; @@ -50,7 +51,8 @@ export const POST: APIRoute = async ({ request, url }) => { for (const k of ATTR_KEYS) if (input[k]) attribution[k] = input[k].slice(0, 200); const licenseKey = newLicenseKey(); - const metadata: Record = { plan, license_key: licenseKey, ...attribution }; + const founding = foundingOpen(await foundingTaken(minLivemode(), FOUNDING.start).catch(() => FOUNDING.seats)); + const metadata: Record = { plan, license_key: licenseKey, ...(founding ? { founding: '1' } : {}), ...attribution }; const mode = 'subscription'; const managed = flag(env.STRIPE_MANAGED_PAYMENTS); const requireTos = flag(env.STRIPE_REQUIRE_TOS); @@ -77,7 +79,9 @@ export const POST: APIRoute = async ({ request, url }) => { : {}), custom_text: { submit: { - message: `${PRICING.trialDays} days free, then ${priceLabel(plan)}. Cancel anytime before ${trialCancelBy()} and you pay nothing. After that, a ${PRICING.guaranteeDays}-day money-back guarantee covers your first payment.`, + message: founding + ? `Founding 100: ${PRICING.trialDays} days free, then ${priceLabel(plan)}, locked for as long as you stay. Cancel anytime before ${trialCancelBy()} and you pay nothing. ${FOUNDING.outcomeHours} hours back in your first ${FOUNDING.outcomeDays} paid days, or a full refund.` + : `${PRICING.trialDays} days free, then ${priceLabel(plan)}. Cancel anytime before ${trialCancelBy()} and you pay nothing. After that, a ${PRICING.guaranteeDays}-day money-back guarantee covers your first payment.`, }, ...(requireTos ? { @@ -103,7 +107,7 @@ export const POST: APIRoute = async ({ request, url }) => { trial_period_days: PRICING.trialDays, trial_settings: { end_behavior: { missing_payment_method: 'cancel' } }, // Shown in the customer portal, so subscribers can always find their key there. - description: `Godmode Pro — ${plan === 'yearly' ? 'Yearly' : 'Monthly'} · License ${licenseKey}`, + description: `Godmode Pro${founding ? ' Founding' : ''} — ${plan === 'yearly' ? 'Yearly' : 'Monthly'} · License ${licenseKey}`, }; const session = await stripe().checkout.sessions.create(params); diff --git a/apps/website/src/pages/api/offer.ts b/apps/website/src/pages/api/offer.ts new file mode 100644 index 0000000..d93ae47 --- /dev/null +++ b/apps/website/src/pages/api/offer.ts @@ -0,0 +1,15 @@ +import type { APIRoute } from 'astro'; +import { FOUNDING, foundingOpen } from '@/config/site'; +import { foundingTaken } from '@/lib/db'; +import { minLivemode } from '@/lib/entitlement'; + +export const prerender = false; + +/** GET /api/offer → founding seats left, for the counters on the page. */ +export const GET: APIRoute = async () => { + const taken = await foundingTaken(minLivemode(), FOUNDING.start); + return Response.json( + { seats: FOUNDING.seats, left: Math.max(0, FOUNDING.seats - taken), open: foundingOpen(taken) }, + { headers: { 'cache-control': 'no-store' } }, + ); +}; diff --git a/apps/website/src/pages/checkout/success.astro b/apps/website/src/pages/checkout/success.astro index 16b1886..a4505c9 100644 --- a/apps/website/src/pages/checkout/success.astro +++ b/apps/website/src/pages/checkout/success.astro @@ -2,7 +2,7 @@ import Base from '@/layouts/Base.astro'; import Logo from '@/components/ui/Logo.astro'; import Icon from '@/components/ui/Icon.astro'; -import { isPlan, PRICING, SITE, type Plan } from '@/config/site'; +import { FOUNDING, isPlan, PRICING, SITE, type Plan } from '@/config/site'; import { stripe } from '@/lib/stripe'; import { syncSubscription, upsertFromSession } from '@/lib/db'; import { ORDER_COOKIE, publicId, sign, verify } from '@/lib/signed'; @@ -88,6 +88,12 @@ const handoffUrl = licenseKey ? `${Astro.url.origin}/download?key=${licenseKey}` const mailBody = `Your Godmode license key: ${licenseKey}\n\nDownload Godmode on your Mac or PC (your key is already filled in):\n${handoffUrl}\n`; const mailto = `mailto:${encodeURIComponent(email)}?subject=${encodeURIComponent('Your Godmode license')}&body=${encodeURIComponent(mailBody)}`; +const founding = session?.metadata?.founding === '1'; +const setupBody = `License: ${licenseKey}\n\nMy time zone:\nTimes that work for me this week:\n\n3 things I want Godmode to do for me:\n1.\n2.\n3.\n`; +const setupUrl = + FOUNDING.bookingUrl || + `mailto:${SITE.email}?subject=${encodeURIComponent('Founding setup call')}&body=${encodeURIComponent(setupBody)}`; + Astro.response.headers.set('cache-control', 'no-store'); Astro.response.headers.set('referrer-policy', 'no-referrer'); @@ -172,6 +178,34 @@ const steps = [

+ {founding && ( +
+
+
+ + + +
+

Founding member

+

Book your {FOUNDING.setupMinutes}-minute setup call

+

+ Tell us the {FOUNDING.setupAutomations} things you want off your plate. We build them with you on + the call, and your founders group invite follows right after. +

+
+
+ + Book my call + +
+
    +
  • Price locked for as long as you stay
  • +
  • Running in {FOUNDING.runningHours} hours, or we set it up with you
  • +
  • {FOUNDING.outcomeHours} hours back in {FOUNDING.outcomeDays} days, or full refund
  • +
+
+ )} +

Your license key

diff --git a/apps/website/src/pages/legal/refunds.astro b/apps/website/src/pages/legal/refunds.astro index 5395b31..b7f61de 100644 --- a/apps/website/src/pages/legal/refunds.astro +++ b/apps/website/src/pages/legal/refunds.astro @@ -1,6 +1,6 @@ --- import Legal from '@/layouts/Legal.astro'; -import { LEGAL, PRICING } from '@/config/site'; +import { FOUNDING, LEGAL, PRICING } from '@/config/site'; --- @@ -18,6 +18,16 @@ import { LEGAL, PRICING } from '@/config/site'; deactivated.

+

Founding 100: {FOUNDING.outcomeHours} hours back, or every cent back

+

+ If you joined through the Founding 100 offer, you get a longer, outcome-based guarantee on top: set up at least + {FOUNDING.setupAutomations} automations (we help on your setup call), and if Godmode hasn’t saved you + {FOUNDING.outcomeHours} hours of work in the first {FOUNDING.outcomeDays} days after your first payment, email + {LEGAL.email} within those {FOUNDING.outcomeDays} days. We refund that payment in + full; your own estimate of the time saved is enough. If your first automation isn’t running + {FOUNDING.runningHours} hours after you install, tell us and the founder sets it up with you. +

+

Cancelling a subscription

Cancel monthly or yearly plans anytime from the billing portal (linked in your receipt, on your welcome page and in the diff --git a/apps/website/src/pages/legal/terms.astro b/apps/website/src/pages/legal/terms.astro index 3eb211f..95c8fc8 100644 --- a/apps/website/src/pages/legal/terms.astro +++ b/apps/website/src/pages/legal/terms.astro @@ -1,6 +1,6 @@ --- import Legal from '@/layouts/Legal.astro'; -import { LEGAL, PRICING } from '@/config/site'; +import { FOUNDING, LEGAL, PRICING } from '@/config/site'; const { monthly, yearly } = PRICING.plans; --- @@ -79,6 +79,17 @@ const { monthly, yearly } = PRICING.plans; the first payment after the free trial) and we’ll refund it in full. This voluntary guarantee is in addition to any statutory rights. See Refunds & cancellation.

+

+ Founding 100. Subscriptions started through the Founding 100 offer (the first {FOUNDING.seats} checkouts + from October 5, 2026 until {FOUNDING.endLabel}, 2026, marked “Founding” on your receipt) also include: (a) one + {FOUNDING.setupMinutes}-minute setup call with the founder, booked within {FOUNDING.outcomeDays} days of your trial + start; (b) if your first automation isn’t running {FOUNDING.runningHours} hours after you install, we help you set it + up personally; (c) your plan’s price stays the same for as long as your subscription runs without interruption; and + (d) an outcome guarantee: if, after setting up at least {FOUNDING.setupAutomations} automations (on the setup call or + on your own), Godmode hasn’t saved you {FOUNDING.outcomeHours} hours of work in your first {FOUNDING.outcomeDays} days + after your first payment, email us within those {FOUNDING.outcomeDays} days and we refund that payment in full. Your + own estimate of the time saved is enough. +

6. Warranty and liability

diff --git a/apps/website/src/scripts/main.ts b/apps/website/src/scripts/main.ts index 8c4f0b5..19920af 100644 --- a/apps/website/src/scripts/main.ts +++ b/apps/website/src/scripts/main.ts @@ -347,6 +347,24 @@ document.querySelectorAll('form[data-checkout]').forEach((form) xEvent('checkout', { value: PRICING.plans[plan].price, currency: PRICING.currency, contents: [{ content_id: plan }] }); }); }); +// Founding 100: seats left; on any failure the counters keep their static text. +const foundingSlots = document.querySelectorAll('[data-founding-slot]'); +if (foundingSlots.length) { + fetch('/api/offer', { cache: 'no-store' }) + .then((r) => (r.ok ? r.json() : Promise.reject(r.status))) + .then((res: unknown) => { + const data = (res ?? {}) as { seats?: unknown; left?: unknown; open?: unknown }; + if (typeof data.left !== 'number' || typeof data.seats !== 'number') return; + const { left, seats } = data; + foundingSlots.forEach((slot) => { + const out = slot.querySelector('[data-founding-left]'); + if (out) out.textContent = data.open ? `${left} of ${seats} left` : 'Founding seats are gone'; + slot.style.setProperty('--taken', `${Math.min(100, ((seats - left) / seats) * 100)}%`); + }); + }) + .catch(() => {}); +} + // Back/forward cache: reset spinners when the visitor returns from Stripe. addEventListener('pageshow', (e) => { if (e.persisted) document.querySelectorAll('[data-loading]').forEach((b) => delete b.dataset.loading); diff --git a/apps/website/src/styles/components.css b/apps/website/src/styles/components.css index 5604d5f..583005a 100644 --- a/apps/website/src/styles/components.css +++ b/apps/website/src/styles/components.css @@ -730,6 +730,65 @@ html.menu-open { overflow: hidden; } .price-num { font-size: 56px; line-height: 1; font-weight: 600; letter-spacing: -0.055em; font-variant-numeric: tabular-nums; } @media (min-width: 640px) { .price-num { font-size: 64px; } } +/* Founding 100: seats left (filled in by main.ts) and the value stack. */ +.founder-slot { + position: relative; + display: flex; + align-items: center; + justify-content: space-between; + gap: 12px; + height: 48px; + padding: 0 18px; + border-radius: 999px; + overflow: hidden; + font-size: 13.5px; + background: rgb(0 0 0 / 0.32); + box-shadow: 0 0 0 1px var(--line-2) inset; +} +.founder-slot > i { + position: absolute; + inset: 0 auto 0 0; + width: var(--taken, 0%); + background: linear-gradient(90deg, rgb(240 164 136 / 0.05), rgb(240 164 136 / 0.16)); + box-shadow: inset -1px 0 0 rgb(240 164 136 / 0.45); + transition: width 1.2s var(--ease-out); +} +.founder-slot > span { position: relative; } +.founder-left { font-family: var(--font-mono); font-size: 12px; color: #f0a488; white-space: nowrap; } +.stack-row { + display: grid; + grid-template-columns: 1fr auto; + gap: 6px 20px; + padding: 18px 24px; + border-top: 1px solid var(--line); +} +@media (min-width: 640px) { + .stack-row { grid-template-columns: 88px 1fr auto; padding: 20px 32px; } +} +.stack-tag { + grid-column: 1 / -1; + align-self: start; + justify-self: start; + padding: 3px 9px; + border-radius: 999px; + font-family: var(--font-mono); + font-size: 11px; + color: var(--text-2); + box-shadow: 0 0 0 1px var(--line-2) inset; +} +.stack-tag.is-bonus { color: var(--brand); background: var(--brand-soft); box-shadow: none; } +@media (min-width: 640px) { .stack-tag { grid-column: auto; margin-top: 1px; } } +.stack-value { font-variant-numeric: tabular-nums; font-size: 15px; font-weight: 500; color: var(--text-2); white-space: nowrap; } +.stack-total { + display: flex; + align-items: end; + justify-content: space-between; + gap: 16px; + padding: 22px 24px; + border-top: 1px solid var(--line-2); + background: rgb(47 214 144 / 0.04); +} +@media (min-width: 640px) { .stack-total { padding: 26px 32px; } } .included { background: linear-gradient(180deg, rgb(255 250 240 / 0.02), transparent 60%); } /* Final CTA ---------------------------------------------------------------------------------- */