# Paywall and checkout QA

<!-- funnelsgrove:generated:start contract-v3/qa/paywall-checkout -->
Step contract version: `3`

Contract hash: `d761e91d5ac6ff9e72c6d49c5bcd014270912473a66f99c49d726c65998085cf`

### Generated contract facts — do not edit

- Step contract version: `3`
- Contract hash: `d761e91d5ac6ff9e72c6d49c5bcd014270912473a66f99c49d726c65998085cf`
- Type: `paywall_offer`
- Family: `commerce`
- Description: A monetization offer that presents purchasable plans.
- Action owner: `step`
- Analytics role: `paywall`
- Terminal: `false`
- Required kind: `paywall`
- Allowed kinds: `paywall`
- Allowed semantic events: `checkout_started`, `add_payment_info`, `checkout_completed`
- Forbidden capabilities: `choice-write`, `email-capture`, `subscription-management`, `subscription-handoff`, `hardcoded-navigation`, `provider-direct-analytics`, `browser-registration-completed`

#### Choice contract

_Not a choice type._

#### Automatic lifecycle events

`first_step_clicked`, `first_step_viewed`, `funnel_started`, `step_completed`, `step_exited`, `step_started`

#### Approved capability owners

- `checkout` must be owned by `named-payment-helpers`.

#### Reserved identities

- `paywall`: id=`paywall`, name=`paywall`; type=`paywall_offer`; kind=`paywall`; primary=`true`; unique=`true`
- `paywall-variant`: idPattern=`^paywall-[a-z0-9-]+$`, namePattern=`^paywall-[a-z0-9-]+$`; type=`paywall_offer`; kind=`paywall`; primary=`false`; unique=`false`
<!-- funnelsgrove:generated:end contract-v3/qa/paywall-checkout -->

## Classification and metadata

- Confirm only screens with purchasable plans are paywalls.
- Confirm primary and variant identities, types, kinds, paths, and component parity.
- Confirm no secrets or provider IDs appear in JSX/client configuration.

## Purchase paths

- Verify every plan, price, currency, discount, and eligibility rule.
- Test card and every enabled wallet.
- Confirm every visible wallet placement uses the shared wallet surface matching its payment mode, owns its own Checkout Session, and remains isolated from the card dialog session.
- Test validation, decline, retry, cancel, double-submit, and provider delay.
- Verify named checkout events, complete metadata, one event ID, and retry deduplication.
- Verify payment-info submission does not call `completeStep`; verified `onSuccess` does.
- Verify funnel code contains no direct checkout analytics calls, one-click endpoint fetch, or direct Stripe confirmation.
- Verify success routing and the `purchase_completed` terminal handoff.

Run `fgrove validate` after all checks.
