Data Collected by RumDash

This page documents exactly what data the RumDash client library collects from your website's visitors, what our servers add to it, and the controls you have over collection. It is intended for security and privacy reviewers evaluating RumDash. For API-level details of the client library, see the client JavaScript documentation.

Data sent by the client library

The RumDash script collects performance telemetry, not user behavior profiles. Each page navigation produces a JSON payload containing the fields below, sent to RumDash's ingestion API over HTTPS. A single navigation may produce more than one beacon (for example, when a metric finalizes after the initial send), and later beacons carry the same per-navigation identifier so the server can reconcile them.

Category Fields
Page & navigation Page URL (including query string and fragment), referrer URL, navigation timestamp, navigation type, a per-navigation id (a randomly generated UUID that correlates beacons from the same navigation and identifies nothing else), and the optional pageType label you configure. Email addresses appearing in query parameter values of the page URL, the referrer URL, or the URL of a client-side navigation in a single-page application, whether plain or percent-encoded, are redacted by the client at capture time, before the payload leaves the browser.
Session A rum_session_id: a randomly generated UUID stored in your site's localStorage under the key __rdSessId, paired with a __rdSessTimestamp key holding the time of last activity, which expires the session after 30 minutes of inactivity. Both keys are written only once an init() call resolves to enabled, so a page that loads the script without initializing it, or that initializes with reporting off, stores nothing. The UUID is scoped to your site, is not a cross-site identifier, and contains no user information. A boolean marks whether a navigation is the first of its session.
Device & environment Viewport width and height, device pixel ratio, effective connection type (e.g. 4g), and logical CPU core count. The viewport is recorded once per navigation: when the RumDash script runs for the page load (at consent time if the script is deferred until then), when the page is restored from the back/forward cache, and when the app routes for a soft navigation. If the window reports no size at that moment, as an embedded WebView can before its first layout, the size at send is used instead. Each metric's attribution records the viewport again at the moment that metric fires, so a rotation or resize between the two shows up as different values. The browser's User-Agent string is not part of the JSON payload; the server reads it from the ingestion request's headers and parses it into browser, OS, and device family.
Performance metrics Core Web Vitals (TTFB, FCP, LCP, CLS, INP). LCP, CLS, and INP additionally carry attribution data for debugging: CSS selectors and tag names of the elements involved, the visible text content of attributed elements (with email addresses and digits redacted, as described below), URLs of contributing resources (images, videos, scripts, stylesheets; only the first 100 characters of an inlined data: URI) with their load timings (start, request start, service worker start, duration), transfer and body sizes, script function names and timings from Long Animation Frames, element geometry (bounding rectangles, scroll positions), and for LCP the timestamp, tag name, and resource URL of each candidate element the browser considered before settling on the final one.
Configuration Your website API key (transmitted in the request URL's query string rather than the JSON body), optional environment label (e.g. prod), optional revision identifier, and the RumDash library version.
Error telemetry If the RumDash library itself throws an error, the error message and stack trace are reported so we can fix the library. These reports stop with everything else once reporting is off: a page that initializes with enabled: false or that calls disable() sends none. That opt-out is applied before any other configuration is read, so a failure while the library is starting up cannot outrun it. The report reaches our internal error tracker alongside standard HTTP request metadata (such as the Referer and User-Agent headers); it never includes page content, form data, or user identifiers.

What RumDash does not collect

  • No cookies. RumDash sets no cookies of any kind. Session continuity uses localStorage only.
  • No session replay. RumDash does not record screens, DOM mutations, or mouse movement.
  • No form input or keystrokes. The script never reads form field values, keystrokes, or clipboard contents, including on checkout and payment pages.
  • No cross-site tracking or advertising identifiers. The session UUID is random, site-scoped, and short-lived.
  • No user accounts or identity. RumDash has no concept of your end users' identities and provides no API for attaching them.

One nuance worth flagging for reviewers: Core Web Vitals attribution includes the visible text of the specific element that produced a metric (for example, the headline that was the Largest Contentful Paint). On pages that render user-specific text, that text can appear in attribution data. Two redactions narrow that exposure: email addresses in the text are replaced with [REDACTED_EMAIL], and every digit character is replaced with #, so numeric identifiers such as phone numbers, order numbers, and account numbers never leave the visitor's browser verbatim.

Both redactions happen in the client, at capture time, before the payload leaves the browser. Email redaction's scope is deliberately narrow: the visible text of attributed elements, and query parameter values in the page URL, the referrer URL, and the URLs of client-side navigations in single-page applications. Digit redaction applies to the visible text of attributed elements only; digits in URLs are not redacted.

Server-side geolocation enrichment

RumDash's ingestion API sits behind Cloudflare. At the edge, Cloudflare derives coarse geolocation from the request's IP address and forwards it as HTTP headers. From those headers RumDash stores: country, city, region code, continent, latitude, and longitude. This enrichment happens entirely server-side; the client library does not access or transmit location data itself.

IP addresses

Like any HTTP service, RumDash's servers necessarily receive the visitor's IP address in transit. We treat IP addresses as personal information under CCPA, GDPR, and similar state privacy laws, and we handle them accordingly:

  • IP addresses are not stored in analytics records. Only the coarse geolocation fields listed above are persisted.
  • IP-bearing HTTP headers (CF-Connecting-IP, True-Client-IP, X-Forwarded-For) are filtered out of our internal error reports before they leave our infrastructure.

Because the IP is momentarily processed at the edge for geolocation, we recommend customers disclose RumDash as a performance-analytics processor in their privacy policies rather than asserting that no personal information is ever processed.

Payment pages & PCI scope

RumDash never reads form input, keystrokes, or payment data, so it does not handle cardholder data on any page. If your PCI assessment calls for excluding third-party scripts from payment pages entirely, you have three options:

  • Omit the RumDash snippet from payment-page templates, so the script never loads there.
  • On a traditional multi-page site, where each route is its own page load, initialize with RumDash.init({ key, enabled: false }) on payment routes: the script loads but registers no observers, touches no browser storage, and sends no telemetry whatsoever, error reports included.
  • In a single-page application, where a payment route is reached by client-side navigation rather than a page load, call RumDash.disable() when you navigate onto it. init() takes effect once per page load, so a later init() call is ignored and cannot be used to turn reporting off.

Note on the third option. disable() stops reporting for the remainder of the page's lifetime and cannot be resumed later in that same page's lifetime, so a single-page application that disables on a payment route also stops reporting on whatever the visitor navigates to next, until the next full page load. Where that is too broad, omit the snippet from the payment-page template instead.

See the client JavaScript documentation for details on init() and disable().

Data retention

  • Raw navigation records (the per-pageview payloads described above) are deleted after 100 days.
  • Aggregated analytics (statistical rollups with no per-visit or per-session records) are retained for up to 3 years.
  • Client error reports are not stored by RumDash; they are forwarded to our error-tracking provider and are subject to that provider's retention policy.

These windows are upper bounds on how long data exists in our systems, not a guarantee of dashboard history. We periodically restructure our aggregations, and a restructured aggregate is rebuilt from the raw-data window, so the history available in a given dashboard view may be shorter than 3 years.

The windows above cover data collected from your website's visitors. Data about your RumDash account itself (operator logins, team membership, billing) is covered by our privacy policy.

Data protection

Encryption in transit

Telemetry is encrypted with TLS on every network hop, from the visitor's browser to the database:

  • Browser to edge. All telemetry is transmitted over HTTPS (TLS) to RumDash's ingestion API, which sits behind Cloudflare. Plain-HTTP requests to our application are redirected to HTTPS, and HTTPS is enforced via HSTS.
  • Edge to application. Cloudflare connects to our origin servers in Full (strict) mode: the edge-to-origin leg is itself TLS-encrypted, with the origin certificate validated on every connection.
  • Application to database. Connections from our application servers to the analytics database require TLS, and our database provider does not accept unencrypted connections at all. In addition, the database is locked down to an allowlist of client IPs, covering only our origin servers.

Encryption at rest

Analytics data is stored in a managed TimescaleDB service (Tiger Cloud, running on AWS), which encrypts data at rest using AES-256, covering both active databases and backups, with cryptographic keys managed by AWS Key Management Service.

Access controls

  • Ingestion is authenticated per-website via API key, and every request's payload is validated before it is stored.
  • Dashboard access is scoped by team membership with role-based permissions.
  • Direct network access to the analytics database is restricted to an IP allow list covering only the address ranges our application servers connect from; connections originating anywhere else are refused at the network layer, before authentication is attempted.

Questions this page doesn't answer (subprocessor agreements or a security questionnaire) can be directed to support.