
Aeon Bank's RM1 billion reward glitch, explained
Aeon Bank's RM1 billion reward glitch, explained
On 14 October 2026, a clinic manager in Kuching opened his Aeon Bank app and found RM1,000,315,879 in his account. He had less than RM1,000 in it minutes earlier. It was not a missing decimal point. It was ten digits, posted as a transaction.
He called the bank, they froze the account, and the amount was reversed the same day. But the interesting part is not the number — it is what the transaction entry said, because it points at the system that produced it.
What actually happened
The account holder is a 33-year-old clinic manager, reported by the New Straits Times as Wan Muhammad Fairuz, who shared the incident on Threads on 14 October. The Vibes reported that RM1,000,315,879 was credited to his account at about 10:36 am.
Two details matter more than the amount:
- The transaction was labelled "Bank adjustment", categorised under "Rewards – Promotion/Campaign", with the description "Cash Reward – Merdeka / Malaysia Day 2026 Campaign (Cycle 6)".
- He said he had not taken part in any promotion or made any purchase that could explain the credit.
He contacted the bank around 11 am. His account was temporarily blocked until 4 pm, the transaction was reversed, and his original balance was untouched. A follow-up post said the bank offered him a reward for reporting it quickly.
Aeon Bank issued a statement on 14 October saying the incident was related to a recent promotion which had caused some account balances to be displayed incorrectly. It said the matter was resolved promptly and that no account or information was compromised. It has not published a root-cause analysis, and did not answer follow-up questions from the press.
The campaign maths is nowhere near it
Aeon Bank ran a Merdeka / Malaysia Day 2026 campaign: RM31 in cash rewards for spending a minimum of RM15 using DuitNow QR. Sixty-nine winners were picked each week across six weeks, from 17 August to 27 September 2026. That is 414 winners and a total reward pool of RM12,834.
The credited amount was about 78,000 times the entire campaign budget.
That ratio is the whole story. This was not a rounding error. A factor of 100 is a unit bug; a factor of 78,000 is a control failure — a system allowed to post a number nobody had bounded.
Display bug, or ledger bug?
Aeon Bank's own wording is careful: it said some balances had been displayed incorrectly. Two very different failures hide behind that phrasing.
If it was a display bug, the ledger was always correct and only the app was reading the wrong snapshot. Recovery is a cache refresh and an apology.
If it was a posting bug, real entries moved through the ledger. Money in a balance can, in principle, be spent or transferred — which is why the bank froze the account, and why the fix was a reversal: a second entry cancelling the first, not a redraw of the screen.
The public record points both ways. The customer's account showed a fully formed transaction, category and description included — which is what a posting looks like. The bank's language describes a rendering problem. We do not know which it was, and it would be wrong to pretend otherwise. But the distinction should not be buried: one is an embarrassing UI defect, the other is a ledger that briefly said a customer owned a billion ringgit. Customers deserve to know which, in writing.
How reward payouts break this way
The description says "Campaign Cycle 6", placing the bad entry in the promotion's final cycle. Here are the failure classes worth understanding — as hypotheses, not findings about Aeon Bank, which has not disclosed what went wrong:
- Wrong aggregate, right sign. A per-winner job (RM31 each) accidentally reads a running total from the same query, and one account is credited with the sum instead of its share. This is the classic way an amount grows by orders of magnitude rather than by a factor of 100.
- Small-multiple bugs. Computing in sen but posting in ringgit, a campaign parameter edited mid-cycle, or a retried batch posting twice — all real, but they produce small multiples, not a 78,000x error.
- No magnitude guard. Nothing compared the batch against the campaign budget before committing it.
Two are arithmetic, one is config; the missing guard is the process mistake, and it is the cheap one that would have stopped this.
Make the campaign contract executable
Promotional money is real money. A cashback job is a payments system wearing a marketing hat, and it deserves the same controls. The most valuable one is to turn the campaign terms into config that the payout job validates before it commits:
from dataclasses import dataclass
from datetime import datetime, timedelta
SEN = 100
@dataclass(frozen=True)
class Reward:
account_id: str
amount_sen: int # minor units: never use floats for money
campaign: str
posted_at: datetime
# The campaign contract is config, signed off before the batch runs.
CAMPAIGN = {
"name": "merdeka-malaysia-day-2026",
"per_award_sen": 31 * SEN, # RM31.00 per winner
"max_awards": 414, # 69 winners x 6 weekly cycles
"budget_sen": 12_834 * SEN, # RM12,834.00 total
"starts": datetime(2026, 8, 17),
"ends": datetime(2026, 9, 27),
}
def validate_batch(rewards, campaign):
errors = []
if len(rewards) > campaign["max_awards"]:
errors.append(f"count {len(rewards)} > max {campaign['max_awards']}")
total = sum(r.amount_sen for r in rewards)
if total > campaign["budget_sen"]:
errors.append(f"total RM{total/SEN:,.2f} > budget RM{campaign['budget_sen']/SEN:,.2f}")
for r in rewards:
if r.amount_sen != campaign["per_award_sen"]:
errors.append(f"{r.account_id}: RM{r.amount_sen/SEN:,.2f} != expected RM{campaign['per_award_sen']/SEN:,.2f}")
if not (campaign["starts"] <= r.posted_at <= campaign["ends"] + timedelta(days=1)):
errors.append(f"{r.account_id}: posted_at {r.posted_at:%Y-%m-%d} outside campaign window")
if total > campaign["budget_sen"] * 1000:
errors.append("magnitude guard tripped: batch is >1000x budget, halt")
return errors
if __name__ == "__main__":
good = [Reward(f"acct-{i}", 31 * SEN, CAMPAIGN["name"], datetime(2026, 9, 27)) for i in range(414)]
print("clean batch:", validate_batch(good, CAMPAIGN) or "PASS")
glitch = good + [Reward("acct-x", 1_000_315_879 * SEN, CAMPAIGN["name"], datetime(2026, 10, 14))]
for err in validate_batch(glitch, CAMPAIGN):
print("HALT:", err)
The clean batch passes with no errors, while the bad entry trips four checks at once — the count, the batch total, the per-award amount and the campaign window — plus a magnitude guard that halts anything over 1,000 times the budget.
The code is the small part. The rest is operational, and boring on purpose:
- Store money in minor units. Integers in sen, or a decimal type — never floats.
- Canary the batch. Post one real winner before the full run, then reconcile against the contract. If one RM31 credit is wrong, stop.
- Reconcile on a schedule. A job that compares what was actually paid against the campaign contract, hourly, will catch drift long before a customer does.
- Alert on distribution, not just totals. A single outlier far above the per-award amount should page someone immediately, even if the batch total looks fine.
- Require dual control. Anything that moves money should need two approvals, including a "marketing" payout.
The money is not yours: what Malaysian law says
The instinct to keep a windfall like this is understandable and legally dangerous. Section 403 of the Penal Code (Act 574) covers dishonest misappropriation of property:
Whoever dishonestly misappropriates, or converts to his own use, or causes any other person to dispose of, any property, shall be punished with imprisonment for a term which shall not be less than six months and not more than five years and with whipping and shall also be liable to fine.
The section's own illustration is almost written for this scenario: if someone takes property in good faith, believing it is theirs, that is not theft — but once they discover the mistake and dishonestly appropriate it, it becomes an offence. The clock starts at knowledge. A balance that appeared by mistake is not a gift the moment you notice it is not yours.
Malaysia has tested this. In September 2024, DayakDaily reported that a 24-year-old man, Andrian Pahang Gau, was charged in the Miri Magistrate's Court with 34 counts under Section 403 after a bank mistakenly transferred RM10 million into his account and he allegedly spent RM309,100 of it over three days. Bail was set at RM22,500.
That is the line between the two cases. One customer reported the error within the hour; the other allegedly spent it, and ended up in court.
If it happens to you
This is general information, not legal advice, but the sequence is simple:
- Do not spend or move the money. Take screenshots of both the balance and the transaction entry, including the description.
- Report it immediately — call the bank and use the in-app channel, and keep the reference number.
- Ask them to confirm, in writing, whether it was a display error or an actual posting, and to confirm the correction.
- Escalate if it is unresolved. Complain to the bank's complaints unit first. If you get no response after 14 days, or the answer is unsatisfactory, escalate to BNMLINK, Bank Negara Malaysia's contact centre.
- For a real dispute, use FMOS. The Financial Markets Ombudsman Service, launched on 17 January 2025 by BNM and the Securities Commission, handles direct financial losses up to RM250,000, free of charge. You must finish the bank's internal process first, then file within six months of its final decision, or after 60 days of silence.
The mirror image matters too. If money left your account without your consent, that is not a windfall but an unauthorised transaction, and you should report it to your bank straight away. QR-based quishing is a common way that starts.
What developers should take from this
A promotional credit is a payment. The moment it leaves a spreadsheet and enters a ledger, it inherits every rule a payment has: it needs limits, approvals, reconciliation, and something that refuses to run when the number is absurd.
Aeon Bank resolved this in hours, and the customer who flagged it did everything right. But the control that should have stopped a RM1 billion credit is a handful of assertions running before the batch commits. That guard is cheap, it is boring, and this week is a good time to check whether yours exists.
Sources
- SoyaCincau: Aeon Bank customer claims he received RM1 billion in his account by mistake
- New Straits Times: Man shocked as banking glitch shows RM1 billion in his account
- The Vibes: Instant billionaire? Bank customer finds RM1 billion mistakenly credited to account
- DayakDaily: Billionaire for a day: Kuching man finds RM1 billion in bank account due to technical glitch
- DayakDaily: 24yo man charged with misappropriating RM10 million after bank error
- Aeon Bank: Merdeka / Malaysia Day 2026 campaign
- Bank Negara Malaysia: Five successful applicants for the digital bank licences
- AEON Credit Service (M) Berhad: AEON Bank launched as Malaysia's first Islamic digital bank
- Laws of Malaysia: Penal Code (Act 574)
- FMOS: Financial Markets Ombudsman Service (FMOS)
- Bank Negara Malaysia: Got an issue with your bank, insurance company, takaful operator or e-money issuers?
// author
Editor & Operator
Mohd Firdaus Abu Bakar (MrDodgerX) is an enterprise geospatial systems engineer in Malaysia and the editor behind hejes.my. He runs the briefing pipeline, curates and edits every draft, verifies each factual claim against primary sources, and presses the publish button — nothing ships without his review. He writes about AI, security and Malaysia's tech scene from a builder's perspective. Professional profile and code: the links below.
// sources //
fact-check verified · 16 OCT 2026 · hejes-content-fact-check
- Aeon Bank customer claims he received RM1 billion in his account by mistakeSoyaCincau · accessed 16 OCT 2026
- Man shocked as banking glitch shows RM1 billion in his accountNew Straits Times · accessed 16 OCT 2026
- Instant billionaire? Bank customer finds RM1 billion mistakenly credited to accountThe Vibes · accessed 16 OCT 2026
- Billionaire for a day: Kuching man finds RM1 billion in bank account due to technical glitchDayakDaily · accessed 16 OCT 2026
- 24yo man charged with misappropriating RM10 million after bank errorDayakDaily · accessed 16 OCT 2026
- Merdeka / Malaysia Day 2026 campaignAeon Bank · accessed 16 OCT 2026
- Five successful applicants for the digital bank licencesBank Negara Malaysia · accessed 16 OCT 2026
- AEON Bank launched as Malaysia's first Islamic digital bankAEON Credit Service (M) Berhad · accessed 16 OCT 2026
- Penal Code (Act 574)Laws of Malaysia · accessed 16 OCT 2026
- Financial Markets Ombudsman Service (FMOS)FMOS · accessed 16 OCT 2026
- Got an issue with your bank, insurance company, takaful operator or e-money issuers?Bank Negara Malaysia · accessed 16 OCT 2026
related //

Shopee Now Takes TNG eWallet via DuitNow QR
TNG eWallet finally works on Shopee — but only through Malaysia's national DuitNow QR rail. Here's how to pay, what the cashback covers, and the catch.

Quishing in Malaysia: RM28.67M Lost to QR Scams
Malaysians lost RM28.67M to QR scams in H1 2026. How quishing works, why QR codes are easy to abuse, and what to check before scanning.

CTOS Breach: When the Credit Agency Asks You to Reset Your Password
CTOS confirmed a limited subset of consumer data was accessed; password-reset notices are now reaching account holders. Here is what it means.
// join the feed
one fresh insight per week. no spam, ever.
weekly digest. unsubscribe anytime.