# FunnelKeeper + First-party event tracking

> No database to connect? Send funnel events straight from your site or backend.

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.

- **Category:** Conversions & revenue
- **Access:** you send, we store
- **Sync:** Real time. Events are written as they arrive.
- **On demand:** no — scheduled 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

| Surface | How |
| --- | --- |
| 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) |

## FAQ

### 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.

## Related

- [Google Tag Manager](https://funnelkeeper.com/integrations/google-tag-manager/) — Catch the broken tag that is quietly spoiling every number you trust.
- [Google Analytics 4](https://funnelkeeper.com/integrations/ga4/) — Sessions, channels and landing pages — the traffic half of the payback join.
- [MySQL](https://funnelkeeper.com/integrations/mysql/) — Turn rows in your existing MySQL database into a joined customer journey.

Full catalogue: https://funnelkeeper.com/integrations/ · Machine index: https://funnelkeeper.com/llms.txt
