Privacy-first analytics

Data & Privacy Policy

OnRamp is an onboarding analytics service for web and mobile apps. This page explains how visitor analytics is processed and what customers need to disclose to their users.

Last updated: 21 October 2026

Data protection & security

Encryption in transit: all traffic to and from OnRamp - the SDKs, the dashboard, and every API endpoint - is served over HTTPS/TLS.

Encryption at rest: credentials for every connected integration (Google Ads, Google Search Console, Stripe, RevenueCat, Paddle, Lemon Squeezy) are encrypted at rest with AES-256-GCM before being stored, and are only decrypted server-side, in memory, to make the specific API call an integration needs.

Access control: each app's data and connected integrations are scoped to that app's API key and accessible only to members of the OnRamp account that owns it. Sensitive fields are never exposed in client-side code or logs.

Infrastructure: OnRamp runs on Railway (EU region - Netherlands), with event data in ClickHouse and account/integration metadata in PostgreSQL - see Infrastructure below for details.

To report a security concern, contact hello@getonramp.dev.

Anonymous web analytics is storage-free by default

By default, OnRamp's web SDK does not set or read cookies and does not use localStorage or sessionStorage for anonymous analytics. It creates a daily pseudonymous ID on the server from request data; the random salt expires at UTC midnight. This design avoids client-side storage, but it does not remove the need to assess your own legal basis, notice, and local requirements. Calling identify() sends the traits you supply and is your responsibility to govern.

No HTTP cookies set or readNo localStorage or sessionStorage for anonymous web analyticsNo cross-site trackingDefault daily web IDs; persistent recognition requires consentRaw IP addresses and user-agent strings are not stored in analytics data

Optional browser recognition and advertising on this website

On getonramp.dev, Accept also enables a random browser ID in a first-party cookie for up to 30 days. This links return visits and trial activity in OnRamp; it does not reveal your name or email. The browser enforces a fixed expiry, rather than extending it on each visit. After expiry, continued consent allows a new random ID. Reject and withdrawal remove this ID and discard unsent events linked to it; subsequent anonymous web events use daily IDs. Previously collected event records remain subject to the retention and deletion controls below. Earlier advertising-only choices do not enable this feature: we request a new choice.

Separately, getonramp.dev uses Google Ads to measure trial-button clicks, first-app creation, engagement, and purchases. With advertising consent, Google may use cookies and ad-click identifiers to attribute these actions. For signed-in conversions, we may provide your email to Google, hashed by its tag, for enhanced conversion matching.

For visitors in the EEA and United Kingdom, and when location cannot be determined, we load the Google tag with advertising storage, analytics storage, ad user data, and ad personalization denied. Measurement waits for your choice in the Accept/Reject banner. Accept grants these four permissions; Reject keeps them denied and blocks Google Ads conversion reporting. We remember your choice in localStorage and you can change it any time using “Cookie settings” in the site footer. Outside these regions, Google Ads measurement starts immediately after our location check, but the 30-day OnRamp browser ID still requires an explicit Accept through Cookie settings.

Before you choose, ad-click parameters can be carried in links between pages on this website, without storing them in cookies or browser storage, so attribution is available if you accept on a later page. Loading the tag contacts Google to retrieve its script; we do not send page or conversion events while consent is pending or rejected.

How Google uses advertising information

Mobile SDK storage

Native mobile SDKs intentionally persist a random anonymous ID and short-lived session state: React Native uses AsyncStorage, Flutter uses SharedPreferences, and iOS uses UserDefaults. This allows journeys to continue across app launches. Mobile storage is not part of the anonymous web no-storage design; customers must make the appropriate App Store, Google Play, privacy-notice, and consent assessments for their app.

Collected automatically

FieldWhat it is
Anonymous identifierWeb by default: a daily, non-reversible ID derived at ingestion from request data using a salt that expires at UTC midnight. With explicit consent on this website: a random browser ID valid for up to 30 days. Mobile: a random SDK ID stored on the device so app launches can be linked.
Session IDGroups events into a visit. Web sessions are held server-side for up to 30 minutes of inactivity; mobile SDKs keep session state on the device.
TimestampsWhen the event happened on the device (client_ts) and when it was received by our servers (server_ts).
Platform & device infoPlatform (iOS / Android / web), OS version, device type (phone / tablet / desktop), and device model.
App versionOnly collected if you pass appVersion to OnRamp.init(). Used to break down funnel metrics by release.
Country, region & cityDerived from the request IP at ingestion time. The raw IP address and user agent are used transiently and are not stored in analytics data.
Step name, step index, event typeThe funnel milestone your code calls OnRamp.step() with, its position in the funnel, and the event category (e.g. step_entered).

Only if you pass it

propertiesA key-value object you can attach to any OnRamp.step() call. You decide what goes here and it is stored with the event. Do not send personal or sensitive data unless you have a documented lawful basis. Examples: { plan: "free", source: "invite" }.
identify() traitsIf your app calls OnRamp.identify(), the traits you pass (for example email or userId) are stored as an identify event and may be used to match sessions to connected integrations such as Stripe or RevenueCat. This is optional. Calling it changes the privacy posture: you must provide the required notice, lawful basis, and consent where applicable.

Be thoughtful about what you pass in properties or identify() - avoid including names, emails, or other PII unless you have a clear reason and have disclosed it to your users.

Never collected

  • ✓Screen recordings or screenshots
  • ✓Raw IP addresses or user-agent strings in analytics data
  • ✓Persistent browser identifiers for default daily-ID web analytics
  • ✓Payment card numbers, government IDs, or sensitive PII
  • ✓Names or email addresses unless you explicitly pass them via identify() or properties
  • ✓User IDs or account identifiers unless you explicitly pass them via identify() or properties

Data retention

Optional browser recognition cookieUp to 30 days; removed on withdrawal
Event data (ClickHouse)13-month rolling window
Heartbeat events7 days
Web session state (Redis)Up to 30 minutes after inactivity
Location data (country/region/city)Stored with the event for up to 13 months
API key hashesUntil you revoke the key

How your data is used

Event data is used exclusively to compute the funnel metrics shown in your OnRamp dashboard - step-level conversion rates, drop-off, timing, session timelines, and journey maps. OnRamp does not create screen recordings or screenshots.

We do not sell, share, or license your data to third parties. We do not use it to train models or for advertising.

Each app's data is scoped to its API key and is only accessible to members of your OnRamp account.

Google user data (Ads & Search Console)

OnRamp offers optional integrations that let you connect your own Google Ads and Google Search Console accounts so their metrics can be shown alongside your funnel data. Connecting is your choice, per app, and requests only the following scopes:

  • https://www.googleapis.com/auth/adwords - read campaign, ad group, and cost/conversion data for the Google Ads accounts you explicitly authorize.
  • https://www.googleapis.com/auth/webmasters.readonly - read-only access to list your verified Search Console properties and their performance data.

We do not request any other Google scope, and these integrations never access your Gmail, Drive, Calendar, or Google Account profile data.

OAuth tokens are encrypted at rest (AES-256-GCM), scoped to the connecting app, and decrypted only server-side to make the specific API calls the integration needs. OnRamp's use and transfer of information received from Google APIs adheres to the Google API Services User Data Policy, including the Limited Use requirements: this data is used only to display Ads and Search Console metrics in your OnRamp dashboard, is never used for advertising, is never used to train AI or machine learning models, and is never sold or shared with third parties.

You can disconnect a Google integration at any time from your app's Settings, which immediately deletes the stored token from our database. You can also revoke OnRamp's access directly from your Google Account permissions page.

Roles, lawful basis & rights

For analytics collected through a customer's app, the customer normally acts as the data controller and OnRamp acts as its processor. The customer decides the purpose, lawful basis, and which event properties or identity traits are sent.

Pseudonymous analytics can still involve personal data. Customers must provide a clear privacy notice, assess the applicable lawful basis and local rules, minimise collection, and handle access, deletion, and objection requests. A Data Processing Agreement is available on request.

For deletion requests relating to OnRamp data, contact hello@getonramp.dev with the relevant app and identifier where available.

Infrastructure

OnRamp runs on Railway (EU region - Netherlands). Event data is stored in ClickHouse and account/funnel metadata in PostgreSQL. No event data leaves these systems except to render your dashboard.

Questions?

Email us at hello@getonramp.dev.