To test battery drain attributable to Radar background tracking in your iOS or Android app, you must isolate battery drain attributable Radar's usage of location services.
This means that you must control for confounding variables:
- In the context of your app, you must control for battery drain attributable to other code and other SDKs running in your app, having the app foregrounded, and notifications.
- In the context of your device, you must control for battery drain attributable to other apps, the OS, and your device state, including having the screen turned on.
Often, having the screen turned on and the app foregrounded are bigger sources of battery drain than usage of location services.
To isolate battery drain attributable Radar's usage of location services in your app, there are two ways to test:
- Install two builds of your app, one with Radar running background tracking and one without. Use your phone for a period of time, ideally a full day, and avoid opening either app (to avoid the confounding variables described above). At the end of the period, compare battery blame for each app on the Battery screen in the device settings.
- Install the Radar Toolkit app, a sample app that does nothing but run Radar. Use your phone for a period of time, ideally a full day, and avoid opening the app (to avoid the confounding variables described above). At the end of the period, inspect battery blame for the app on the Battery screen in the device settings.
Note that the Battery screen on iOS and Android shows battery drain attributable to each app not as an absolute percentage, but as a percentage of the absolute battery drain in the battery session.
For example, if the iOS Battery screen shows 2% battery blame attributable to your app and shows that your phone has drained 50% of its battery in the battery session, the absolute percentage attributable to your app is actually 2% * 50% = 1%.
When using the efficient and responsive tracking presets, the SDK will wake up while the user is moving (usually every few minutes), then shut down when the user stops. To save battery, the SDK will not wake up when stopped. For most users, background tracking with these presets uses only 1-2% battery per day (measured in absolute percentage).
See the SDK documentation and Navigating location services tradeoffs between accuracy, frequency, and battery efficiency for more information.
Many developers switch to Radar from other location SDKs. You can test Radar side-by-side with another location SDK, but keep in mind that there may be side effects on iOS.
On iOS, significant location change events,
CLRegion events, and
CLVisit events may be sent to all
CLLocationManager instances in the app. This may cause the Radar SDK to receive client-side location updates triggered by other SDKs even if you have not called
On Android, this is not an issue.
Yes, if background location permissions have been granted.
On iOS, if the app is killed (e.g., swiped up from the App Switcher), the SDK is able to wake up and start collecting locations again if it receives certain types of location updates from the OS. These services can be activated on iOS by enabling the location updates background mode and using at least one of following tracking options:
On Android, Radar will continue to receive location updates if the app is swiped out of the Recent Apps list. Radar will not receive location updates if the phone manufacturer aggressively kills background services or the user presses Force stop.
With just foreground location permissions, you can leverage the background location indicator on iOS or a foreground service on Android to continue to receive location updates in the background. These are activated via the
showBlueBar tracking option on iOS or the
foregroundService tracking option on Android. iOS devices will display a blue location icon when activated, and Android devices will display a persistent notification. Use of these visual indicators is common for operational use cases such as fleet tracking and delivery.
Each listener can support different use cases and exposes different data to take actions. The client location listener (
onClientLocationUpdated on Android,
didUpdateClientLocation on iOS) is fired whenever the Radar SDK receives a location update from the device. It can be used to collect a stream of location updates before they hit Radar servers. The location updated listener (
onLocationUpdated on Android,
didUpdateLocation on iOS) delivers location updates processed by Radar servers and will return refreshed user context. This listener can be used to deliver in-app experiences based on user context, including when
Radar.trackOnce() is called on application launch. The Radar events listener (
didReceiveEvents on Android and iOS) can be used to listen for Radar events and trigger workflows.
Radar APIs have a p50 latency of 50ms and a p90 of 150ms. The
/route/matrix API increases in latency as additional
destination points are added, or as the distance between points increases.
Usage statistics are recalculated nightly and reflect the total Monthly Tracked Users (MTUs) and API requests made in the month. Usage statistics can be found on the Home page of the Radar dashboard.
The Radar SDK collects location data (latitude, longitude), device IDs, IP addresses, and device info by default. We also collect any other user IDs (e.g., user IDs) or metadata that you choose to send us. Radar does not collect personally identifiable information like name or email by default.
- Do not send any PII, like names, email addresses, or publicly available IDs, to the Radar SDK or API.
- Minimize the data you collect with Radar, turning on only the context types relevant to your use case (store visits for shopping apps, airport visits for travel apps, and so on).
For more information, see our location data privacy checklist.
The best location permission prompts are:
- Valuable: The prompt explains why the user should grant location permissions, like enabling a location-based feature or unlocking an offer.
- Timely: The prompt is shown when the user is engaged, like in an onboarding, when accessing a location-based feature, or after a transaction. Background permission prompts are shown after and incremental to foreground permission prompts.
Opt-in rates vary from app to app, but apps that follow best practices can expect 70-80% of users to grant location permissions, with 40-50% of users granting background ("always") location permissions on iOS.
For more information, see our location data privacy checklist.
By default, users and events are retained for 1 year, trips are retained for 90 days, and location updates are retained for 7 days.
Radar supports custom data retention settings. Admins can adjust these settings in the Radar dashboard under the Privacy section. Data retention settings are customizable per project.
Yes, Radar is CCPA-compliant and GDPR-compliant. For more information, see our commitment to privacy.
For data deletion requests, you can delete a user manually from the user detail page in the dashboard or delete a user programmatically using the API. Deletions are immediate.
For data access requests, you can export a user and all of their events and locations manually from the user detail page in the dashboard.
If you need assistance, you can also forward requests to your customer success manager.
- Read accounts can read user, geofence, and event data.
- Write accounts can also create, update, and delete user, geofence, and event data.
- Admin accounts can also invite new accounts and update project settings, including API keys and integrations.
- Owner accounts can also edit account roles and project access.
Use the appropriate role (owner, admin, write, or read) for each co-worker's account. See Radar security best practices. By default, an organization can have a maximum of 100 accounts. Contact your customer success manager if you need more.
In addition to the account roles above, owners can also control:
- Project access: Access to specific projects in an organization
- Environment access: Access to test or live data across projects in an organization
- Data access: Access to specific data and pages across projects in an organization
- User locations: Access to data on the user details page (map and location information) and access to the user locations page
- Trip locations: Access to data on the trip details page (map and location information) and access to the trip tracking dashboard
- Geofence tags: Access to geofences with specific tags. An empty list gives access to all geofences. To access a Geofence, both the tag and externalId access controls must be satisfied.
- Geofence externalIds: Access to geofences with specific externalIds. An empty list gives access to all geofences. To access a Geofence, both the tag and externalId access controls must be satisfied.
Yes. For more information, see the Vulnerability Disclosure Policy.
- Use a strong password (at least 10 characters, at least 1 lowercase letter, at least 1 uppercase letter, at least 1 number, and at least 1 symbol).
- Use a password manager like 1Password or LastPass to generate and store passwords, and use a different password for each website.
- Use app- or SMS-based multi-factor authentication (MFA). Enable MFA on the Account page.
- Do not share your account with co-workers.
- Use the appropriate role (owner, admin, write, or read) for each co-worker's account.
- When a co-worker is terminated, delete their account.
- Use single sign-on (SSO) if supported by your organization.
- Use a password protected lock screen on employee workstations set to a short timeout, e.g., 5 minutes.
- Use Test keys for development and Live keys for production.
- Use Publishable keys, which are restricted in scope in client-side code. Never use Secret keys, which can read or write any data.
Additionally, you can restrict which websites can use your publishable API keys. You can add or modify available domains on the settings page.
Examples of valid rules:
- A host with a single domain: example.com
- A host with sub domains: sub.example.com or sub1.sub2.example.com
- A domain and all its subdomain(s), using a wildcard (*) asterisk: example.com and *.example.com
- A host with a non-standard port: example.com:8000
- Using localhost with port: localhost:8080
- Encrypt data stored outside of Radar (e.g., data sent to integrations or sent to webhooks and stored in a data warehouse).
- Do not send any PII, like names, email addresses, or publicly available IDs, to the Radar SDK or API. See also Radar privacy best practices.
Yes, Radar supports audit logs for enterprise customers. Audit logs include all requests made from the dashboard with the account, project, environment, IP address, and timestamp of each request. The 100 most recent audit logs can be viewed from the dashboard, and the most recent 100,000 audit logs can be exported to CSV. Contact your customer success manager if you need older audit logs.
Radar supports single sign-on (SSO) via SAML, LDAP, Open ID, and other identity providers.
SSO is an enterprise-only feature. Contact your customer success manager to enable this feature.
To set up your SAML identity provider, reach out to your customer success manager who will provide the assertion consumer service URL and application callback URL. They will need the following information in return:
- SAML protocol URL
- Sign-in URL
- Sign-out URL (optional)
- X509 Signing Certificate (.pem file)
- User ID attribute (defaults to http://schemas.xmlsoap.org/ws/2005/05/identity/claims/nameidentifier then http://schemas.xmlsoap.org/ws/2005/05/identity/claims/upn then http://schemas.xmlsoap.org/ws/2005/05/identity/claims/name)
Yes, Radar is SOC 2 type II-certified. For more information, please ask your account executive for a copy of our attestation report.
Yes. The Radar SDK calls the Radar API over HTTPS using TLS version 1.2 or higher, so all data is encrypted in transit. API calls are authenticated using your Publishable keys, which are restricted in scope.
Statistics for location permissions are available for customers who have installed SDK 3.1 or later.
On iOS, the SDK checks
CLLocationManager to determine authorization status:
.authorizedAlways, meaning that the user has granted background location permissions.
.authorizedWhenInUse, meaning that the user has granted foreground location permissions.
.restricted, meaning that the user has denied location permissions.
.notDetermined, meaning that the user has not yet been prompted for location permissions.
On Android, the SDK checks the
ACCESS_BACKGROUND_LOCATION permissions to determine authorization status:
Granted Background: The
ACCESS_BACKGROUND_LOCATIONpermission is granted, meaning that the user has granted background location permissions.
Granted Foreground: The
ACCESS_FINE_LOCATIONpermission is granted, meaning that the user has granted foreground location permissions.
ACCESS_FINE_LOCATIONpermission is denied and
false, meaning that the user has denied location permissions and checked "Never ask again."
Not Determined: None of the above criteria are true, meaning that the user has not yet been prompted for location permissions.
A tracked user is a unique user that sends one or more location events to Radar in a given time period.
The Radar SDK collects IDs for each user and device, including:
installId: a GUID automatically generated on fresh install
deviceId: IDFV on iOS, Android ID on Android, or a GUID on web
userId: set by calling
Radar.setUserId(), also called External ID in the dashboard
Each user record is also assigned a unique
_id, also called Radar ID in the dashboard.
For usage tracking and security reasons, Radar maintains a separate user record for each unique combination of these IDs.
Radar.setUserId() for the first time will assign a
userId to an existing user record (e.g., on login or when a device is first identified), changing the
userId for an already identified user (e.g., to set a different
userId or to clear the
userId on logout) will create a new user record.
A unique user record created or updated in a given time period is counted as a tracked user in that time period.
An active user is a unique user that has an app session in a given time period.
An app session is a period of user activity in your app. A new app session is started whenever the app is opened, assuming at least 5 minutes have elapsed since the last app session started.
Depending on your Radar SDK implementation, a user may have an app session without sending a location event to Radar. Conversely, a user may send a location event to Radar in the background (assuming they have granted background location permissions) without opening the app.