Pricing Page skill for Codex
Pick a plan in ten seconds, pay what you saw. Codex packages plans around personas and growth-linked gates, then builds the page from one pricing config that also feeds checkout, with a check that every displayed price matches its Stripe or Paddle lookup key. Annual toggles state the billed total, comparison tables show what differs, the FAQ answers billing objections, and live price changes wait for your approval.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- pricing-page Installs to ~/.agents/skills/pricing-page/ for every project on this machine.
curl -fsSL codexskills.dev/cli.mjs -o codex-skills.mjsnode codex-skills.mjs install pricing-page The CLI also searches, updates and removes skills. Run it with no arguments to pick from a list. Needs Node 20.12+.
curl -fsSL codexskills.dev/install.sh \ | sh -s -- --project pricing-page Installs to .agents/skills/pricing-page/ in the current repository. Commit it and everyone who runs Codex there gets it.
curl -fsSLO codexskills.dev/downloads/pricing-page.zipunzip -o pricing-page.zip -d ~/.agents/skills/ The archive holds the skill folder with its generated agents/openai.yaml. Unzip into .agents/skills/ to scope it to a repo.
& ([scriptblock]::Create((irm codexskills.dev/install.ps1))) pricing-page PowerShell 5.1 or 7. Installs to %USERPROFILE%\.agents\skills\. Add -Project for the current repo.
104-line POSIX script. No sudo, no telemetry. Read install.sh
Use it in Codex
Start a prompt with $pricing-page, or pick it from /skills.
You can also just describe the task: Codex reads the description below and loads the playbook when your request matches.
What Codex reads before loading it
Designs and builds SaaS and product pricing pages - tier structure and packaging, plan names and target personas, value metric display, monthly/annual toggle, feature comparison table, enterprise and contact-sales paths, currency and tax display, FAQ that handles billing objections, and Product structured data - with prices kept in one source of truth shared with billing. Use when asked to create or redesign a pricing page, restructure plans into tiers, add an annual discount toggle, build a plan comparison table, or fix confusion and support tickets about pricing.
Use it when
- You are creating or restructuring a pricing page or plan tiers
- Prices on the site drift from what billing actually charges
- Support gets repeated questions about plans, billing periods or tax
- A plan comparison table is unreadable, especially on mobile
Use something else when
- You need to decide price levels or run willingness-to-pay research: use pricing-strategy
- You need subscriptions, proration and invoices implemented: use stripe-billing
How to check the result
An automated check confirms every displayed price equals its billing lookup key amount, and each CTA opens test-mode checkout with the right plan, interval and currency.
The mistake it prevents
Hard-coding prices in page markup separately from billing, so the page and checkout quietly disagree after the next price change.
A pricing page is done well when a visitor can identify their plan in under ten seconds, the price they see is the price they are charged (currency, tax, billing period), the comparison table answers “what do I lose by choosing the cheaper plan”, and every number comes from the same source as billing.
This skill covers packaging and the page. Choosing price levels and running
willingness-to-pay research belongs to pricing-strategy.
Inspect first
- Find where prices live today:
rg -n "price_|priceId|lookup_key|monthly|annual|per seat|/mo" src/ app/ config/ -g '!node_modules'. Hard-coded numbers in JSX next to Stripe or Paddle price IDs in config are a mismatch waiting to happen. - Read the billing setup (Stripe Products and Prices, Paddle, Lemon Squeezy, Chargebee): which plans, intervals, currencies and tax behaviour exist.
- Read
AGENTS.mdand the existing design system components for cards, tables, toggles. - Collect evidence: sales and support questions about pricing, plan distribution of current customers, upgrade triggers, churn reasons mentioning price.
Packaging decisions
| Decision | Default | Change when |
|---|---|---|
| Number of tiers | 3 self-serve (plus Enterprise) | One clear persona: 1-2 tiers; very broad market: add a free tier |
| Tier anchor | Middle tier as “Most popular”, sized for the core persona | Data shows most buyers choose a different tier |
| Value metric | Grows with value received (seats, usage, contacts, projects) | Metric customers cannot predict creates anxiety: offer bundles or caps |
| Free option | Free plan for products with viral/collaborative loops; trial otherwise | Support cost of free users is high: time-limited trial |
| Annual discount | ~15-20% (“2 months free”) | Cash flow not a priority, or monthly churn is low |
| Enterprise | “Contact sales” tier with SSO, audit logs, SLA, invoicing, security review | Product has no enterprise buyer yet: omit it |
Tier differentiation rules:
- Each tier is named for who it is for or how they work (“Solo”, “Team”, “Business”), not gemstones.
- Gate on features that matter more as customers grow (permissions, SSO, audit logs, API limits, integrations, support SLA), not on core value; crippling the base product kills conversion.
- Each tier has a one-line “for
<persona>who need<thing>” description. - Show what is in a tier as “Everything in Team, plus:” to keep cards short.
Page structure
- Headline that states the deal plainly (“Simple pricing, free for small teams”).
- Billing toggle (Monthly / Annual, savings shown as a concrete amount or “2 months free”); default to annual only if most customers choose it, and say “billed annually” next to the per-month figure.
- Plan cards: name, persona line, price with unit (
$12 per user / month), billing note, primary CTA, 4-6 key inclusions. One highlighted plan. - Logos or short social proof near the cards.
- Comparison table: every feature grouped by category, sticky header with plan names and CTAs, tooltips for jargon. Use text (“Unlimited”, “3 projects”, ”-”) not just ticks.
- Usage calculator if pricing depends on volume.
- FAQ: billing cycle, upgrades and downgrades (proration), cancellation, refunds, taxes and VAT, payment methods, invoices/POs, discounts (education, nonprofit, startup), data on downgrade, what happens at limits.
- Final CTA and contact-sales path.
Single source of truth
Generate both the page and the checkout from one config, or read prices from the billing provider at build time.
// pricing.config.ts - the only place prices and limits are written
export const plans = [
{
id: "team",
name: "Team",
persona: "For growing teams that ship together",
prices: {
month: { amount: 1500, currency: "usd", lookupKey: "team_monthly_usd" },
year: { amount: 14400, currency: "usd", lookupKey: "team_yearly_usd" },
},
unit: "per user",
limits: { projects: Infinity, guests: 10 },
highlights: ["Unlimited projects", "10 guest seats", "Priority email support"],
},
] as const;
export const formatPrice = (cents: number, currency: string, locale = "en-US") =>
new Intl.NumberFormat(locale, { style: "currency", currency, maximumFractionDigits: cents % 100 ? 2 : 0 })
.format(cents / 100);
Then add a test that each lookupKey exists in the billing provider with the same
amount (in CI with test-mode keys, or a script the user runs with network access).
Stripe lookup keys let the code reference a stable key while the underlying Price
changes.
Currency, tax and region
- Show local currency where you actually charge it; do not convert on the fly to a currency checkout will not use.
- US convention: prices shown excluding sales tax. EU/UK consumers expect VAT-inclusive prices; for B2C there, show inclusive prices or state clearly that VAT is added. Get the user’s accountant or tax provider (Stripe Tax, Paddle as merchant of record) to confirm the rule for each market.
- Annual price shown per month must state the billed annual total somewhere visible.
Structured data and SEO
- Pricing pages rank for ”
<brand>pricing”; give the page a clear title and meta description that include the starting price if it is stable. - Product or SoftwareApplication JSON-LD with
offersis optional; if used, prices must match the visible page exactly. Details belong toschema-markup.
Honesty rules
- No fake strike-through “was” prices; reference prices must be real prices actually charged.
- No pre-checked add-ons, no hidden fees revealed only at checkout.
- Cancellation should be as easy as signup; US state automatic-renewal laws (California’s among the strictest), the federal ROSCA statute and EU consumer rules require clear renewal terms and simple cancellation. Describe the real process in the FAQ.
- “Free” means free: state limits and what happens when they are reached.
Changing live prices
Changing prices or plans on the live site and in billing affects real customers and revenue. Prepare the config change, page and a migration note for existing customers (grandfathering, notice period), and ship only after the user confirms. Never edit live Prices in the billing provider from Codex without explicit approval.
Gotchas
- Page says “$15/user”, checkout charges $18 because a new Price was created in Stripe and the page was not updated. Single config plus a test prevents it.
- Annual toggle shows per-month price without “billed annually”; leads to refund requests.
- Comparison table with 60 rows of ticks nobody can scan; group and cut to what differs.
- “Contact sales” as the only path for mid-market buyers who want to self-serve.
- Mobile: comparison tables overflow; use per-plan accordions or a sticky plan selector.
Verification
- Every displayed price equals the billing provider’s amount for that lookup key and currency (automated check).
- Click each CTA through to checkout in test mode; plan, interval and currency are preselected correctly.
- Five-person or five-question test: “Which plan would you pick and what will you pay per year?” answered correctly from the page alone.
- Page renders at 375 px without horizontal scroll; toggle and table are keyboard accessible.
Output template
## Pricing page: <product>
**Tiers:** table (name, persona, price month/year, value metric, key gates)
**Changes from current:** ...
**Source of truth:** pricing.config.ts <-> billing lookup keys (check: passing)
**Sections:** headline, toggle, cards, comparison, FAQ (questions listed)
**Regional/tax display:** ...
**Open questions for user:** price levels (pricing-strategy), legal/tax review, grandfathering What the zip contains
SKILL.md plus the interface file below. Nothing runs on install.
agents/openai.yaml
Gives the Codex app a display name, a one-line description and a starter prompt for this skill.
interface:
display_name: "Pricing Page"
short_description: "Pick a plan in ten seconds, pay what you saw"
default_prompt: "$pricing-page Redesign our pricing page into three tiers with an annual toggle and a comparison table" About this skill
Written and maintained by the Codex Skills editors to the same editorial standard as every skill here: a selective description, a real workflow, known pitfalls and a way to verify the work. First published , last updated . MIT licensed. Something wrong or out of date? Tell us.