We measure which steps people reach and which features they use, so we can fix what is broken and see what helps. We never measure what you say.
No cookies
Not on this site, not in the web app. The Cookie Policy lists the few things kept in your browser, and why.
No advertising IDs, no tracking kits
We never read your phone’s advertising ID, and no third-party analytics or advertising code runs in the apps or on this site. When an Apple ad leads to an install, Apple sends us a report that names no person or device; we only count those.
No content
Never what you write or read, what you search for, file names, your email address or your account number. Every value below comes from a fixed list or is a small count.
One random ID per install
Each app install makes one random ID, kept on that device only. On the website, a random ID lives only as long as the browser tab. Once you sign in, events are linked to your account through a separate random ID, never your email or account number.
Counters with no identifier at all
Some things are only counted: we keep a total per day, with no install, tab or account attached. They cannot be linked to anyone.
PostHog, run by us
PostHog is open-source analytics software. We run our own copy on our own servers, so the PostHog company receives nothing, and nothing here is shared with anyone else.
Below are all 104 things we record, grouped by where they come from. Tap any line to see the details it carries. This list was built into the page; a newer one loads when our servers answer.
- In the apps and the web app (54)
- On the public website, before you sign in (17)
- On our servers (23)
- Counters with no identifier (10)
In the apps and the web app (54)
Short events sent to our own servers, never to an analytics company. Before you sign in they carry the install’s random ID (or, on the web, the tab’s); once you sign in they are linked to your account.
app_installedCounts new installs of the app, and for Android which campaign link led to the store.
store: one of: app store, playapp_build: a whole number from 0 to 10,000,000install_referrer: the campaign labels on the store link, and only these: utm_source, utm_medium, utm_campaign, utm_term, utm_content
app_openedCounts how often the app is opened, and how long a cold start takes, so we notice a slow release.
app_build: a whole number from 0 to 10,000,000days_since_install: a whole number from 0 to 36,500launch_bucket: one of: lt 1s, 1 2s, 2 4s, gt 4s
onboarding_stepShows which first-run screen people reach, so we can see where setup loses them.
step: one of: welcome, demo chat, account choice, choose method, email signup, anon intro, plan, checkout, reveal number, key setup, permissions, done, guest unavailable, welcome back, invite paste, join card, join wait, save accountoutcome: one of: pasted, skipped, joined, subscriber sign in, left, admitted, left app, still waiting 24h, email, number, later
onboarding_completedCounts people who finish setting up the app.
No details: only that it happened.
paywall_viewedCounts how often the plans screen is shown, and from where.
placement: one of: onboarding, chat limit, settings, device sync, username claim, deep link, other, guest ai, guest files, guest invite, guest pausedplan_shown: one of: monthly, yearly, both
plan_selectedShows which plan (monthly or yearly) people pick.
plan: one of: monthly, yearly
purchase_startedCounts purchases that were begun, so a failing store sheet is visible.
provider: one of: apple, google play, stripeplan: one of: monthly, yearly
purchase_restoredCounts subscriptions restored on a new install.
provider: one of: apple, google play, stripeplan: one of: monthly, yearly
purchase_failedCounts purchases that did not complete, and the broad reason (cancelled, declined, network, timed out, still pending, failed, store unavailable).
provider: one of: apple, google play, stripeplan: one of: monthly, yearlyreason: one of: cancelled, declined, network, unknown, timeout, pending, failed, unavailable
purchase_verify_failedCounts store purchases our server could not confirm, so paying people are not left without access.
provider: one of: apple, google play, stripeplan: one of: monthly, yearlystage: one of: checkout, restore, recoverystatus: a whole number from 100 to 599kind: one of: gone, retryable
signup_startedShows which way people choose to create an account (email, anonymous or with a purchase).
method: one of: email, anonymous, purchase
feature_usedCounts which features signed-in people use, once per deliberate action, never per message.
feature: one of: new chat, attachment, collaboration, export, model switch, folders, import, my files, memory, custom instructions, devices, app lock, reasoning, search, dictation, read aloud
app_crashedCounts app crashes and freezes by kind and build, with the broad type of error, a number standing for where in our code it happened and the app's memory use, never a crash log or message.
kind: one of: crash, native crash, hang, out of memory, resource limit, othercrashed_build: a whole number from 0 to 10,000,000exception: one of: out of memory error, stack overflow error, illegal state, null pointer, illegal argument, index out of bounds, concurrent modification, class cast, arithmetic, unsupported operation, number format, security, io, cancellation, other exception, other errorcrash_frame: a whole number from 0 to 2,147,483,647pss_mb: a whole number from 0 to 65,535rss_mb: a whole number from 0 to 65,535
notification_permissionShows whether people allow notifications, so we can tell if reply alerts can reach them.
state: one of: granted, denied, provisional, not determinedprompted: yes or no
api_errorCounts failed requests by area and broad kind, so we can find what is broken.
route: one of: auth signup, auth login, auth refresh, account, verify purchase google, verify purchase google anonymous, verify receipt apple, verify receipt apple anonymous, checkout stripe, portal stripe, chat, sync, relay, attachments, memory, blob storage, demo launch, guest config, otherstatus: a whole number from 100 to 599kind: one of: transport, timeout, client, serverrelay_op: one of: register, device list, device revoke, push token, blocks, discoverability, username, lookup, directory, key package upload, key package count, key package claim, commit, group state, send, drain, ack, invite, other
guest_session_startedCounts visits that start a guest chat without an account.
No details: only that it happened.
screen_viewedShows which guest-mode screens are opened.
screen: one of: guest chat, chat list, overflow menu, settings, privacy explainer, checkout, identity, email, reveal, welcome, guest unavailable, welcome back
guest_message_sentCounts guest messages by turn number and how they were typed, never the message.
turn: a whole number from 0 to 1,000message_source: one of: typed, starter prompt, dictationchat_index: a whole number from 0 to 1,000
starter_prompt_tappedShows which suggested first prompt (by position) is tapped.
index: a whole number from 0 to 1,000
guest_reply_receivedCounts guest replies and how long they took, in broad buckets.
turn: a whole number from 0 to 1,000latency_bucket: one of: lt 5s, 5 15s, 15 45s, gt 45sinterrupted: yes or no
guest_reply_failedCounts guest replies that failed, and the broad reason.
reply_failure: one of: rate limited, network, server, interrupted
guest_chat_createdCounts new guest chats.
chat_count: a whole number from 0 to 1,000
answer_actionCounts what people do with an answer (copy, share, regenerate and the like).
action: one of: copy, share, react, bookmark, regenerate, read aloud, report
blur_intro_shownCounts how often the privacy blur is introduced.
No details: only that it happened.
blur_toggledShows whether people turn the privacy blur on or off.
on: yes or no
reveal_all_tappedCounts taps on reveal-all for blurred text.
No details: only that it happened.
lock_tappedShows which locked feature a guest tapped.
locked_feature: one of: folders, collaborate, import, attachments, my files, custom instructions, memory, export, devices, app lock, notify, reasoning, panic wipe, destroy account
paywall_shownShows where a guest was offered a trial.
paywall_source: one of: wall, meter, not saved line, overflow menu, settings card, chat list, auto visit, privacy explainer, folders lock, collaborate lock, import lock, attachments lock, my files lock, custom instructions lock, memory lock, export lock, devices lock, app lock lock, notify lock, reasoning lock, panic wipe lock, destroy account lock, push, live activityoffer_id: a whole number from 0 to 100,000
paywall_dismissedShows where a guest closed the trial offer.
paywall_source: one of: wall, meter, not saved line, overflow menu, settings card, chat list, auto visit, privacy explainer, folders lock, collaborate lock, import lock, attachments lock, my files lock, custom instructions lock, memory lock, export lock, devices lock, app lock lock, notify lock, reasoning lock, panic wipe lock, destroy account lock, push, live activity
wall_shownCounts guests who reach the free-message limit.
turns_used: a whole number from 0 to 1,000
extension_takenCounts guests who take the extra free messages.
No details: only that it happened.
checkout_openedShows where a guest opened checkout.
paywall_source: one of: wall, meter, not saved line, overflow menu, settings card, chat list, auto visit, privacy explainer, folders lock, collaborate lock, import lock, attachments lock, my files lock, custom instructions lock, memory lock, export lock, devices lock, app lock lock, notify lock, reasoning lock, panic wipe lock, destroy account lock, push, live activityoffer_id: a whole number from 0 to 100,000
identity_chosenShows whether a new member chose an email or an anonymous account.
method: one of: email, anonymous
signup_completedCounts finished sign-ups and how many guest chats came along.
method: one of: email, anonymousdemo_turns: a whole number from 0 to 1,000chats: a whole number from 0 to 1,000paywall_source: one of: wall, meter, not saved line, overflow menu, settings card, chat list, auto visit, privacy explainer, folders lock, collaborate lock, import lock, attachments lock, my files lock, custom instructions lock, memory lock, export lock, devices lock, app lock lock, notify lock, reasoning lock, panic wipe lock, destroy account lock, push, live activity
login_openedShows where people open sign-in.
login_source: one of: empty state, overflow menu, wall, settings card, welcome back, welcome
carryover_savedCounts guest chats kept when a guest creates an account.
chats: a whole number from 0 to 1,000
welcome_viewedCounts how often the first-run welcome is shown.
No details: only that it happened.
welcome_continueCounts people who continue past the first-run welcome.
No details: only that it happened.
referral_sharedCounts referral links shared or copied.
No details: only that it happened.
update_prompt_shownCounts update prompts shown, so we know how fast a fix reaches people.
required: yes or no
update_prompt_acceptedCounts update prompts accepted.
required: yes or no
review_prompt_requestedCounts how often we ask the phone to offer a store rating.
No details: only that it happened.
session_endShows how long a visit lasted, in broad buckets, and whether anything was done in it.
duration_bucket: one of: lt 1m, 1 5m, 5 15m, 15 60m, gt 60mengaged: yes or no
live_activity_startedCounts Lock Screen setup-progress cards started on iPhone, by kind and step, never what they showed.
live_activity_kind: one of: guest setup, account numberlive_activity_step: a whole number from 0 to 20
live_activity_openedCounts taps on a Lock Screen setup-progress card, by kind, step and broad state.
live_activity_kind: one of: guest setup, account numberlive_activity_step: a whole number from 0 to 20live_activity_state: one of: progress, writing, answer ready, create account, bonus, onboarding, all set, account number
live_activity_permissionShows whether Live Activities are switched on for the app.
live_activities_enabled: yes or no
notify_optin_shownCounts how often the "Reminders and offers" opt-in is shown, and at which moment.
moment: one of: first reply, offer dismissed, wall dismissed, settings
notify_optin_answeredShows how people answer the "Reminders and offers" opt-in.
moment: one of: first reply, offer dismissed, wall dismissed, settingschoice: one of: accept, not now
marketing_pref_changedShows when "Reminders and offers" is switched on or off, and from where.
marketing_enabled: yes or nopref_source: one of: card, settings, system
push_registeredCounts registrations for reminders and offers, and token changes, never the token or the reminders identifier.
push_stage: one of: guest, member, subscriber, lapsedrotated: yes or no
push_receivedCounts reminders and offers that reached the phone, by campaign, version, kind and step.
campaign_id: a whole number from 0 to 1,000,000variant: one of: a, b, cpush_kind: one of: series, campaignpush_step: a whole number from 0 to 10
push_openedCounts notifications opened, by kind.
campaign_id: a whole number from 0 to 1,000,000variant: one of: a, b, cpush_kind: one of: series, campaignpush_step: a whole number from 0 to 10
experiment_exposedCounts people who were shown a test's version.
key: a value from a fixed list
settings_snapshotRecords which settings a signed-in member has on (app lock, memory, custom instructions, folders), never their content.
app_lock: yes or nomemory: yes or nocustom_instructions: yes or nofolders: one of: 0, 1 5, 6 plus
Kept as your current settings only, not as a history.
Details every app event may also carry
About the app and its build, never about you or your phone’s model.
channelWhich build the event came from (store, beta, debug), so test traffic is kept out of the figures.
channel: one of: app store, testflight, play, play testing, web, debug, unknown
channel_sourceHow the app worked out its channel.
channel_source: one of: app transaction, receipt fallback, build time, unknown
channel_errorWhy the app could not work out its channel, when it could not.
channel_error: one of: network error, system error, not entitled, unsupported, not available in storefront, verification failed, timeout, user cancelled, unknown error, other
attest_stateWhether the app has proved it is our genuine app.
attest_state: one of: none, pending, attested, backoff, unsupported
attest_errorThe last broad reason that proof failed.
attest_error: one of: dc invalid key, dc invalid input, dc feature unsupported, dc server unavailable, dc unknown, deadline, http 4xx, http 429, http 5xx, offline, other
app_buildThe app's build number.
app_build: a whole number from 0 to 10,000,000
os_majorThe phone's major OS version only (for example 18), never the model.
os_major: a whole number from 0 to 99
bucketA number from 0 to 99 worked out from the reminders identifier, used to compare people who are and are not sent reminders; never the identifier itself.
bucket: a whole number from 0 to 99
exp_<key>Which version of a product test the install was shown, when a test is running.
exp_<key>: the name of a version, from a fixed list
On the public website, before you sign in (17)
Page views and button presses on this site, recorded by our own copy of PostHog under a random ID that lasts only as long as the tab. Page addresses are kept without their query strings, apart from campaign labels. This stops when you sign in; the Cookie Policy has the details.
$pageviewCounts page views on the public site (before sign-in only).
lp_cta_clickedCounts clicks on a landing page's main button.
demo_openedCounts opens of the old public demo.
demo_message_sentCounts messages in the old public demo, never the message.
demo_upgrade_shownCounts upgrade offers in the old public demo.
demo_cta_clickCounts clicks on the old public demo's sign-up button.
app_download_clickedCounts taps on an app store button on our site.
app_banner_shownCounts how often the get-the-app banner is shown.
app_banner_dismissedCounts how often the get-the-app banner is closed.
signup_account_type_selectedShows which account type is chosen on the sign-up page.
signup_plan_selectedShows which plan is chosen on the sign-up page.
signup_payment_method_selectedShows which payment method is chosen on the sign-up page.
promo_landing_viewedCounts visits to a promo link's page.
promo_landing_continueCounts people who continue from a promo link's page.
signup_abandonedCounts sign-ups left part-way.
referral_landing_viewedCounts visits from a referral link.
chat_invite_landing_viewedCounts visits to an invite link's web page and which button was tapped, with no person attached and never the invite.
On our servers (23)
Things our servers already know because they happened there: an account was created, a payment went through. Each is linked to an account by a random ID, never by email or account number, and carries only the details listed. exp_<key> is which version of a product test the app was shown, worked out from the app’s random install ID; it is added only when the event happens during a request from an app taking part in a running test.
account_createdCounts new accounts, with the platform and campaign labels they arrived from.
Details: account_type, brand, platform, country, region, source, promo, referral, lp_variant, promo_code, utm_source, utm_medium, utm_campaign, utm_term, utm_content, ft_utm_source, ft_utm_medium, ft_utm_campaign, ft_utm_term, ft_utm_content, ft_lp_variant, app_build, exp_<key>
sign_inCounts sign-ins by platform.
Details: account_type, brand, platform, app_build, exp_<key>
first_messageCounts accounts that send their first message (never the message).
Details: brand, platform, app_build, account_state, exp_<key>
subscription_createdCounts new subscriptions, by plan, store, platform and price; paid_at_start is false when a free trial started the subscription.
Details: plan, amount, currency, brand, country, provider, promo_code, app_build, paid_at_start, platform, exp_<key>
first_paymentCounts first payments, by plan, store, platform and price.
Details: provider, plan, amount, currency, brand, country, app_build, platform, exp_<key>
chat_invite_mintedCounts chat invites created.
Details: kind, brand, platform, exp_<key>
chat_invite_claimedCounts chat invites accepted.
Details: kind, brand, platform, via, claimer, exp_<key>
chat_guest_admittedCounts guests let into a Collaboration and how long they waited, in broad buckets.
Details: wait, added_by, exp_<key>
guest_cap_hitCounts when a subscriber's guest spots were full, at accepting or adding.
Details: stage, exp_<key>
device_enrolledCounts devices set up for encrypted chat.
Details: platform, brand, app_build, exp_<key>
active_dayCounts each day an account was active, for active-user figures.
Details: brand, exp_<key>
store_redirectCounts clicks on our ad links, by store and campaign label, with no person attached.
Details: brand, platform, destination, utm_source, utm_medium, utm_campaign, utm_term, utm_content, country, exp_<key>
paywall_hitCounts when a member reaches a paid limit.
Details: brand, platform, placement, app_build, exp_<key>
checkout_startedCounts checkouts started on our servers.
Details: plan, brand, provider, platform, app_build, exp_<key>
checkout_abandonedCounts checkouts that were not finished.
Details: plan, brand, provider, platform, exp_<key>
subscription_renewedCounts subscription renewals, by store and platform.
Details: provider, plan, amount, currency, brand, platform, exp_<key>
payment_failedCounts failed renewals, by store, platform and broad reason.
Details: provider, plan, brand, reason, platform, exp_<key>
subscription_cancelledCounts cancellations, by store, platform and broad reason.
Details: provider, plan, brand, reason, platform, exp_<key>
refund_issuedCounts refunds, by store and platform.
Details: provider, amount, currency, brand, platform, exp_<key>
referral_link_createdCounts referral links created.
Details: brand, platform, app_build, exp_<key>
referral_convertedCounts referrals that became accounts.
Details: brand, platform, exp_<key>
account_deletedCounts accounts deleted.
Details: brand, platform, app_build, exp_<key>
signup_identity_resolvedCounts web sign-ups that finished as an email account.
Details: account_type, brand, exp_<key>
Counters with no identifier (10)
A name, a kind from a fixed list and a number. No install, tab or account ID is sent or kept, only a total per day, so these cannot be linked to anyone or to each other.
push_sentCounts notifications we sent and whether Apple or Google accepted them; a refused token is how we estimate uninstalls.
- Kind: answer ready, message, marketing
- Detail: ok, failed, unregistered
- Counted by: our servers
replyCounts replies and how they ended (finished, interrupted, rate-limited, failed).
- Kind: guest, app, api
- Detail: ok, interrupted, rate limited, upstream error, client gone
- Counted by: our servers
reply_ttftCounts how long replies took to start, in broad buckets.
- Kind: guest, app, api
- Detail: lt 1s, 1 3s, 3 10s, gt 10s
- Counted by: our servers
ad_postbackCounts Apple's ad-attribution reports we received, and whether they verified.
- Kind: skan, aak
- Detail: stored, duplicate, unverified, malformed, unconfigured, foreign app
- Counted by: our servers
push_openedCounts notifications opened, by kind.
- Kind: answer ready, message, marketing, other
- Counted by: iPhone and iPad, Android
decrypt_failedCounts things that could not be decrypted on a device, by kind, so we can find bugs; never what it was.
- Kind: message, group state, welcome, history, local store, other
- Counted by: iPhone and iPad, Android, the website and web app
web_errorCounts site errors by broad kind.
- Kind: chunk load, uncaught, rejection
- Counted by: the website and web app
exportCounts uses of the chat export page and how they ended.
- Kind: opened, completed, failed decrypt, failed storage, failed download, failed other
- Counted by: the website and web app
web_vitalCounts page loads by Google's speed verdicts (good, needs improvement, poor), never the page or the timing.
- Kind: lcp, inp, cls, ttfb
- Detail: good, needs improvement, poor
- Counted by: the website and web app
guest_sendCounts guest messages let through or paused because nobody in the chat subscribes; never who or which chat.
- Kind: ok, paused
- Counted by: our servers
Questions
If you find something we record that is not on this page, or a detail that is not what we say it is, write to legal@strongwall.ai. The Privacy Policy covers what we keep about accounts and for how long.