churn.fyi

A LITTLE MORE CLARITY, A LOT LESS GUESSWORK

Why did your
return rate change?

Your audience changed. Their behavior did, too.
See how each shows up in the numbers.

Compare two completed weekly or monthly return windows using aggregate counts.

Bring your own numbers
Local processing · No signup · No uploads · No saved sessions

THE RETURN-RATE ANALYZER

Start with the right comparison

Loading local app…
01

Your aggregate counts

One row per segment, per comparison. Use distinct people, with returners counted only from the eligible group.

Required columns, in order: comparison, segment, eligible, returned. Maximum 1 MiB · 2,000 rows · UTF-8

Aggregate counts only. Do not include customer names, IDs, emails, or event-level records. Use non-identifying segment labels.

What exactly do I count?

Eligible = distinct people active in the base window. Returned = those same people active again in the immediately following window. Count each person once within one exhaustive, non-overlapping segment partition. Keep the activity, identity, filters, and assignment rules consistent.

This is next-period return rate, not permanent churn, new-user cohort retention, or current active users divided by prior active users.

A QUICK REALITY CHECK

These are your assertions.
Aggregate counts cannot verify upstream definitions.

Nothing is saved automatically. Reset or reload to clear the working state.

UNDER THE HOOD

A bridge, not a black box

Overall return rate is total returned ÷ total eligible. It’s weighted by the size of each segment, never an average of segment rates.

We use a symmetric midpoint decomposition to separate changes in audience mix from changes in within-segment return rates. The two contributions reconcile to the overall change.

Read the math & limitations

For each segment: mix = (current weight − baseline weight) × average return rate. Within = (current rate − baseline rate) × average weight. Both averages use the two comparisons equally. Add the terms across segments.

This splits the interaction equally between the two orderings. It’s a convention, not the only possible allocation. Results depend on your segmentation and upstream definitions. Monthly windows can have different lengths, and the method does not control calendar effects.

Segment mix terms can be large and offset. They are not independent operational causes. No causal effects, confidence intervals, significance claims, or forecasts are inferred. A person may appear in both comparison populations.

Zero eligible people in any paired segment allows an overall summary only. We don’t invent the missing rate, drop the segment, or force a decomposition.

Method: symmetric_rate_mix_v1

PRIVATE BY DESIGN

Your analysis stays here

This app reads and calculates locally in your browser. It doesn’t send your file, labels, metadata, or results to a server, and doesn’t save them in browser storage.

Resetting or reloading clears the app’s working state. Downloading or copying is always your choice.

The important fine print

Tinylytics records page views using the page URL and referrer. It does not receive your analysis inputs or results. Its optional tracking opt-out uses a browser storage preference.

The host and analytics provider may receive ordinary delivery metadata, such as IP address, user agent, page URL, and request time, while serving the app. Actual hosting retention settings must be reviewed before deployment.

Browsers, extensions, operating systems, crash recovery, managed-device tools, screenshots, downloaded files, and synced clipboards are outside this app’s full control. Clearing state is not guaranteed forensic erasure. This build is not an independent security audit or compliance certification.

Aggregate data can still be sensitive. Use only data you’re authorized to analyze. Support requests should use synthetic examples.

Save a local file?

This creates a file on your device. Your browser or operating system may sync or retain downloaded files.

The report includes the comparison metadata and results shown here.