byForja Tools · Analytics map

Analytics map — what we track

Source of truth for every event type captured by bf-tracking.js

All events are POSTed by bf-tracking.js to /api/events on byforja.com, enriched server-side (country, browser, device, source class, bot detection), and stored in D1 byforja.events. Tools binds the same D1 read-only for dashboards.

Event type When it fires Meta payload Notes
page_visit On DOMContentLoaded (none — base fields only) Auto-fired by bf-tracking.js
page_exit On pagehide / beforeunload { path, ms, max_depth, had_conversion } Single structured exit event
scroll_depth When scroll crosses 25/50/75/100% { depth } One per threshold per page load
time_on_page On pagehide / beforeunload { ms, max_depth } Visible-time only (excludes hidden tab time)
click On every click (debounced 400ms) { x, y, tag, id, track_id, text } Coordinates as % of viewport
outbound_click On click of external <a> { host, href } Captured before navigation
contact_link_clicked On click of mailto: / tel: / sms: { scheme, href } Counts as conversion-adjacent
cta_call_clicked Manual bfTrack() on "Book a call" CTA (custom) Wire on byforja.com CTAs
cta_signin_clicked Manual bfTrack() on Sign-In button (custom) Pending Sign-In UI rollout
nav_lang_switched Manual bfTrack() on FR/EN toggle { from, to } Pending wiring
newsletter_signup Manual bfTrack() on newsletter form submit (custom) Pending newsletter
web_vital Auto (LCP / FID / CLS) { name, value } Pending Web Vitals integration
js_error Auto on uncaught JS error { message, stack, source } Pending error handler

Server-side enrichment

Each incoming event is enriched before insertion into D1:

Self-exclusion

Visit any byforja.com page with ?bftrack=off to disable tracking on your device (localStorage flag). Re-enable with ?bftrack=on.