Core concepts
Metrics & ownership
Two tools will happily report visitors, and their numbers will disagree. Rather than average them, add them, or pick one at random, every canonical field has exactly one owner — and the rest is context.
One owner per field
| Metric | Owner, in order of precedence |
|---|---|
| MRR, churn, new customers, failed payments, refunds | The active primary billing source: Stripe → Polar → Paddle → Lemon Squeezy → Dodo → Easytools. |
| Unique visitors, pageviews, visitor growth | Seiton snippet → GA4 → PostHog. |
| Active days, stickiness, activation | PostHog → Seiton snippet. |
| Organic clicks, impressions, CTR, position | Google Search Console. |
| Error volume, checkout errors, crash-free sessions | Sentry. |
| Deploy success rate, deploy failures | Vercel → GitHub. |
| Database and platform incidents | Supabase → Cloudflare. |
| Edge error rate | Cloudflare. |
| Operating margin, estimated profit | Billing MRR minus the monthly costs you enter. |
The rules this enforces
- Never summed. The snippet and GA4 both counting visitors does not produce twice the traffic — the snippet wins and GA4 stays context.
- Cloudflare requests are not visitors. Edge request volume never becomes a traffic number.
- CRM contacts are not customers. HubSpot writes no billing field, ever.
- Easytools does not double-count Stripe. It runs on your Stripe account, so with Stripe primary it adds checkout context and no MRR.
- Issue counts are not engagement. Linear and Resend connect for context and write no health metric at all.
Freshness decides what counts
| State | Meaning | Effect on the score |
|---|---|---|
| Healthy | Last successful sync is inside the provider's staleness window. | Counted. |
| Partial | The source is degraded but still reporting. | Counted, with lower confidence. |
| Stale | No successful sync inside the window — six hours for billing, two for error and infra sources, a day for Search Console. | Dropped. The dimension goes back to insufficient data. |
| Error / revoked | Credentials rejected, or you revoked them at the provider. | Dropped, and the Integrations page says why. |
| No data | Never synced. | Nothing to drop — the dimension has never scored. |
Dropped means missing, not zero
Windows and comparisons
Metric tiles carry their own window — now for MRR, 30d for churn, visitors and organic, 24h or 7d for errors. Deltas compare against the baseline snapshot, which is the previous week, and are shown in percent for counts and in percentage points for rates.
Every window is computed in the project's timezone, so "today" means the same thing to you and to the engine. Per-source detail — what each provider writes and how fast it goes stale — is on the integration pages.
Something here wrong or missing? hello@seiton.online
