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

  1. 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.

  2. 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.

  3. 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.

  4. 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).

ColumnTypeExample
child_profiles.name | age | motivator | regulatortext/int
...
The 4 editable fields. Other onboarding fields (diagnosis, communication, challenges) are read-only here; they would need a re-onboarding flow.
profiles.subscription_statustext
plus
free / standard / plus / annual. Drives the plan label + the quota chips elsewhere.
profiles.scheduled_subscription_changejsonb
{ "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.SubscriptionStripe 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.

SectionWhats_visible
HeaderPlan: Plus • Renews 2026-06-13 • $14.99/mo
Scheduled change bannerAmber: 'Downgrading to Standard on 2026-06-13. [Cancel scheduled change]'
Maya taps CancelPOST /api/stripe/cancel-scheduled-change → schedule released → banner disappears.
Update paymentTap → 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 PWAAndroid: '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

Open Settings in Beacon →

Related guides