Repository navigation
Usage analytics for the funnel: server events after the account's own yes - #130
Merged
Merged
Conversation
… yes The cookie answer now belongs to the account (settings.analytics). The web banner, the AI tool consent screen and the iPhone prompt read and write it, and the server sends usage only when it is yes. One track() in lib/telemetry.ts sends plucked (every surface), signed_up (with via), AI tool connected and disconnected, every MCP tool call and prompt, Lists, imports, search counts and more. Each event may carry only the properties on its allow-list; docs/analytics.md lists the same, and a test holds the two together. pnpm numbers prints MongoDB counts for everyone. The privacy page says so in all ten languages. ADR 0001 records why. Co-Authored-By: Claude Opus 5.5 <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Chg7BFTY54anasBWfWnSm8 Signed-off-by: NiallJoeMaher <nialljoemaher@gmail.com>
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
A "Pluck off" given anywhere but a signed-in page (the marketing site, /signin, or a save that failed offline) was overwritten by the account's older "yes" at the next signed-in page, which turned tracking back on. Each answer now carries when it was given (settings.analyticsAt). A device takes the account's answer only when it is newer, and gives the account its own when that is; the server ignores a save older than what it has, and never dates one ahead of now. The banner saves to the account from any page. An answer lapses after a year everywhere, so a signed-in browser is asked again as the banner promises, and the server counts nothing meanwhile. Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Per4f8yL5A7nL9frZVDJj7 Signed-off-by: NiallJoeMaher <nialljoemaher@gmail.com>
NiallJoeMaher
added a commit
that referenced
this pull request
Nov 3, 2026
Co-Authored-By: Claude Opus 5.5 (1M context) <noreply@anthropic.com> Claude-Session: https://claude.ai/code/session_01Per4f8yL5A7nL9frZVDJj7 Signed-off-by: NiallJoeMaher <nialljoemaher@gmail.com>
This was referenced Nov 3, 2026
NiallJoeMaher
added a commit
that referenced
this pull request
Nov 3, 2026
) Updating the app asked "Help make Pluck better?" again. 1.4.0 keeps the answer under a new key ("answer", with when) and nothing carried the old one over; before #130 the account held no answer to fall back on. - iOS carries a "consent" answer from an older build over, dated now. - An account's answer never lapses (freshAnswer); it changes only in Settings or Cookies. A browser with no account still asks after a year. - The app waits for the account's answer before asking, so a phone new to the account never asks what the account already said. - Privacy says the iPhone and iPad app asks once, in all ten languages. Claude-Session: https://claude.ai/code/session_01Chg7BBfwaoFjYv8SEWTjMY Signed-off-by: NiallJoeMaher <nialljoemaher@gmail.com> Co-authored-by: Claude Opus 5.5 <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
What
Sees who converts, across every app, without breaking the cookie promise.
settings.analytics(yes | no | null). The web banner, the AI tool consent screen (where MCP-first people sign up) and the iPhone prompt all read and write it; a device with no answer takes the account's, the latest answer wins.track()inapps/web/lib/telemetry.ts. Sends only when the account said yes. Each event's properties are on an allow-list (enums, counts, timings); anything else is dropped before it leaves.signed_up(withvia: try / mcp / public-page / shared-list / ios / extension / direct),plucked(every surface, incl. email-in and the share sheet),ai_tool_connected/ai_tool_disconnected,mcp_tool_called(tool, client name, ok, error code, result count, duration),mcp_prompt_used, Lists, imports, highlights, opens, search counts, API keys, handle, export. Person properties for cohorts:plucked_from_*,ai_tools,items_bucket,has_public_list,digest_on,locale.signed_upis sent at the first yes, dated when the account began, with a uuid fixed by the account, so PostHog keeps one.pnpm numbers: MongoDB counts for everyone (sign-ups by via, Items by source, accounts by number of surfaces, AI tools), for the people PostHog never sees.docs/analytics.md(the event list;telemetry.test.tsfails if it drifts from the code), ADR 0001, privacy page in all ten languages.packages/mcpstays free of PostHog: it getsonCall/onPromptcallbacks, and the route sends them on.Checks
pnpm typecheck,pnpm lint,pnpm test(508) pass.mcp,signin,site,extension,account: 23/24 pass. The failure is the account import, which already fails locally from the clogged digest queue; CI starts from a fresh database.pnpm designnot run: no visual change.Before merging
Read the new privacy sentence (
privacy.sections.cookies.body) in each language. I translated it with the glossaries indocs/i18n/; a native read would help.🤖 Generated with Claude Code
https://claude.ai/code/session_01Chg7BFTY54anasBWfWnSm8