How verification works
Agency marketing runs on claims: client counts, revenue, retention, case studies. Buyers can't check any of it, so they fall back on reviews, and reviews can be bought. We replace the review with a receipt: numbers computed from a payment connection the agency cannot edit and we cannot exceed.
The agency connects a read-only key that is technically incapable of showing us client identities. We compute totals from it daily, publish them as floors, and answer buyer questions with exactly three states: verified, partially verified, or unverified. Never “false”.
The scoped key: blind by permission, not by promise
Verification starts with a Stripe restricted API key the agency creates in its own dashboard. Stripe enforces each permission on its servers: a request outside the grant is rejected before we ever see data. This is the exact scope we ask for, and everything not listed defaults to None:
| Stripe resource | Access | Why |
|---|---|---|
| Subscriptions | Read | Amounts, intervals, statuses, and start/cancel dates. Subscription records identify clients only by an anonymous ID, so this is where client counts and retention come from without names ever appearing. |
| Analytics & Reports | Enabled | Stripe's own aggregate endpoints: monthly recurring revenue, churned revenue, and category totals for refunds. Pure totals, no per-client rows. |
| Balance | Read | Confirms the account is live and settling. |
| Customers | None | Customer records hold names and emails. The key cannot fetch them. An agency's client list is its most guarded asset; we are structurally unable to see it. |
| Charges & Refunds | None | Individual charges carry the payer's billing details. Blocked at the permission layer. |
| Invoices | None | Invoice objects carry the client's name and email on every record, so we do not read them at all. Payment health comes from subscription statuses instead. |
A PROMISE
“We access your customer data but we pledge not to store it.” The reader has to trust the platform's data handling. Most verified-data products work this way.
A PERMISSION
“The key you created cannot return customer data, and you can confirm that in your own Stripe dashboard before you paste it.” Nothing to trust. That is our model.
What we compute, and what we refuse to publish
From that scope we compute four aggregates, re-synced daily:
- Verified monthly revenue: the total on connected rails, published as a floor with a visible “+”.
- Active clients: distinct anonymous customer IDs with an active subscription.
- Median retention: tenure computed from subscription start and cancel dates.
- Payments current: the share of active subscriptions not past-due or unpaid.
Raw API responses are discarded after each computation. We store the aggregates, the sync timestamp, and nothing else.
We refuse to publish anything that requires reading records with client identity on them, any “quality score” we would have to invent, and any figure about an agency that has not connected. There are no profiles of non-members, no scraped pages, no shadow rankings.
Floors, never ceilings
Agencies get paid on many rails: card, bank transfer, wire, local methods. A payment connection shows us only the rails behind it. So every verified figure is a minimum, marked as such everywhere it appears. This cuts both ways, deliberately:
- An agency showing $84,200+ verified may well earn more. The floor is still worth more than any screenshot, because it cannot be faked.
- A claim above the floor is not evidence of dishonesty. The difference may simply live on rails we cannot see. This is why the claim checker never says “false”.
The three states
Every claim checked against a verified agency gets exactly one of three answers:
- Verified. The connected data supports the full claim.
- Partially verified. The data supports part of it, stated as “we can verify at least X”. The remainder is outside our view, not contradicted.
- Unverified. The claim is not covered by connected data. Unverified describes our coverage, not their honesty.
There is no fourth state. A platform that publishes “this agency lied” is making an accusation it cannot prove from a floor, and we built the product so we never have to.
Opt-in, exit, and corrections
- Opt-in only. A profile exists because the agency created it, connected its own key, and agreed to publication. We never publish data about anyone else.
- Exit anytime. Revoking the key in Stripe kills our access instantly. The agency can also remove its profile entirely, no questions, no retention period.
- Corrections fast. If a published figure is wrong, the agency flags it, we freeze the figure, re-sync, and correct or annotate within one business day.
What verification costs
Nothing, forever. Verification, the profile, the badge, and the claim checker are free for every agency, permanently. The business runs on clearly labeled sponsor attention beside the data and on paid tooling around it. Money buys visibility next to the table. It never buys the numbers, the badge, or a row in it.
Get verified
- Create a restricted key in your Stripe dashboard with the exact scope above. Takes about two minutes; we show every click.
- Paste it once. We validate the scope first: a key that can read customer data is rejected, not quietly accepted.
- Your profile goes live with the first sync, along with your embeddable badge and your claim-checker link to hand to prospects.
“Don't take my word for any number in this deck. Here is my claim checker.”