alternative · comparison · tutorial

PostHog Bills $450. SQL Bills $0.

Event tiers, cookie banners, export limits: the $450 analytics habit. SQLite events plus SQL answers plus CSV exports, forever $0. Inside.

The PostHog logo, faded, with a curved arrow to the BoringPush logo
The PostHog logo, faded, with a curved arrow to the BoringPush logo · Photo: BoringPush

Paying to watch users

The PostHog dashboard was beautiful: funnels, cohorts, session replays watched like television. Then events crossed the free tier and the invoice arrived — $40/month climbing toward hundreds, for the privilege of observing a product still finding revenue. A pre-profit founder funding analytics Series A habits.

Worse, the cookie banner it required bounced EU visitors before they converted — money paid to lose customers, then paid more to analyze the loss. The snake ate its tail on the company card.

Posthog vs selfhosted analytics isn't tooling taste. It's whether observation should cost more than what's observed.

Rented vs owned measurement

Axis PostHog cloud SQLite events
Monthly cost $0 → $40–450+ $0 forever
Cookie set by default Tracking cookies One session cookie (first-party)
EU bounce cost Double-digit abandon Zero
Revenue joins Export-merge pipelines Same-DB SQL query
Session replay Yes (genuine edge) No (accepted gap)
Volume ceiling Tier negotiation Disk space

Three details make rented measurement rot:

  1. Free tiers are funnels, not prices. Generosity converts you; growth converts you to paid — the meter starts exactly when leaving hurts (history, dashboards, habits). Price at 10x current events on day one. Tiers acquire; meters retain (you, involuntarily).
  2. Banners tax every visitor. Consent walls bounce double-digit EU percentages before content loads — analytics that costs customers to measure customers. First-party tracking with cookie-free mode is a far simpler posture (verify counsel). Measurement should never cost measured.
  3. Revenue questions need joins. "Which source converts trial→paid?" spans events × orders × users — siloed tools export-merge dance while same-DB SQL answers in thirty seconds. Joins are the founder's superpower; silos charge admission to your own data. Owned rows join free.

The analytics-template post built the tables. This one deletes the bill.

Posthog vs selfhosted analytics migration

Export history, track natively, query freely — one weekend, $0 forever after.

Step 1 — Export history before canceling anything.

# PostHog export API → events JSON (timestamps preserved, user IDs mapped)
# transform: event → events table (name, path, userId, createdAt)
# verify: monthly counts match dashboard (±2% acceptable, documented gaps)

History migrates once (continuity for year-over-year launch comparisons), then the tap closes. Counts parity per month before canceling — migrated analytics with holes gaslights future decisions.

Export-verify-cancel, in that order, same weekend. Past preserved, future free.

Step 2 — Track server-side, first-party, adblock-proof.

-- events table (existing template): name, path, userId, referrer, createdAt
-- middleware logs pageviews (no client script, no third-party tag)
-- handlers log conversions (signup, checkout, refund — money paths complete)

Server-side tracking sees everything client scripts miss (adblocked users, bots filtered explicitly, no-JS edge cases) with zero privacy theater. No third-party script means no third-party tag to block — conversion recovers with page speed. Measurement invisible to users, complete for founders: the correct arrangement, finally.

Step 3 — Answer in SQL, export CSV on demand.

-- the five saved views covering 95% of founder questions:
-- activation, checkout conversion, retention cohorts, source revenue, churn reasons
-- admin route: CSV export per view (advisors, acquirers, curiosity — one click)

Saved views compound (each new question starts from working SQL, not blank dashboards). CSV exports satisfy external asks without seats or APIs.

Thirty seconds per ad-hoc question, forever, free — the analytics experience rented tools approximate with UI at $450. Queries beat dashboards for founder curiosity; dashboards beat queries for team rituals. Solos ask; teams share.

That's what flat bills buy — eyes open, wallets closed.

Rented vs owned, one year

Year PostHog cloud SQLite events
Cash ~$0 → $450+ $0
Cookie posture Third-party, banner likely First-party, cookie-free mode
Ad-hoc answers Minutes–hours UI ~30s SQL
Revenue joins Pipelines Same query
Session replay Watched sometimes Missed rarely

BoringPush measurement costs nothing to keep.

The honest bill: no replay theatre (heatmaps genuinely useful, occasionally), no polished shared dashboards (team rituals need screens), SQL literacy required (real afternoon). Priced against replay-nostalgia plus dashboard-envy: founders need answers, not theater. Replay the sessions that matter via logs; dashboard the metrics that repeat via saved views.

FAQ

Is posthog vs selfhosted analytics fair — isn't PostHog genuinely good?

Excellent product, honestly priced for teams — funnels, cohorts, replay, feature flags in one mature roof. The case against is solo-specific: tier math at low revenue, banner bounce pre-conversion, siloed revenue joins.

Great tool, wrong customer (pre-profit solos). Revisit at team scale; until then SQL serves curiosity better per dollar (infinite ratio, zero dollars).

What do I lose quitting session replay specifically?

Rage-click archaeology (watching confused sessions) and qualitative UX gold (real hesitation patterns). Mitigate: structured event sequences (click trails in events table reconstruct flows textually), plus targeted user calls (five conversations beat fifty replays for why).

Replay shows what; calls reveal why. Lose the theater, keep the learning via cheaper channels.

How do feature flags work without PostHog?

Tiny flags table (key, variant, userId hash) plus events measuring outcomes — same DB, same SQL, $0. Homegrown flags lack fancy targeting UIs and cover solo needs completely (percentage rollouts, per-user overrides, kill switches).

Flags plus events, both owned, total visibility. The features cluster details the pattern; analytics closes its loop natively.

Can I keep PostHog free tier forever by staying small?

Until growth (the goal!) breaks it — free tiers cap the success they helped create, forcing migration mid-momentum (worst timing: busy, growing, distracted).

Migrate on calm schedules (this weekend, deliberately), never under tier pressure (panicked, mid-launch). Voluntary exits cost weekends; forced exits cost quarters. Leave while leaving is cheap.

Gladly — investors read numbers, not dashboards (CSV with revenue joins impresses more than funnel screenshots). Same-DB revenue attribution (source → signup → paid in one query) answers diligence questions live on calls.

Owned data presents better because it joins better. Diligence loves joins; dashboards love renewals.

When should analytics graduate back to platforms?

Team-shared metrics daily (ten readers need screens), dedicated analyst role (professional tooling earns keep), compliance-certified pipelines (audited retention, access controls). Graduate on organizational triggers, never event volume (SQLite handles millions cheerfully).

Solo curiosity runs SQL; departments run platforms. Org chart decides, volume doesn't.

Keep reading

+ all the boring stuff (analytics, auth, SQLite ↔ Supabase, full marketplace, webhooks)

The Agent-First Shipping Kit

Command from your phone.

Built so autonomous AI agents build what you want without breaking what's already paying you.

$199

Get BoringPush

One-time payment · Lifetime updates · Unlimited projects.

Keep reading