FlowParse
Feature 10 August 2026 12 min read

Subscription detection

A recurring payment is invisible in a statement, because nothing on the line says it repeats. It only becomes a subscription when you see the same payee at the same interval across many months — which is a property of the whole dataset, not of any one transaction. This is the feature that surfaces it.

FlowParse
flowparse.io

A property of the dataset, not of the line

Look at a single bank transaction and there is no way to tell whether it will happen again next month. The amount, the date, the payee — none of them carry that information. A twelve-pound payment to a software company looks exactly the same whether it is a one-off or the ninth of an indefinite series.

This is why subscriptions accumulate. Each individual charge is small enough to ignore and looks like every other line around it. The pattern only exists across time, and a statement in date order is precisely the arrangement that hides patterns across time.

Rearranging by payee makes them appear immediately. That rearrangement is the feature: not clever analysis, but putting the data in the shape where the thing you are looking for is visible.

Why they hide so well

Four properties conspire, and each one is individually reasonable.

They are small. Any single charge falls below whatever threshold you use to notice things. Twenty subscriptions at modest amounts add up to a figure that would get attention as one line and gets none as twenty.

They are silent. A subscription requires no decision to continue. Unlike an invoice that someone approves, it simply carries on until stopped, so there is never a moment when anyone looks at it.

They are scattered. Some on a company card, some on the current account, some on a personal card and reclaimed. Any single-account review misses most of them, which is why most reviews find less than they should.

They outlive their owner. The person who signed up for a tool leaves, and the payment continues indefinitely because nobody knows what it was for. These are the ones with the highest cancellation rate once found — and the ones nobody would ever go looking for.

FlowParse
flowparse.io

What the pattern actually looks like

Three things together make a recurrence, and each on its own is meaningless.

SignalStrong whenWeak when
Same payeeDescription is stable month to monthA processor prefixes its own reference
Regular intervalDates land within a few days each timeA human pays invoices whenever they get to them
Similar amountFixed price planUsage-based billing that varies widely

The interval is the strongest of the three and the most forgiving. A subscription whose price changed is still a subscription; a subscription whose name is written differently is still a subscription; but a payee appearing at random intervals is genuinely not one, whatever the amount suggests.

This ordering matters because it decides what happens in ambiguous cases. Weighting the amount too heavily splits one usage-based service into a dozen unrelated payments; weighting the interval correctly keeps them together.

Four intervals, four difficulties

Monthly is the common case and the easiest. Three months is enough to suspect, six to be confident.

Four-weekly produces thirteen payments a year and periodically puts two into one calendar month. Anything that assumes monthly reads this as a double charge followed by a missing one, and generates a false alarm every few months.

Quarterly needs a year of data to be recognisable at all, and is frequently mistaken for a series of unrelated one-off payments — which is exactly how quarterly insurance and service contracts escape review.

Annual is the most valuable and the most demanding: two years of statements minimum, because one occurrence is not a pattern. These are also the largest individual amounts and the ones most likely to renew unnoticed, which is a poor combination.

The practical implication is simple. If you only convert this year, you will find your monthly subscriptions and miss the annual renewals entirely — and the annual ones are usually where the money is.

Name variants

The same company rarely appears identically twice. Banks truncate long descriptions, card processors prepend their own reference, and some merchants include an order number that changes every time.

Matching therefore works on the stable portion of the description rather than on an exact string. Where the variants are ambiguous, they are grouped and shown together rather than merged silently — because a wrong merge is worse than an unmerged pair. Two entries you can join in a click cost you a click; one wrong join produces a number you will trust and should not.

The confirmation is a decision you make once per payee. After that it holds, which is what turns a one-hour first pass into a five-minute monthly routine. The same principle governs transaction categorisation: correct a payee once, not every month.

One case deserves attention: a merchant who changes payment processor mid-year. The description changes completely, and the pattern appears to stop and a new one to begin. It is worth checking new payees against recently ended ones for exactly this reason.

Amounts that move

A fixed price makes everything easy. Real subscriptions rarely stay fixed, and how the variations are treated decides whether the output is trustworthy.

A step change — same amount for months, then a new amount that persists — is a price rise or a plan change. It stays one subscription, and the change is worth flagging in its own right, because a price rise that nobody noticed is one of the more common findings in this exercise.

Gradual drift suggests per-user or usage-based pricing. Still one subscription, but its trajectory is the interesting part: a tool that costs half again what it did a year ago deserves a look regardless of whether it is used.

Wild variation at a regular interval is usually a consumption-based service — cloud hosting is the classic. It is recurring in the sense that it will happen again, and unbudgetable in the sense that the amount is unknown, which makes it a different management problem despite looking similar in the data.

A single outlier that returns to normal is typically an annual add-on, a proration or a one-off overage — worth showing next to the pattern rather than allowing it to redefine the baseline.

FlowParse
flowparse.io

How it works

1 · Convert everything

Every account and card, ideally two years. Up to 100 files at once; older scans go through OCR first.

2 · Check completeness

Closing balances recalculated and the series checked for gaps — a missing month breaks a pattern and looks like a cancellation.

3 · Group by payee

Name variants collapsed onto the stable part of the description, ambiguous ones surfaced rather than merged.

4 · Measure the interval

Monthly, four-weekly, quarterly or annual, with tolerance for weekends and holidays.

5 · Track the amount

Typical value, step changes and outliers kept distinct, so a price rise is a flag rather than a new subscription.

6 · Export

One row per recurring payment: payee, interval, typical amount, first seen, last seen, annualised total.

FlowParse
flowparse.io

What you get back

One row per recurring payment, with the columns that make a decision possible.

ColumnWhy it earns its place
PayeeThe stable name, with variants recorded
IntervalMonthly, four-weekly, quarterly, annual
Typical amountThe current level, not the average across a price rise
Annualised totalThe number that actually prompts a decision
First seenHow long this has been running
Last seenWhether it is still live
AccountWhich card or account it sits on
OccurrencesHow much evidence the pattern rests on

The annualised total is the column that changes behaviour. A modest monthly figure invites a shrug; the same subscription shown as its yearly cost gets cancelled or renegotiated. Sorting by that column is the single most useful thing you can do with the output.

“First seen” is the quiet one. A subscription running for four years that nobody can explain is a different conversation from one started last quarter, and the date is the only thing that distinguishes them.

Where the human comes in

The pattern is found automatically. What it means is not, and this boundary is deliberate rather than a limitation to be engineered away.

A supplier invoiced monthly for a similar amount is indistinguishable from a subscription in bank data. Rent looks like a subscription. A repayment schedule looks like a subscription. The data genuinely cannot tell them apart, and a tool that guessed would produce a confident list that is quietly wrong.

So the output is a list of things that repeat, sorted by annual cost, with the evidence attached. Classifying them — and deciding what to cancel — takes a person perhaps twenty minutes, which is the fastest twenty minutes of cost saving available in most businesses.

The same reasoning applies to the incoming side: a customer who stopped paying might have churned or might be late, and the difference matters enormously. That is treated on our failed payment and churn signals page.

Money out and money in

The same pattern logic runs in both directions, and the two uses feel entirely different despite being the same operation.

Outgoinganswers “what are we paying for”. It is a cost exercise, it is usually done once and then annually, and it almost always pays for itself the first time.

Incominganswers “who pays us regularly”. It is a revenue exercise, it needs doing every month, and its value is in the customers who stop rather than the ones who continue — the full treatment is on recurring revenue from bank statements.

Businesses that do both find the incoming side more valuable over time and the outgoing side more satisfying immediately. Starting with outgoing is the usual advice for that reason: it produces a result in the first session.

How much evidence is enough

A pattern is a claim about the future made from a handful of past events, and it is worth being explicit about how much confidence each amount of evidence actually justifies.

Two occurrences is a coincidence with a plausible interpretation. Two payments a month apart might be a subscription or might be two unrelated purchases from the same supplier. Worth surfacing, not worth acting on alone.

Three to five at a consistent interval is a working pattern. This is where most monthly subscriptions become unambiguous, and where a review can proceed without checking each one against a contract.

Six or more is settled, and the interesting question shifts from whether it recurs to whether it should. That is a business question rather than a data one.

Which is why the occurrence count appears in the output. A row backed by twelve payments and a row backed by two deserve different levels of confidence, and hiding that distinction behind a single “recurring” label would make the weak rows look as solid as the strong ones.

Worth stating what all of this rests on: none of it works if the underlying series has holes. A missing statement removes several months of a pattern, and the effect is not a gap you notice — it is a subscription that appears to have been cancelled and restarted, or one that never reaches enough occurrences to be recognised at all. That is why statement continuity is checked before any pattern work begins, and why a series with a known gap is flagged rather than quietly analysed. A confident list built on incomplete data is worse than an honest gap.

Where it gets used

The annual subscription audit

One session a year, sorted by annualised cost. Almost everyone finds something nobody can explain.

Building next year's budget

Recurring costs are the baseline a budget is built on — see the budget-building guide for where this fits.

Monthly revenue review

Which customers paid, which did not, and who reduced their amount before cancelling.

Due diligence and handovers

Taking over a set of books, the recurring list tells you what the business is committed to far faster than reading contracts.

For budgeting specifically, the recurring list is the cleanest possible starting baseline — the method is in the budget-building guide, and tracking against it afterwards on budget versus actual.

What it will not do

It will not cancel anything. It produces a list; the cancelling is a series of logins and emails that nobody can automate for you.

It will not tell you whether a subscription is used. Usage data lives in the tool itself, not in the bank, and a payment says nothing about whether anyone opened the thing being paid for.

It will not distinguish a subscription from a regular supplier invoice, because the data does not contain that distinction. The pattern is surfaced with its evidence; the classification is yours.

And it cannot find annual patterns in a single year of data. That is not a shortcoming to be improved — one occurrence is not a pattern, and any tool claiming otherwise is guessing.

Frequently asked questions

Try it on two years

Convert every card and account for two years, sort by annualised cost, and read the top twenty rows. That is where the annual renewals nobody remembers are hiding.

Related