How to find every subscription you forgot you were paying for
A subscription you pay by card or bank transfer is already printed on one of your statements — the trouble is that the statement lists everything else too. The way to find them is to look for charges that repeat on a clock: the same merchant, at a steady price, on a regular gap. Two sightings is the minimum and one charge is never a subscription, so two or three months of statements is the floor. No bank login is involved anywhere on this page: everything here is done from the file your bank already gives you.
MyFulus is an AI personal accountant for people in the USA and the Gulf. Upload a statement and it reads every line, finds the charges that repeat, and shows what you really earn and spend — free for your first 3 statements, then $8.99/mo.
Everything below is how our own detector decides. The thresholds are the real ones, and so are the things it gets wrong.
Why is finding them harder than it sounds?
Three problems, and the third is not about arithmetic at all.
- Groceries repeat too. A weekly supermarket run lands on a clock as reliably as a streaming bill. Rhythm alone cannot separate them; only the amount can, because a subscription charges the same money and a supermarket does not.
- A charge that has not appeared has two explanations. It stopped, or the month it would appear in is not in front of you yet. A calendar cannot tell those apart, and anything that judges by the calendar will announce that half your subscriptions are dead the moment you fall a month behind.
- Plenty of things repeat that nobody can cancel. Rent. Fuel. Road tolls. Your own cash withdrawals. Zakat. A detector that finds those is working correctly. A page that then explains how to cancel them is not.
What counts as a recurring charge?
Four tests, and all four have to pass.
- Rhythm. The median gap between charges has to land in one of four windows: 6–8 days for weekly, 27–33 for monthly, 85–95 for quarterly, 350–380 for yearly. The windows do not overlap, so a rhythm matches at most one of them. Months are not the same length, so gaps of 29, 31 and 30 days all read as monthly — calendar drift is not irregularity.
- Count. Two charges are enough for monthly, quarterly and yearly — as long as the gap between them is the one that cadence asks for. Weekly needs three, because two payments seven days apart are far more often a coincidence than a plan.
- Regularity. At least 80% of the gaps have to keep that rhythm. One missed month inside a short series is enough to drop the charge; a longer history absorbs it.
- Amounts. Every amount has to sit within 15% of the middle one.
Charges are grouped by merchant after the statement line is tidied up — lowercased, extra spaces collapsed, then trailing store and reference numbers stripped repeatedly, because statements stack them. So a shop the bank reprints as SPINNEYS #1122, spinneys #3344 and SPINNEYS 987654 counts as one charge. A hash number always goes; a bare run of digits only goes at four or more, because a short number at the end of a name is as often part of the name as it is a store code. A merchant billing you in two currencies stays two charges, and the finished list is ordered by what each one costs per month, biggest first, so a yearly renewal is ranked against a monthly one honestly.
None of that is AI. An AI reads the statement and writes down each line; fixed arithmetic decides what repeats, with no model call, no database read, no clock and no randomness in it, so the same ledger always produces the same answer in the same order. Money is handled as whole thousandths of a currency unit rather than as a decimal that can round, so the 15% and 2% comparisons are exact.
How do I tell a subscription from the weekly supermarket run?
The fourth test is the one that does it. Groceries repeat weekly too, but their amounts swing, so the 15% rule drops them — a monthly grocery run that varies 40% either side of its median comes back as nothing at all.
That window is deliberately wide, because the bills people most want found — rent, telecom, insurance — are not the same to the last decimal every month. The width has an obvious cost: a weekly shop that happens to stay steady passes as recurring, and so does your rent. A detector that finds your rent is working, not failing. What it must not then do is offer to cancel it.
Did the price go up, or did I just spend more?
A price rise is only a fact if there was a price. MyFulus reports one only when every charge before the most recent one agrees within 2%, and the newest is more than 2% above the one before it. Exactly 2% is treated as noise; a hair over it is treated as a rise. A small wobble does not hide a real one — 56.00, 56.10, 56.00 and then 62.00 is still reported. A price going down is never flagged at all.
That rule exists because of a mistake this product made in production, on 24 August 2026. Six months of supermarket runs — 412.35, 388.20, 455.10, 401.75, 398.60, then 421.90 — had been stored as a price increase, and the alert pass would have emailed that the supermarket had gone up by AED 279.60 a year. A bigger shop is not a price change. Feed those same six amounts to the detector now and it reports an ordinary active charge.
Apply the same test by hand: before you believe a price went up, check that the earlier charges agreed with each other.
How many months of statements do I need?
The floor is on the gap between two charges, not on the length of the file.
- Two months for a monthly charge — it has to be seen charging you twice.
- A weekly charge needs three sightings, not two.
- A quarterly charge needs two charges about three months apart; a yearly one, two charges about a year apart. That last one is worth reading twice: exactly twelve months of history usually contains one annual renewal, not two.
- The “easy to forget” flag needs six sightings— six months of a monthly charge, or six weeks of a weekly one.
Get them from every account money leaves from — the current account and the card, not just whichever one you happen to have open. A subscription billed to a card you never look at cannot appear in a list built from the statements you did look at.
Practically: PDF or CSV, up to 10 MB each, 6 files at a time, and the free scan reads your first 3 statements. The allowance counts files, not months — so if your bank lets you export a date range, one CSV covering a year counts as one of the 3, and a year of history is worth more here than three single months. Overlapping months are safe: if two statements cover the same week, nothing is counted twice. A statement we could not read does not use up a scan.
How to get your bank statement covers finding the files, including the ones your bank sends locked with a password.
How do I do this by hand?
The same idea, done with your eyes. Put two or three months in front of you, for every account and card, then:
- Read only the money going out. Salary lands monthly and moves between your own accounts repeat on a clock too, and neither is a subscription. MyFulus excludes both for the same reason.
- Group by name, not by date, and ignore trailing digits. You are looking for the same merchant more than once. Strip a trailing # number or a trailing run of four or more digits and the three spellings your bank used collapse into one.
- Check the gap. About a week, about a month, about three months, about a year. Anything else is probably not a subscription.
- Check the amount. Measure every charge against the middle one rather than against the one before it: if any of them sits more than about 15% away, it is spending rather than a subscription.
- Cross out what has no cancellation flow — rent, fuel, tolls, your own transfers, cash withdrawals — before you go looking for a cancel button.
- Check your next statement. It is the only way to confirm a cancellation actually took, and it is the last of the steps MyFulus prints whenever it offers them.
Nothing there needs software. What software adds is that it does not get bored on page four, and that it applies exactly the same threshold to the last line as to the first.
What will this method miss?
Quite a lot, and specifically:
- Fortnightly billing. No cadence window covers a 14-day gap, so a charge every two weeks comes back as nothing at all. So does a 45-day cycle.
- Anything charged once. A merchant that appears a single time in the whole ledger is never reported.
- A price jump bigger than about 15%. Five charges of 56.00 followed by one of 70.00 does not become a price alert — it stops looking like one series and disappears from the list entirely. The same run ending at 64.00 is reported as a rise. So “we catch every price increase” is not a claim this page makes.
- A short series with a gap in it. Gaps of 30, 60, 30 and 30 days are only 75% regular, and drop out.
- Reference noise printed before the merchant name. When the reader cannot name the merchant, the raw statement line becomes the grouping key — and the cleanup is trailing-only, so POS 4455 STARBUCKS DIFC does not group with STARBUCKS DIFC.
- A card whose statements you never upload. The list can only ever contain what your statements contain.
More sightings do make a reading firmer, and the app scores its own confidence that way — but it is a hand-set number that rises with the count, not a probability, so it is not printed anywhere and this page does not quote one.
So the honest version of the heading: every repeating charge in the statements you upload, that passes those four tests.
Why is my rent on the list, and why won’t you tell me how to cancel it?
Because finding a charge and offering to cancel it are different questions.
Rent genuinely repeats on a clock, and seeing it listed with everything else that leaves your account every month is useful. What the software must not do is print “cancel before the next charge” underneath it. We know because it did: on a realistic Dubai ledger, the same cancellation steps were offered for rent, for ATM cash withdrawals, for petrol and for Salik road tolls.
So the steps are now withheld for twenty-two of the app’s categories: rent and mortgage, utilities and telecom, groceries, transport and fuel, car payments, healthcare, school fees, childcare, domestic help, dining, shopping, travel, personal care, gifts, family support and remittances, zakat and charity, savings and investments, loans and card payments, bank fees, taxes, ATM and cash, and account transfers. Zakat is on that list for a reason beyond usefulness: telling a Gulf user how to cancel their zakat is not a clumsy suggestion, it is an offensive one. Five categories keep the guidance — insurance, entertainment, streaming and apps, gym and sports, and everything else — along with any charge the app could not categorise, because an uncategorised repeating charge is far more likely to be a forgotten subscription than a mortgage.
There is also no per-merchant cancellation list here, and there never will be. A table of “how to cancel Netflix” links reads better and rots into false instructions the week a company redesigns its account page. Where the guidance is honest, what the app prints instead is the same four steps every time, written in code rather than by a model, filled in with that charge’s own next date:
- Cancel before the date shown. After that date you have paid for another period.
- Cancel where you signed up — the same app, website or shop. Asking your bank to block the payment is not the same as cancelling.
- Keep the confirmation email or reference number until the charge stops.
- Upload your next statement and we will tell you whether it charged you again.
That date in step one is calendar arithmetic, not thirty days added on. A bill on the 31st becomes the 28th in February and the 29th in a leap year, and twelve monthly steps from the 15th land back on the 15th — where twelve thirty-day steps land on the 10th, five days adrift. It is also always a date still ahead of today, because “next charge 21 May” read in August is not a prediction. A charge with no next date, and a charge the app has stopped seeing, get no steps at all. When two charges look like the same service, one line goes above the four: decide which one you are keeping before you cancel either.
How can you say a charge stopped if you never see my bank?
We don’t say that. The badge reads No recent charge, and the sentence under it says: we have not seen this one for a while, it may have stopped, or the months it would show in may not be uploaded yet. It used to read “Cancelled”, which told people something we do not know.
The judgement is made against your ledger, not against today’s date — specifically against the newest transaction in the statements you have uploaded, of any kind, because a statement full of salary still proves you have uploaded that far. That is the whole trick of doing this without a bank connection, and it is why falling three months behind on uploads never declares your subscriptions dead. With no ledger at all, nothing is ever called missing.
How late is late depends on the cadence, and the allowances are generous: 14 days past due for a weekly charge, 45 for a monthly one, 60 for quarterly, 90 for yearly.
What about paying twice for the same thing?
Two charges get badged Maybe paid twice when they are in the same currency, look like the same service by name, and cost within 20% of each other per month. Comparing monthly equivalents rather than printed amounts is what catches the classic double-pay: a monthly plan and an annual plan to the same service. Both rows are badged, not one, unless a row has something more urgent to say: status precedence puts a price rise above a duplicate, so a charge doing both shows the rise. Deciding which to keep is your call, not ours. A charge the app has stopped seeing is never paired at all: history rather than a leak.
Two things it deliberately will not do. It never pairs charges in different currencies, because comparing them needs an exchange rate and there are none in this app. And this badge is never emailed to anybody: the matching is a text-similarity test on what your bank printed — an exact match, one name starting with the other, or a 60% word overlap once filler like the, ltd, inc and pay is dropped — not a lookup of real companies. It will produce false pairs, and telling somebody they are paying twice when they are not is the one message you never recover from.
Does any of this work outside dollars?
There are no exchange rates anywhere in this product, on purpose, and that shapes the whole feature.
- Charges group by merchant and currency, so a service billing you in AED and in USD is two rows, never one summed row.
- Duplicate pairs are never compared across currencies.
- Monthly totals are shown per currency, side by side, and never added together.
- KWD, BHD and OMR carry three decimal places, and amounts are stored to match.
Even the “small enough to forget” threshold is hand-set per currency rather than converted: 25.00 USD, 92.00 AED, 94.00 SAR, 91.00 QAR, 7.700 KWD, 9.400 BHD, 9.600 OMR, 23.00 EUR, 20.00 GBP a month. Converting a KWD charge to test it against a dollar figure would be exactly the arithmetic this app refuses to do everywhere else. That flag also needs six sightings and applies only to weekly and monthly charges: an annual renewal is not forgotten, it is annual.
Can I just upload the statements instead?
Yes, and it is the same method run for you. MyFulus reads every line, groups the charges, applies the four tests above, and lists what it found ordered by what each one costs per month. Each charge carries one of five labels: Active, Price went up, Easy to forget, Maybe paid twice, No recent charge — and every badge except Active prints the plain sentence saying what we actually know.
The hunt re-runs by itself every time your ledger changes: after a statement is read, after one is removed, and when you delete a transaction or correct its date, amount or direction — the three fields the arithmetic actually reads. There is nothing to remember and nothing to schedule. Pro adds the other half — looking again on demand, whenever you ask.
We never ask for your bank login, your statements never train AI, and you can delete everything at any time. MyFulus is software that reads a document: it is not a licensed accountant, tax preparer or investment adviser, and nothing it produces is professional financial advice.