# AI Editor RSP — Pricing / Conversion Contract Repair

- Date: 2026-06-04
- Owner: 墨账
- Task: t_9b5811e3
- Parent PM verdict: PM_NO_GO
- Production: https://aieditorrsp.net
- Contract JSON: /root/.hermes/reports/aieditorrsp-hero-optimization-20260603/pricing_contract.json

## 0. Decision

Pricing model confirmed:

1. Free: $0, 2 anonymous generations per day.
2. Pro: $19/month or $180/year, 200 credits per month while subscription is active.
3. Credit Pack: $9 one-time add-on, 100 credits.
4. Business: waitlist/contact only, no public checkout until team workspace, shared billing, invoice flow, and entitlement model are implemented.

This keeps the public self-serve conversion path simple: Free -> Pro subscription -> Credit Pack top-up. Business is a lead-capture anchor, not a live paid entitlement.

## 1. Exception / alignment note

Default site pricing usually prefers three public plan cards: Free / Pro / Business. AI Editor RSP should use a modified model:

- Free and Pro are the core plan ladder.
- Credit Pack is an add-on because the production backend already exposes `plan=credit_pack` and it is useful for occasional extra generations.
- Business must be waitlist-only because no team seats, shared workspace, agency billing, invoice checkout, or Business entitlement surface has been proven.

Frontend recommendation: show three self-serve cards or blocks: Free, Pro, Credit Pack. Add Business as a small `Need team volume? Join the Business waitlist` section below pricing, not as a fake checkout card.

## 2. Limits and cost guardrail

No public copy should imply uncapped usage.

Current limits:

- Free: 2 anonymous generations per day.
- Pro Monthly: 200 credits per month.
- Pro Yearly: $180/year, 200 credits per month while active; frontend displays `$15/mo billed annually` and `Save 21%`.
- Credit Pack: 100 purchased credits.
- Credit consumption: 1 successful generated image = 1 credit.
- Failed provider calls do not consume site credits.

Cost math from this contract:

- Pro monthly net after assumed Stripe 2.9% + $0.30: $18.15.
- Pro monthly net per credit: about $0.0907.
- Credit pack net after assumed Stripe 2.9% + $0.30: $8.44.
- Credit pack net per credit: about $0.0844.
- Annual discount: 21.1% vs 12 monthly payments.

Finance guardrail: if average provider + storage + retry cost per successful generation exceeds $0.05, review quota or price before scaling paid traffic; if it exceeds $0.08, freeze Credit Pack promotion until cost is fixed.

## 3. Exact pricing page copy

### Pricing hero

Eyebrow:
`PRICING_AND_CREDITS`

H1:
`Pricing and credits for AI Editor RSP.`

Subhead:
`Start with 2 free daily generations. Upgrade to Pro for recurring monthly credits, or buy a credit pack when you need extra edits. Google login is required before Stripe Checkout so credits, receipts, and entitlement records attach to your account.`

### Free card

Plan label:
`FREE`

Price:
`$0`

Subline:
`2 free generations per day`

Description:
`Try prompt-based image edits before signing in or buying credits.`

Bullets:
- `2 anonymous generations per day`
- `Prompt library access`
- `Safe prompt guardrails`
- `No payment required`

CTA:
`OPEN EDITOR`

CTA href:
`/ai-photo-prompt-editor`

### Pro card

Plan label:
`PRO`

Billing toggle labels:
- `Monthly`
- `Yearly`

Monthly price:
`$19/mo`

Yearly price:
`$15/mo billed annually`

Yearly badge:
`Save 21%`

Limit line:
`200 credits/month`

Description:
`For recurring product, portrait, and campaign editing sessions with account-backed credits.`

Bullets:
- `Google login required before checkout`
- `Stripe Checkout with automatic tax fields`
- `Billing address and tax ID collection enabled`
- `Receipt-backed subscription entitlement`
- `Failed provider calls do not consume credits`

Primary CTA monthly:
`UPGRADE TO PRO`

Monthly href:
`/api/checkout/stripe?plan=monthly`

Primary CTA yearly:
`UPGRADE YEARLY`

Yearly href:
`/api/checkout/stripe?plan=yearly`

### Credit Pack card

Plan label:
`CREDIT PACK`

Price:
`$9`

Subline:
`100 credits · one-time purchase`

Description:
`For occasional extra generations without changing your subscription state.`

Bullets:
- `Google login required before checkout`
- `Stripe Checkout payment mode`
- `Purchased credits tracked separately`
- `Failed provider calls do not consume credits`

CTA:
`BUY CREDIT PACK`

CTA href:
`/api/checkout/stripe?plan=credit_pack`

### Business waitlist block

Headline:
`Need team volume or agency workflows?`

Body:
`Join the Business waitlist for higher credit volumes, team review workflows, and invoice support. Business checkout is not self-serve yet.`

CTA:
`JOIN BUSINESS WAITLIST`

CTA href:
`/contact?topic=business-waitlist`

## 4. Credit exhausted state contract

Trigger states:

- `/api/generate-image` returns `402 LOGIN_REQUIRED`.
- `/api/generate-image` returns quota exhausted for free users.
- Authenticated user has no paid or purchased credits remaining.

### Anonymous exhausted / login-required copy

Status label:
`Generation blocked`

Title:
`Sign in or upgrade to keep editing.`

Body:
`You have used today’s free generations. Sign in with Google to continue to Stripe Checkout, attach credits to your account, and keep receipts for your edits.`

Limit line:
`Free quota: 2 generations/day · Failed provider calls do not consume credits.`

Primary CTA:
`UPGRADE TO PRO`

Primary href:
`/api/checkout/stripe?plan=monthly`

Secondary CTA:
`BUY CREDIT PACK`

Secondary href:
`/api/checkout/stripe?plan=credit_pack`

Tertiary CTA:
`SIGN IN`

Tertiary href:
`/api/auth/login?return_to=/ai-photo-prompt-editor`

### Authenticated no-credit copy

Status label:
`Credits exhausted`

Title:
`You are out of editing credits.`

Body:
`Upgrade to Pro for 200 credits/month, or buy 100 extra credits for occasional edits. Your generated result appears only after a successful provider response.`

Remaining line:
`Remaining credits: 0`

Primary CTA:
`UPGRADE TO PRO`

Primary href:
`/api/checkout/stripe?plan=monthly`

Secondary CTA:
`BUY CREDIT PACK`

Secondary href:
`/api/checkout/stripe?plan=credit_pack`

Tertiary CTA:
`VIEW ACCOUNT CREDITS`

Tertiary href:
`/account/credits`

## 5. Post-generation success upsell contract

Placement: below result preview actions, after `Download image` / `Open full size` / `Try another style`.

Title:
`Need more edits?`

Body:
`Upgrade to Pro for 200 credits/month, or buy a 100-credit pack when you need extra generations.`

Primary CTA:
`UPGRADE TO PRO`

Primary href:
`/api/checkout/stripe?plan=monthly`

Secondary CTA:
`BUY CREDIT PACK`

Secondary href:
`/api/checkout/stripe?plan=credit_pack`

Microcopy:
`Credits are used only after a successful generated result.`

## 6. Checkout contract

Hard requirements:

- Google login is required before Stripe Checkout.
- Anonymous checkout CTA must redirect to `/api/auth/login?return_to=<checkout path>`.
- `return_to` must preserve monthly, yearly, and credit_pack plan paths.
- Stripe Checkout must include:
  - `automatic_tax: { enabled: true }`
  - `billing_address_collection: 'required'`
  - `tax_id_collection: { enabled: true }`
- Receipt-backed entitlement required:
  - subscription or credit pack must not be granted from frontend success URL alone.
  - entitlement should be created from Stripe webhook / verified checkout session.
  - orders table should preserve Stripe session/payment/subscription identifiers, subtotal, tax, total, currency, and entitlement status.
- Public copy must say Stripe is payment processor, not Merchant of Record.
- Tax collected by Stripe must be accounted separately from product revenue.

Observed production verification in this repair pass:

- `/api/credits` returns checkout paths for monthly/yearly/credit_pack and `daily_limit=2`.
- Anonymous `monthly`, `yearly`, and `credit_pack` checkout routes each return 302 to Google login with `return_to` preserved.
- Browser pricing snapshot confirms Free / Pro Monthly / Credit Pack public copy; yearly and Business waitlist copy still need frontend copy/UI repair.

## 7. Frontend / backend / design handoff

Frontend must implement:

- Monthly/yearly billing toggle for Pro.
- Yearly CTA: `UPGRADE YEARLY` -> `/api/checkout/stripe?plan=yearly`.
- Credit exhausted block with three visible actions: `UPGRADE TO PRO`, `BUY CREDIT PACK`, `SIGN IN`.
- Post-generation upsell block with `UPGRADE TO PRO` and `BUY CREDIT PACK`.
- Account/credits surface reflecting `/api/credits`: free remaining, paid remaining, plan, checkout links.
- Business waitlist block without fake checkout.

Backend must preserve:

- `monthly`, `yearly`, and `credit_pack` checkout routes.
- Google login gate before Stripe.
- Checkout automatic tax / billing / tax ID fields.
- Webhook-backed entitlement and receipts.
- Failed generation calls do not consume credits.
- Successful generation consumes exactly 1 credit unless future contract changes.

Design must show:

- Free quota badge in header/editor.
- Pro monthly/yearly segmented control.
- Credit Pack as add-on, not a subscription replacement.
- Business as low-pressure waitlist/contact block.
- Exhausted and post-success states with clear CTAs.

## 8. Acceptance checklist for next QA

Pricing/conversion is acceptable only when production evidence proves:

1. Pricing page shows Free / Pro monthly+yearly / Credit Pack.
2. No public copy promises uncapped use.
3. Pro yearly CTA exists and routes to `/api/checkout/stripe?plan=yearly`.
4. Business, if shown, is waitlist/contact only.
5. `/api/credits` values are visible in editor/account UI.
6. Credit exhausted state shows `UPGRADE TO PRO`, `BUY CREDIT PACK`, and `SIGN IN`.
7. Successful result state shows generated image actions plus lightweight upsell.
8. Anonymous checkout routes redirect to Google login with `return_to` preserved.
9. Logged-in checkout reaches Stripe Checkout or is explicitly blocked by lack of test account.
10. Stripe webhook / receipt-backed entitlement evidence exists for at least one controlled checkout or documented live event.
