How do apps detect recurring subscription charges from bank transactions?
The algorithm behind subscription detection: merchant normalisation, interval clustering, amount tolerance — and the blind spots no vendor avoids.
Answer
Detection groups transactions by a normalised merchant name, then looks for charges that repeat at a regular interval — weekly, monthly, annual — with amounts inside a tolerance band. A group that fits is flagged as recurring. The method cannot distinguish subscriptions billed through Apple, Google or PayPal, and it misses anything charged less often than the history it can read.
Leutrim Miftaraj
Founder, SubTracker · Updated September 29, 2026
The short answer
Detection groups transactions by a normalised merchant name, then looks for charges that repeat at a regular interval — weekly, monthly, annual — with amounts inside a tolerance band. A group that fits is flagged as recurring. The method cannot distinguish subscriptions billed through Apple, Google or PayPal, and it misses anything charged less often than the history it can read.
Step One: Normalise the Merchant
Raw statement descriptors are noisy. The same service can appear as `NETFLIX.COM`, `NETFLIX 866-579` or a processor prefix plus a reference number. Detection starts by stripping reference numbers, locations and processor prefixes, then mapping what is left to a canonical merchant.
Get this wrong and one subscription looks like three unrelated merchants, none of which repeats often enough to be flagged.
Step Two: Find the Interval
Within each merchant group, the dates are sorted and the gaps between them measured. A monthly subscription produces gaps clustered around 28–31 days; an annual one around 365. The algorithm looks for a dominant gap with low variance, and usually needs at least two or three occurrences before it is confident.
Month-end billing complicates this. A charge on the 31st moves to the 28th or 30th in shorter months, so the tolerance has to absorb a few days without also absorbing irregular purchases.
Step Three: Tolerate Amount Changes
Subscriptions change price, add tax, or convert currency. Requiring identical amounts misses them; ignoring amounts flags every weekly grocery shop. The usual compromise is a percentage band around the median amount of the group, with a separate rule that a single step change followed by a stable new amount is a price change, not a new subscription.
The Blind Spots Are Structural
App store and wallet billing. Every subscription bought inside an iPhone app is charged by Apple under one merchant name. The detector sees many recurring Apple charges and cannot say which app each one belongs to. The same applies to Google Play and PayPal agreements.
Annual plans. A detector reading ninety days of history has never seen last year's annual renewal. It does not exist until it recurs.
Shared cards and accounts. Detection covers the accounts that are connected. A subscription on a partner's card or an unconnected account is invisible.
These are properties of the method, not of any vendor. Switching between detection products reproduces all three.
Why a Manual Tracker Does Not Do This
SubTracker deliberately does not detect charges: detection requires reading the complete transaction history, and the product is built around never holding it. The trade-off is that the user enters subscriptions once, and in exchange no bank connection exists. Both designs are reasonable; they answer different priorities.
Frequently asked questions
How accurate is automatic subscription detection?+
Accurate for merchants that bill directly on a regular schedule and appear consistently on statements. Weak for app store billing, annual plans outside the history window, and accounts that are not connected to the service.
Why does my budgeting app miss some subscriptions?+
Usually because they are billed through Apple, Google or PayPal under a single merchant name, because they renew annually and have not appeared in the history yet, or because they sit on an account that is not connected.
How many charges does detection need to flag a subscription?+
Typically two or three occurrences at a consistent interval. A new subscription is often not flagged until after its second or third charge has posted.
Can detection tell a price increase from a new subscription?+
A good implementation treats a single step change followed by a stable new amount as a price change. Simpler ones may show it as a separate recurring charge or miss it entirely.
