15 categories
JESS MOVECommunications
Event architecture
One event engine. Every message the platform can send.
234 catalogued events across 15 categories, fanning out to five channels under one set of delivery rules. Nothing in this platform sends a message by building a string inside a service.
bypass channel preferences — never age
absent below 18, not consent-gated
email · in-app · sms · push · whatsapp
Resolution order
Five checks, and the order is the argument.
A platform serving ten-year-olds and ninety-year-olds from one engine cannot have a single “send to user” path. Every message goes through the same function, and that function is pure — which is why the rules below are unit tests rather than log output somebody has to read.
Age
An adult-only event does not exist below 18. Not suppressed by preference, not unlockable by consent, not reachable by an administrator. It is checked first because it is the only rule with no override anywhere in the platform.
Coach presence
If MOVA is off, coaching messages do not send — and no severity overrides that, because a person who turned the coach off did not ask for a louder coach. Statutory notices are a different class and are unaffected.
Context — Law 2
A nudge fired into a moment the person cannot move is a defect, not a delivery. A held context blocks the send and the hold is recorded as the correct outcome rather than a failure.
Quiet hours and the daily cap
Ordinary traffic waits until morning. The cap is per person and per mode. Exempt events — security, safety, clinical, breach — pass, and nothing else does.
Channel consent
The last check, and the only one a mandatory notice bypasses. Mandatory means “we will tell you about your own security, money and data whatever your preferences say”. It has never meant “ignore the age rules”.
Worked examples
Resolved by the real function, at build time.
Nothing below is illustrative. Each card calls resolveDelivery with the recipient described and prints what came back, including the explanation.
A payment receipt, to a twelve-year-old
suppressedpayment.successful
Explorer mode · consent irrelevant
- adult only
This event does not exist below 18. It is absent, not suppressed by preference.
A movement nudge, coach switched off
suppressedsnap.offered
Momentum mode · MOVA off
- coach off
The coach is off. Coaching messages do not send, and no severity overrides that.
The same nudge, while driving
suppressedsnap.offered
Momentum mode · context held
- context held
Context says the person cannot move right now. The hold is the correct outcome.
A breach notice, everything opted out, 3am
deliveredprivacy.breach_notification
Balance mode · no consented channels
- In-app
Mandatory notice — delivered regardless of channel preferences, but still subject to the age rules.
A red flag for a minor, at night
deliveredclinical.red_flag_detected
Teen mode · guardian linked
- In-app
- + guardian copy
Mandatory notice — delivered regardless of channel preferences, but still subject to the age rules.
A weekly insight, at night
suppressedinsight.weekly_ready
Independence mode · quiet hours
- quiet hours
Inside quiet hours, and this event is not exempt.
Channel coverage
How many events name each channel by default.
Every event lands in-app, because that is the record of what happened. SMS is reserved for warning and critical traffic — it costs eighty times what an email costs, and a catalogue that forgets this is a catalogue that produces a surprising invoice.
Branded template, company logo and details on every outbound message.
£0.00040 per message
In-app
wiredEvery catalogue event lands here. It is the record of what happened.
£0.00000 per message
SMS
unwiredCatalogued, templated and costed, but no gateway is connected — events naming it fall back to the next channel. Reserved for critical and mandatory notices when it is.
£0.03200 per message
Push
wiredCoaching and time-sensitive events. Obeys quiet hours and the daily cap.
£0.00002 per message
Catalogued and templated, but no provider is connected. Events naming it fall back to the next channel.
£0.00450 per message
The catalogue
234 events, 15 categories.
Every message the platform can send. A mandatory notice bypasses channel preferences. An adult-only event does not exist below 18. A guardian copy reaches the linked guardian when the subject is a minor. Coaching obeys presence, context and the daily cap.
Identity & Account
20 events
Account requestedaccount.registration.requested | Welcome to JESS MOVE — confirm your account | info |
| |
Registration receivedaccount.registration.received | We received your registration | info |
| |
Email verification requiredaccount.email_verification_required | Verify your email address | warning |
|
|
Mobile verification requiredaccount.mobile_verification_required | Verify your mobile number | warning |
| |
Age verification requiredaccount.age_verification_required | We need to confirm your age band | warning |
|
|
Age band assignedaccount.age_band_assigned | Your JESS MOVE mode is set to {{mode}} | success |
| |
Age band changedaccount.age_band_changed | Your mode has changed to {{mode}} | info |
|
|
Verification successfulaccount.verification.successful | Your account is verified | success |
| |
Verification failedaccount.verification.failed | Verification could not be completed | warning |
| |
Verification expiredaccount.verification.expired | Your verification link expired | warning |
| |
Registration abandonedaccount.registration.abandoned | Finish setting up your JESS MOVE account | info |
| |
Onboarding startedaccount.onboarding.started | Let’s learn how your day works | info |
| |
Onboarding step completedaccount.onboarding.step_completed | Step {{item}} complete | success |
| |
Onboarding completedaccount.onboarding.completed | Your Movement Vector is ready | success |
| |
Onboarding abandonedaccount.onboarding.abandoned | Two questions left, then you’re set | info |
| |
Profile updatedaccount.profile_updated | Your profile was updated | info |
| |
Capability profile updatedaccount.capability_profile_updated | Your movement options have changed | info |
| |
Mode override requestedaccount.mode_override_requested | A mode change was requested on your account | warning |
|
|
Account closedaccount.closed | Your JESS MOVE account is closed | info |
|
|
Account reopenedaccount.reopened | Welcome back | success |
|
Login & Security
20 events
Successful loginauth.login.success | New sign-in to your account | info |
| |
Failed loginauth.login.failed | Failed sign-in attempt | warning |
| |
Suspicious loginauth.login.suspicious | Unusual sign-in detected | critical |
|
|
New device detectedauth.device.new | New device signed in | warning |
|
|
Device approvedauth.device.approved | Device approved | success |
| |
Device rejectedauth.device.rejected | Device rejected | warning |
| |
Forgot passwordpassword.forgot | Reset your JESS MOVE password | info |
| |
Password reset linkpassword.reset_link | Your password reset link | info |
| |
Password reset successfulpassword.reset.successful | Your password was reset | success |
|
|
Password changedpassword.changed | Your password was changed | success |
|
|
Password expiry warningpassword.expiry_warning | Your password expires soon | warning |
| |
OTP codemfa.otp_code | Your JESS MOVE verification code | info |
|
|
MFA enabledmfa.enabled | Two-factor authentication enabled | success |
|
|
MFA disabledmfa.disabled | Two-factor authentication disabled | warning |
|
|
Backup codes generatedmfa.backup_code_generated | New backup codes generated | info |
| |
Security alertsecurity.alert | Security alert on your account | critical |
|
|
Account lockedaccount.locked | Your account has been locked | critical |
|
|
Account unlockedaccount.unlocked | Your account is unlocked | success |
| |
Too many attemptssecurity.too_many_attempts | Too many attempts | warning |
| |
Session revokedsession.revoked | A session was signed out | warning |
|
|
Guardianship & Household
15 events
Guardian link requestedguardian.link_requested | {{name}} has asked you to be their guardian on JESS MOVE | info |
|
|
Guardian link confirmedguardian.link_confirmed | You are now the guardian for {{name}} | success |
|
|
Guardian link declinedguardian.link_declined | A guardian request was declined | info |
| |
Guardian link removedguardian.link_removed | A guardian link was removed | warning |
|
|
Guardian consent requestedguardian.consent_requested | Consent needed for {{item}} | warning |
|
|
Guardian consent grantedguardian.consent_granted | Consent recorded for {{item}} | success |
| |
Guardian consent withdrawnguardian.consent_withdrawn | Consent withdrawn for {{item}} | warning |
|
|
Guardian weekly summaryguardian.weekly_summary | This week for {{name}} | info |
| |
Safeguarding notice to guardianguardian.safeguarding_notice | Something we think you should know | critical |
|
|
Household member addedhousehold.member_added | {{name}} joined your household | info |
| |
Household member removedhousehold.member_removed | {{name}} left your household | info |
| |
Household seat limit reachedhousehold.seat_limit_reached | Your household plan is full | warning |
| |
Household owner changedhousehold.owner_changed | Household ownership changed | warning |
|
|
Member reaches 18minor.turns_18 | Your account moves to adult mode next week | info |
|
|
Guardian visibility reminderminor.guardian_visibility_reminder | What your guardian can and cannot see | info |
|
|
Subscription & Billing
23 events
Trial startedsubscription.trial_started | Your JESS MOVE trial has started | success |
|
|
Trial endingsubscription.trial_ending | Your trial ends in 3 days | warning |
|
|
Trial expiredsubscription.trial_expired | Your trial has ended | warning |
|
|
Subscription activatedsubscription.activated | Your {{plan}} subscription is active | success |
|
|
Subscription renewedsubscription.renewed | Your subscription renewed | info |
|
|
Subscription upgradedsubscription.upgraded | You moved to {{plan}} | success |
|
|
Subscription downgradedsubscription.downgraded | Your plan changes on {{date}} | info |
|
|
Subscription cancelledsubscription.cancelled | Your subscription was cancelled | warning |
|
|
Subscription reactivatedsubscription.reactivated | Your subscription is reactivated | success |
|
|
Payment pendingpayment.pending | Payment is processing | info |
|
|
Payment successfulpayment.successful | Payment received — {{amount}} | success |
|
|
Payment failedpayment.failed | Your payment failed | warning |
|
|
Payment retrypayment.retry | We’ll retry your payment | info |
|
|
Charge below the £5 floorpayment.below_minimum | That amount is below our £5 minimum | info |
|
|
Card expiringpayment.card_expiring | Your card expires soon | warning |
|
|
Card expiredpayment.card_expired | Your card has expired | warning |
|
|
Refund processedpayment.refund_processed | Your refund was processed | success |
|
|
Chargeback receivedpayment.chargeback_received | A chargeback was raised on your account | critical |
|
|
Invoice generatedinvoice.generated | Invoice {{number}} is ready | info |
|
|
Invoice overdueinvoice.overdue | Invoice {{number}} is overdue | warning |
|
|
Invoice reminderinvoice.reminder | Reminder: invoice {{number}} due {{date}} | info |
|
|
Invoice paidinvoice.paid | Invoice {{number}} paid | success |
|
|
Credit note issuedinvoice.credit_note_issued | Credit note issued | info |
|
|
ACU Wallet & Spend
14 events
Wallet createdacu.wallet_created | Your Adaptive Coaching Unit wallet is open | info |
|
|
Monthly allowance grantedacu.allowance_granted | Your {{plan}} allowance is available | success |
|
|
Quote issued before an expensive actionacu.quote_issued | This action will cost {{amount}} | info |
|
|
Balance lowacu.balance_low | Your ACU balance is running low | warning |
|
|
Balance exhaustedacu.balance_exhausted | Paid AI actions are paused | warning |
|
|
Top-up successfulacu.topup_successful | Top-up received — {{amount}} | success |
|
|
Top-up failedacu.topup_failed | Your top-up did not complete | warning |
|
|
Auto top-up enabledacu.auto_topup_enabled | Auto top-up is on | info |
|
|
Auto top-up triggeredacu.auto_topup_triggered | We topped up your wallet automatically | info |
|
|
Auto top-up raised to the minimumacu.auto_topup_raised_to_minimum | Your top-up was raised to £5, our minimum charge | info |
|
|
Spend cap reachedacu.spend_cap_reached | You have reached your monthly spend cap | warning |
|
|
Rollover appliedacu.rollover_applied | Unused units rolled over | success |
|
|
Rollover expiringacu.rollover_expiring | Rolled-over units expire on {{date}} | info |
|
|
Hard stop reachedacu.hard_stop | Paid AI actions have stopped. Nothing else has. | warning |
|
|
Movement & Coaching
22 events
Movement offeredsnap.offered | {{item}} — {{duration}} | info |
|
|
Movement remindersnap.reminder | Still a good moment for {{item}} | info |
|
|
Movement startedsnap.started | Started | info |
| |
Movement completedsnap.completed | Nice one — {{item}} done | success |
| |
Movement skippedsnap.skipped | Skipped, noted | info |
| |
Held — you cannot move right nowsnap.held_context | Held: {{item}} | info |
| |
Held — quiet hourssnap.held_quiet_hours | Held until morning | info |
| |
Held — daily cap reachedsnap.held_daily_cap | That’s enough from us today | info |
| |
Variant substituted downwardsnap.variant_substituted | Switched to the supported version | info |
|
|
Dose reducedsnap.dose_reduced | We made this one shorter | info |
|
|
Movement window openingmova.window_opening | Your strongest window starts in {{item}} | info |
|
|
Daily plan readymova.daily_plan_ready | Today’s plan is ready | info |
|
|
Coach presence changedmova.presence_changed | MOVA is now set to {{item}} | info |
| |
Suggestion explainedmova.explained_suggestion | Why we suggested {{item}} | info |
| |
Coach declined a requestmova.refused_request | That is not something I can do | info |
| |
Habit anchor suggestedhabit.anchor_suggested | This fits right after {{item}} | info |
|
|
Chain extendedhabit.chain_extended | Day {{item}} | success |
| |
Grace token spent automaticallyhabit.grace_token_spent | Your chain held | success |
| |
Flare mode enabledhabit.flare_mode_on | Targets lowered, chain intact | info |
| |
Flare mode endedhabit.flare_mode_off | Back to your usual targets | info |
| |
Bereavement hold startedhabit.bereavement_hold_on | Everything is paused. Nothing is lost. | info |
|
|
Bereavement hold endedhabit.bereavement_hold_off | Welcome back, at your pace | info |
|
Safety & Clinical
14 events
Screening requiredsafety.screening_required | A few health questions before we start | warning |
|
|
Screening passedsafety.screening_passed | You’re cleared for the standard programme | success |
| |
Screening limited the programmesafety.screening_limited | We’ve limited some movements for now | warning |
|
|
Contraindication matchedsafety.contraindication_matched | We’ve removed some movements from your plan | warning |
|
|
Movement blocked on safety groundssafety.movement_blocked | That one isn’t suitable right now | warning |
|
|
Standing clearance requiredsafety.standing_clearance_required | Standing movements need a clearance first | warning |
|
|
Pain reportedsafety.pain_reported | Thanks for telling us — we’ve adjusted | warning |
|
|
Stop advice issuedsafety.stop_advice_issued | Please stop and seek advice | critical |
|
|
Red-flag pattern detectedclinical.red_flag_detected | Something we’d like you to check | critical |
|
|
Clinical escalation openedclinical.escalation_opened | We’ve flagged this for review | warning |
|
|
Clinical escalation closedclinical.escalation_closed | That review is complete | info |
| |
Signposted to careclinical.signposted_to_care | Where to get help with this | warning |
|
|
Safeguarding flag raisedsafeguarding.flag_raised | A safeguarding review has started | warning |
|
|
Safeguarding lead notifiedsafeguarding.lead_notified | Designated safeguarding lead notified | critical |
|
|
FoodLens & Nutrition
11 events
Capture receivedfoodlens.capture_received | Reading your plate | info |
| |
Capture unusablefoodlens.capture_unusable | We couldn’t read that one — try again | warning |
| |
Analysis readyfoodlens.analysis_ready | Your meal analysis is ready | success |
| |
Low confidence resultfoodlens.low_confidence | We’re not confident about this one | warning |
| |
Allergen presentfoodlens.allergen_present | Contains {{item}} | critical |
|
|
Allergen cannot be confirmedfoodlens.allergen_unconfirmed | We cannot confirm {{item}} from a photograph | warning |
|
|
Barcode verifiedfoodlens.barcode_verified | Verified from the label | success |
| |
Swap simulatedfoodlens.swap_simulated | Here’s what changing {{item}} does | info |
| |
Plant points milestonefoodlens.plant_points_milestone | {{item}} different plants this week | success |
| |
Weekly pattern readyfoodlens.weekly_pattern | Your week in food | info |
| |
Energy figures withheldfoodlens.energy_hidden_minor | We don’t show energy figures under 18 | info |
|
|
BodyCommand
10 events
Assessment readybody.assessment_ready | Your body balance assessment | info |
|
|
Pathway assignedbody.pathway_assigned | Your pathway is {{item}} | info |
|
|
Pathway changedbody.pathway_changed | Your pathway has changed to {{item}} | info |
|
|
Body metrics opt-in confirmedbody.metrics_opt_in_confirmed | Body metrics are now visible to you | info |
|
|
Body metrics opt-out confirmedbody.metrics_opt_out_confirmed | Body metrics are hidden again | info |
|
|
Measurement recordedbody.measurement_recorded | Measurement saved | info |
|
|
Trend readybody.trend_ready | Your monthly trend | info |
|
|
Rate of change flaggedbody.rate_of_change_flagged | This is changing faster than we’d expect | warning |
|
|
Extreme change request declinedbody.extreme_request_declined | We won’t plan for that target | warning |
|
|
Plan updatedbody.plan_updated | Your daily plan has been updated | info |
|
|
Challenges & Crews
13 events
Challenge invitationchallenge.invitation_received | {{actor}} invited you to {{item}} | info |
| |
Challenge startedchallenge.started | {{item}} has started | info |
| |
Daily progresschallenge.daily_progress | Your crew today | info |
| |
Milestone reachedchallenge.milestone_reached | Your crew hit {{item}} | success |
| |
Challenge finishedchallenge.finished | {{item}} is complete | success |
| |
Auto-withdrawn from a challengechallenge.auto_withdrawn | We’ve taken you out — no cost to your crew | info |
| |
Withdrawal recorded, no penaltychallenge.withdrawal_no_penalty | Your crew is unaffected | info |
| |
Crew member joinedcrew.member_joined | {{name}} joined your crew | info |
| |
Crew member leftcrew.member_left | {{name}} left your crew | info |
| |
Support receivedcrew.support_received | {{name}} backed you up | success |
| |
Matchmaking completecrew.matchmaking_complete | We found you a crew | success |
| |
Content reportedcrew.reported_content | A report has been received | warning |
|
|
Moderation action takencrew.moderation_action | Action taken on reported content | warning |
|
|
Wearables & Devices
10 events
Connection requestedwearable.connect_requested | Connect {{item}} to JESS MOVE | info |
| |
Device connectedwearable.connected | {{item}} is connected | success |
| |
Device disconnectedwearable.disconnected | {{item}} was disconnected | warning |
| |
Data is stalewearable.sync_stale | We haven’t heard from {{item}} in a while | warning |
| |
Sync restoredwearable.sync_restored | {{item}} is syncing again | success |
| |
Scope revoked, feature degradedwearable.scope_degraded | One feature is less precise now | warning |
|
|
Sources disagreewearable.conflict_detected | Two devices disagree — we’re using {{item}} | info |
| |
Data refused on ingestwearable.refused_data | We declined some data from {{item}} | info |
|
|
Revocation completewearable.revocation_complete | We’ve deleted what {{item}} sent us | success |
|
|
Device battery lowwearable.battery_low | {{item}} is low on battery | info |
|
Progress & Insight
10 events
Weekly insight readyinsight.weekly_ready | Your week | info |
| |
Monthly insight readyinsight.monthly_ready | Your month | info |
| |
Streak milestoneinsight.streak_milestone | {{item}} days | success |
| |
Personal bestinsight.personal_best | That’s your best {{item}} yet | success |
| |
Trend improvinginsight.trend_improving | Things are moving in the right direction | success |
| |
Trend declininginsight.trend_declining | This week was quieter — here’s what changed | info |
| |
Outcome measure promptinsight.prom_prompt | Two quick questions about how you feel | info |
| |
Goal reachedinsight.goal_reached | You reached {{item}} | success |
| |
Goal missedinsight.goal_missed_no_blame | That one didn’t land. Next. | info |
| |
Data export readyinsight.export_ready | Your export is ready | success |
|
|
Organisation & Workplace
14 events
Organisation application receivedorg.application_received | We received your application for {{enterprise}} | info |
|
|
Verification startedorg.verification_started | Verification of {{enterprise}} has started | info |
|
|
Documents requestedorg.documents_requested | Documents needed to verify {{enterprise}} | warning |
|
|
Documents approvedorg.documents_approved | Your documents were approved | success |
|
|
Organisation activatedorg.activated | {{enterprise}} is live on JESS MOVE | success |
|
|
Seat invitationorg.seat_invitation | {{actor}} invited you to {{enterprise}} | info |
|
|
Invitation reminderorg.seat_invitation_reminder | Reminder: your invitation to {{enterprise}} | info |
|
|
Seat acceptedorg.seat_accepted | {{name}} accepted the invitation | success |
|
|
Seat removedorg.seat_removed | Your access to {{enterprise}} has ended | warning |
|
|
Below the seat minimumorg.minimum_seats_not_met | Organisation plans start at {{item}} seats | info |
|
|
Cohort report readyorg.report_ready | Your {{item}} report is ready | info |
|
|
Report suppressed below k-anonymityorg.report_suppressed | Too few people to report on | info |
|
|
Individual view refusedorg.individual_view_refused | That view does not exist on this platform | warning |
|
|
Renewal reminderorg.renewal_reminder | Your renewal is coming up | info |
|
|
Growth & Partners
21 events
Weekly newslettergrowth.newsletter.weekly | What your JESS MOVE account already includes | info |
|
|
Partner application receivedpartner.application_received | We received your Growth Partner application | info |
|
|
Partner approvedpartner.approved | You’re in — your referral link is ready | success |
|
|
Partner application declinedpartner.rejected | An update on your application | info |
|
|
Referral registeredreferral.registered | Someone signed up through your link | info |
|
|
Referral converted to paidreferral.converted | A referral just became a paying customer | success |
|
|
Referral held for reviewreferral.held_for_review | One referral is being checked | warning |
|
|
Referral rejectedreferral.rejected_fraud | A referral did not pass our checks | warning |
|
|
Referral reversedreferral.reversed | A referral was reversed after a refund | warning |
|
|
Reward tier reachedreward.tier_reached | You reached {{item}} | success |
|
|
ACU reward grantedreward.acu_granted | {{amount}} added to your wallet | success |
|
|
Commission unlockedcommission.unlocked | Lifetime commission is now unlocked | success |
|
|
Commission accruedcommission.accrued | Commission accrued this month | info |
|
|
Lifetime cap reached on a customercommission.lifetime_cap_reached | You reached the per-customer cap | info |
|
|
KYC required before payoutpayout.kyc_required | We need to verify you before paying out | warning |
|
|
Below the payout minimumpayout.below_minimum | Your balance is below the {{amount}} minimum | info |
|
|
Payout scheduledpayout.scheduled | Your payout is scheduled for {{date}} | info |
|
|
Payout under manual reviewpayout.manual_review | This payout needs a manual check | warning |
|
|
Payout paidpayout.paid | We’ve paid {{amount}} | success |
|
|
Payout failedpayout.failed | Your payout did not go through | warning |
|
|
Partner account suspendedpartner.suspended | Your partner account has been suspended | critical |
|
|
Support, Platform & Privacy
17 events
Ticket createdsupport.ticket_created | Support ticket {{number}} created | info |
| |
Ticket updatedsupport.ticket_updated | Update on ticket {{number}} | info |
| |
Ticket resolvedsupport.ticket_resolved | Ticket {{number}} resolved | success |
| |
Accessibility request receivedsupport.accessibility_request | We’ve received your accessibility request | info |
| |
Scheduled maintenancesystem.maintenance_scheduled | Scheduled maintenance on {{date}} | info |
| |
Emergency maintenancesystem.maintenance_emergency | Emergency maintenance in progress | warning |
|
|
Service disruptionsystem.outage | Service disruption | critical |
|
|
Service restoredsystem.service_restored | Service restored | success |
| |
Consent requestprivacy.consent_request | We need your consent for {{item}} | info |
|
|
Consent updatedprivacy.consent_updated | Your consent preferences were updated | info |
|
|
Data export readyprivacy.data_export_ready | Your data export is ready | success |
|
|
Deletion requestedprivacy.deletion_requested | Account deletion requested | warning |
|
|
Deletion completedprivacy.deletion_completed | Your account and data have been deleted | info |
|
|
Retention rule appliedprivacy.retention_applied | Some older data has been removed | info |
|
|
Subject access request receivedprivacy.dsar_received | We received your request | info |
|
|
Policy updatedprivacy.policy_updated | Our {{item}} has changed | info |
|
|
Breach notificationprivacy.breach_notification | An important notice about your data | critical |
|
|
Counts
What the flags actually cover.
bypass channel preferences
every billing, wallet, partner and BodyCommand event
safety, clinical, moderation and data rights
none of them are mandatory — a nudge is never statutory
Templates render through one function that throws on an unknown token, so {{firstname}} cannot ship as literal text in a live subject line. Every subject in the catalogue is asserted to render in the test suite.
When this platform speaks, and when it stays quiet.
The longer list is when it says nothing. Every event above is a decision the engine makes about your day — it needs your day to make any of them.
Free to create. 150 AI credits a month for 2 months, then AI features need a plan — everything that is not AI carries on either way. Premium is £5.99 a month and cancels in one click. Under 18 a guardian confirms before the account opens.