checkout delivery

Payment path from button to delivered scroll

This internal chamber stitches together Scroll Shop, Stripe checkout, webhook, purchase link, artifact, email, account archive, recovery, refund, and deletion dry run. This does not sell beauty; it proves the checkout does not lead into a maze.

checkout delivery lab

Build the path from button to scroll

Choose product, payment mode, delivery channels, and proof flags. The panel shows blockers before live payments.

Delivery channels

needs_review

Standard Scroll

standard

Completed

  • product_selected
  • checkout_created
  • payment_confirmed
  • webhook_claimed
  • purchase_unlocked
  • artifact_created
  • delivery_queued
  • email_sent
  • archive_visible
  • support_recoverable

Next stages

    Tables

    reading_recordsstripe_eventsfinance_eventspurchase_linksdelivery_jobsoracle_artifactsomen_consentsdata_deletion_requests
    Next: Clear remaining warnings before opening live payments.

    Stage proof

    • Product selected: product_id and safe wording are fixed before payment.
    • Checkout created: Stripe session has client_reference_id, metadata, and success/cancel URL.
    • Payment confirmed: Stripe reports payment_status=paid and amount matches tier.
    • Webhook claimed once: stripe_events protects against duplicates and double delivery.
    • Purchase unlocked: purchase_links changes status to paid/unlocked and points to the correct unlock_route.
    • Artifact created: oracle_artifacts separates private_payload from public_payload.

    free_or_entry

    Daily Key

    /daily/shop/daily-key

    safe-share-card

    quick

    Small Scroll

    /matchmaker/shop/small-scroll

    private_pdfprint_view

    standard

    Standard Scroll

    /matchmaker/shop/standard-scroll

    private_pdfsafe-share-card

    deep

    Deep Scroll

    /shop/deep-scroll/shop/deep-scroll

    private_pdfprint_viewsafe-share-card

    premium

    Council of Oracles

    /oracle-council/shop/council-of-oracles

    private_council_pdfredacted_share_card

    premium

    Relationship Mirror

    /compatibility/shop/relationship-mirror

    private_pdf

    premium

    Year Map Scroll

    /year-map/shop/year-map-scroll

    private_year_pdfmonthly_echo_cards

    gift

    Gift Scroll

    /shop/gift-scroll/shop/gift-scroll

    gift_claim_keyrecipient_private_pdf

    membership

    Seeker Bundle

    /passport/shop/seeker-bundle

    archivemonthly_pdfecho_threads

    stages

    Proof of passage

    Product selected

    product_id and safe wording are fixed before payment.

    Checkout created

    Stripe session has client_reference_id, metadata, and success/cancel URL.

    Payment confirmed

    Stripe reports payment_status=paid and amount matches tier.

    Webhook claimed once

    stripe_events protects against duplicates and double delivery.

    Purchase unlocked

    purchase_links changes status to paid/unlocked and points to the correct unlock_route.

    Artifact created

    oracle_artifacts separates private_payload from public_payload.

    Delivery queued

    delivery_jobs has idempotency_key, safe subject, and attempts.

    Email sent

    receipt/delivery email was sent without private preview.

    Archive visible

    account shows the purchase only to the owner and with correct consent.

    Support recoverable

    support can find an order by email/session without secrets.

    risk ledger

    What blocks live

    Missing Stripe Price ID

    Set STRIPE_PRICE_* or a verified fallback price_data.

    Missing webhook secret

    Check STRIPE_WEBHOOK_SECRET and live/test mode.

    Broken success URL

    Success URL must lead to unlock/recovery route.

    Duplicate webhook

    Stripe event claim and idempotency keys are required.

    Missing purchase link

    Create a purchase_links row before checkout.

    Missing delivery job

    Webhook must enqueue delivery_jobs with idempotency_key.

    Private data in email preview

    Subject/preview neutral only, full text via link.

    Public artifact leak

    Public payload whitelist and private_payload ban.

    Archive without consent

    Separate consent flags before archive writing.

    No recovery

    Support macro + recovery token + lookup by safe fields.

    No refund/recreate path

    Decision tree: resend, recreate, refund, manual review.

    rooms