Skip to main content
Import Sales Order Lines from Excel or CSV — A build-to-order Odoo module that lets your team paste or upload an Excel/CSV fi — 1/1Illustrative preview

A build-to-order Odoo module that lets your team paste or upload an Excel/CSV file directly onto a quotation and

generate validated sales order lines in one action. Scoped, built, and supported by ECOSIRE.

What is Import Sales Order Lines from Excel or CSV?

A build-to-order Odoo module that lets your team paste or upload an Excel/CSV file directly onto a quotation and generate validated sales order lines in one action. Scoped, built, and supported by ECOSIRE. Built to order by ECOSIRE for Odoo 17, 18, 19 — indicative price from $999.00 USD; request a quote for a scoped proposal.

Key Features

Import Lines action added directly to the sale.order form view — no separate menu hunt, the wizard opens against the currently loaded quotation
TransientModel wizard accepting .xlsx (parsed via openpyxl) and .csv/delimited files with configurable delimiter and encoding detection
Column-to-field mapping for product, quantity, unit price, discount, unit of measure, taxes, and line description, remembered as a reusable mapping profile
Product resolution by internal reference (default_code), barcode/EAN13, customer-specific product code, or name, with a configurable match priority
Live preview grid (computed via @api.depends) showing every parsed row with resolved/unresolved status before any sale.order.line is written
Row-level validation that flags unknown SKUs, missing UoM, non-numeric quantities, and blank prices with a specific reason per failed row
Pricelist fallback — take unit price from the file or resolve it from the customer's Odoo pricelist when the column is empty
Unit-of-measure conversion honoring the product's UoM category so a file in cartons maps correctly to a product sold in units
Downloadable column template (.xlsx/.csv) generated from your agreed mapping so staff always upload the correct layout
Idempotent append behavior with optional de-duplication so re-running a corrected file does not double the lines already on the order
Tax and discount handling that respects fiscal position and the customer's tax configuration rather than blindly overwriting
Access controlled through ir.model.access.csv plus optional record rules so only sales roles can run the import
Import summary logged to the order chatter (mail.thread) — who imported, file name, rows created, rows skipped — for a full audit trail
Optional XML-RPC/JSON-RPC endpoint so an upstream ERP, EDI, or e-commerce system can push an order file into a draft quotation programmatically
Built and tested for Odoo 17.0, 18.0, and 19.0 on Community or Enterprise, matched to your exact edition

Built to order, done for you

No DIY setup — a working app, built, installed and supported by ECOSIRE.

  1. 1

    You order

    Start with a one-time build price. We scope it with you at kickoff.

  2. 2

    We build & install

    ECOSIRE builds, configures and installs it on your Odoo.

  3. 3

    Go live + support

    You go live in about one working week, with two weeks of go-live support. Defects in the code we deliver are fixed free of charge.

Technical Specifications

Odoo Compatibility
Odoo 17, Odoo 18, Odoo 19
Editions
Enterprise & Community
License
Licence confirmation required
Python Requirement
Python 3.10+
Database
PostgreSQL 12+

About this Product

Re-keying twenty, fifty, or two hundred order lines by hand into a quotation is where sales-order accuracy quietly falls apart. Customers send purchase orders as spreadsheets, distributors send reorder lists in Excel, and your team ends up typing each product_id, quantity, unit price, and discount into the sale.order.line grid one row at a time — mistyping SKUs, missing lines, and applying the wrong price. Odoo core has no native bulk line-entry on the sales order form; the built-in base_import framework imports whole records into a model, not child lines onto a specific open quotation, and it cannot resolve your customer's part numbers or supplier references to internal products on the fly. That gap is exactly what this module closes.

We build a made-to-order Odoo module that adds an Import Lines action directly on the sale.order form. A user opens (or creates) a quotation, launches the wizard (a TransientModel), uploads an .xlsx or .csv file, and the module parses it server-side (openpyxl for Excel, Python's csv for delimited files), maps each column to the right field, matches products by internal reference, barcode, customer product code, or name, and writes clean sale.order.line records back onto that order. A preview step shows every parsed row with a resolved/unresolved status before anything is committed, so bad SKUs, unknown units of measure, and missing prices are caught up front rather than in the confirmed order. Quantities, unit prices, discounts, taxes, and UoM are all honored; unmatched rows are flagged with a clear reason instead of silently dropped.

Technically, the module ships as a proper addon: a __manifest__.py declaring the dependency on sale, a wizard model with @api.depends compute logic for the live preview, an OWL/XML view for the upload-and-map screen, and a downloadable column template so your team knows the expected layout. Product matching is configurable — we wire it to your real data (internal reference, EAN13 barcode, or the customer-specific product_customer_code on the partner), and pricing can either take the value from the file or fall back to the Odoo pricelist for that customer. Access is governed by ir.model.access.csv and, where you need it, record rules so only sales users can run the import. Everything is built against your Odoo edition and version — Community or Enterprise, 17.0, 18.0, or 19.0 — and the same file-parsing engine can optionally be exposed over the XML-RPC/JSON-RPC API if you want an upstream system to push order files programmatically.

Because this is build-to-order, nothing ships until we have agreed the scope. We start with a short scoping call to confirm your file formats, the column mapping, how products should be matched, and your Community-vs-Enterprise and version constraints. We then build on a staging copy of your database, run UAT with your real spreadsheets, and only deploy to production once you have signed off. Typical delivery is one working week from confirmed scope. Pricing starts from $999 (indicative, single-company base scope); multi-company rollout, non-standard file layouts, deeper customer-product-code cross-referencing, or integration with an upstream ordering system increases the quoted scope.

What you get

  • Installable, version-matched Odoo addon source code for your Odoo 17/18/19 Community or Enterprise environment
  • Installation and configuration on your staging environment, including column-mapping profile and product-match rules wired to your data
  • Technical documentation covering the manifest, wizard model, matching logic, and security (ir.model.access.csv + record rules)
  • End-user guide plus a live training session for your sales team on running the import and reading the preview/error report
  • UAT on a staging copy of your database using your real spreadsheets, with a documented rollback plan before production deploy
  • Post-go-live support window for bug fixes and adjustments to the mapping/matching behavior
  • Git repository handover with tagged release and commit history for full ownership of the code
  • Downloadable import template file matching your agreed column layout

Who this is for

Sales operations lead

Owns quotation accuracy and turnaround. Receives customer POs as spreadsheets and needs the team to turn them into confirmed sales orders in minutes without transcription errors or wrong SKUs.

B2B distributor / wholesaler

Processes large, repeat reorder lists from resellers. Needs bulk line entry that resolves customer part numbers to internal products and applies the correct contract pricelist automatically.

Odoo functional consultant or in-house admin

Runs the company's Odoo instance and wants a clean, version-safe addon with proper security and documentation rather than a brittle in-house script that breaks on the next upgrade.

Operations manager scaling order intake

Facing rising order volume and wants to cut manual data entry, reduce order-line mistakes, and free sales staff for selling rather than typing.

How Import Sales Order Lines from Excel or CSV Compares

CriterionECOSIRECustom BuildCompetitorOdoo Native
Fit to your files & productsBuilt around your exact columns, SKUs, and customer part numbersFully bespoke but you specify and manage everythingGeneric layout you must bend your files to fitNo bulk line import onto an open order at all
Product matchingConfigurable priority: internal ref, barcode, customer code, nameWhatever you build; needs its own designUsually name or internal reference onlyManual selection per line
Error handlingPreview grid with per-row reason before commitDepends on how much you invest in validationOften import-and-hope with limited feedbackNot applicable
Odoo version/edition safetyMatched and tested for your 17/18/19 Community or EnterpriseYour responsibility to maintain across upgradesDepends on vendor's update cadenceCore-supported but lacks the feature
Delivery modelScoped, built, UAT'd, deployed, supported by usYou hire and manage developersInstant download, self-install, self-supportAlready present, nothing to add
OwnershipFull git repo handover — you own the codeYou own itLicensed; source may be obfuscated or restrictedPart of Odoo core
Support & changesPost-go-live support window + optional maintenanceOnly what your team can provideGeneric ticket queue, changes rarely bespokeCommunity/Enterprise support, not for this gap
Upfront costFrom $999 indicative, fixed quote after scopingTypically the highest — developer timeLow sticker price, hidden fit/rework costIncluded, but doesn't solve the problem

Frequently Asked Questions about Import Sales Order Lines from Excel or CSV

Is this a ready-made app I can download and install right now?

No. This is a build-to-order Odoo module. We scope it to your exact file formats, product-matching rules, and Odoo edition/version, then build, install, and support it. It is not an existing apps.odoo.com download.

How long does delivery take?

Typical delivery is one working week from confirmed scope. After a short scoping call we agree the column mapping and matching logic, build on a staging copy of your database, run UAT with your real spreadsheets, and deploy to production once you sign off. Volume, multi-company rollout, and integrations can extend the timeline — we confirm dates in the fixed quote.

How does pricing and scoping work?

Pricing starts from an indicative $999 for a single-company base scope. After a 15–45 minute scoping call we send a fixed quote. Drivers such as multi-company setups, non-standard file layouts, customer-product-code cross-referencing, and upstream integrations increase the quoted scope. You approve the fixed price before we build.

Which Odoo versions and editions do you support?

We build and test for Odoo 17.0, 18.0, and 19.0 on both Community and Enterprise. We match the build to your exact edition and version so the addon installs cleanly and survives your upgrade path.

What happens to rows that don't match a product?

Nothing is silently dropped. The preview step shows every parsed row with a resolved/unresolved status and a specific reason for each failure — unknown SKU, missing unit of measure, blank price, or non-numeric quantity. You review and correct the file before any sale.order.line is committed to the quotation.

How does the module know which product each spreadsheet row refers to?

We configure the match priority to your data — internal reference (default_code), barcode/EAN13, customer-specific product code, or product name. For B2B distributors we typically wire it to the customer's part numbers so their reorder lists resolve to your internal products automatically.

What support and updates do I get after go-live?

Every build includes a post-go-live support window for bug fixes and mapping adjustments. Because you receive the full git repository, you own the code outright. We can also provide ongoing maintenance or version-upgrade work under a separate agreement as your Odoo instance evolves.

Can an upstream system push order files in automatically?

Yes, optionally. The same parsing engine can be exposed over Odoo's XML-RPC/JSON-RPC API so an ERP, EDI, or e-commerce platform can drop a file into a draft quotation programmatically. This is one of the scope drivers we confirm during the scoping call.

Request a quote

Import Sales Order Lines from Excel or CSV

A build-to-order Odoo module that lets your team paste or upload an Excel/CSV file directly onto a quotation and generate validated sales order lines in one action. Scoped, built, and supported by ECOSIRE.

  • Import Lines action added directly to the sale.order form view — no separate menu hunt, the wizard opens against the currently loaded quotation
  • TransientModel wizard accepting .xlsx (parsed via openpyxl) and .csv/delimited files with configurable delimiter and encoding detection
  • Column-to-field mapping for product, quantity, unit price, discount, unit of measure, taxes, and line description, remembered as a reusable mapping profile
  • Product resolution by internal reference (default_code), barcode/EAN13, customer-specific product code, or name, with a configurable match priority

Request a Quotation

Tell us about your Import Sales Order Lines from Excel or CSV requirements and we'll send pricing, licensing options and a tailored proposal — usually within one business day.

No payment now. This sends a quote request to our team — we'll follow up by email with pricing and next steps.