SDK · 01 of 05

RevenueCat

Validates Apple StoreKit / Google Play Billing receipts so we know which features to unlock.

Always on · purchases only
FieldValue
SendsAnonymous UUID (device-level) · purchase receipts · subscription status
Never touchesCycle data · constitution tags · symptoms · name · email · IP (proxied by Apple/Google)
WhenAt purchase · at app launch (to refresh subscription status)
RegionUS-East · processed under SOC 2 Type II
ToggleNone — required for billing. The data sent is functionally within what Apple/Google can already see.

SDK · 02 of 05

Health SDK (HealthKit / Health Connect)

Two-way syncs your cycle data with Apple Health (iOS) or Health Connect (Android). A pure OS bridge — no external server, the data never leaves the operating system's health database.

Opt-in · OS sync only
FieldValue
SendsWrites: cycle flow and start dates. Reads: existing MenstrualFlow records. Both stay inside the HealthKit / Health Connect sandbox.
Never touchesAny external server · our cloud backup endpoint (Health data is separate from the backup flow)
WhenOnly when you enable it in Settings → Health integration
RegionOn-device only (OS-controlled)
ToggleSettings → Health integration → toggle. Off by default.

SDK · 03 of 05

Sentry

Crash reporting. Off by default; requires the user to explicitly turn it on in Settings → Help us improve.

Opt-in · off by default
FieldValue
SendsCall stack · device model · OS version · app version · breadcrumbs of the last 20 navigation events (screen names only, no data)
Never touchesCycle data · symptoms · constitution · UI text content · screenshots
WhenOnly when a crash occurs · only when the user has opted in
RegionHosted on Sentry.io cloud (SaaS) · opt-in
ToggleSettings → Help us improve → toggle. Off by default on every fresh install.

SDK · 04 of 05

Sign-in-with-Apple

Used only if you opt into iCloud backup, to bind the encrypted blob to your Apple ID. We never see your email.

Opt-in · backup only
FieldValue
SendsAn opaque user identifier issued by Apple (and a Private Relay email if you choose to use one)
Never touchesReal email (proxied by Apple) · cycle data · device identifiers
WhenOne time — when you tap "Back up to iCloud" in Settings
ToggleSettings → Backup → Disconnect, any time

SDK · 05 of 05

google_sign_in (Android only)

Mirrors the role of Sign-in-with-Apple on Android: used only if you opt into Google Drive backup.

Opt-in · backup only
FieldValue
SendsAn opaque user identifier issued by Google · OAuth scope limited to: drive.appdata
Never touchesDrive content outside our app sandbox · contacts · calendar · email content
WhenOne time — when you tap "Back up to Google Drive"
ToggleSettings → Backup → Disconnect, any time · revoke access at myaccount.google.com

Cap policy

5 SDKs is a ceiling, not a target.

To add a 6th, we must first remove one of the existing 5. The cap is enforced by CI: scripts/sdk_whitelist_audit.sh fails the build when the network SDK count exceeds 5.