| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
eCommerce (website_sale)
• Discuss (mail) • Invoicing (account) • Website (website) |
| Lines of code | 560 |
| Technical Name |
fees_extension_stripe |
| License | LGPL-3 |
| Website | https://www.shadailtech.com |
| Availability |
Odoo Online
Odoo.sh
On Premise
|
| Odoo Apps Dependencies |
•
eCommerce (website_sale)
• Discuss (mail) • Invoicing (account) • Website (website) |
| Lines of code | 560 |
| Technical Name |
fees_extension_stripe |
| License | LGPL-3 |
| Website | https://www.shadailtech.com |
|
|||||||||||||||||
|
Who Can Use It?
💳 eCommerce Businesses — Pass Stripe card processing fees transparently to customers on the website checkout page.
📊 Finance & Accounting Teams — Get a clean, dedicated order line for processing fees that flows automatically into invoices and accounting reports.
🛒 B2B & B2C Sellers — Recover Stripe fees from customers who pay by card while keeping bank-transfer and ACH options free of charge.
⚙️ Odoo Administrators — Configure the fee rate in minutes directly from the Stripe payment provider form — no code changes or custom roles needed.
🔧 Developers & Integrators — Leverage a clean OWL + Python implementation with no monkey-patching and idempotency built in for safe cron retries.
Why Choose This Extension?
⚡ 100% Transparent — Customers see the exact fee before confirming — order subtotal, processing fee, and total charged — no surprises at checkout.
🎯 Clean Accounting — The fee lands as a dedicated product line on the sale order and flows into the invoice, reportable via a separate income account.
🚀 Zero Configuration Overhead — One screen to set the rate, one auto-created fee product, no new security groups — up and running in under five minutes.
🛡️ Idempotency Safe — Duplicate fee lines are prevented even when Odoo's payment cron retries a transaction multiple times.
🔗 Webhook-Powered Reconciliation — The fee order line is created on Stripe payment confirmation via webhook — no manual reconciliation needed.
When a customer reaches the payment step and selects a card method, the fee breakdown block appears automatically below the order summary. The fee is calculated in real time using the formula:
Fee = (Order Total × Fee %) + Fixed FeeFor Stripe's standard US rate:
(total × 0.029) + 0.30
After successful payment, the Stripe webhook fires and Odoo creates the fee as a dedicated order line on the confirmed sale order — using the auto-created Processing Fee product — and it flows into the invoice automatically.
If the customer switches to bank transfer or ACH at any point, the fee panel disappears and no fee line is created. This makes the experience completely transparent and fair.
Real-Time Fee Calculation
Configurable Rate
Separate Line Item
Card-Only Trigger
Idempotency Safe
Webhook Integration
Portal Transparency
Saved Card Support
No Custom Roles
Auto Fee Reconciliation
Recover Stripe Card Fees Transparently — Zero Manual Work
The Stripe Processing Fee Extension wires into Odoo's existing Stripe payment provider and website checkout pipeline. One configuration screen, one auto-created fee product, and a Stripe webhook that writes the fee line back to the sale order automatically after payment — all without any new security groups, custom cron jobs, or code changes.
| Real-Time Fee Calculation | Fee is computed and displayed instantly on the payment portal the moment the customer selects a card payment method, using the formula (total × fee%) + fixed_fee. |
|---|---|
| Configurable Rate | Set your own percentage (e.g. 2.9%) and fixed amount (e.g. $0.30) per payment provider directly in Accounting → Configuration → Payment Providers → Stripe — no code change required. |
| Dedicated Fee Order Line | The fee appears as a separate product line on the confirmed sale order and linked invoice, keeping accounting clean and auditable with its own income account. |
| Card-Only Trigger | The fee panel is shown only when a card payment method is selected. Bank transfers and ACH payments remain fee-free, and the fee block disappears automatically when switching methods. |
| Idempotency Safe | Duplicate fee lines are prevented even if Odoo's payment cron retries a transaction multiple times, ensuring no duplicate charges appear on the sale order. |
| Webhook Integration | The fee order line is auto-created on payment confirmation via the Stripe payment_intent.succeeded webhook using a safe sudo pattern — no manual reconciliation needed. |
| Portal Fee Breakdown | Full fee breakdown — Order Subtotal, Processing Fee (with rate badge), and Total Charged — is shown to customers before they confirm payment. Complete transparency with no surprises. |
| Saved Card Support | Fee breakdown also appears correctly when customers pay with a saved card on file in the Odoo customer portal. |
| No Custom Roles | Uses existing Accounting Manager access for configuration — no new security groups, custom roles, or access rights CSV entries are required. |
| Auto Fee Product | A Processing Fee product is created automatically during installation and linked to the Stripe provider. The income account can be customised on the product form for separate revenue tracking. |
Follow these steps from installation through live fee collection.
-
Install the Module
Go to Apps → Search "Stripe Processing Fee Extension" → Install. The module adds fee-related fields to the Stripe payment provider configuration.
💡Prerequisites: The module requires payment_stripe sale website_sale. The Stripe payment provider must be configured and active before the fee extension will work. A Processing Fee product is created automatically during installation. -
Configure the Processing Fee Rate
Go to Accounting → Configuration → Payment Providers → Stripe. In the Processing Fee section, set the following fields:
Setting Description Fee PercentageThe variable part of the fee as a percentage of the order total. Default: 2.9%. Fixed FeeA flat amount added to every card transaction regardless of order size. Default: $0.30. Fee ProductThe Odoo product used as the order line for the fee. Created automatically during installation. 💡Fee formula:Fee = (Order Total × Fee %) + Fixed Fee
For Stripe's standard US rate:(total × 0.029) + 0.30 -
Verify the Stripe Webhook is Active
The fee order line is created when Stripe confirms payment via webhook. Ensure your Stripe webhook is properly configured in Odoo:
- Go to Accounting → Configuration → Payment Providers → Stripe → Webhook.
- Confirm the webhook URL is registered in your Stripe Dashboard under Developers → Webhooks.
- Ensure the
payment_intent.succeededevent is enabled.
⚠️Important: Without an active webhook, the fee line will not be added to the sale order after payment. The fee will still be collected by Stripe but will not be visible in Odoo. -
Customer Checkout Experience
When a customer reaches the payment step and selects a card method:
- The fee breakdown block appears automatically below the order summary.
- It shows: Order Subtotal, Processing Fee (with the rate), and Total Charged.
- The amounts update in real time if the customer switches between payment methods.
- If the customer selects bank transfer or ACH, the fee block hides and no fee is charged.
✅Saved cards on file in the Odoo portal also trigger the fee breakdown correctly — no additional configuration needed. -
Review the Fee on the Sale Order
After successful payment, open the confirmed sale order in Sales → Orders → Orders. The fee appears as a dedicated order line with the Processing Fee product. It is included in the invoice automatically when the order is invoiced.
📊Accounting tip: The fee product uses a dedicated income account (configured on the fee product form) so you can report on processing fee revenue separately in Odoo's accounting reports.
How the fee moves from the portal through to the sale order and invoice.
Selects card payment on portal
Breakdown shown in real time
Stripe webhook fires
payment_intent.succeeded
SOL created on sale order
If the customer switches back to a bank-transfer method the fee panel disappears and no fee line is created. Switching back to card will show the fee again before confirmation.
| Step | What Happens | Where |
|---|---|---|
| Card method selected | JavaScript reads the current order total, applies (total × fee%) + fixed_fee, and renders the breakdown block below the payment summary. |
Website payment portal (browser) |
| Method switched | If the customer selects a non-card method, the fee block is hidden immediately and the displayed total reverts to the original order subtotal. | Website payment portal (browser) |
| Payment confirmed | Customer confirms and Stripe processes the payment (including the fee amount) via the payment form. | Stripe infrastructure |
| Webhook received | Stripe sends payment_intent.succeeded to the Odoo webhook endpoint. Odoo's payment controller processes the event. |
Odoo payment controller |
| Fee line created | The module's webhook handler locates the linked sale order, checks idempotency (no existing fee line), and creates the processing fee order line using a sudo pattern. | Odoo server (Python) |
| Invoice propagation | When the sale order is invoiced, the fee order line flows into the invoice automatically as a standard Odoo order line, posted to the fee product's income account. | Odoo accounting |
Dependencies, data models, extensions, and configuration field reference for developers and integrators.
| Requirement | Details |
|---|---|
| Odoo Version | 19.0 (Community or Enterprise) |
| Required Odoo modules | payment_stripe sale website_sale |
| Stripe account | An active Stripe account with the Odoo webhook configured (payment_intent.succeeded event enabled). |
| Python packages | No additional packages required beyond standard Odoo dependencies. |
| Browser support | Modern browsers with JavaScript ES6+ (Chrome 80+, Firefox 75+, Safari 13+, Edge 80+) |
| Model / View | Change |
|---|---|
payment.provider | Adds stripe_fee_percentage, stripe_fee_fixed, and stripe_fee_product_id fields with a Processing Fee section on the provider form. |
sale.order | Adds a helper method to locate or create the processing fee order line, with idempotency check built in. |
| Website payment form template | Injects the real-time fee breakdown block (subtotal, fee, total) below the order summary whenever a card method is active. |
| Website sale template | Extends the checkout page to surface the fee breakdown when a card method is selected, and hides it for non-card methods. |
| Stripe webhook controller | Extended to call the fee-line creation method on the sale order after payment_intent.succeeded is received. |
| Field | Location | Description |
|---|---|---|
stripe_fee_percentage | Payment Provider form | Variable fee as a decimal percentage (e.g., 2.9 for 2.9%). |
stripe_fee_fixed | Payment Provider form | Fixed fee added to every card transaction (e.g., 0.30 for $0.30). |
stripe_fee_product_id | Payment Provider form | The product used for the fee order line. Defaults to the auto-created Processing Fee product. |
| Fee product income account | Product form (Accounting tab) | The account used to post processing fee revenue. Set to a dedicated income account for separate fee reporting. |
This module is ready to use out of the box for Stripe card fee pass-through. If you need custom fee structures (tiered rates, per-country rates, multi-provider fee rules), additional payment provider support, or integration with your accounting workflow, our team at Shadail Technology is here to help with a tailored paid setup.
Note: This module integrates with standard Odoo 19 Stripe payment provider and website sale modules. For custom payment provider extensions or advanced fee logic, please contact our team.
This module has been tested with Odoo 19 standard payment_stripe, sale, and website_sale modules on Ubuntu OS.
We strongly recommend:
- Installing it first on your testing or staging database with Stripe in test mode.
- Verifying the fee appears correctly on the checkout page and on the confirmed sale order.
- Confirming the Stripe webhook is active and the
payment_intent.succeededevent is enabled. - Only then deploying it on your production environment.
Odoo Solutions & Digital Transformation
© 2026 Shadail Technology
LGPL-3 License • Odoo 19
Address
Office no. 602, Raj Oaks, MTNL Rd,
Gokul Village, Mira Road East,
Mira Bhayandar, MH 401107
Please log in to comment on this module