Explain the obvious GCP charges in Feb/Mar/May 2025
Goal / question¶
Owner sees obvious GCP charges in Feb, Mar & May 2025 β explain why (what they are, and why present / not categorized-or-matched). Ties to the GCP billing reconciliation work (GL6006, MISC DEBIT verdict, evidence-only matching, statement-as-invoice).
Findings (2026-06-13, live data)¶
Two distinct Google products in those months (Company Card *4687): - *Google CLOUD (= actual GCP) β tiny, UNCATEGORIZED (no GL): 2025-02-09 HK$0.75 Β· 2025-03-02 HK$0.31 Β· 2025-05-02 HK$0.31. Real GCP usage charges, micro-amounts β consistent with near-free-tier Cloud Run/Firestore spill (PDF renderer + bank-login-service run scale-to-zero on aote-pms). They're uncategorized because nothing matched/booked them. - Google WORKSPACE (NOT GCP) β already categorized to GL 6000: 2025-02-02 HK$528.12 Β· 2025-03-02 HK$282 Β· 2025-05-01 HK$282. Different product (email/Workspace seats), correctly not GCP. - The only GL-6006/6400 entry in those months is 2025-02-04 HK$150 TRANSFER-DEBIT on 6400 (a bank charge, unrelated to GCP). So "the obvious GCP charges" = the three sub-HK$1 Google Cloud card charges, currently uncategorized. Nothing alarming; just un-booked micro-usage. Decision for owner: leave as immaterial, or categorize them (and where β a GCP/IT GL).
Why the auto-matcher didn't book them (2026-06-13)¶
By design β your own evidence-only policy. The two Google paths differ:
- Workspace = pattern-based: an auto-link rule (patterns 'GOOGLE WORKSPACE'/'GSUITE',
from GL 6000's autoMatch.keywordPatterns) + File-Archive Workspace invoices β
amount+date match β books to GL 6000. (pages/api/workspace-billing/auto-link.ts,
lib/googleWorkspace/matcher.ts.)
- GCP = evidence-only: the GCP auto-linker REQUIRES a fetched GCP invoice (BigQuery
export or a Firestore Cost-Table import). For these micro-charges there's NO GCP invoice
for those months β invoice == null β skipped β uncategorized. categorizeWithoutMatch:
false (AUTO_MATCH_DEFAULTS, types.ts) means it won't book without invoice evidence β
same principle as the Aug/Sep 2025 export blocker (T-016). (pages/api/gcp-billing/auto-link.ts.)
So: working as designed. To book them, either import the GCP invoice/Cost-Table for
Feb/Mar/May 2025 (then they auto-link), or categorize the 3 micro-charges manually. NOT
recommended: flipping categorizeWithoutMatch β you set evidence-only deliberately.
What's actually lacking (2026-06-13, live data β owner was right, evidence DOES exist)¶
GCP invoices ARE imported: tebs-erl/Expenses/Subscriptions/Google/GCP/invoices holds
cloud_console_csv rows for 202501β202606 (all 3 months): 202502 netCost HK$0.31,
202503 HK$0.31, 202505 HK$0.30 β but all with transactionCount: 0 (locked). So the
evidence is NOT the gap. The real gaps:
1. Never linked β transactionCount 0 on all three β the GCP auto-linker hasn't tied a
card charge to these invoices.
2. Amount/timing reconciliation β card charges (Feb HK$0.75, Mar 0.31, May 0.31) β
console netCost (0.31/0.31/0.30). GCP bills USDβHKD at its own rate and IN ARREARS
(a 2025-02-09 card charge is ~Jan usage), so exact-amount (Β±0.01) matching fails for
Feb & May. Only Mar (0.31==0.31) lines up β and even it wasn't linked, i.e. the linker
likely hasn't been re-run since the CSV import.
FIX: (a) re-run the GCP auto-linker for those months (should catch Mar); (b) the Feb/May
FX+arrears gap needs a tolerance band / date-offset / aggregation β same currency theme as
T-029b. This is a LINKING + reconciliation gap, not an evidence gap.
Offset analysis β all 15 Google Cloud charges (2026-06-13) β corrects the FX guess¶
Amounts MATCH EXACTLY; the gap is purely TIMING (arrears), not FX. Pairing each charge to
its usage-month GCP invoice:
- 11 of 15 charges == their PRIOR-month invoice to Β±HK$0.01 (GCP bills the card the exact
HKD invoice amount, ~1 month in arrears; charge posts 2β9 days AFTER the usage month
closes). e.g. 2026-02-03 $29.86 == 202601 $29.86; 2026-03-03 $6.90 == 202602 $6.90;
2026-05-02 $21.14 == 202604 $21.14; 2025-02-09 $0.75 β 202501 $0.76.
- So the "FX mismatch" idea was WRONG β amount is exact; only the ~1-month arrears
separates the charge date from the usage month.
- OUTLIERS (no matching usage invoice): $100 (2026-05-09), $100 (05-12), $200 (05-17),
$499.31 (2026-06-04). Round + no invoice β look like prepaid top-ups / a spend spike,
NOT usage bills. These are the ONLY big "offsets" (HK$79β198) and they're mis-pairings.
BIGGEST OFFSETS: amount β€ HK$0.01 for real usage charges (the HK$198 figure is an outlier
top-up with no invoice); timing β 1 month arrears (charge 2β9 days after usage month-end).
So: amount tolerance is a non-issue (exact). Fix = (a) re-run the GCP linker with a window
covering the ~1-month arrears (45-day default already covers it) β links the 11 clean ones;
(b) check whether locked:true excludes them from linking; (c) review the 4 outlier
top-up/spike charges separately. Not FX, not evidence β un-run linker + arrears window.
Log¶
- 2026-06-13 created + investigated. Answered: 3 tiny Google Cloud charges (uncategorized)
- larger Workspace charges (already GL 6000). Awaiting owner call on categorizing.