# Owned vs Rented Analytics: PostHog, Plausible, DataFast

> Every analytics vendor compared on the one axis that matters: who owns the data. And why revenue telemetry in your own SQLite beats them for solo founders.

Source: https://boringpush.com/blog/analytics-owned-vs-rented-posthog-plausible

## The question nobody asks before installing the snippet

Every analytics decision gets framed as features: funnels vs goals, replays vs heatmaps, AI analyst vs dashboard. Wrong frame. For a solo founder the frame is ownership: who holds the data, what happens when the vendor reprices, and whether a third-party script even fires in a browser running uBlock.

## The rented field, honestly priced (verify current)

**PostHog** ([posthog.com](https://posthog.com)) — the honest giant. 1M events/month free, then usage-based from fractions of a cent per event. Session replay, feature flags, funnels, AI analyst. If you need product analytics at scale with a real free tier, this is the best rented deal in the industry and it isn't close. The catch for solos: it's a platform relationship — SDK weight, event-volume thinking, a vendor dashboard between you and your numbers, and a pricing page that rewards scale you don't have yet.

**Plausible** ([plausible.io](https://plausible.io)) — $9/mo for 10k pageviews, privacy-friendly, no cookies. Clean and honest. The catch: pageview meters (a viral week reprices you), no revenue semantics (pageviews aren't sales), and it's still someone else's server.

**Fathom** ([usefathom.com](https://usefathom.com)) — $15/mo for 100k pageviews, same privacy story, bigger allowance. Same structural catch as Plausible: rented numbers, traffic-shaped bills.

**DataFast** — usage-based SaaS analytics in the same mold: simple until the meter runs. Fine product, rented foundation.

**Google Analytics** — free like a puppy is free: cookie banners, GDPR exposure, sampled numbers, and a UI designed for enterprises. You are the product being farmed for benchmark data.

## The three taxes every rented tool charges

**1. The meter tax.** Every vendor above converts your growth into their revenue. Traffic spike? Bill spike. The tool that's supposed to measure success taxes it.

**2. The blocker tax.** Third-party analytics scripts are what ad-blockers exist to kill. Industry estimates put blocker usage at 25–40% of tech audiences — the exact audience buying dev tools. Your rented dashboard confidently reports a fraction of reality and you'll never know which fraction. First-party endpoints (same domain as your app) don't get blocked, because blockers can't tell them from your product.

**3. The cookie tax.** Third-party cookies mean consent banners, GDPR surface, and a trust hit on first paint. Privacy-friendly vendors dodge this; Google doesn't. Owned analytics never had it.

## The owned alternative: revenue telemetry in your SQLite

The inbuilt analytics keeps every event where your money already lives: your database. One beacon endpoint on your own domain (`/api/analytics/track`, unblockable, first-party, with a cookie-free mode), funnels/referrers/live visitors computed by SQL you can read, dashboard at `/dashboard/analytics`, CSV export when you want more.

What it deliberately is NOT: session replays, heatmaps, AI analyst, cross-app portfolios. If you need to watch individual sessions, use PostHog free alongside — honesty requires saying so. What it IS: every revenue question answered (which page sold, which referrer converts, what's live right now) with zero vendors, zero meters, and numbers no blocker can eat.

The math: Plausible costs $108/year forever for numbers you could own. Fathom $180/year.

PostHog $0 until volume, then meters. Owned costs $0 forever and gets cheaper per insight as you grow, because queries don't meter.

## How the owned beacon works (30 lines, no SDK)

There is no analytics SDK, and that's the point. One first-party endpoint receives `{ event, props }`, stamps it with timestamp + referrer + UTM params from the request, and inserts one SQLite row. The client is eleven lines of fetch with `keepalive: true` — same domain, so blockers ignore it, and failed sends die silently instead of breaking your app.

```js
// The entire client. No SDK, no third-party domain.
function track(event, props = {}) {
  const body = JSON.stringify({ event, props, ref: document.referrer });
  if (navigator.sendBeacon) {
    navigator.sendBeacon("/api/analytics/track", body);
  } else {
    fetch("/api/analytics/track", {
      method: "POST", body, keepalive: true,
      headers: { "Content-Type": "application/json" },
    }).catch(() => {});
  }
}
```

Server side: validate the event name against an allowlist (never trust free-form strings into storage), attach the session's user id when logged in (anonymous otherwise — no fingerprinting theater), insert, done. Retention is a cron row (`DELETE WHERE createdAt < 90 days`) instead of a pricing tier.

## The five revenue events (track these, ignore everything else)

Most analytics setups drown in fifty custom events nobody queries. Solo revenue needs five: `signup_started`, `checkout_started`, `purchase_completed` (with amount), `magic_link_sent`, and `feature_used` (one per core action).

Every funnel question — where do buyers come from, where do they die, what's live right now — is a GROUP BY over these five. If an event can't appear in a revenue sentence, don't track it.

## What the dashboard actually shows (and the CSV escape hatch)

Three screens, no more. **Live** — visitors right now, their referrers, what they're reading; the answer to "is it working" at a glance. **Funnels** — signup_started → checkout_started → purchase_completed with drop-off percentages per step and per referrer; the answer to "where does money die." **Top content** — posts ranked by DBNull-free reads and by purchases influenced, so writing effort follows revenue instead of vanity traffic.

Every screen has the same footer: Export CSV. Not because you'll click it weekly, but because the button's existence is the whole argument — try finding an honest one-click full export in a metered SaaS dashboard.

Owned data exports in a heartbeat; rented data exports through a support ticket, a rate limit, and a retention window. The CSV button is the audit you run once, believe forever, and never need again.

## Migration: ripping out rented analytics in an afternoon

Morning: keep the old snippet running, add the beacon beside it, and compare numbers for a week — you'll watch the blocker gap with your own eyes (expect the rented dashboard to undercount tech audiences by a quarter or more). Afternoon of week two: export historical aggregates to CSV for the record, delete the third-party script (watch your Lighthouse score jump from dropping 100KB of tracker JS), cancel the subscription. Your dashboard Monday shows fewer, truer numbers — every one of them yours.

## FAQ

### Isn't PostHog's free tier enough for solos?

Often yes — 1M events/month covers most indie products, and saying otherwise would be dishonest. Use it when you need replays and funnels at scale.

Use owned analytics when you want revenue answers with zero vendors, a cookie-free mode, and data that survives vendor repricing. They compose fine.

### What about GDPR and cookie banners?

Owned analytics sets one first-party session cookie by default, none in cookie-free mode, and stores telemetry in your own database — no processor agreements, nothing leaves your server. Your privacy page gets one boring paragraph instead of a consent-management saga.

### Can I export my data later?

It's SQLite — `VACUUM INTO` a file, open it anywhere. CSV export ships in the dashboard. Try exporting your soul from a SaaS dashboard sometime for comparison.

### What can't owned analytics do?

Session replay, heatmaps, AI Q&A over events, multi-app portfolios, and 7-year retention compliance theater. If any of those is the job, rent that specific tool. Don't rent the whole category for one feature.

## The top-down verdict

Analytics vendors sell your numbers back to you with meters attached. An agent-first shipping kit keeps them in your SQLite: same funnels that matter, zero rent, first-party by construction. Boilerplates rent the category; starters document it; this deletes it.
