# FunnelKeeper + MySQL

> Turn rows in your existing MySQL database into a joined customer journey.

Your signups, orders and payments already exist as rows. FunnelKeeper reads them with a read-only user and maps each table to a funnel stage, so revenue attributes to the channel that earned it instead of sitting in a separate report.

- **Category:** Conversions & revenue
- **Access:** read-only
- **Sync:** Hourly. A new connection backfills in stages — 30 days, then a year, then the whole table (as deep as your plan's history window) — then reads a rolling 7-day window.
- **On demand:** yes — Sync now is available

## What FunnelKeeper reads from MySQL

- Mapped funnel events from the tables you nominate — one table can feed several stages
- Customer identity (email or id) so a person's visits, signups and payments stitch into one journey
- Attribution columns you already store: utm_source, utm_medium, utm_campaign, gclid, referrer
- Transaction amounts as integer cents, in the currency the row is denominated in

## What it never does

- No writes. FunnelKeeper issues SELECTs; a read-only user is the supported setup
- No schema changes, triggers, or migrations against your database
- Credentials are encrypted at rest (AES-256-GCM) and are never shown back to you

## How to connect MySQL

| Surface | How |
| --- | --- |
| Dashboard | Integrations → MySQL → Connect database, then Event maps |
| MCP | connect_mysql, then set_mysql_event_maps |
| API | POST /products/{slug}/connections/mysql |

## FAQ

### Do I have to write the table mapping by hand?

No. POST /products/{slug}/connections/mysql/suggest-mappings reads your tables, columns and three sample rows and proposes a mapping — either by matching common schema presets or by sending the schema to a model. Nothing is saved until you review it. The dashboard exposes the same thing as a Suggest button.

### What access does the database user need?

SELECT on the tables you map, and nothing else. Point it at a read replica if you have one. The connection test runs a live SELECT 1 so you find out immediately whether the credentials and network path work.

### How does revenue get attributed to a channel?

Through the attribution columns in your event map. FunnelKeeper resolves utm/gclid/referrer values into a canonical channel and records first and last touch against the identity. Revenue it cannot tie to a channel is shown as unattributed — it is never spread across paid channels.

## Related

- [Postgres](https://funnelkeeper.com/integrations/postgres/) — The same row-to-funnel mapping as MySQL, schema-aware for Postgres.
- [MongoDB](https://funnelkeeper.com/integrations/mongodb/) — Map documents in your collections to funnel stages with dot-notation paths.
- [First-party event tracking](https://funnelkeeper.com/integrations/event-tracking/) — No database to connect? Send funnel events straight from your site or backend.

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