Who's behind PaidCheck
PaidCheck is built and run by Frank Murcelo, a solo builder in Lancaster, Pennsylvania. It's self-funded, and the code is written with AI assistance and reviewed before it ships. There's no team behind a support queue: email support@paidcheck.app and it reaches Frank.
PaidCheck compares Stripe with who actually has access in your app, and flags people who paid but are locked out, people who stopped paying but still have access, double charges and failed webhooks. Because that means handing over a Stripe key, this page explains plainly what that key can see and what happens to it. The Security page and Privacy Policy have the full detail.
What the read-only key can see
PaidCheck asks for a Stripe restricted key (rk_live_… or rk_test_…). When you create it, you set these to Read and everything else to None:
| Customers | Read | match a subscription to the customer's email, ID and metadata |
| Subscriptions (Billing) | Read | know who is active, trialing, past_due, unpaid or canceled, and seat quantities |
| Charges | Read | detect duplicate charges, refunds and one-time payments |
| Events | Read | find events whose webhook delivery failed (pending_webhooks > 0) |
| Webhook Endpoints | Read | detect disabled endpoints and endpoints missing key events |
| Checkout Sessions | Read (optional) | one-time purchases (mode=payment) and telling separate checkouts apart |
| Invoices | Read (optional) | link charges to subscription periods (fewer double-charge false positives) and invoice emails |
| Entitlements | Read (optional) | count Stripe active entitlements as paid access |
With those permissions, PaidCheck reads customers (ID, email and user-ID metadata), subscriptions (status, price, interval, quantity), charges from the last year (amount, currency, time, refund status, billing or receipt email, description and metadata), events from the last 30 days that weren't delivered to your webhooks, and your webhook endpoints' URLs, status and event types. If you add the optional permissions, it also reads invoices, completed Checkout Sessions and active entitlements.
What it can't see or do
- It can't read anything you leave at None. PaidCheck never asks for balances, payouts or any other resource beyond the list above.
- PaidCheck only makes read (list) requests. It never creates, updates, refunds or deletes anything in Stripe, and never needs Write on anything.
- It can't tell whether your key also has Write permissions, because it never makes write requests. Please check that everything else is set to None when you create the key.
- Live secret keys (
sk_live_…) and publishable keys (pk_…) are refused. The free report and monitored apps still accept test-mode secret keys (sk_test_…), which only reach Stripe test-mode data; a restricted key is better there too.
What's stored, and what isn't
- Free report: nothing. Your key, any access-feed credentials and any CSV are used for that one request, in memory. The results go back to your browser, and we don't store the key, the CSV, the Stripe data or the report.
- Key checker: nothing. The restricted key checker makes one read-only list request per resource and doesn't store or return the key.
- Monitored apps (paid plans): the Stripe key and any app credentials or uploaded CSV are encrypted with AES-256-GCM before they're stored in private Vercel Blob storage. We also keep the latest report (overwritten on each daily check, and it can include end-users' emails, Stripe IDs and amounts) and a compact daily history that's deleted after 400 days.
- Your account: your email, plan, sign-up time and, if you subscribe, your PaidCheck Stripe customer and subscription IDs. Never card details.
- Email list: only if you opt in. The address goes to our contact list at Resend, our email provider.
- Analytics: cookieless page views and anonymous events, plus anonymous daily counts of a few actions. No keys, emails or IP addresses are attached.
The Security page lists every item and how long each is kept.
How to revoke the key
- In the Stripe Dashboard, go to Developers → API keys.
- Find the restricted key you created for PaidCheck and roll or delete it. PaidCheck can't read anything after that.
- If you have a monitored app, use Delete app & keys on its page to delete the encrypted credentials, report and history right away. To delete your whole account, email support@paidcheck.app.
For the free report there's nothing to delete on our side, since nothing was stored, but you can still delete the key in Stripe when you're done.