Your browser sucks, JavaScript disabled! Gunnar's console needs JavaScript and WebAssembly. Git over SSH on port 2222 does not.

nordisk/monetize

DESIGN-PRIVATE-PAY-ONCE.md

A private Gunnar is paid at Stripe ONCE

Owner order, 2026-10-22: "ja! så måste det vara! dokumentera gärna" — a visitor who buys a PRIVATE Gunnar instance meets Stripe once.

Before (to 2026-10-22)

A visitor on /signup?plan=private went to Stripe twice:

  1. the free account's 0 kr card check (/auth/signup/start, plan gunnar/account, Stripe mode=setup) → welcome → passkey → signed in;
  2. back on the private choice: /auth/private/ladder → /auth/private/start (EstateOrder.Start with the signed-in account's estate ticket) → Stripe payment → /auth/private/status.

Now

  visitor on the private choice: e-mail + account name + company (+ domain, size)
     │  POST /auth/private/start  (gunnar-ui: nobody signed in → new_account, welcome_url)
     ▼
  EstateOrder.Start{new_account}         monetize: the name is free here, the address has
     │                                   no account here, the product has an account plan;
     │                                   the name is held while the payment page runs
     ▼
  Stripe: the private Gunnar's payment   (the ONE vendor page)
     ▼
  tick: ORDERED → paid                   monetize makes the ACCOUNT now, as a paid signup
     │                                   does (signup sink; a pulled product: "<site>'s main
     │                                   creates <user> when it next calls monetize"), and
     │                                   mails its sign-in link (welcome_url + session)
     ▼
  HELD → laid → installed → ready mail   the estate order is that account's (run.account)
  sign-in link → /welcome → passkey → signed in → /signup?plan=private&company=<co>

The buy form (owner additions, 2026-10-22)

On /signup?plan=private:

  1. One heading: the private choice's heading is "New private Gunnar". The choice row stays (signed in: "New instance" / "Grow 's Gunnar" / "Buy a plan" or "Grow your account"; a visitor: "Account on " / "Private Gunnar instance") — real paths.
  2. The button says what is paid: "Pay ", the chosen step's amount as monetize words it (EstateLadderStep.pay_words, e.g. "Pay 3.21 EUR"). The other buttons stay.
  3. The e-mail is not changed in the buy ("man skall inte kunna byta email"): signed in, there is no e-mail field; monetize sends the order's mail to the address the account was made with (the signup record it holds), whatever a page sends. An account monetize holds no address for is refused by name before any money. A visitor types the e-mail once: it is the new account's address and the order's.
  4. The account line is short: "x14 (you)".

Kept: the company and its address preview, the machines, the VPN line.