Privacy & data
In short
Section titled “In short”- Targeting is evaluated on the device. No profile of the user is uploaded to decide who sees a survey.
- For statistics, the server receives only anonymous counts: a survey was shown, closed or completed.
- The user ID, attributes and hidden fields leave the device only when a survey is shown, as part of that survey’s response.
- The SDK uses no advertising identifier, no device fingerprint and no location.
- The install ID the SDK creates never leaves the device.
Stored on the device
Section titled “Stored on the device”The SDK keeps its state in the app’s private storage: a UserDefaults suite named com.responsly.sdk on iOS and SharedPreferences named com.responsly.sdk on Android. It is removed when the app is uninstalled.
| Data | Used for | Cleared by reset |
|---|---|---|
| Install ID, a random UUID created once | A stable position for the share-of-users rule | no |
Tracking setting from setTrackingEnabled | Switching the SDK off | no |
| User ID and attributes | Targeting; hidden fields of responses | yes |
Language override from setLocale | Survey language; targeting | yes |
Values from setHiddenFields | Hidden fields of responses | yes |
| Event counts: event name and number of calls | The “from occurrence no.” trigger setting | yes |
| Per survey: number of displays, time of the last display, time of completion, number of dismissals | Frequency rules | yes |
| Time a survey was last shown by a trigger | The pause between surveys | yes |
| The cached configuration | Targeting without a network round trip | yes |
| Counts waiting to be sent | Statistics | yes |
The survey’s web view also keeps the usual website data (cookies, local storage) for the survey’s address. reset clears that too.
Sent from the device
Section titled “Sent from the device”| When | What is sent | Contains user data |
|---|---|---|
| Downloading the configuration, at start and at most every 10 minutes or so | The SDK key, the platform (iOS or Android), the SDK version and the app ID | no |
| After a survey is shown, closed or completed | The kind of event and the Survey ID. Sent in small batches. | no: no user ID, no install ID, no attributes, no timestamps |
| When a survey is shown | The survey is loaded and receives: platform, app ID, app version, OS version, SDK version, locale, the trigger (type and name), and, unless responses are anonymous, the user ID, attributes and hidden-field values | yes, unless anonymous |
| When the respondent submits | The answers, saved as a response in Responsly | yes: the answers |
What is never uploaded:
- the events you pass to
track, their properties and their counts, - the screens you pass to
screen, - the install ID,
- an advertising ID, location or anything that identifies the device.
One detail: when a trigger shows a survey, the name of that event or screen is recorded with the response as “what triggered the survey”.
What is saved with a response
Section titled “What is saved with a response”- Always: the answers, platform, app ID and version, OS version, SDK version, locale and the trigger.
- If the form has matching hidden fields: the user ID (hidden field
user_id), attributes and hidden-field values, each in the field with the same name. See Hidden fields.
Anonymous responses
Section titled “Anonymous responses”The Mobile app tab has an anonymous responses switch per form. With it on, the SDK does not hand the user ID, attributes or hidden-field values to the survey at all, whatever your code passes to identify, setAttributes, setHiddenFields or showSurvey.
Targeting is not affected. Audience rules still use the attributes, because that check happens on the device.
Turn the SDK off
Section titled “Turn the SDK off”setTrackingEnabled(false) switches the SDK off: no network requests, no targeting, nothing shown. showSurvey reports disabled. The setting is saved on the device, survives restarts and is kept by reset.
Use it for a user opt-out, or to hold the SDK back until the user has given consent. The call is safe before initialize, so the SDK never contacts the server without consent:
Responsly.shared.setTrackingEnabled(userHasConsented)Responsly.shared.initialize(sdkKey: "rsk_…", options: ResponslyOptions(logLevel: .error))
// later, when the user changes their choiceResponsly.shared.setTrackingEnabled(true)Responsly.setTrackingEnabled(userHasConsented)Responsly.initialize(applicationContext, "rsk_…", ResponslyOptions(logLevel = LogLevel.ERROR))
// later, when the user changes their choiceResponsly.setTrackingEnabled(true)Responsly.setTrackingEnabled(userHasConsented)Responsly.initialize('rsk_…', { logLevel: 'error' })
// later, when the user changes their choiceResponsly.setTrackingEnabled(true)Responsly.setTrackingEnabled(userHasConsented);await Responsly.initialize('rsk_…', options: const ResponslyOptions(logLevel: ResponslyLogLevel.error));
// later, when the user changes their choiceResponsly.setTrackingEnabled(true);ResponslySDK.SetTrackingEnabled(userHasConsented);ResponslySDK.Initialize("rsk_…", new ResponslyOptions { LogLevel = ResponslyLogLevel.Error });
// later, when the user changes their choiceResponslySDK.SetTrackingEnabled(true);When you switch it back on, the SDK downloads its configuration and targeting resumes.
reset on logout
Section titled “reset on logout”Call reset when the user logs out, so the next user of the device does not inherit the previous user’s identity.
reset:
- clears the user ID, attributes, language override and hidden-field values,
- clears event counts and the display history of every survey,
- clears the cached configuration and the counts waiting to be sent, then downloads the configuration again,
- clears the website data the survey’s web view stored,
- closes a survey that is visible.
It keeps the install ID and the tracking setting, and the SDK stays initialized. You do not call initialize again.
func logOut() { Responsly.shared.reset() // your own logout}fun logOut() { Responsly.reset() // your own logout}function logOut() { Responsly.reset() // your own logout}Future<void> logOut() async { await Responsly.reset(); // your own logout}void LogOut(){ ResponslySDK.Reset(); // your own logout}Because the display history is cleared, a survey with frequency once can appear again on that device after a logout.
iOS privacy manifest
Section titled “iOS privacy manifest”The iOS SDK ships a PrivacyInfo.xcprivacy file inside the package. Xcode includes it in your app’s privacy report automatically. It declares:
- No tracking and no tracking domains.
- One required-reason API:
UserDefaults, reasonCA92.1(the SDK reads and writes its own state).
The SDK does not use the advertising identifier, so it never causes the App Tracking Transparency prompt.
App Store privacy labels and Google Play Data safety
Section titled “App Store privacy labels and Google Play Data safety”The stores ask what your app collects. The SDK itself collects nothing about the user in the background. What reaches Responsly is what you pass to it and what respondents answer. The table lists it so you can fill in the questionnaires; what you finally declare depends on your app, your surveys and your own legal review.
| Data | Leaves the device when | App Store category | Google Play category |
|---|---|---|---|
User ID from identify | A survey is shown, responses are not anonymous, and the form has a user_id hidden field | Identifiers: User ID | Personal info: User IDs |
| Attributes and hidden-field values | Same, for each value with a matching hidden field | Depends on what you send | Depends on what you send |
| Survey answers | The respondent submits | User Content: Other User Content | App activity: Other user-generated content |
| Contact details asked in a survey (email, phone, name) | The respondent submits | Contact Info | Personal info |
| App ID, app version, OS version, platform, locale | A survey is shown | Not user data by itself; saved with the response | Not user data by itself; saved with the response |
| Anonymous counts of shown, closed, completed | In batches | None: not linked to a user or device | None: not linked to a user or device |
Points that apply to the whole SDK:
- Tracking (Apple): no. The SDK does not link data with third-party data for advertising and does not share it with data brokers.
- Linked to the user: yes when you attach a user ID or the survey asks for identifying details; no for forms with anonymous responses that ask for none.
- Purpose: usually Analytics or App Functionality on the App Store, and Analytics or App functionality on Google Play.
- Encrypted in transit: yes, the SDK and the survey use HTTPS.
- Optional collection: answering a survey is the user’s choice, and a respondent can close it without answering unless you switched that off.
- Deletion: responses can be deleted in Responsly.
- Device or other IDs / advertising ID: not collected. The install ID stays on the device.