Erdi never connects to your database. You post what you want on the timeline, from wherever your data already lives. Postgres, MySQL, Mongo, Firebase, a spreadsheet — it makes no difference. The features described in these docs are the current state of the product and will keep evolving.
API — Post events and metrics from cron, CI, or scripts/erdi-event.sh when a webhook is not available.
Your own numbers — Users, revenue and whatever your product counts, from your own database.
Web attribution — Optional marketing-site snippet and Stripe or Paddle Checkout visitor id — first touch to checkout.
Vercel — Deployments become events on the timeline. Vercel webhooks need a Pro plan — on Hobby, post from your coding agent.
GitHub — Releases, tags and closed user-facing issues.
Paddle — Subscriptions and payments become events on the timeline. Need a visitor snippet first? Create one in Settings → API. For web attribution, pass customData.ek_visitor_id (localStorage ek_vid) into Paddle.Checkout.open.
Stripe Checkout attribution — Checkout completions with a visitor id become attribution markers on the timeline. Need a visitor snippet first? Create one in Settings → API.
Erdi shows what your connected sources send, and a few calculations on top. Those figures are for direction — not bookkeeping, tax, or a claim that one thing caused another. Three limits that actually apply in the product:
Day totals are not cohorts. Funnel rates compare daily aggregates on the same calendar day. They are not conversion rates for the same people over time.
iOS attribution is not available. ROAS and CAC here are blended — spend and outcomes side by side, not attributed to a campaign or click.
Imported history is fuzzier than live capture. The first pull of past days (backfill) can mis-count renewals as new payers until ongoing capture covers the day. Charts mark that window.
Typical range is historical spread, not a forecast. On Overview, Releases and Investigate, Erdi shows how much a metric usually moves week over week — the median absolute change between consecutive 7-day averages over the last 90 days. It needs at least eight such comparisons before a range appears; until then the usual data minimums apply. A delta inside that band is shown more quietly; one outside it is not labeled as good or bad — only as larger than what this metric has done lately.
More detail (and liability limits under German law) lives in the Terms.