Skip to content

Site measurement: the questions we must always be able to answer

Started 2026-10-14 after two real inquiries arrived with no record of how they found us (they came from Google; see embeddedera-site Log). Rule: every question below has a named source. If a new question has no source, add a row here and close the gap; do not wait until the question is urgent.

Volume caveat: 20-50 visits a day. Funnel percentages are noise for months; individual sessions and individual inquiries teach more than rates.

# Question Source Status
1 How did this inquiry find us? Form first-touch: utm tags or referrer host + landing page, plus optional "How did you hear about us?" (live 2026-10-14, eb63b6f) live, e2e verified 2026-10-14
2 Inquiries per week, by source form_submit event to /api/ev (D1 ee-usage) -> marketing-snapshot -> app Marketing page event live; snapshot/page wiring next
3 What did people search to find us? Search Console (search-report, gsc token) + Bing Webmaster; rare queries are anonymized by Google have
4 Which pages and sites bring visitors? Cloudflare Web Analytics (paths, referrers, country, device; minute-level via GraphQL, query day-by-day windows) have
5 Which pages and buttons lead people to Contact/Quote? cta_click on every same-site link to contact/quote/book/service/store, with place header/main/footer (site PR #15) -> marketing-snapshot source site -> app Reports > Website > Clicks toward contact built 2026-11-02, preview verified; live after PR #15 merges
6 Where do people abandon the contact/quote form? form_start / form_error (first invalid field name or server) / form_submit on contact, quote, assembly (PR #15) -> app Reports > Website > Form drop-off built 2026-11-02; live after PR #15 merges
7 Which free tools get used, and finished? /api/ev tool funnels (flashers, assembly-check); calculators not yet partial
8 Which note offers get clicked? /api/click -> R2 clicks/ -> scripts/note-clicks.sh have
9 Which social posts bring visitors and engagement? utm tags (SOP-018) + social-insights have
10 What do people actually do on a page (scroll, hesitate, rage-click)? Microsoft Clarity (owner approved 2026-10-14), branch clarity, consent banner for EEA/UK/CH, forms masked live 2026-10-14 (project yxstuvbmyv); daily numbers via marketing-snapshot --only clarity (2 calls/day: site-wide + per page; problem sessions = sessionsCount x sessionsWithMetricPercentage, fixed 2026-11-02 — before that every session was stored as a rage/dead click, 114 wrong rows removed, backup marketing.sqlite.bak-20261102-clarity); per-page report: app Reports > Website > Website pages (token ~/.config/clarity/env, 10 API calls/day max); app series need an assistant restart to show
11 Do our emails reach the inbox? DMARC aggregate reports (rua adiaz@); Gmail Postmaster needs far more volume than we send weak
12 Is the site fast and healthy? PageSpeed in search-report, uptime-kuma working: GOOGLE_API_KEY set in ~/.config/google/env, daily psi_score rows (5 pages) through 2026-11-02
13 Who links to us (backlinks)? Bing Webmaster GetLinkCounts in marketing-snapshot bing (metrics backlinks, linked_pages) + Search Console Links export (no API) collected daily from 2026-11-02 (0 links so far)
14 Store sales: orders, revenue, units, by source Woo orders + Order Attribution (utm survives in _wc_order_attribution_referrer even when source_type says typein, e.g. order 37 from an Instagram story) collected 2026-11-01 (marketing-snapshot --only store, paid orders only); app Store tab committed on cockpit (0700a56), release pending
15 Store funnel: product views -> cart -> checkout -> order Cloudflare RUM already records store.embeddedera.com; store source queries it one day at a time (wide windows come back sampled to nothing) collected 2026-11-01
16 Cricket page -> store clicks, QR scans, ad/video clicks cta_click on /cricket/ buy links (row 5), ?src=qr impossible (QR is engraved plain), utm per ad Buy clicks live 2026-11-01 (site bd65565, cta_click to=store, e2e verified, test rows deleted); QR and per-ad still need utm tags per ad
17 Which company is this visitor / inquiry from? (a) company_from_email in every inquiry email (work-email domain), (b) Company field on contact/quote/assembly, (c) org = Cloudflare asOrganization on every /api/ev row (company only on office networks; ISPs filtered at read time) -> /api/admin/visitor (Access) lists visitors by company live 2026-11-06 (235121a)
18 What did this inquirer read before writing, and for how long? site-wide view/leave (page, visible seconds, scroll) under the Clarity consent decision; form_submit.rid joins the request id -> visitor_history link in the inquiry email -> /api/admin/visitor?rid= live 2026-11-06 (235121a), verified on embeddedera.com

Rules

  • First party first: extend /api/ev, the D1 database, marketing-snapshot and the app Marketing page. No second dashboard.
  • Privacy page changes in the same commit as any new data (both languages).
  • Never self-host a heavy analytics stack on the Plex box (about 4 GB free RAM).

Log

  • 2026-11-02: Owner: "we need a report with [Clarity] so we learn how to improve" + "implement all this". Clarity parse bug fixed (ops-scripts 30346d1), per-page Clarity + site conversion + Bing backlinks collected (9da8dac), Meta reads not_connected while social is stopped. App Reports > Website (pages, clicks toward contact, form drop-off) on cockpit. Site PR angelEmbeddedEra/embeddedera-site#15 (CTA everywhere + form funnel, privacy EN/ES dated 2026-11-02) awaiting owner merge. Still open: PageSpeed key (#12).
  • 2026-11-02: App v2026.11.2 released with the Website reports; PR #15 merged (915faee) and deployed, form_start/form_error + cta place live on embeddedera.com. #12 was stale: the key was already set and PageSpeed has stored daily scores since 2026-10-02.
  • 2026-11-06: Owner chose visitor insights items 1, 3, 4 (company field + email-domain company; inquiry -> page history + network company + time on page; privacy EN/ES). Built on branch visitor-insights (worktree ~/embeddedera-site-visitors), PR angelEmbeddedEra/embeddedera-site#16 draft. Preview D1 migrated; production ee-usage migration 0002 (ALTER TABLE events ADD COLUMN org) was blocked for owner approval and MUST run before merge. Emails cannot be learned for visitors who never send a form; paid identity tools (RB2B, Leadfeeder) rejected: paid, EU-illegal.
  • 2026-11-06: Preview verified (view/leave rows with seconds and scroll, org filled e.g. Brightspeed, /api/admin/visitor behind Access; test rows deleted). marketing-snapshot excludes view/leave from tool-usage series (ops-scripts 614a24d). Not built yet: Clarity custom tag per inquiry (needs privacy line); app page for companies.
  • 2026-11-06: PR #16 merged (235121a) after owner applied migration 0002 to prod; deploy green; live check: view/leave rows land with org, Company field and privacy date live, /api/admin/visitor behind Access; test rows deleted. Owner still to open the admin page signed in.
  • 2026-11-06: Owner asked for 3 (Clarity tags) and 4 (app companies page). Site PR #17 (branch clarity-inquiry-tags): Clarity tag visitor=, inquiry= + upgrade on form send; /api/admin/visitor?org=; privacy EN/ES. Preview verified. Collector: company_* rows per network/day (ops-scripts 7021d1d). App: Reports > Website > Visitors by company (site_reports.company_rows, cockpit, ISP regex mirrored from visitor.ts — change both together).
  • 2026-11-06: Shipped: site PR #17 merged (0aeed40), deploy green, privacy tag line live and ?org= behind Access; app v2026.11.3 released (Visitors by company; 3056 tests, UI gate 1829/0, perf 0 failures). Handoff removed. Owner checks pending: open /api/admin/visitor signed in; next inquiry email shows company_from_email + visitor_history; Visitors by company fills as office-network visits arrive.