Skip to main content

Flutterwave Vendor Payments for Odoo 18

ECOSIRE Flutterwave Vendor Payments pays your vendor bills from Odoo through Flutterwave Transfers. Your team pays a posted vendor bill, or many bills at once, to the vendor's bank account held in Odoo. Each payment is tracked until Flutterwave confirms it, and a confirmed payment is registered on the bill and reconciled automatically.

It handles outgoing payments only. Incoming customer payments use Odoo's own Flutterwave payment provider, which works alongside this module and is not changed by it (see Customer receipts).

Compatibility: Odoo 18 (Community and Enterprise) · depends only on Accounting/Invoicing (account) Flutterwave API: v3 Transfers

Features​

  • Flutterwave account per company with Test and Live modes. Odoo refuses a live key in Test mode and a test key in Live mode.
  • Protected credentials. The secret key and the webhook secret hash are visible to system administrators only, and are never displayed back or written to a log.
  • Bank list from Flutterwave for the country you choose (Nigeria by default), refreshed on demand. A bank that Flutterwave removes is archived, never deleted.
  • Vendor account name check. Before a vendor bank account is paid, Flutterwave resolves the account holder's name at the bank. Changing the bank or the account number clears the check.
  • Pay one bill or many. Pay via Flutterwave on a posted vendor bill, or on a selection of bills, with the option to send them as one Flutterwave bulk transfer.
  • Real status tracking. Draft → Submitted → Pending → Successful or Failed, plus Awaiting Approval, Reversed and Cancelled.
  • Signed notifications, confirmed at the source. A Flutterwave notification is accepted only when it carries your secret hash, and the transfer is then looked up with Flutterwave before any bill is touched.
  • Scheduled status check every 30 minutes as the fallback for a notification that never arrived.
  • Automatic reconciliation. A successful payout registers the payment on the bill through Odoo's standard payment flow and reconciles it.
  • Fees booked separately. Flutterwave charges its fee on top of the transfer, so the fee is posted as its own entry and the bill payment equals what the vendor received.
  • Reversal handling. A payout reported failed after it had succeeded cancels the registered payment and re-opens the bill.
  • Money-safety controls (see Safety controls).
  • Two user groups and multi-company record rules on every model.

Requirements​

You needNotes
Odoo 18 with Accounting or InvoicingThe module depends only on account.
A Flutterwave business account with Transfers enabledBusiness activation (KYB) is completed with Flutterwave.
Flutterwave secret keysA test key (FLWSECK_TEST-…) first, then the live key (FLWSECK-…).
A webhook secret hashA value you choose; the same value goes into Flutterwave and into Odoo.
Odoo reachable over HTTPS from the internetFlutterwave must be able to deliver status notifications to Odoo.
The Python requests libraryPresent on standard Odoo installations.

Installation​

  1. Place the ecosire_flutterwave_vendor_payments folder in a directory on your Odoo addons_path, owned by the Odoo service user.
  2. Restart Odoo.
  3. Go to Apps → Update Apps List, search for Flutterwave Vendor Payments and click Activate.

A new Flutterwave Payouts menu appears for users in the Flutterwave groups.

Configuration​

1. Flutterwave account​

Go to Flutterwave Payouts → Configuration → Flutterwave Accounts and create one account for the company.

FieldWhat to enter
EnvironmentTest to start. Test moves no real money.
Secret KeyYour Flutterwave secret key for the selected environment.
Webhook Secret HashThe secret hash you also enter in the Flutterwave dashboard.
Payment JournalThe bank journal vendor payments are registered in (for example a journal representing your Flutterwave balance).
Fee Journal / Transfer Fee AccountA miscellaneous journal and an expense account for Flutterwave fees. Leave the account empty to record the fee on the payout without posting it.
Bank CountryISO country code for the bank list, NG by default.
Payout Currency / Debit CurrencyOptional. Leave empty to pay in each bill's currency.
Require Name EnquiryOn by default: a vendor account whose name has not been verified cannot be paid.
Poll Open TransfersOn by default: lets the scheduled status check look this account's payouts up.

Then press Test Connection, followed by Fetch Banks.

Protect payment credentials

Never place Flutterwave keys or the secret hash in screenshots, tickets, chat messages, source control or this documentation. Rotate a key immediately if it is exposed.

2. Webhook​

The account form shows the Callback URL (https://<your-odoo>/flutterwave/webhook). In the Flutterwave dashboard, open the webhook settings, enter that URL and the same secret hash you saved in Odoo. A hash that differs means every notification is discarded; payouts then only update through the scheduled check or Refresh Status.

3. Scheduled status check​

Settings → Technical → Scheduled Actions → Flutterwave: Poll Open Payouts (developer mode). It is installed inactive, so a fresh installation never calls Flutterwave without credentials. Activate it as soon as the account is configured and tested. Every 30 minutes it:

  • looks up every payout that is still open;
  • reads every Flutterwave transfer of the last seven days and posts any reference that has no payout in Odoo on the Flutterwave account's chatter, once per reference.

4. User groups​

GroupAccess
Flutterwave: PayoutsCreate and send payouts and batches, refresh statuses, read accounts and banks. Implies Odoo's billing rights.
Flutterwave: ConfigurationEverything above, plus manage Flutterwave accounts and banks.
System administratorsReceive Configuration automatically; the only users who can read or change credentials.

5. Vendor bank accounts​

Open the vendor → Accounting tab → the bank account. Select the Flutterwave bank, confirm the account number, and press Verify with Flutterwave. The account name returned by the bank is recorded and the account is marked verified.

Paying vendors​

One bill​

Open a posted vendor bill and click Pay via Flutterwave. Check the vendor bank account and amount, then confirm. The payout is created with a reference such as FLW/2026/00001 and sent; its status becomes Submitted. The bill stays Not Paid until Flutterwave confirms the transfer.

Many bills​

Select the bills in the vendor bills list and choose Pay via Flutterwave. Tick Send as one batch to send them in a single Flutterwave bulk transfer (reference FLWB/2026/0001) with an optional batch title shown in the Flutterwave dashboard. Bills that cannot be paid are listed at the top of the window with the reason and left out; the rest still go. Select bills of one company at a time.

Reconciliation​

When a payout is confirmed Successful:

  1. the payment is registered on the vendor bill in the account's payment journal and reconciled;
  2. the Flutterwave fee is posted as a separate entry to the fee account;
  3. the payout, the bill and the payment are linked, and each step is written in the chatter.

A Failed payout leaves the bill open and shows Flutterwave's own reason on the payout and on the bill. A payout that later turns Reversed has its payment cancelled and the bill re-opened.

Statuses​

StatusMeaningAvailable actions
DraftCreated in Odoo, not sent.Send Payout, Cancel
SubmittedAccepted by Flutterwave; money has not moved yet.Refresh Status
PendingFlutterwave is processing the transfer.Refresh Status
Awaiting ApprovalTransfer approval is enabled on the Flutterwave account. Approve it in the dashboard.Refresh Status
SuccessfulPaid; the bill is reconciled.—
FailedNot paid; the bill stays open with the reason.Retry (once)
ReversedReturned after success; the payment is cancelled and the bill re-opened.—
CancelledA draft withdrawn before sending.—

A payout marked Needs status check had a call end without a definite answer (a timeout, for example). It can only be refreshed: it is resolved by looking its reference up with Flutterwave and is never sent a second time.

Safety controls​

  • One payout per bill in flight. While a payout for a bill is submitted, pending, awaiting approval or of unknown outcome, the bill cannot be paid again. Two users paying the same bill at the same moment cannot both send: the second is told a payout is already being sent.
  • Checked against the bill. A payout must be to the bill's vendor, in the bill's currency, to a bank account belonging to that vendor, and for no more than the open amount. In a batch, all payouts for one bill together may not exceed the open amount.
  • No repeated money requests. A request that moves money is never repeated automatically after a timeout or network error; an unclear answer is resolved by looking the reference up.
  • Retry once. A failed payout can be retried once, as a new payout linked to the original.
  • Protected bills. A bill with a live payout cannot be reset to draft.
  • Unknown transfers are surfaced. Transfers found at Flutterwave with no payout in Odoo are reported on the account's chatter. Find such a transfer in the Flutterwave dashboard and register it on the bill by hand before paying the bill another way.

Customer receipts​

Customer payments use Odoo 18's built-in Flutterwave payment provider: Invoicing/Accounting → Configuration → Payment Providers → Flutterwave. Enter the public key, secret key and webhook secret, set the state to Test Mode, publish it, and switch to Enabled with live keys. Customers then pay invoices online and the payment is recorded against the invoice. Refunds are made from the Flutterwave dashboard. This module does not override that provider.

Going live​

  1. Run at least one successful and one deliberately failed payout in Test mode.
  2. Switch the account to Live and enter the live secret key.
  3. Update the webhook hash in the Flutterwave dashboard if it changed.
  4. Confirm Flutterwave: Poll Open Payouts is active and the account chatter shows no unmatched transfers.
  5. Set the Odoo Flutterwave payment provider to Enabled with live keys.

Troubleshooting​

You seeCauseFix
Pay via Flutterwave is missing on a billThe bill is not posted, is already paid, has a payout in progress, or the vendor has no Flutterwave bank account.Post the bill; add and verify the vendor bank account; check the bill's Flutterwave payouts.
"The account name … has not been verified"Name enquiry is required and not done.Press Verify with Flutterwave on the vendor bank account.
"No Flutterwave bank is set …" / "No account number is set …"Vendor bank details are incomplete.Complete them and verify.
"No Flutterwave account is configured for …"The bill's company has no Flutterwave account.Create one for that company.
"Invalid authorization key"Wrong key, or a key from the other environment.Re-enter the key; test keys contain _TEST.
"A payout for this bill is already being sent"Another user is paying the same bill at this moment.Wait, re-open the bill and check its payouts. Do not pay it twice.
Payouts stay Submitted or PendingNotifications are not reaching Odoo (URL or secret hash mismatch).Check the webhook settings, press Refresh Status, activate the scheduled check.
Payout in Awaiting ApprovalTransfer approval is on in Flutterwave.Approve in the Flutterwave dashboard.
Payout failed with a bank reasonThe receiving bank refused the transfer.Resolve with the vendor, then Retry or pay again.

FAQ​

Does the module collect payments from customers? No. Use Odoo's native Flutterwave payment provider for that; the two work side by side.

Is the fee deducted from the vendor's payment? No. Flutterwave charges the fee on top of the transfer, so the vendor receives the full bill amount and the fee is booked separately.

What happens if the connection drops while a payment is sent? The payout is marked Needs status check and resolved by looking its reference up with Flutterwave. It is never re-sent automatically.

Can we test without moving money? Yes. Use Test mode with a Flutterwave test key.

Does it work with several companies? Yes. Each company has its own Flutterwave account in Odoo, and a bill is paid from the account of the company it is booked in. Users see only their companies' records.

Which Flutterwave API version is used? Flutterwave v3 (secret-key authentication and the verif-hash webhook header).

Where do I get help? Write to info@ecosire.com with the payout reference (it starts with FLW/) and a screenshot.