Path C

Office Hours — seat or waitlist

The visitor browses Office Hours listings, opens a session or tier detail, and either joins a waitlist or buys a payable tier.

Status Implemented Last reviewed 2026-08-06 All user flows →
User intent

What the visitor is trying to do

“I want to join an Office Hours session or buy a membership — and I need to know the price and availability before committing.”

Entry points

ElementDestination
Resources “Voir le format et les accès”/ressources/office-hours/
Nav indirect via resources/ressources/office-hours/
Qualification group format note/ressources/office-hours/
Session detail cohort link/ressources/office-hours/cohortes/<slug>/

Flow

flowchart LR
      LAND["Landing page"] --> OH["/ressources/office-hours/"]
      OH --> SESSION["Session / tier detail"]
      SESSION --> DECISION{"Payable tier?"}
      DECISION -- Yes --> FORM["Checkout form"]
      FORM --> POST["POST /paiement/produit/<slug>"]
      POST --> SESSION2["Stripe Checkout session"]
      SESSION2 --> RETURN["/paiement/<ref>/retour/"]
      SESSION2 --> CANCEL["/paiement/<ref>/annule/"]
      RETURN --> WEBHOOK["Webhook confirms PAID"]
      WEBHOOK --> ENTITLE["Entitlement + delivery link"]
      DECISION -- No --> WAITLIST["Waitlist registration
(no payment)"]

Screen inventory

IDScreenUser task
P0LandingChoose an entry point
P8Office Hours listingCompare tiers and sessions
P9Session / tier detailJoin waitlist or buy seat
P3Checkout formSelect plan, enter identity, accept terms
P11Stripe hosted checkoutEnter card and confirm
P12Return / cancelledSee confirmation or backing-out notice
P13Webhook (machine)Settle payment and grant entitlement
P14Entitlement / deliveryDownload file or see access instructions

Flow scenario

Scenario C1

Buy an Office Hours membership

Trigger

  • Visitor clicks “Office Hours” in the footer
  • Compares the three tiers
  • Selects a payable tier

Experience

  1. The Office Hours listing shows tiers, prices, and cohort status.
  2. The tier detail includes the checkout organism if the tier has a payable price.
  3. The visitor chooses a plan, enters identity, and posts to /paiement/produit/<slug>/.
  4. Stripe Checkout handles the card entry.
  5. The return page grants access to the session or opens the next instalment.

Trust and safety rules

  • The amount charged is always read from a ProductPrice — never from a browser field.
  • The terms version is frozen at payment creation time; later CGV updates do not retroactively change an open payment.
  • The return page never declares a payment settled: it shows “confirmation en cours” until the signed webhook arrives.
  • No card data touches the server. Stripe hosts the checkout page and returns the buyer via HTTPS.
  • Pending checkouts are throttled per email address to prevent probing.
  • Payment pages are blocked by robots.txt and carry no editorial SEO value.

Interaction rules

  • A product with no payable price shows no checkout form; the page keeps its existing CTAs only.
  • A visitor cannot start a second pending payment from the same email address more than ten times per hour.
  • The office-hours waitlist records a request, not a payment; the checkout form appears only on payable tiers.
  • Mobile fields use 16 px text to avoid browser zoom; choice targets are at least 44×44 px.
  • Reduced-motion preferences disable nonessential transitions.

Result states

StateWhat the visitor seesWhat happens next
PendingCheckout form, “continuer vers le paiement sécurisé”Redirect to Stripe
ProcessingReturn page: “confirmation en cours”Webhook settles the row
PaidReturn page: access granted, entitlements, next instalment if anyBuyer attends session or downloads
Cancelled“Vous avez annulé le paiement” — nothing was chargedBuyer may restart
FailedError message, no chargeBuyer retries or contacts support