Bank Recon
bank-recon.majority.dev gives one view of our bank reconciliation status. It's a playground app; how it works is documented in apps/bank-recon.
What it shows
- Received files: latest file and arrival time for 30 feeds from 8 providers (
WebBank,CFSB,Lithic,InComm,Axiominvoices,Checkout,Dwolla,Fiserv). - Read from the rawgcs/s3tables indw-prod-gwiiag(file_name/s3_file_name,ingested_at). - Sent reports: latest archived file for 19
dt-reportingreports toAxiomandWebBank. - Read from theaxiom-reports-prodandwebbank-reports-prodbuckets. - dbt usage per file: reconciled, modelled, staging only or not used, generated from the
dt-dbtmanifest. - Daily reconciliation: provider vs Majority count and amount per business day, with matched and unmatched items.
- Item-level checks:
InComm(cash and swipe),Dwolla,Fiserv,Checkout,Lithic. -WebBankis a balance check;CFSBshows the provider side only. - Data flow: for each check, provider files →
dbtmodels → check ← Majority models, linked todt-dbt-lineageand Looker.
Sent ≠ delivered
dt-reporting writes the GCS copy before the SFTP upload, so the archive proves the file was produced, not that the bank received it.
Access
- Every query runs as the signed-in user through
gcp-auth, which only gives Cloud Storage read access to apps that request it (scopes=storage). - Without read access to a table or bucket, that row shows
No access. - File previews drop personal-data columns (SSN, government ID, date of birth, names, address, email, phone, card holder data).
Cost
A daily recon refresh scans about 2.5 GB, mostly the unpartitioned fact_fiserv_payments, fact_checkout_payments and fact_psp_funding_transaction. Results are cached for 5 minutes per user. A nightly dt-dbt model is the planned replacement.
Known gaps
| Area | Finding |
|---|---|
WebBank |
gcs.webbank_bank_statement (BAI2) and gcs.webbank_drawdown_request are not read by any dbt model. OR 13.7 calculates WebBank's balance from our own ledger. |
CFSB |
The only reconciliation model, int_cfsb_quickbooks_reconciliation, is Deprecated. The daily prefund wire has no transaction key; Finance's prefund definition is needed. |
Lithic |
Only card_transactions is modelled past staging. Visa and Visa Interlink debit settlements have no Lithic file to reconcile against. |
Lithic |
settlement_date rolls weekends into Monday. Reconcile on the report date in the file name = fact_processor_settlement.reporting_date. |
InComm |
fact_incomm_swipe_transaction.log_id is documented as the Majority transaction id but joins nothing. Use vend_resp_ref_num = fact_transaction.transaction_id. |
fact_processor_settlement |
settlement_detail_id is always null. Lithic settlement_id joins ledger_transaction_id. |
Dwolla |
fact_dwolla_transactions stops at 2026-10-15 and matches about 50%. Join fact_dwolla_transfers_reconciliation.transfer_id to base_ach_transaction_ach_event.external_transaction_id. |
Axiom |
axiom_opening_closing_balance_report is Deprecated but still uploaded daily. |