Bank Feed: Plaid
Live bank transaction import from Plaid for US, Canada, UK, and European accounts with automatic statement line creation and idempotent reconciliation.
Why this module
Bank Feed: Plaid
Bring Your Own Keys
Supply your own Plaid credentials (client id, secret, access token, account id); no IAP charges, no API tax, only your Plaid subscription cost.
Safe Repeated Runs
Recognizes Plaid transaction ids and skips duplicates on re-fetch. Reconciliation workflows can run daily without creating phantom transactions.
Minimal Dependencies
Pure Python HTTP; no heavy SDKs to maintain. Credentials stay in your deployment; credentials never transmitted except to Plaid.
Day in the life
Banking team automates daily imports
Configure a connector profile once with Plaid credentials and account id. Scheduled jobs fetch new transactions every 2 hours into the linked bank journal. Duplicate-safe on Plaid id. A human reviews the statement in Odoo, matches entries, and posts.
Edge cases
The cases most modules quietly ignore.
In the shipped code today, each one a place where a cheaper module silently does the wrong thing.
Plaid returns transactions in pages with a cursor. Code iterates until has_more is false, collecting all rows. Guards against infinite loops with a page limit of 50.
Plaid may return rows from other accounts in the same sync result. Code filters by account_id to import only the intended account.
Plaid: positive amount = money out. Connector negates to Odoo convention (negative = debit). Both tests and the code explicitly document this mapping.
Filters transactions to the requested since_date and until_date window. Rows outside the window are discarded silently to avoid stale imports.
Skips rows missing transaction_id, posted date, or amount. Returns None instead of erroring to tolerate partial API responses.
Uses row iso_currency_code if present, falls back to unofficial_currency_code or profile default (USD) if not.
What is inside
Built to do the job, end to end.
- connectors/plaid_live.py. PlaidLiveConnector class extending LiveBankConnector. authenticate() validates credentials and selects Plaid host by environment. fetch_transactions() paginates /transactions/sync, filters by account and date window, negates amounts.
- tests/test_plaid_live.py. test_sign_flip_and_filters() validates amount negation across two-page Plaid response. test_registered_over_stub() confirms live connector overrides stub. test_missing_credentials_raises() tests error path for incomplete config.
- _map_transaction(). Static method converting Plaid row to BankTransaction. Filters by account_id, date range. Negates raw_amount (Plaid positive=out to Odoo negative=debit). Sets provider_reference to transaction_id for idempotency.
- _credentials() and _HOSTS. Validates required fields (client_id, secret, access_token, account_id). Selects endpoint from sandbox/development/production enum. Raises ConnectorError if validation fails.
Honest about the edges
What this does not do, so nothing surprises you.
- Requires Plaid subscription and a Live mode item (not Link-only). Customer must obtain client_id, secret, access_token, and account_id themselves.
- Depends on eh_account_bank_statement_import parent module; the parent framework handles scheduling, journal binding, and statement creation. This module is a connector only.
- Supports US, Canada, UK, and EU Plaid regions. Other geographies must check Plaid's API availability.
- Does not parse merchant category codes or transaction type fields; imports only basic amount, date, name, merchant_name, and pending status.
- Polling interval, retry logic, and error notification are managed by the parent framework, not the connector.
Plaid bank integration, automatic bank statement import, live bank feed, transaction sync Odoo, Plaid connector, BYO Plaid credentials, idempotent import, multi-region banking, account reconciliation, US Canada UK EU banking, no IAP bank feed, open source bank connector
Modules teams pair with this one.
Premium ERP Heritage modules that extend the same stack, each built to the same engineering bar.
The Australia country pack for the ERP Heritage Employment Hero integration
Sync certifications, qualifications and employee document metadata from the Employment Hero people platform into...
Sync Employment Hero leave categories, leave requests and leave balances into the standard Odoo Time Off app, wit...
Show the Hijri (Umm al-Qura) date alongside Gregorian dates across Odoo 16
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
Invoicing (account)
• Discuss (mail) |
| Community Apps Dependencies | Show |
| Lines of code | 6104 |
| Technical Name |
eh_account_bank_statement_import_plaid |
| License | LGPL-3 |
| Website | https://www.erpheritage.com.au/ |
Please log in to comment on this module