2.1 Phone State (READ_PHONE_STATE)
Why we need it: This is the core function of the App. Without monitoring call state, the App cannot detect missed calls. This data is never transmitted off your device.
2.2 Call Log (READ_CALL_LOG)
Why we need it: To confirm that an incoming call was genuinely missed (versus answered) before sending an auto-reply. We do not copy, store, or upload your full call log.
2.3 Send SMS (SEND_SMS)
Why we need it:This is the App's primary function — sending your customized auto-reply message to callers you missed. We send exactly one SMS per missed call, to the number that called you, containing only the message you configured.
2.4 Contacts (READ_CONTACTS)
Why we need it:To display caller names in your reply history and to support the optional "Reply to Contacts Only" Spam Shield feature. Contacts access is optional and off by default.
2.5 Notifications (POST_NOTIFICATIONS)
Android requires foreground services to show a notification. This lets you see that LeadShield is actively monitoring.
2.6 Reply History Log (Local Storage Only)
Stores: caller phone number, caller name, message sent, timestamp. Maximum 20 entries. Stored only on your device. Never transmitted off your device on Free or Pro tiers.
2.7 Cloud Sync (Operator Tier Only)
Operator tier subscribers have anonymized lead and conversation data synced to a secure Supabase (Postgres) database hosted on AWS. This is required for the CRM dashboard feature. Phone numbers are hashed before transmission. You can disable sync in Settings at any time.