Optional email + explicit consent flow at signup #142
Labels
No labels
Compat/Breaking
Component/Enclave-Builder
Component/Infrastructure
Deploy/BYOC
Deploy/Full-managed
Deploy/Self-hosted
Interface/API
Interface/CLI
Interface/Git
Interface/Web
Kind/Bug
Kind/Documentation
Kind/Enhancement
Kind/Feature
Kind/Security
Kind/Testing
Priority/Critical
Priority/High
Priority/Low
Priority/Medium
Reviewed/Confirmed
Reviewed/Duplicate
Reviewed/Invalid
Reviewed/Won't Fix
Status/Abandoned
Status/Blocked
Status/Need More Info
No milestone
No project
No assignees
1 participant
Notifications
Due date
No due date set.
Dependencies
No dependencies set.
Reference
public/platform#142
Loading…
Add table
Add a link
Reference in a new issue
No description provided.
Delete branch "%!s()"
Deleting a branch is permanent. Although the deleted branch may continue to exist for a short time before it actually gets removed, it CANNOT be undone in most cases. Continue?
Summary
Caution allows anonymous sign-up via passkey/YubiKey: no email, username, or password required. We want to introduce an optional email step during registration, with explicit informed consent for users who choose to skip it. Users who skip email should also be able to add one later from Account Settings.
Background
Our anonymity-first model is a feature, not a gap. But not collecting email creates real consequences for users: no billing notifications, no invoices, no service updates, no account recovery path. Users need to understand this trade-off at the point of sign-up and actively consent to it, not discover it later when an invoice goes missing or their balance hits zero with no warning.
Reference: Mullvad VPN handles a similar pattern. Their support form lets users submit without an email but clearly states: "if you want a reply from us, you need to add an email." Caution's version needs to be more explicit given the billing consequences attached.
User Flow
Overview
See the attached flow chart covering both paths from the passkey ceremony:
The account settings "add email later" path sits in the middle, feeding into Path C logging. The dashed line separating the nudge column makes clear those triggers only apply to no-email users.
Registration > Step: Add Email (optional)
After the passkey ceremony succeeds, present a single optional step. This is the main point of collection, so it should contain both the decision UI and a concise link to the relevant privacy notice subsection.
Screen: Add your email (optional)
Headline:
Stay informed, or stay anonymousBody:
[ Email address input ]
Primary CTA:
Add email and continue →Secondary CTA:
Skip. I understand I won't receive emails.Helper text under the secondary CTA:
How Caution uses (and doesn’t use) your emailLink target: https://caution.co/privacy.html#email-addresses-optional
Optional tertiary line under the input or helper text:
Read our Privacy NoticeLink target: https://caution.co/privacy.html#email-addresses-optional
If user clicks Skip — inline consent confirmation (not a modal):
This is the best place for a just-in-time reminder because it appears exactly when the user confirms they do not want to provide personal contact data.
CTA: I understand. continue without email.
Final helper line below the warning text or under the CTA:
How Caution uses (and doesn’t use) your emailLink target: https://caution.co/privacy.html#email-addresses-optional
This confirmation must be logged server-side with a timestamp and the policy/copy version shown to the user
Account Settings > Add Email Later
Users who signed up without email should see a persistent but non-intrusive prompt in Account Settings. A privacy link is useful here too because this is another point where the user may decide to provide email later.
Small helper text below the prompt:
How Caution uses (and doesn’t use) your emailLink target: https://caution.co/privacy.html#email-addresses-optional
Users who add an email later must receive a verification email before it is saved. The add-email event must also be logged as Path C.
Billing UI > "No Email" Notice
At the point of payment or checkout, if no email is on file, show a non-blocking notice. This is not the main legal notice, but it is an appropriate operational reminder because it appears exactly where invoice expectations are most likely to matter.
Optional inline link on the second line:
How Caution uses (and doesn’t use) your emailLink target: https://caution.co/privacy.html#email-addresses-optional
This is the only persistent passive reminder. It appears every time the user transacts, regardless of nudge state.
Dashboard > Soft Nudge (no email on file)
For users who skipped email at signup, show a single dismissible banner in the dashboard. The banner triggers at up to three meaningful moments, then is permanently gone, fully respecting the user's choice. It never reappears after dismissal at any stage.
Trigger 1: First login after account creation
Trigger 2: First login after adding a payment method
Trigger 3: First time funds are added to the account
After all three triggers have fired or been dismissed, the nudge is permanently suppressed. The billing UI notice (above) remains as the only ongoing reminder.
Banner copy:
Small secondary link beneath the banner body:
How Caution uses (and doesn’t use) your emailLink target: https://caution.co/privacy.html#email-addresses-optional
Dismiss is permanent per trigger: clicking it at Trigger 1 does not suppress Trigger 2, but dismissing at any stage means that specific trigger never resurfaces.
Placement rule
Use the full “How Caution uses (and doesn’t use) your email” link text on screens where the user is actively deciding whether to provide an email, and shorten it to Privacy Notice or How we use email in compact surfaces like banners or billing notices. That keeps the main decision points explicit while preserving UI cleanliness
Technical Requirements
Data model
emailfield on user/org record: nullable, optionalemail_verifiedboolean: false until verification link is clickedemail_consent_declinedboolean +email_consent_declined_attimestamp: set when user explicitly skipsnudge_dismissed_flags— track dismissal state per trigger (e.g.nudge_post_signup,nudge_post_payment_method,nudge_post_first_topup): once set, never unsetaccount_uuidassigned at account creation — all consent logs keyed to this UUIDEmail handling
email IS NOT NULLbefore attempting delivery — silent skip if null, no crash, warning loggedConsent logging — GDPR Article 7(1) + Cayman DPA Schedule 5
A bare timestamp + boolean will not satisfy audit or dispute requirements. Three distinct log schemas are required:
Path A: Email provided (legal basis: consent, GDPR Art. 6(1)(a))
Path B: Email skipped (legal basis: contract performance, GDPR Art. 6(1)(b))
Path C: Email added later
consent_copy_versionmust be bumped any time the skip screen copy changesPseudonymity note
A passkey credential ID is pseudonymous personal data under GDPR Recital 26 — not truly anonymous — because it can be linked to an account via the public key store. The account_uuid approach above addresses this by keeping the mapping in a separate access-controlled table.
Out of Scope
Priority: Medium
Should ship before public launch. Billing consequences of silent no-email are a support and compliance risk.
Is this issue still relevant? @xenushka
Addressed by #365