
Features
Part of Open banking guide: consent, APIs, aggregators, permissions, and data flows
Tracing an incorrect balance through a financial data aggregator case
Incorrect aggregated balance case tracing provider fields, fetch times, mapping, pending items, cache state, consumer impact, correction, and control fixes.
What to take away
- Begin with the financial institution's source record and timestamp.
- Preserve the aggregator's raw field names before inspecting the app's display.
- Available balance, ledger balance, and projected balance must not share one label.
- A stale refresh and a mapping error can combine into one misleading number.
- Correct the display, assess downstream effects, and fix ownership and test controls.
This fictional case shows an investigation method. Names, amounts, times, and systems are invented. It does not describe a real consumer, bank, aggregator, or app.
The complaint
At 9:42 a.m. on Tuesday, Maya opens a cash-planning app. It shows $1,240 in her checking account. Her bank app shows an available balance of $2,040 and a ledger balance of $2,440.
She had scheduled an $800 rent payment on Monday. The bank lists it as pending. The planning app also shows the $800 transaction in its activity list.
Maya reports that the planning app is subtracting rent twice.
The system map
The support team first identifies the layers:
| Layer | Fictional entity | Record to obtain |
|---|---|---|
| Data provider | Harbor Bank | Account and transaction source fields |
| Aggregator | ClearPipe Data | Raw response and fetch metadata |
| App import | Northstar Plan | Import event and field mapping |
| Calculation | Northstar cash forecast | Formula and version |
| Display | Mobile dashboard | Cache and render time |
This avoids sending the consumer between companies without a shared reference.
The timeline
| Time | Event |
|---|---|
| Monday 4:10 p.m. | $800 rent payment enters pending state |
| Monday 4:12 p.m. | Bank available balance falls from $2,840 to $2,040 |
| Monday 11:55 p.m. | App's last successful account refresh occurs |
| Tuesday 7:00 a.m. | Scheduled aggregator refresh fails during token renewal |
| Tuesday 9:40 a.m. | App recalculates forecast from cached balance and a newer pending item feed |
| Tuesday 9:42 a.m. | Consumer sees $1,240 labeled checking balance |
| Tuesday 9:49 a.m. | Support case opens |
The displayed figure is not a source-bank balance. It is a calculated projection whose label lost that distinction.
How the wrong balance appeared
- Monday 410 p.m. $800 rent payment goes pending
- Monday 412 p.m. Bank available balance drops to $2,040
- Monday 1155 p.m. App's last successful account refresh
- Tuesday 700 a.m. Aggregator refresh fails at token renewal
- Tuesday 940 a.m. App recalculates from cached balance
- Tuesday 942 a.m. Consumer sees $1,240 checking balance
Evidence collection
The team freezes relevant logs and records these identifiers:
- consumer connection ID;
- bank account reference, masked;
- aggregator request and response IDs;
- token renewal result;
- app import ID;
- calculation version;
- cache key and render version;
- pending transaction identifier;
- consent scope and current connection status.
No one asks Maya for her password. Support does not copy full account details into a general ticket.
What the provider record says
At 9:41 a.m., Harbor Bank holds:
Source field / Value
ledger_balance- $2,440
available_balance- $2,040
- Pending rent
- -$800
- Rent included in available balance
- Yes
The bank's values are internally consistent. The $400 difference between ledger and available balance also reflects other availability adjustments, which are outside this case. The investigator does not invent an explanation for that difference.
Historical CFPB stakeholder research reports broad agreement that consumer-authorized data should be accurate, reliable, and timely, while noting concerns about field interpretation and refresh timing. The data-aggregation stakeholder insights support checking both field mapping and timeliness. They are a 2017 summary of views, not a finding about this fictional event or a current binding rule.
What the aggregator sent
The last successful account response on Monday contains:
balance_type: available
balance_amount: 2040.00
balance_currency: USD
as_of: Monday 23:55
A separate pending-transactions endpoint later delivers the rent item. That response is newer than the balance response because the balance refresh failed during token renewal.
The aggregator preserved the source balance type and timestamp. It also returned an authorization error for the failed refresh. Its data is mixed-age, but the metadata discloses that fact.
What the app changed
Northstar's importer maps balance_amount to a generic field called current_balance. It discards balance_type from the calculation table, though it keeps the raw response elsewhere.
How the app double-counted rent
- Bank available balance: $2,040
- Importer maps to generic current_balance
- balance_type available is discarded
- Formula subtracts pending outflow of $800
- Displayed cash: $1,240
The forecast formula then runs:
current_balance - pending_outflows = displayed_cash
It calculates:
$2,040 - $800 = $1,240
That formula could be useful if current_balance were a ledger figure excluding the pending rent. Here, the bank's available balance already reflects the pending payment. The app subtracts it again.
Root cause
The incident has three contributing causes:
- Semantic mapping loss.The importer dropped the
availablebalance type. - Mixed-age inputs.The balance was older than the pending item.
- Misleading display.The app called a forecast result a checking balance and hid the source timestamps.
The failed token renewal exposed the problem but did not create the incorrect formula. Even with a fresh response, the same mapping could double-count a pending item.
Immediate correction
The team disables the affected forecast card, preserves evidence, and restores the last correctly labeled bank values with their timestamps. It tells Maya:
- the bank record was not changed;
- the app display was wrong;
- the $1,240 figure did not initiate or alter a transaction;
- the rent item appeared once at the bank;
- the app is reviewing whether any alert or recommendation used the wrong figure.
The team does not tell her to dispute the rent because the source transaction is authorized and correctly recorded.
Downstream impact review
Investigators search the affected mapping version and formula across:
- low-balance alerts;
- savings suggestions;
- spending limits;
- cash-flow charts;
- credit or eligibility models;
- exported reports;
- customer-support messages.
They identify every account for which an available balance was combined with a pending outflow. They do not limit the review to Maya's complaint.
Permanent controls
Preserve semantics
Store ledger, available, projected, and unknown as separate types. Reject unknown mappings rather than forcing them into current balance.
Apply freshness rules
Do not combine values from different retrieval windows without a visible warning and a documented rule. Show both source time and app refresh time.
Test financial states
Add fixtures for pending card holds, scheduled payments, partial posting, reversed transactions, weekend delays, overdraft availability, and missing balance types.
Monitor the API path
NIST's cloud-native data protection architecture report discusses monitoring API endpoints and blocking unauthorized access and data exfiltration. For this case, monitoring must also preserve enough request, authorization, and response metadata to distinguish a failed bank fetch from an app cache read without recording secrets.
Give one complaint path
The app owns the consumer response even when another party supplied data. It coordinates with the aggregator and institution using shared timestamps and references.
Closure record
The case closes only when:
- the faulty mapping is removed;
- corrected displays reach affected users;
- downstream alerts and decisions are reviewed;
- token renewal succeeds or the connection is reauthorized appropriately;
- consumer communication is complete;
- regression tests cover the state;
- logs demonstrate the fix in production.
The final report separates source accuracy, transport freshness, transformation logic, and display wording. That separation makes the remedy testable.
Common questions
Was the bank balance wrong in this case?
No. The fictional error arose when the app relabeled an available balance and subtracted a pending payment again.
Did the failed refresh cause the whole problem?
No. It created mixed-age inputs, but the mapping and formula could still misstate a fresh balance.
Should the consumer contact every company?
The visible app should coordinate the investigation, though the institution may need to address any source-account issue.
What is the most useful first record?
Get the source field name, value, and timestamp, then trace the same value through each layer.







