Changelog
What changed in each release. Update any time with npx databull@latest update.
1.5.0
- Peak hours: a weekday-by-hour heatmap of visits, sales and revenue in your time zone. It outlines the busiest three hours ("Busiest on Wednesdays, 2–5 pm"), says when to post so you're there before the peak, and shows when buyers actually pay. On the dashboard, and on the Revenue page for sales.
- Scroll depth and reading time: how far visitors scroll and how long they really read each page (tab visible, idle time left out), with a scroll map of where readers drop off. Buyers are compared with everyone who didn't buy ("Buyers read 22% further and 2.2× longer on /pricing"). No setup: the script sends both when a visitor leaves a page, on the goodbye ping it already sends, for about one extra database write per page view.
- Path to purchase (Revenue page): how many days and visits customers take before their first purchase, the source that found them next to the source credited with the sale, the pages they saw before paying and the paths that end in a sale, by first source with "Impulse" and "Slow burner" badges.
- Chart notes: click any day on the dashboard chart to pin a note ("Launched on Product Hunt", "New pricing"). Traffic spikes DataBull alerted you about are pinned automatically. Notes stay private on shared dashboards.
- AI agents: three new tools, get_peak_hours, get_engagement and get_purchase_paths, and get_overview now includes the period's chart notes.
1.4.1
- Stripe Managed Payments: one-off sales were counted twice, once for the checkout and once for the invoice Stripe makes for it. Each sale now counts once, under its checkout, with its visitor and any refund. Sales already counted twice are merged on the first sync after updating (or click Sync now).
- Integrations: a payment connection can be disconnected after its API key was deleted or rolled in the provider. DataBull tells you which webhook endpoint to delete there yourself. If the provider is down, "Disconnect anyway" removes the connection without deleting the webhook.
1.4.0
- Import from Plausible: bring a site's Plausible history in from its CSV export (Site settings → Import history). The file is read in your browser and the dashboard shows those days as daily totals: visitors, pageviews, sources and campaigns, pages, countries, devices, browsers, systems, goals and outbound links. Imported days stop where DataBull's own data starts, so nothing is counted twice.
- Far fewer database reads, same numbers. Finished days are counted once and reused; each visit to a dashboard, the Sites page or an AI agent query then only counts today. On a site with ~100k pageviews a month a 30-day dashboard reads about 30 times fewer rows, and the Sites page about 25 times fewer, so busier sites stay well inside Cloudflare's free-plan read allowance and pages load faster. Every number, unique visitors included, is exactly what a full recount gives.
- Traffic spike alerts check the last hour first and recount the week's usual level at most hourly, instead of every 5 minutes for every site.
- Fixed: monthly charts (including the default "Last 12 months" view) failed for sites in time zones with daylight saving time, such as Europe/London or America/New_York.
1.3.0
- Checkout timing: when a sale arrives with nothing that links it to a visitor (no checkout metadata, no thank-you page visit, no known email), DataBull credits the one visitor who clicked checkout for that provider just before it. With several clickers it waits 30 minutes and credits the only one who came back from the payment page, or the only one who clicked in the last 30 minutes; otherwise the sale stays unattributed with a note saying why. These matches are marked "estimated" everywhere, proof (metadata, a thank-you page) replaces them, and each website can turn them off in Settings.
- Revenue: "Match unattributed sales again" re-checks older sales, and every unattributed sale says why it couldn't be matched.
- Payments API: send sales from your server for any provider (Lemon Squeezy, Paddle, Gumroad, PayPal, your own billing) with
POST /api/v1/payments. Same fields as DataFast's API, idempotent, with refunds, renewals and free trials. Create a payments key in the website's settings; it only works for that website and can't read analytics. - Live view: a cha-ching for every sale and, if you like, a soft ping for new visitors (the sound switch on the live card). Press M anywhere to open the live view, and M or Esc to close it.
- Campaign links: Settings → Campaign links builds tagged links for X, LinkedIn, Reddit, Hacker News, newsletters, ads and more, and previews exactly how DataBull will record their visits.
- Checkout links opened from JavaScript (
window.open) and checkouts on your own domain now count as checkout clicks.
1.2.0
- Creem: connect your Creem store with an API key and see which post, search or referrer made each sale, subscription and renewal. Creem payment links (creem.io/payment/…, and links on your own checkout domain) are tagged automatically, the webhook is created for you, and your past sales are imported. Test-mode keys connect your test store.
- A sale that DataBull saw before the details of its visitor arrived (say, by a scheduled check that ran before the payment webhook) is now linked to that visitor when they arrive.
- A thank-you page visit now links every charge of the order it names, not only the first.
1.1.0
- AI agents: ask Claude Code, Cursor, VS Code, Codex or Windsurf about your traffic and revenue ("which post made me money this month?"). Every install now has a built-in MCP server; run
npx databull@latest mcpto connect your agent in one step. - Read-only API keys under Settings → API keys & AI agents, with ready-to-paste setup for each client. Customer names and emails stay hidden unless you allow them per key.
- Your stats in the terminal:
npx databull@latest stats,sources,compare,sales,visitors,liveand more, with--jsonfor scripts.
1.0.6
- Your own visits (Site settings): stop counting your own browser with one click, and list IP addresses or ranges (home, office, team) whose visits aren't counted. "Add my current IP" fills in yours.
- The "Finish setting up" reminder on the dashboard can be dismissed, for sites that don't take payments.
1.0.5
- Dodo Payments: subscription charges are imported (first charges and renewals, including multi-subscription payments), from your history, the every-minute check and webhooks. Earlier versions skipped them because Dodo lists products only on one-time payments; updating re-imports the ones that were skipped, without sale alerts.
- Cloudflare's free plan: importing payment history no longer fails with "Too many subrequests". DataBull notices the free plan's 50-request limit, imports in small steps that keep their progress, lets each payment account take turns, and checks for new sales while history is still importing. "Sync now" works there too.
- Nothing changes on Workers Paid: history imports at the same speed as before.
1.0.4
- Revenue page: every tab in the sources panel is visible again ("Landing page" was cut off). When the tabs and the sort button don't fit on one line, the sort button moves under the tabs.
1.0.3
- Visitors page loads in a fraction of a second on busy sites. It used to slow down sharply as traffic grew and could time out with "Something went wrong", holding up the rest of the dashboard while it ran.
- Funnels load several times faster on busy sites.
1.0.2
- Updating from a second computer reuses your install's license activation instead of using up a new one.
1.0.1
- Settings → Data: the clean-up result shows once instead of twice.
- Settings → About: "License" is spelled the same way everywhere.
1.0.0 — first self-hosted release
- DataBull now installs into your own Cloudflare account with one command:
npx databull@latest. - Revenue-first analytics: every visit, goal and sale tied to the source that brought it (Dodo Payments, Stripe, Polar).
- Welcome screen on first run; the setup link from the installer fills in the setup token for you.
- The dashboard's fonts ship with it: no requests to Google Fonts.
- Forgot your password?
npx databull@latest reset-passwordopens a one-time reset link. - Settings → Data: choose how long traffic is kept, clean up now, see database size, erase one website's traffic. Clean-ups pace themselves so they never use up the free plan's daily database quota.
- Settings → About: your version, licence, and a heads-up with the update command when a new version is out.
- Built to stay inside Cloudflare's free plan for small sites: the tracker script and built files are served without waking the Worker, and clean-ups work in small daily batches.