EXAMPLE, fictional data

← patternslab.work · Download PDF

Data-Flow Privacy Audit — ExampleFit (fictional)

EXAMPLE, fictional data. The app, company, findings and evidence are invented for demonstration only.

FieldValue
ClientExampleFit Ltd. (fictional)
AppExampleFit 4.2.0 (iOS), 4.2.1 (Android)
Test period3-14 Nov 2026 (fictional)
AuditorSILENCE.OBJECTS
Report version1.0

1. Executive summary

During testing the app sent data to 9 external domains belonging to 6 vendors. We identified 3 high-risk findings:

• 1. Meta SDK sends events with a device identifier BEFORE the user gives consent in the banner (iOS and Android).

• 2. Weight and fitness goal (potential health data) are sent to Firebase Analytics as event parameters; the privacy policy does not describe this.

• 3. The App Store label declares "Data Not Linked to You" for health data, while traffic shows it linked to the user ID.

All three can be fixed with SDK configuration and text changes, an estimated 3-5 team days (ASSUMPTION).

2. Scope and method

• In scope: iOS and Android builds from TestFlight / APK, test accounts, privacy policy (version of 1 Oct 2026), App Store "App Privacy" label, Google Play "Data safety".

• Out of scope: client servers, penetration testing, real user data, certification.

• Method: (1) static analysis (MobSF, apktool, Exodus Privacy signatures); (2) traffic capture (mitmproxy; test iPhone via proxy, Android emulator) on 11 paths: install, consent banner (accept / decline), sign-up, login, profile, workout, payment, sharing, logout, account deletion; (3) comparison with policy and labels; (4) risk ranking.

• Limitations: api.examplefit.example uses certificate pinning; only domain names are visible, not content. Traffic outside the tested paths may not be captured.

3. Data-flow table

#DestinationSDK / vendorData fieldsPurposeIn policy?Label matchRiskEvidence
F1graph.facebook.comMeta SDKIDFA/AAID, app_open event, device modelads / attributionYN (before consent)HE-01, E-02
F2app-measurement.comFirebase Analyticsapp_instance_id, weight_kg, goalanalyticsNNHE-03
F3firebaseinstallations.googleapis.comFirebase InstallationsFID, app versiontechnicalYYLE-04
F4api.revenuecat.comRevenueCat (payments)app_user_id, product, pricesubscriptionsYYLE-05
F5o12345.ingest.sentry.ioSentrystack trace, email in breadcrumbscrash reportsY (general)NME-06
F6api.mixpanel.comMixpaneldistinct_id = user_id, screen, workout timeproduct analyticsYN (linked to user)HE-07
F7maps.googleapis.comGoogle Maps SDKapproximate locationroute mapYYME-08
F8cdn.examplefit.exampleown CDNno personal datacontentn/an/aLE-09
F9api.examplefit.exampleclient backend[pinning - content not visible]core appY?ME-10

4. Findings

U-1 (H): Meta SDK before consent

On first launch, before the banner is shown, the event fb_mobile_activate_app is sent with the advertising identifier. Evidence E-01: [SCREENSHOT: mitmproxy, POST graph.facebook.com/.../activities, 00:00:02 after launch]. Evidence E-02: [SCREENSHOT: consent banner shown at 00:00:04].

U-2 (H): Weight and goal data in Firebase

Parameters weight_kg and goal=lose_weight in the profile_saved event. These may be data concerning health (GDPR Art. 9). Evidence E-03: [REQUEST EXCERPT: params: {weight_kg: 7*, goal: "lose_..."} - masked].

U-3 (H): Mismatch with App Store label

Label: "Health & Fitness - Data Not Linked to You". Mixpanel receives distinct_id equal to the account ID together with workout time. Evidence E-07: [SCREENSHOT of App Store label + request to api.mixpanel.com/track].

U-4 (M): Email in Sentry crash reports

Breadcrumbs contain the email address from the login form. Evidence E-06: [EXCERPT: breadcrumb "login_form: an***@example.com"].

U-5 (M): Declining consent does not stop Mixpanel

After tapping "Decline", Mixpanel events are still sent (Android). Evidence E-07b: [SCREENSHOT: 14 requests after decline].

U-6 (L): RevenueCat not named in the policy

The policy mentions a "payment provider" without its name or country of processing.

5. GDPR risk ranking

NOT LEGAL ADVICE. Technical assessment pointing to areas for review by the client's counsel.

#FindingGDPR / regulatory areaRisk
1U-2possible special-category data (Art. 9), legal basis, transparency (Art. 13)High
2U-1consent before device access (ePrivacy / GDPR Art. 6), transfer outside EEAHigh
3U-3consistency with App Store declaration (Apple guidelines 5.1.1/5.1.2)High
4U-5effective withdrawal of consent (Art. 7(3))Medium
5U-4data minimisation (Art. 5(1)(c))Medium
6U-6transparency of recipients (Art. 13(1)(e))Low

6. Fix list (priorities)

PrioFixOwnerEffort (ASSUMPTION)
P1Delay Meta SDK init until consent (AutoInitEnabled=false, AdvertiserIDCollectionEnabled=false)iOS/Android0.5 day
P1Remove weight_kg/goal from Firebase parameters or move to backendmobile0.5 day
P1Correct App Store label and Data safety ("Linked to You") or anonymise Mixpanelproduct0.5 day
P2Stop Mixpanel after decline (optOutTracking())Android0.5 day
P2Sentry beforeBreadcrumb filter removing emailmobile0.5 day
P3Name recipients and countries in the privacy policylegal1 day
P3Provide a test build without pinning to re-test F9backend0.5 day

7. Annexes

• A. SDK list (static): Meta SDK 17.x, Firebase Analytics 11.x, Firebase Crashlytics (detected, inactive in traffic), RevenueCat 5.x, Sentry 8.x, Mixpanel 4.x, Google Maps 9.x - fictional versions.

• B. Android permissions: INTERNET, ACCESS_COARSE_LOCATION, AD_ID, POST_NOTIFICATIONS.

• C. Environment: test iPhone iOS 18.x; Android 14 emulator (no Google Play image, rooted); mitmproxy 11.x; MobSF 4.x.

• D. Evidence register E-01...E-10: delivered as a separate, masked package.

• E. Disclaimer: technical review, not a certification, not a penetration test, not legal advice. Test data deleted 30 days after delivery.

EXAMPLE, fictional data