Skip to content
Scalpels home

Scalpels is officially launching on October 31, 2026. Special early adopter pricing is available now.

← All documentation

Documentation

Telltale

Privacy and data

Updated

Telltale runs in your own Laravel Cloud account and stores device data in your own database. You remain responsible for declaring what your app collects, including anything you add in custom event properties.

What is captured

On both platforms:

  • Your own events from Telltale::event(), with bounded properties.
  • An optional opaque user id from Telltale::identify().
  • Screen views from the platform signals NativePHP already dispatches.
  • Estimated sessions: the first event starts one, and more than 30 minutes of inactivity starts the next.
  • A random install UUID generated on the device. It resets on reinstall and is never IDFV, Android ID or any other hardware identifier.
  • Context once per session: app and client version and platform details.
  • Bounded PHP error details: exception class, a scrubbed and capped message, normalised file and line, a capped stack trace and an optional grouping fingerprint.
Mobile (NativePHP Mobile 4.1+) Desktop
Screens Screen mounted, resumed and unmounted, with component and URI when exposed Window focus and blur, route changes
Version nativephp.version, version code, UpdateInstalled App::version(), AutoUpdater available and downloaded events
Device Model, OS, OS version, language Platform and architecture, locale, timezone
Network Connected state, type, expensive and constrained flags when exposed Not captured
PHP errors Laravel-reported HTTP and web-view exceptions, failed queued jobs Exceptions reported through Laravel's exception handler

Obvious email addresses and phone numbers are scrubbed from automatically captured strings, and property keys and values are length-capped. The server uses the request IP for rate limiting but does not store it as analytics data.

Store declarations

Telltale does not use this data for tracking and does not link it to a user by default. The repository's docs/privacy.md contains a ready-to-use PrivacyInfo.xcprivacy baseline declaring Product Interaction, Other Diagnostic Data and Device ID, each not linked, not tracking, for analytics.

Baseline App Store privacy label:

Category Collected Purpose Linked Tracking
Product Interaction Yes Analytics No by default No
Diagnostics: Other Diagnostic Data Yes Analytics No by default No
Other Identifiers (the install id) Yes Analytics No by default No

Baseline Google Play data safety answers:

Data type Collected Shared Purpose Required
App activity: App interactions Yes Not by Telltale Analytics No, opt-out available
App info and performance: Diagnostics Yes Not by Telltale Analytics No, opt-out available
Device or other IDs Yes, the random install id Not by Telltale Analytics No, opt-out available

If you call identify(), put personal data in properties, or link the install id to an account, change the "linked" answers to match.

Retention

Raw events are kept for 90 days by default. The scheduler runs telltale:prune-events every day at 03:10 and deletes older raw events. Durable projections and daily aggregates are kept, so active users, release adoption, event counts and retention still cover older periods, while funnels, screen flow, error lists and timelines only cover the retained window. Sessions are kept as their own records and are not pruned.

Deleting or revoking one install

To honour a deletion request, find the install UUID (for example with install_timeline) and delete it with the delete_install MCP tool, or on the server with:

php artisan telltale:delete-install {app-id} {install-uuid}

This removes the install, its raw events and its sessions, and rebuilds any error groups it belonged to. Daily aggregates, which hold counts rather than per-install data, are preserved.

Deleting does not block the device. If that install is still running the app, it re-registers with the ingest value and starts a fresh history. To stop a device sending, use revoke_install: its token stops working, it cannot re-register, and its history is kept.

On the device, Telltale::optOut() stops capture and clears the local outbox.