FunnelKeeper + First-party event tracking
The path for products with no replica to expose. A browser snippet or a server-side POST writes into the same warehouse as MySQL and GA4, so a tracked event and a database row are the same kind of fact.
What FunnelKeeper reads from First-party event tracking
- Funnel events you send: a canonical stage, a dedupe id, and optional name, identity, attribution and value in cents
- Browser first-touch and last-touch attribution, kept in localStorage by the snippet
- Identity calls, so anonymous sessions stitch to a person once they sign in
What it never does
- No auto-pageview tracking — GA4 or PostHog already own traffic, and double counting would be dishonest
- No third-party cookies, no cross-site profile, no advertising use of your visitors' data
- Public write keys can only write events; they cannot read anything back
How to connect First-party event tracking
Integrations → Event tracking (copy the snippet or the key) <script src="https://api.funnelkeeper.com/fk.js"> then fk.track(...) Paste as Custom HTML, or let FunnelKeeper publish it for you track_events, get_tracking_snippet, rotate_tracking_key POST /products/{slug}/events (batch 500) or POST /t/events (batch 25) Real time. Events are written as they arrive.
First-party event tracking questions
Is this a replacement for GA4?
No, and it is not trying to be. It does not auto-track pageviews or build audience reports. It exists so the funnel steps that matter to your revenue — signed up, activated, paid — arrive reliably even when no database is exposed.
Why does every event need a dedupe id?
Because ingest is idempotent by design. Sync windows overlap and retries happen; the dedupe id is what lets the same event arrive twice without inflating your funnel.
What is the difference between the two endpoints?
POST /t/events is public and takes a fk_pub_ write key in the body — it ships in page source, so it can only write. POST /products/{slug}/events needs a real API key or session and accepts larger batches; use it from your backend.
Usually connected alongside
Google Tag Manager
Catch the broken tag that is quietly spoiling every number you trust.
Read what it pulls →Google Analytics 4
Sessions, channels and landing pages — the traffic half of the payback join.
Read what it pulls →MySQL
Turn rows in your existing MySQL database into a joined customer journey.
Read what it pulls →Connect First-party event tracking on the free tier. The first sync backfills history, so the dashboard opens with something in it.
Start freeAgents: the same page as markdown at /integrations/event-tracking.md.