Internal-data synthesis across Vercel, PostHog, GSC, MailerLite, Sentry, Adapty, Linear, Convex, and BigQuery. Anomalies and Wins reference today vs the trailing 14-day window. Written 07:00 UK by the analytics-cockpit Routine.
No briefing for 2026-07-19 yet. The analytics-cockpit Routine runs each morning, commits to the vault, and posts to Slack #cockpit.
To trigger manually from this repo, run /analytics-cockpit.
Snapshot fetched: 2026-07-18 06:08 UTC. All sources live except ad spend (credentials not configured). Context: friends-and-family beta, 3 WAU, 17 MAU, £0 MRR, £522/month burn.
Yesterday's briefing noted the rate was falling on Saturday morning (0.89% at 07:12 UTC, partial) and suggested normalisation as weekday traffic resumed. It has not normalised. This morning shows 30 errors on 636 Convex calls = 4.72%, continuing the pattern of 5.75% on 16 July and 4.18% on 15 July. Prior baseline across 11–12 July was 0.05–0.12% (35–48 errors on 51K–76K calls/day), making this a 40–100x band breach.
The weekend-only hypothesis is now off the table — this is a persistent, active fault. Sentry backend lists 94 "Not authenticated" ConvexErrors this week across 4 users; issue #129246741 is trending up (+67%). The most plausible mechanism remains auth session expiry after 5–7 days, surfacing as a cold error rather than a graceful redirect. The correct fix is a proactive session refresh before the expiry window, not just a retry wrapper.
Surface: App Health · Sentry #129246741
WAU has held at 4–5 in every prior briefing. This week it dropped to 3, with MAU also declining from 18 to 17. With a 4-person weekly cohort, one person becoming less active is a 25% drop — beyond the ±20% threshold. It is not yet clear whether this is the user experiencing crash sessions (crash_free_users remains at 75%, meaning 1 of 4 WAU hit a crash), or simply a beta participant stepping back.
The Convex call volume collapse during the weekend (2,390–4,313 calls/day on 15–17 July versus 40K–76K/day on 11–12 July) aligns with reduced activity rather than a technical failure. If the same user continues to drop off next week, the cohort is effectively 3 people, which changes the signal-to-noise ratio on all PostHog metrics.
Surface: PostHog
First flagged in the 16 July briefing as a same-day priority. Now entering its fourth consecutive day with no recorded triage outcome. The error (`SyntaxError: Failed to execute 'appendChild' on 'Node': missing ) after argument list`) affects the web app; 4 users were affected on 15 July when the main traffic spike hit.
The tagassistant.google.com hypothesis (GA Tag Assistant preview mode injecting malformed script fragments) remains the most plausible explanation — 23 of this week's 31 unique visitors came from that referrer. If those 4 affected users were all using Tag Assistant, the issue is test noise and can be filtered. If any were organic visitors, this is a live production error that has been blocking real homepage visitors for four days. The check takes under 10 minutes.
Surface: Sentry #134568909
The overall mobile error volume is falling. The dominant "onError" warning (issue #122324359) dropped 51% (37 events vs 75 prior). This continues the downward trajectory noted in the 17 July briefing (which called out 40% backend error reduction). The crash-free session rate remains healthy at 98.26% across 115 sessions.
The combined Adapty profile fetch timeout count (issues #109003255 and #131439859) has more than halved compared to last week. Issue #131439859 dropped 86%. The last event on #109003255 was 16 July; if no new events today, COD-3374 and COD-3375 (shipped 13 July) have addressed the main source. Crash-free users is still 75%, which likely reflects a different open issue rather than continued Adapty failures.
The second consecutive briefing flagging this improvement. 15 July drove 63 of the 108 views, with 25 organic visits in a single day. Stripping out the 23 tagassistant.google.com visits (likely internal QA), the organic week was still 85 pageviews vs 30 prior (+183%). Reddit accounted for 8 visits this week. LP conversion remains 0, but the traffic foundation is building.
1. Diagnose the Monday morning error rate — the weekend hypothesis is disproved The 17 July briefing predicted normalisation as weekday traffic resumed. Today shows 4.72% at 06:08 UTC. The auth session expiry mechanism (5–7 day expiry hitting on weekend sessions) would actually predict continued Monday-morning errors for users who last logged in on Tuesday or Wednesday. Cross-reference Axiom error log for the specific failing Convex functions on 15–17 July, then check whether the affected user's Clerk session token has a specific TTL. A proactive `refreshToken()` call before the expiry window would fix this class cleanly. → App Health · Sentry #129246741 · Axiom
2. Confirm web SyntaxError root cause — day 4, 10-minute check Open Sentry #134568909, click into the user/session list for the 4 affected users, check their referrer or user-agent. If all 4 show `tagassistant.google.com` in session context: filter the issue in Sentry, mark resolved, and note in the next briefing. If any show organic or direct: this is a live production error and needs a same-day fix. → Sentry #134568909
3. Fix MailerLite webhook — 22+ days, name the blocker today 7 subscribers, 0 emails sent. This has been in the action items since 8 July with no progress recorded. The ask remains the same: not to fix it today, but to name the specific blocker. Is the webhook URL misconfigured? Is the web form not submitting to MailerLite? Is it a missing field in the subscriber payload? One sentence naming the blocker makes this actionable; "still broken" does not. → MailerLite automations
4. Ship DEV-2071 or reduce scope to ship the UTM piece alone 3 WAU using the app, 34 web visitors this week — none attributable to segment or source. DEV-2071 (UTM first/last touch) is the smallest of the three instrumentation tickets and the most immediately valuable. If the full ticket is blocked, a stripped version that stamps `first_touch_source` on sign-in would recover 80% of the value in under a day. 7 briefings with this in the watch list. → DEV-2071
5. Review sprint allocation — 2.5:1 creation:completion ratio, third week running 47 issues created vs 19 completed this week. BET backlog at 30 (beta-blocking), high-priority at 62. Five items currently in-flight simultaneously (DEV-2265, DEV-2243, DEV-2076, DEV-2072, DEV-2071). Each of the three instrumentation tickets has been In Progress for 7+ briefing cycles without completing. Either the scope is too large or the allocation is too split. A focused sprint on one ticket to completion would break the pattern. → Linear
| Source | Status | Notes |
|---|---|---|
| Sentry (mobile + web + backend) | ✅ ok | |
| PostHog | ✅ ok | |
| GSC | ✅ ok | Window: 10 Jul – 16 Jul |
| MailerLite | ✅ ok | |
| Axiom / Convex | ✅ ok | Morning partial data; error rate may shift as weekday traffic returns |
Snapshot fetched: 2026-07-17 07:12 UTC. All sources live except ad spend (credentials not configured) and GCP billing (BigQuery export not enabled). Context: friends-and-family beta, 4 WAU, 18 MAU, £0 MRR, ~£522/month burn.
248 errors on 4,313 Convex calls on 16 July — 27x the trailing average of ~0.21% across Jul 10–14. This is the second consecutive day of elevated error rates: 4.18% on 15 July, 5.75% on 16 July. Both days also coincide with the weekend call volume collapse (4K calls/day vs ~51K on weekdays). Jul 17 partial data (07:12 UTC) shows 6 errors on 675 calls = 0.89%, suggesting the rate is returning toward normal as weekday activity resumes.
The root cause is still unknown. Three hypotheses: (a) a deploy late in the week introduced a function that fails gracefully for heavy users but hard-errors on cold paths; (b) the low weekend call volume means a single failing user session dominates the rate; (c) an auth session expiry pattern that surfaces on day 5–7 of a login (weekends being the furthest from a weekday login). The backend "Not authenticated" cluster in Sentry (116 events from 4 users across multiple issue IDs) points toward hypothesis (c).
Surface: App Health
18 issues completed against 49 created this week (net −31), versus 34 completed against 55 created last week (net −21). The completion count dropped 47% week-on-week while creation stayed roughly flat. 64 high-priority issues open; 30 in the BET backlog (beta-blocking surface); 9 items In Progress in DEV. Three instrumentation tickets (DEV-2071/2072/2076) have been In Progress for 6+ briefing cycles without completing — they may be pulling focus without shipping.
Snapshot fetched: 2026-07-16 06:10 UTC. All sources live. Context: friends-and-family beta, 4 WAU, £0 MRR. First full data day since the 3-day API outage (13–15 July); the 15 July briefing was the first successful return.
162 errors on 3,874 total Convex calls on 15 July, giving a 4.18% error rate. The trailing 7-day average for error rate is 0.21% (ranging 0.05–0.79% across 9–15 July, with the prior spike on 13 July reaching 0.79%). The 15 July figure is the highest recorded.
What makes this harder to read: total Convex call volume on 15 July was also just 3,874 — down 90% from the 7-day average of ~52,000 calls/day. Both the error rate spike and the volume collapse happened simultaneously. Possible explanations: a single user session that generated proportionally many errors, or most users were inactive while one user hit a broken flow. The 59 Sentry mobile events on 15 July (highest single day this week) support the second reading.
This needs a look at which specific Convex calls generated errors on 15 July.
Surface: App Health
A new Sentry error class appeared on 15 July: `SyntaxError: Failed to execute 'appendChild' on 'Node': missing ) after argument list` — 11 events, 4 users affected (#134568909). A second related error fired twice at the same time: `SyntaxError: Unexpected identifier 'AW'` ().
| Linear | ✅ ok |
| Adapty | ✅ ok | All metrics £0 — beta stage |
| CCI / Convex | ✅ ok | 0 drift pending, 0 submissions pending |
| BigQuery (population) | ✅ ok | 2 active users in TW1, 6 projects tracked |
| Ad Spend (Meta / Google) | ⚠️ stale | Credentials not configured — `META_ACCESS_TOKEN`, `META_AD_ACCOUNT_ID`, Google Ads OAuth tokens needed |
| GCP / BigQuery billing | ⚠️ stale | Billing export to BigQuery not yet enabled |
Surface: Linear
Sentry #134568909 (`SyntaxError: Failed to execute 'appendChild'`) first appeared 15 July with 11 events across 4 web users. Yesterday's briefing flagged this as same-day priority and hypothesised Google Tag Assistant preview mode as the cause — `tagassistant.google.com` accounts for 23 of 31 unique visitors this week, and Tag Assistant injects script fragments that can conflict with page rendering. This hypothesis has not been confirmed or ruled out. If the errors correlate exclusively with Tag Assistant sessions, they can be filtered in Sentry and downgraded. If they affect organic visitors, this is a production JavaScript error blocking real users on the homepage for 3 days.
Surface: Sentry #134568909
Two Sentry issues tracking Adapty profile fetch timeouts: #109003255 (27 events) and #131439859 (9 events). Combined 36 this week vs 81 last week. The 9 July spike (66 events in a single session) has rolled off the 7-day window. COD-3374 and COD-3375 shipped 13 July to address paywall correctness — it is plausible they reduced the Adapty call frequency and brought the timeout rate down. Crash-free users remain at 75% (1 of 4 WAU), so the fix is partial rather than complete.
The backend (Convex) error cluster — primarily "Uncaught ConvexError: Not authenticated" — generated 94 events this week versus 158 the prior week, a 40% reduction. Three bug fixes shipped this cycle: reconcileTask omitting houseId (COD-3372), SaveEstimateDialog failure on partial-success state (COD-3381), and AddExpenseModal non-atomic stock withdrawal (COD-3383). The "Not authenticated" cluster is still open and still the largest single Sentry group by event count, but it is declining.
This week: 407 impressions, avg position 22.5. Last week (Jul 7–13): 354 impressions at avg position 24.2. Up 15% in impressions and 1.7 positions better in ranking, with no paid channels active. Top queries showing up: "estimated costs of renovations" (7 impressions, position 26), "diy bathroom remodel cost estimator" (1 impression, position 9). 1 click this week (CTR 0.25%) — position is not yet click-generating but the trajectory is right.
1. Identify the functions generating Convex errors on Jul 15–16 Error rates of 4.18% and 5.75% on consecutive weekend days with no equivalent spike on weekdays. Jul 17 partial data is already back to 0.89%, suggesting a weekend-only pattern. The backend "Not authenticated" Sentry cluster (116 events, 4 users) is the most likely source — cross-reference the Axiom error log for Jul 15–16 against session tokens and which specific functions threw. If it is auth expiry, the fix is a proactive session refresh before weekend inactivity. → App Health · Axiom
2. Confirm the web SyntaxError root cause — day 3 Sentry #134568909 has been open since 15 July. Check whether all 4 affected users came from `tagassistant.google.com` referrer (if yes: Tag Assistant noise, filter and close). If any affected user came via organic or direct, this is a live production error blocking homepage visitors. Either outcome takes 10 minutes to confirm in Sentry's user/session data. → Sentry #134568909
3. Fix MailerLite webhook — name the blocker this run 7 subscribers, 0 emails sent, 20+ days. This has been Action Item #2 in every briefing since 8 July with no recorded progress. The ask is not to fix it today but to name the specific blocker: is the webhook URL misconfigured, is there a missing API key, or is the form simply not sending signups to MailerLite at all? One named blocker is actionable; "still not fixed" is not. → MailerLite automations
4. Set a ship date for DEV-2071 or reduce scope to ship the UTM piece alone DEV-2071 (UTM first/last touch) is the smallest of the three instrumentation tickets and the most immediately valuable — it would retroactively attribute the Jul 15 organic spike. If the full ticket is blocked, a reduced version that just stamps `first_touch_source` on sign-in would provide 80% of the value. 6+ briefing cycles In Progress with no completion. → DEV-2071
5. Confirm Adapty timeout is genuinely declining and not just quiet 36 events this week vs 81 last week (−56%) — but crash-free users is still 75%. Check the date of the most recent Adapty timeout event in Sentry #109003255. If the last event was before 13 July (COD-3374/3375 ship date), the fix worked. If events have continued since, the timeout root cause is still live and the week-on-week improvement is a sample artefact. → Sentry #109003255 · Sentry #131439859
| Source | Status | Notes |
|---|---|---|
| Sentry (mobile + web + backend) | ✅ ok | |
| PostHog | ✅ ok | |
| GSC | ✅ ok | Window: 9 Jul – 15 Jul |
| MailerLite | ✅ ok | |
| Axiom / Convex | ✅ ok | |
| Linear | ✅ ok | |
| Adapty | ✅ ok | All metrics £0 — beta stage |
| CCI / Convex | ✅ ok | All maintenance crons healthy; PropertyData refresh completed (1,779 items) |
| Ad Spend (Meta / Google) | ⚠️ stale | Credentials not configured — `META_ACCESS_TOKEN`, `META_AD_ACCOUNT_ID`, Google Ads OAuth tokens needed |
| GCP / BigQuery billing | ⚠️ stale | Billing export to BigQuery not yet enabled |
4 affected users is meaningful relative to this week's web session count (306 sessions) and unique visitors (30). This has the shape of a malformed JavaScript payload reaching browsers — possible causes include a misconfigured third-party script tag, a build asset cached from a broken deploy, or Tag Assistant injection (the top referrer `tagassistant.google.com` accounted for 23 visits this week, which is itself anomalous and likely explains the SyntaxError pattern: GA Tag Assistant preview mode injects script tags that can conflict with page rendering).
Either way, 4 organic users hitting a SyntaxError on the homepage is worth a same-day triage.
Surface: Sentry #134568909
Two separate Sentry issues both titled `Error: Adapty profile fetch timed out after 8000ms` — issue #131439859 logged 54 events this 7d (up 157% from 21 prior), and issue #109003255 logged 26 events (up from 1 prior = +2,500%). The crash-free user rate has dropped to 75% (1 of 4 WAU hit a crash session), down from 80% yesterday. COD-3374 and COD-3375 shipped 13 July to address paywall correctness — they may have addressed a contributing cause, but the timeout events clearly continued after that. The root cause (Adapty SDK timing out before returning a profile) remains open.
Surface: Sentry #131439859 · Sentry #109003255
The largest weekly traffic figure since the cockpit has been running. 63 of those 99 pageviews landed on 15 July alone: 38 direct, 25 organic. The organic spike is the signal — 25 organic visits in a single day versus a prior week that saw organic visits on only 2 of 7 days. GSC shows avg position improving (23.7 this week) and 426 impressions — not yet converting to clicks (1 click, 0.23% CTR), but the search visibility is there.
No paid channel is active. This is entirely owned traffic.
The `AddExpenseModal 'use existing material'` path was withdrawing stock non-atomically — a retry after a partial failure would double-decrement inventory. Fixed and closed yesterday. A data integrity bug in the materials/budget flow with potential knock-on to reconciliation accuracy.
1. Investigate 15 July Axiom error rate spike 4.18% error rate (162 errors on 3,874 calls) — 20x the trailing average. Cross-reference which Convex functions generated errors that day with the Sentry mobile events from the same date. The simultaneous call volume collapse (90% below average) suggests one user was active in an error-generating state while others were inactive. Identify the failing function and whether it's still failing today. → App Health tab · Axiom
2. Triage the web SyntaxError — same-day priority Sentry #134568909 — 11 events, 4 users affected on 15 July. The `tagassistant.google.com` referrer pattern (23 visits this week) is the most likely cause: GA Tag Assistant preview mode injects script fragments that can produce exactly this class of SyntaxError. Check whether the errors correlate with Tag Assistant sessions; if so, the issue is test-tool noise and can be filtered. If not, this is a production JavaScript error blocking real visitors. → Sentry #134568909
3. Diagnose and resolve Adapty 8000ms timeout 80 events across two issues this week, both still unresolved. Crash-free users at 75%. COD-3374/COD-3375 did not close the timeout issue. Options: raise the timeout threshold in the Adapty SDK initialisation, add a retry with exponential backoff, or check whether a specific Adapty API endpoint is slow on the UK network path. → Sentry #131439859 · Sentry #109003255
4. Prioritise DEV-2071 / DEV-2072 / DEV-2076 for the next sprint With traffic growing (99 pageviews this week, 30 unique visitors), the window to establish baseline attribution data is now. UTM carry-through (DEV-2071) and segment classification (DEV-2072) are the prerequisite for understanding where the 25 organic visitors on 15 July came from, and whether they match the target segment. DEV-2076 gates the entire activation funnel. None of these are new issues — they have been In Progress for 5+ briefing cycles. → DEV-2071 · DEV-2072 · DEV-2076
| Source | Status | Notes |
|---|---|---|
| Sentry (mobile + web + backend) | ✅ ok | |
| PostHog | ✅ ok | |
| GSC | ✅ ok | Window: 8 Jul – 14 Jul |
| MailerLite | ✅ ok | |
| Axiom / Convex | ✅ ok | |
| Linear | ✅ ok | |
| Adapty | ✅ ok | All metrics £0 — beta stage |
| CCI / Convex | ✅ ok | All maintenance crons healthy |
| Ad Spend (Meta / Google) | ⚠️ stale | Credentials not configured — `META_ACCESS_TOKEN`, `META_AD_ACCOUNT_ID`, Google Ads OAuth tokens needed |