Loading

Switching On Self-Serve Sign-up

Self-serve sign-up is switched on for a whole installation, and almost everything it needs is set in the server configuration and in Stripe rather than on a screen. This article is for whoever runs the installation: what has to be in place, the safety checks that refuse sign-ups when something is wrong, and how to test the whole journey before taking real money.

Where to find it

Architect Panel → Layout & Pages:

  • E-mail Templates — Self-serve: verify your e-mail and Self-serve: your app is waiting

Architect Panel → Integration & Connections:

  • E-mail Accounts — the account the confirmation and reminder e-mails are sent from

Architect Panel → Subscriptions:

  • Tenant Plans — check each test sign-up's plan row

Architect Panel → Activity:

  • Error Log — why a sign-up was refused, when the reason is a configuration problem

What the hosting administrator sets

  1. The self-serve switch. Turning it on also forces open registration and requires the reCAPTCHA check on the registration form.
  2. reCAPTCHA keys (version 2, a site key and a secret key). With the check required and either key missing, registration is refused rather than left unprotected.
  3. The address of a load balancer, if there is one, as a trusted proxy range. Otherwise every visitor appears to come from the balancer and the per-address sign-up limits become one shared limit.
  4. The Stripe mode (test or live), the secret key, the webhook signing secret and the Stripe account ID the key belongs to. With self-serve on and the account ID empty, every Checkout, top-up and Manage billing request answers that payments are not set up, so a key from the wrong Stripe account can never take money.
  5. The Stripe catalogue and Customer Portal. In test mode a bootstrap script creates the Starter and Pro prices, the AI top-up packs and a Customer Portal configuration that allows card updates, invoice history, cancellation at period end and switching between Starter and Pro only. In live mode they are created by hand to match. The Portal configuration's ID must then be set; without it Manage billing cannot open.
  6. The webhook endpoint in the Stripe dashboard: https://your-site/ajax/subscription-webhook.php?tenantID=0, with these events: checkout.session.completed, checkout.session.async_payment_succeeded, customer.subscription.created, .updated, .deleted, .paused and .resumed, invoice.paid, invoice.payment_failed, charge.refunded, and charge.dispute.created, .updated, .funds_withdrawn and .closed.
  7. The sending e-mail account for confirmation e-mails, if it should differ from the password reset account.

Safety checks that refuse registration

A self-registered account must start with no administration rights anywhere. Registration is therefore refused, with "Registration isn't available right now. Please try again later." shown to the visitor and the reason in the Error Log, when:

  • any group new registrations are placed in by default has admin access;
  • new users are set to be linked to a tenant automatically;
  • reCAPTCHA is required and a key is missing;
  • the platform's rate-limit table is missing.

Registration from one address is also limited to 10 accounts an hour, and confirmation e-mails to 5 an hour per account.

Testing the whole journey

  1. With Stripe in test mode, open the site's /onboarding/ address in a private browser window and complete the wizard.
  2. Register a new account, open the confirmation e-mail and confirm.
  3. Create the app and pay with one of Stripe's test cards.
  4. Check you land in the new app's Site Administration, and that Billing & Plan shows the trial and its end date.
  5. Open Tenant Plans and confirm the new row: Self-serve on, Status trialing, Sign-up state done.
  6. In the Stripe dashboard, check the webhook deliveries succeeded.
  7. Try Manage billing, switch plan in the Portal, and confirm the change reaches Billing & Plan.

What goes wrong

  • "Self-service sign-up is not enabled on this site." in the wizard: the switch is off.
  • "Registration isn't available right now.": one of the safety checks above. The Error Log names it.
  • "Payments are not set up yet." at Checkout: the Stripe account ID or key is missing.
  • "Payments aren't set up correctly on this site. Please contact support.": the Stripe key belongs to a different account from the account ID set.
  • "Billing management is not set up yet." when the owner clicks Manage billing: the Customer Portal configuration ID is not set.
  • Plans never change from incomplete: webhooks are not arriving. Check the endpoint address ends in ?tenantID=0; self-serve events are ignored on any other endpoint.

Worked example

An operator sets the switch, the reCAPTCHA keys and Stripe test credentials, runs the bootstrap and registers the webhook. The first test registration is refused. The Error Log shows the default registration group has admin access, a leftover from an older set-up. Once that group's admin access is removed, a full test sign-up succeeds, Tenant Plans shows the row as trialing, and the operator repeats the checks before switching Stripe to live.

Recommendations

  • Complete a full test sign-up in Stripe test mode before going live.
  • Never let default registration groups carry admin access.
  • Set the trusted proxy range behind a load balancer.
  • Watch the webhook deliveries in Stripe for the first days after launch.
  • Check the two e-mail templates read well for your audience.