ml-connector
OdooOrderful

Odoo and Orderful integration

Odoo is your ERP source of truth for procurement, inventory, and finance. Orderful is your EDI platform that translates, routes, and delivers documents to trading partners via X12, EDIFACT, AS2, SFTP, and other channels. Connecting the two keeps your purchase orders synchronized with your partners without manual re-entry or file uploads. When partners send back invoices, acknowledgments, and ship notices, they land in Odoo automatically, ready for matching and payment.

How Odoo works

Odoo exposes purchase orders, sales invoices, vendor bills, account moves, journal lines, partners, products, and analytic accounts through XML-RPC (all editions) and JSON-2 (Odoo 19 and later) REST APIs. Authentication uses an API key paired with a username, returned as a Bearer token. Odoo Online runs at https://<subdomain>.odoo.com, Odoo.sh at https://<subdomain>.odoo.sh, and self-hosted at a custom domain. API access requires a Custom pricing plan on Odoo Online, not the free tier. Polling is recommended for production use, using write_date filters with a high-water-mark timestamp to fetch only changed records. Webhooks exist via Automated Actions on Enterprise + Studio but are not production-grade and lack HMAC signatures.

How Orderful works

Orderful is a cloud EDI platform that receives and sends X12 and EDIFACT documents over REST API versioned at /v3 (list, retrieve) and /v4 (create, inbox operations). Authentication is a static API key passed in the orderful-api-key header, retrieved from the Orderful UI. Orderful accepts purchase orders as 850 documents, invoices as 810 documents, and payment orders as 820 documents for routing to partners. Inbound documents (855 acknowledgments, 856 ship notices, 810 vendor invoices) arrive in your Orderful inbox. Orderful supports both webhooks (push to your endpoint) and polling (GET /v3/polling-buckets every 5-10 minutes, 100 docs per request). Transactions require ISA identifiers (sender.isaId and receiver.isaId) and are region-scoped (US vs EU, not synced across).

What moves between them

The main flow runs outbound from Odoo to Orderful and back inbound. Outbound: ml-connector polls Odoo for new or changed purchase orders (confirmed, waiting supplier confirmation) and translates them to EDI 850 documents, then POSTs them to Orderful's inbox for routing to suppliers via AS2, SFTP, VAN, or HTTP. Inbound: ml-connector polls Orderful's inbox for incoming documents (855 purchase order acknowledgments, 856 advance ship notices, 810 vendor invoices from suppliers). It parses these EDI documents, extracts line items and quantities, and writes them into corresponding Odoo records (updates to purchase order status, new receipt lines into Inventory Receipts, new vendor bill lines into Accounts Payable). This closes the loop so suppliers' confirmations and shipments drive your Odoo procurement state without manual intervention.

How ml-connector handles it

ml-connector stores both credential sets encrypted: the Odoo API key and the Orderful API key. For outbound, it polls Odoo's purchase.order records filtered by confirmation_date and state, translates each order into an EDI 850 structure with line items (product code, quantity, unit price), and POSTs the document to Orderful's v4 /inbox endpoint. Each Orderful POST includes ISA identifiers for the sender (your company) and receiver (the supplier), and sets stream to 'live' in production or 'test' in sandbox. For inbound, ml-connector polls Orderful's v3 /polling-buckets endpoint every 5-10 minutes, requesting up to 100 documents per call. When a 855 acknowledgment arrives, it extracts the supplier's confirmed quantities and delivery dates and updates the Odoo purchase order with that status. When a 856 ship notice arrives, ml-connector creates or updates an Inventory Receipt in Odoo with the shipped quantities and expected delivery date. When a 810 vendor invoice arrives, ml-connector creates a new vendor bill in Odoo's account.move with invoice lines matching the EDI quantities and amounts. All three key entities required for each direction (purchase.order, account.move for bills, stock.picking for receipts) are validated before write, and every record carries a BullMQ job ID for replay if a downstream operation fails. Rate limits and transient failures are handled with exponential backoff and retry, and the full audit trail is written to Odoo as job state.

A real-world example

A mid-sized food and beverage distributor uses Odoo for procurement and general ledger, and works with a dozen suppliers across multiple regions who communicate via EDI. Before the integration, the procurement team entered each purchase order into Odoo, then manually created EDI 850 files in an external tool, uploaded them to AS2 or SFTP, and waited for suppliers' acknowledgments and invoices to arrive via file transfer. When a supplier sent a 856 ship notice, the team manually updated delivery dates in Odoo or created receipt documents by hand. Month-end close required reconciling vendor invoices from multiple channels against purchase order line items. With Odoo and Orderful connected, purchase orders flow from Odoo directly to all suppliers through Orderful's EDI network within minutes of confirmation. Supplier responses (acknowledgments, ship notices, invoices) land in Odoo's purchase orders and accounts payable automatically, so the procurement team spends time managing exceptions and relationships, not re-keying documents.

What you can do

  • Translate Odoo purchase orders to EDI 850 documents and post them to Orderful's inbox for routing to suppliers via AS2, SFTP, VAN, or HTTP.
  • Receive EDI 855 purchase order acknowledgments from Orderful and update purchase order status and supplier-confirmed quantities in Odoo.
  • Receive EDI 856 advance ship notices and automatically create or update Odoo Inventory Receipts with expected delivery dates and quantities.
  • Receive EDI 810 vendor invoices from Orderful and create matching vendor bill records in Odoo's accounts payable, linked to purchase orders.
  • Poll Orderful every 5-10 minutes with full audit trails and job replay on failure, keeping Odoo and partner documents in sync across the EDI network.

Questions

Which purchase orders flow to Orderful?
ml-connector polls Odoo for purchase orders in 'to approve' or 'purchase order' state (confirmed and awaiting supplier confirmation) and translates them to EDI 850 documents. Each order includes product code, quantity, unit price, and delivery location. Drafts and cancelled orders are not sent. Once a purchase order is posted to Orderful, ml-connector tracks it in the job audit so retries do not create duplicates.
How are supplier responses (acknowledgments and invoices) written back to Odoo?
ml-connector polls Orderful's inbox for inbound documents tagged by document type (855, 856, 810). A 855 acknowledgment updates the purchase order state to 'confirmed' and stores the supplier's confirmed quantities and dates. A 856 ship notice creates a new Inventory Receipt (stock.picking) in Odoo with the carrier, expected delivery date, and line items. A 810 vendor invoice creates a new vendor bill (account.move) with lines matched to the purchase order and linked for payment matching. All three require that the purchase order exists in Odoo first.
What happens if Orderful is unreachable or a document fails validation?
ml-connector retries failed POSTs to Orderful and failed polls with exponential backoff (starting at 2 seconds, capping at 5 minutes between attempts). If an inbound EDI document from Orderful fails to parse or references a purchase order that does not exist in Odoo, the record is marked as failed and flagged in the audit log with the error message and the raw document payload, so the operations team can investigate and manually fix the source order. The job can then be replayed once the issue is resolved.

Related integrations

Connect Odoo and Orderful

Free to use. Add your credentials, ping your real systems, and see if we fit.

Get started