Skip to content

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, Axiom invoices, Checkout, Dwolla, Fiserv). - Read from the raw gcs / s3 tables in dw-prod-gwiiag (file_name / s3_file_name, ingested_at).
  • Sent reports: latest archived file for 19 dt-reporting reports to Axiom and WebBank. - Read from the axiom-reports-prod and webbank-reports-prod buckets.
  • dbt usage per file: reconciled, modelled, staging only or not used, generated from the dt-dbt manifest.
  • 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. - WebBank is a balance check; CFSB shows the provider side only.
  • Data flow: for each check, provider files → dbt models → check ← Majority models, linked to dt-dbt-lineage and 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.