Settings
Edit child profile fields, manage your subscription, install the app, restore a missing subscription. The 4 things, on one page.
When to use this
Open Settings when something about your situation has changed (Avery's regulator stopped working, you want to upgrade/downgrade, you signed in on a new device and your subscription went missing). The 4 actions are stacked top-to-bottom; you'll usually only need one at a time.
How it works
Edit child profile
Four editable fields: name, age, motivator, regulator. Saves to child_profiles. Changes propagate live to Crisis Mode, Workshop tools, and chat without needing to reload.
Subscription management
Plan label (Free / Standard / Plus / Annual) + current period end. Buttons: Change plan (opens PlansModal), Update payment method, Cancel (sets cancel_at_period_end, so you keep access through the paid period). Resume button appears if previously cancelled.
Scheduled downgrade banner
If you've requested a downgrade, an amber banner shows the from-plan → to-plan + effective date (period end). Includes 'Cancel scheduled change' button to back out. PR-C policy: no Stripe credit for early downgrades.
Install + Restore
Install PWA prompt (different copy for iOS vs Android: Android has native install). Restore button at the bottom: re-links an existing subscription if you magic-link signed into the wrong account or your subscription went missing.
What Beacon stores when you use it
child_profiles + profiles + Stripe: Settings reads from + writes to 3 surfaces. Profile edits hit child_profiles. Subscription state is the union of profiles.subscription_status + the live Stripe Subscription object (fetched on each Settings open).
| Column | Type | Example |
|---|---|---|
| child_profiles.name | age | motivator | regulator | text/int | ... The 4 editable fields. Other onboarding fields (diagnosis, communication, challenges) are read-only here; they would need a re-onboarding flow. |
| profiles.subscription_status | text | plus free / standard / plus / annual. Drives the plan label + the quota chips elsewhere. |
| profiles.scheduled_subscription_change | jsonb | { "schedule_id":"sch_...", "from_plan":"plus", "to_plan":"standard", "effective_at":"2026-06-13" } Set by /api/stripe/change-plan when direction is downgrade. Cleared on subscription update (webhook). |
| Stripe.Subscription | Stripe object | (status, cancel_at_period_end, current_period_end, interval, amount) Source of truth for billing date + cancel state. Fetched on every Settings open, never cached. |
A real example
Maya is on Plus, signed in on her phone but lost the subscription. Today: cancel scheduled downgrade, update payment method, and restore.
| Section | Whats_visible |
|---|---|
| Header | Plan: Plus • Renews 2026-06-13 • $14.99/mo |
| Scheduled change banner | Amber: 'Downgrading to Standard on 2026-06-13. [Cancel scheduled change]' |
| Maya taps Cancel | POST /api/stripe/cancel-scheduled-change → schedule released → banner disappears. |
| Update payment | Tap → UpdatePaymentModal → Stripe element → save → success. |
| Restore (bottom) | 'Restore subscription' button → reads Stripe customer by email → re-links profiles.subscription_status. Use when you signed into the wrong account. |
| Install PWA | Android: 'Add Beacon to your home screen' button. iOS: 'Tap share → Add to Home Screen' instructions (no native API). |
What Beacon auto-knows
- Your child profile (4 editable fields here, the other 4 read-only).
- Your subscription status + the live Stripe object on every open.
- Any scheduled subscription change (downgrade pending at period end).
- Your install state (PWA already added? iOS? Android with native prompt?).
How it fits with Chat
- Settings doesn't have a Discuss button. It's a control surface, not a content surface.
- But Beacon in chat can guide you here: 'Update your regulator in Settings → Profile' or 'To cancel, head to Settings; cancellation is at-period-end, no immediate refund'.
Try these with Beacon
“I want to cancel. What happens to my data?”
Explains: cancellation sets cancel_at_period_end=true, you keep Plus access until period end, then the account drops to Free (1 lifetime use of each Workshop tool). Data stays. You can resume any time before period end; after, you keep Free access but Plus features are gated again.
“I downgraded to Standard but I want Plus back.”
If the downgrade is scheduled but not yet effective: tap 'Cancel scheduled change' in the amber banner. You stay on Plus. If the downgrade already happened: open the Plans modal and upgrade back. Stripe prorates upgrades the same day.
“I signed up but Settings says I'm on Free.”
Two likely causes: (1) the webhook hasn't fired yet (Settings repolls every 2s for 20s after returning from Stripe checkout, so wait + refresh), (2) you signed into a different email than the one you used to pay. Use the Restore button at the bottom of Settings, which re-links by Stripe customer email.
“Install Beacon on my iPhone.”
iOS doesn't expose a PWA install API. Settings shows iOS instructions: open in Safari → tap Share → Add to Home Screen. Beacon then runs full-screen like a native app.