← All integrations Conversions & revenue

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.

Accessyou send, we store
SyncReal time
On demandScheduled only

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

Dashboard Integrations → Event tracking (copy the snippet or the key)
Browser <script src="https://api.funnelkeeper.com/fk.js"> then fk.track(...)
Tag Manager Paste as Custom HTML, or let FunnelKeeper publish it for you
MCP track_events, get_tracking_snippet, rotate_tracking_key
API 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

Connect First-party event tracking on the free tier. The first sync backfills history, so the dashboard opens with something in it.

Start free

Agents: the same page as markdown at /integrations/event-tracking.md.