They Cancelled Last Month. Why Did Your Scheduled Agent Charge Them Again?
A customer cancels a subscription on the 12th. On the 1st, your scheduled agent runs its billing job, finds the customer on its list, and charges the card anyway. A renewal confirmation goes out, the customer replies angrily, and someone on your team spends the afternoon issuing a refund for a charge that should never have existed. Nothing in the run failed. The job completed and the logs look clean. The agent did exactly what its list told it to do. The problem is that the list was wrong, and
A customer cancels a subscription on the 12th. On the 1st, your scheduled agent runs its billing job, finds the customer on its list, and charges the card anyway. A renewal confirmation goes out, the customer replies angrily, and someone on your team spends the afternoon issuing a refund for a charge that should never have existed.
Nothing in the run failed. The job completed and the logs look clean. The agent did exactly what its list told it to do. The problem is that the list was wrong, and the agent had no way to know it, because a cancellation is not a task in a queue. It is a change of state that happened somewhere else, while the agent was asleep between runs.
Charging a customer who already cancelled is one of the most expensive mistakes a scheduled agent can make. A wrong shipment can be recalled and a wrong message corrected, but a wrong charge hits a bank statement, and bank statements turn ordinary frustration into disputes, chargebacks, and lost customers. The damage is not just the refund. It is the trust the business loses in the automation itself.
Why the billing run charges cancelled customers
A scheduled billing agent usually starts by reading a list of active subscriptions due for renewal. That list was correct when it was built, and it goes stale the moment anything changes. Cancellations happen after the list is made, and they hide in more places than most billing runs check.
First, the billing system itself. The customer cancelled in the customer portal, or support cancelled the subscription in the admin panel. The subscription record changed, but the agent's working list still says active, because the run never re-reads the record before charging.
Second, the support inbox. The customer emailed "please cancel my subscription" instead of clicking the cancel button. A scheduled run that never opens the inbox treats the request as if it never happened, and the charge goes out on schedule.
Third, the payment layer. A subscription can be cancelled at the processor, in an app store, or by a bank instruction, while the business's own system still shows the customer as active. The renewal workflow lives in a different tool from the billing record, so the two never meet before the money moves.
Fourth, the grace period. Many subscriptions are cancelled with access until the end of the paid period: cancelled, but still entitled until a specific date. A billing run that only checks "is this customer active" cannot tell that customer apart from one who should be renewed, so it treats both as renewals.
Each run then does exactly what it was told. It charges the card, sends the receipt, and updates the record to show a new billing period, which makes the next run even more confident that the customer is active. The error compounds itself, because every successful charge becomes evidence for the next one.
A billing gate, not a better list
Building a cleaner subscription list does not fix this, because lists go stale the moment they are built. What a scheduled agent needs before it charges anyone is a gate: a fresh check, at the start of every run, on every account it is about to bill.
The gate asks four questions, and a "no" or an "I don't know" on any of them stops the charge:
- Is this subscription still active in the billing system right now, not at the time the list was built?
- Is there a cancellation recorded anywhere: the portal, the support inbox, the payment processor, or the app store?
- If the subscription was cancelled, what is the effective date, and has that date passed?
- Has this customer already been refunded, disputed, or charged for this same period?
That last question catches duplicate charges after a refund, where the refund sits in one system while the renewal list still shows the customer as due.
A gate like this only works if the agent remembers what it checked and what it found. A run that checks the billing system today and forgets the answer tomorrow will charge the same cancelled customer again next month. Memory turns a one-time check into a standing rule: this customer cancelled, on this date, through this channel, with access ending on this date, and no renewal should run past it.
What the agent's memory has to hold
For billing, the memory that matters is a small set of facts, kept current, that the next run can rely on:
- The subscription state for each customer, updated whenever it changes, not just when a run happens to notice.
- The cancellation itself: when it happened, through which channel, and when access actually ends.
- The last billing outcome: charged, refunded, disputed, or skipped, with the date and the reason.
- The support conversation around the cancellation, in full, so the next run can see what was promised to the customer.
- Any exception a person approved, such as a final charge the customer agreed to, with who approved it.
With that memory in place, the billing run stops being a list it executes blindly and becomes a set of decisions it can defend: charge this customer because the subscription is active and no cancellation exists; skip this one because a cancellation is on record; hold this one because the status is unclear and a person should look first. A skipped charge can be run tomorrow. A wrong charge has to be undone in public.
Where Vilix AI fits
This is the kind of shared state Vilix AI is built to hold. It is a cloud-hosted memory layer, so there is nothing to install or maintain, and every tool connects to the same memory over MCP: the billing workflow, the support workflow, and the scheduled agent all read the same subscription state, instead of each keeping its own stale copy. Because Vilix AI stores full conversation history, not just extracted facts, the support exchange where a customer cancelled by email stays retrievable in full, alongside the billing record.
The free plan is free forever, and the Pro trial runs seven days with no credit card required. Everything can be exported or deleted at any time. Learn more at Vilix AI.
A short checklist before the next billing run
Before the next billing run goes out, check four things. Does the run re-read subscription status immediately before charging, or trust a list built earlier? Does it check every place a cancellation can land, including the support inbox and the payment processor? Does it distinguish "cancelled with access until a date" from "active and due for renewal"? And does it remember what it decided, so a cancelled customer stays cancelled in every future run?
A scheduled agent that wakes up blind will keep charging customers who already left. Give it a memory of who cancelled, when, and what was promised, and the billing run becomes what it was supposed to be: a job that charges the customers who still want the service, skips the ones who ended it, and holds the uncertain cases for a person to decide.