← All integrations Conversions & revenue

FunnelKeeper + MySQL

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.

Accessread-only
SyncHourly
On demandSync now 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

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

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. Saving credentials also triggers a sync, so the dashboard fills in one step.

MySQL questions

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.

Usually connected alongside

Connect MySQL 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/mysql.md.