Skip to content

How to Connect Plaid to Odoo: Bank Sync Integration Guide

DeployMonkey Team · March 23, 2026 10 min read

Why Use Plaid with Odoo?

Plaid connects to over 12,000 financial institutions and provides secure, read-only access to bank transaction data. Integrating Plaid with Odoo Accounting eliminates the tedious process of downloading CSV bank statements, uploading them, and manually matching transactions. Instead, transactions flow in automatically, and Odoo's reconciliation engine matches them to invoices and bills.

For businesses processing hundreds of transactions monthly, this integration saves 5-10 hours per week of bookkeeping time and reduces reconciliation errors by eliminating manual data entry.

How the Integration Works

Plaid acts as a secure intermediary between your bank and Odoo. The data flow works as follows:

  1. You authenticate your bank account through Plaid Link (a secure widget)
  2. Plaid retrieves transactions from your bank via their API
  3. A middleware service (webhook handler or scheduled script) pulls transactions from Plaid
  4. Transactions are pushed into Odoo bank statement lines via XML-RPC or JSON-RPC
  5. Odoo's reconciliation engine matches them to existing journal entries

Prerequisites

  • Odoo 17+ with the Accounting module installed
  • Plaid developer account (free sandbox, $500+/mo for production)
  • A middleware server or automation platform (n8n, custom script, or Zapier)
  • Bank account at a Plaid-supported institution

Step 1: Set Up Plaid

  1. Create an account at dashboard.plaid.com
  2. Get your client_id and secret from the Keys section
  3. Start in Sandbox mode for testing
  4. Enable the Transactions product

Step 2: Link a Bank Account

Use Plaid Link to connect your bank account. In production, this requires a frontend component. For server-side integration, you can use Plaid's sandbox test credentials:

# Create a link token
curl -X POST https://sandbox.plaid.com/link/token/create \
  -H 'Content-Type: application/json' \
  -d '{
    "client_id": "YOUR_CLIENT_ID",
    "secret": "YOUR_SECRET",
    "user": {"client_user_id": "odoo-user-1"},
    "products": ["transactions"],
    "country_codes": ["US"],
    "language": "en"
  }'

After the user authenticates, exchange the public token for an access token that you store securely for ongoing API calls.

Step 3: Fetch Transactions

import plaid
from datetime import datetime, timedelta

client = plaid.Client(client_id='...', secret='...', environment='sandbox')

start = (datetime.now() - timedelta(days=30)).strftime('%Y-%m-%d')
end = datetime.now().strftime('%Y-%m-%d')

response = client.Transactions.get(access_token, start, end)
transactions = response['transactions']

Step 4: Push to Odoo Bank Statements

import xmlrpc.client

odoo_url = 'https://your-odoo.com'
db = 'your_db'
uid = 2
api_key = 'your_api_key'

models = xmlrpc.client.ServerProxy(f'{odoo_url}/xmlrpc/2/object')

for txn in transactions:
    models.execute_kw(db, uid, api_key, 'account.bank.statement.line', 'create', [{
        'date': txn['date'],
        'payment_ref': txn['name'],
        'amount': -txn['amount'],  # Plaid uses opposite sign convention
        'journal_id': bank_journal_id,
    }])

Step 5: Automate with Webhooks

Plaid sends webhooks when new transactions are available. Set up a webhook endpoint that listens for TRANSACTIONS events and triggers the sync automatically. This ensures near-real-time transaction imports without polling.

Data Mapping

Plaid FieldOdoo FieldNotes
datedateDirect mapping
namepayment_refTransaction description
amountamountNegate (Plaid: positive=debit)
category-Can map to analytic accounts
merchant_namepartner_idMatch to Odoo partner
transaction_id-Store as external ID for dedup

Security Considerations

  • Never store Plaid access tokens in Odoo fields visible to users
  • Use Odoo's ir.config_parameter with encryption for secrets
  • Plaid access is read-only — it cannot move money or modify accounts
  • Enable Plaid's webhook verification to prevent spoofed webhook calls
  • Implement transaction deduplication using Plaid's transaction_id

Plaid Pricing

TierCostFeatures
SandboxFreeTest data only
Production$500+/moReal bank connections
Per connection$0.30-3.00Per linked account/month

Plaid is best suited for businesses with high transaction volumes where the cost is justified by the time savings. For lower volumes, manual CSV import or Odoo's built-in bank sync (OCA module) may be more cost-effective.

DeployMonkey + Plaid

DeployMonkey instances come with stable URLs and API access ready for Plaid webhook integration. Our AI agent can help you configure the bank journal settings and test the transaction import pipeline.