A different kind of business
Every other manufacturing-focused article in this lab deals with a business that buys raw material, transforms it, and sells finished goods. A freight forwarder or C&F agent does none of that. Their product is coordination and paperwork: booking cargo space with a shipping line, coordinating with the port authority (Chattogram Port Authority or Mongla), managing customs clearance through a licensed C&F house, and delivering the goods to the client's factory or warehouse. Revenue comes from service fees, documentation charges, and a markup on the duty and taxes they advance to NBR on the client's behalf. Cost comes from actual freight paid to carriers, port handling charges, and the C&F staff's clearance fees.
Because there is no physical transformation happening, forcing Odoo's Manufacturing module onto this business, the way you would for the plastics or food processors covered elsewhere in this lab, is the wrong instinct. The right model treats each shipment as a service job: a Sales Order (or in Odoo's newer terminology, a quotation converted to a confirmed order) representing the client engagement, with either a Project task or a simple set of milestones tracking where that shipment stands operationally.
Shipment / job tracking as a project
Set up each shipment as a Sales Order in Odoo, one per shipment for occasional clients, or one Sales Order per recurring client covering a defined billing period if you handle high volumes for a single importer. Link a Project task to that Sales Order representing the shipment's operational lifecycle. A practical milestone structure for an import shipment looks like this:
Each stage becomes a task status your operations team updates, giving both your staff and, if you choose to expose it, the client a live view of where their shipment stands rather than the status update happening only via phone calls or WhatsApp. This structure also naturally produces the operational data behind your invoicing: once a shipment reaches "delivered," the linked Sales Order is ready to be finalized and invoiced, tying financial closure to an operational milestone instead of an arbitrary end-of-month batch invoice run.
HS-code-linked billing for duty pass-through
The most important billing discipline for a Bangladesh freight forwarder or C&F agent is separating two very different kinds of money on every client invoice: your service fee (revenue you keep) and the duty, VAT, and Advance Income Tax (AIT) you have paid to NBR on the client's behalf and are now recovering (pass-through, not revenue). Mixing these together on an invoice, or worse, in your own bookkeeping, makes your P&L unreadable and makes it hard to defend an invoice when a client questions a large total.
Set each cleared consignment up with a reference to its HS code (Harmonized System code), either as a custom field on the shipment's Sales Order line or tied to a generic "Customs Clearance – [HS Code]" service product, since the assessed duty rate depends directly on that HS classification. The mechanics of HS code classification and how it drives customs assessment are covered in more depth in HS Code & Customs in Odoo Bangladesh; for a freight forwarder, the practical requirement is simpler: record the assessed duty, VAT, and AIT at source amounts as separate, clearly labeled pass-through cost lines on the Sales Order, distinct from your handling fee, documentation charge, and any agreed markup percentage on the advanced duty amount.
NBR audits of C&F agents and their client importers periodically review whether duty amounts collected from clients match what was actually deposited against the Bill of Entry. An invoice structure that clearly itemizes "Duty & VAT paid to NBR: BDT X" separately from "Clearance & handling service fee: BDT Y" is far easier to defend and reconcile than a single lump "Total Clearance Charges" line that blends both, and it also makes your own margin visible internally instead of buried inside a large pass-through number.
Managing multiple client accounts with different billing terms
A freight forwarding business typically serves a mix of clients: large importers with negotiated per-container rates and 15 to 30 day credit terms, smaller occasional shippers who pay per shipment with no credit, and a handful of clients where you advance duty payment and recover it plus a markup upon delivery. Use Odoo's Contacts records to hold each client's specific commercial terms, and Sales Pricelists (under Sales → Configuration → Pricelists) to encode client-specific rate cards, so that a per-container handling fee or a documentation charge auto-populates correctly per client rather than being manually re-keyed on every job.
Payment terms deserve particular attention in this sector because cash flow timing is tight: you frequently must pay duty and VAT to NBR to release goods before the client has paid you for that shipment. Set accurate Payment Terms on each client's Contact record reflecting their actual agreed credit period, and monitor the Accounts Receivable aging report in Odoo Accounting closely, since a forwarder who has advanced BDT 20 lakh in duty on a client's behalf and is waiting 45 days for reimbursement against a 15-day agreed term has a real working capital problem that the aging report will surface early if it is watched, and will surface late (as a cash crisis) if it is not.
Documentation tracking
Every shipment requires a specific set of documents to be complete before customs clearance can proceed, and an incomplete document set is one of the most common causes of clearance delay and demurrage cost at Chattogram port.
| Document | Source | Why it matters |
|---|---|---|
| Bill of Lading / Airway Bill | Shipping line / airline | Proof of shipment, required for Bill of Entry filing |
| Commercial Invoice | Overseas supplier | Basis for customs valuation and duty assessment |
| Packing List | Overseas supplier | Cross-checked against physical inspection at port |
| Certificate of Origin | Exporting country chamber/authority | Determines preferential duty rate eligibility (e.g. under trade agreements) |
| LC documents | Issuing/negotiating bank | Required where the import is financed via Letter of Credit |
| Insurance Certificate | Insurer | Required for CIF valuation and claims if goods are damaged in transit |
Attach each document directly to the shipment's Sales Order or linked Project task using Odoo's native attachment feature, and maintain a simple checklist of required versus received documents visible on the shipment record. This turns "do we have everything we need to file the Bill of Entry" from a question someone has to chase down by phone into a status any staff member can see at a glance. For clients whose imports are LC-financed, this same document discipline connects to the broader LC document flow, covered in LC Management in Odoo Bangladesh, since the C&F agent is often the party physically handling the LC documents on the importer's behalf at the clearance stage.
Margin tracking on freight, handling, and clearance fees
Because a single shipment involves multiple cost components (ocean or air freight, inland haulage from the port to the client's factory, port and terminal handling charges, C&F clearance fees, and any sub-agent fees at origin or destination), knowing whether a specific shipment was actually profitable requires those costs to be captured against that specific job, not absorbed into a general expense account reconciled only at month-end.
Record vendor bills for freight, haulage, and handling as Purchase Orders or vendor bills linked to the same Sales Order or a shared analytic account representing that shipment. Odoo's analytic accounting then lets you pull a profitability report per shipment: revenue billed (service fee plus any markup) against actual cost incurred (freight, handling, clearance labor), producing a true per-shipment margin. This is particularly valuable for identifying which types of shipments (by client, by route, by cargo type) are actually profitable versus which are being carried at thin or negative margin because a quote made months ago never got revisited against rising freight rates. Landed cost thinking from Odoo Landed Costs & Duty Drawback Bangladesh is directly relevant here, since the same discipline of allocating freight and handling cost accurately against a specific consignment applies whether you are the importer valuing your own stock or the forwarder tracking your own service margin.
Getting started without overbuilding
Freight forwarding businesses are prone to over-engineering their ERP setup because the operational complexity feels like it demands custom development. In most cases it does not. Start with Sales Orders as the shipment record, a simple Project board for operational status, document attachments on that record, and analytic accounts for cost tracking. This combination, all native to Odoo without custom modules, covers the real needs of a Bangladesh C&F agency with 5 to 50 shipments a month. Reserve custom development for genuine scale problems, such as automated status updates to clients via SMS or WhatsApp once shipment volume justifies the integration cost.
A sequencing mistake worth naming explicitly: many forwarders try to configure detailed automatic HS-code duty calculation and multi-currency freight invoicing in the very first week of an Odoo rollout, before the basic Sales Order and document-attachment workflow is even stable with staff. Get the team comfortable creating a shipment record, attaching documents, and moving it through status stages first, for at least a month of live shipments, before layering in the analytic cost tracking and HS-code billing detail. A forwarding company that goes live with the full structure on day one, but whose staff still track the real status of shipments on paper because the Odoo habit never formed, has built an elaborate system nobody actually uses, which is a more expensive failure than a simpler system that gets adopted.
It is also worth deciding early whether sub-agents at origin or destination ports (a partner C&F house handling clearance in a city where you have no branch) are modeled as vendors whose bills flow into your shipment's analytic account, or as a separate revenue-share arrangement recorded differently. Bangladesh forwarders who work through a network of correspondent agents in Dhaka, Chattogram, and Mongla often blur this distinction informally, paying and receiving on a net basis without a clean paper trail, which makes it very difficult later to know whether a given corridor of business is actually profitable once every sub-agent fee is accounted for.
If your freight forwarding or C&F business is still tracking shipments across WhatsApp threads and a shared Excel sheet, and you genuinely do not know which clients or routes are profitable once real costs are counted, I can help you set up the Sales Order, Project, and analytic accounting structure that answers both questions inside Odoo. Contact me for a strategy session →
Frequently asked questions
Should a freight forwarder use Odoo Project, Sales Orders, or a custom module for shipment tracking?
For most Bangladesh C&F agents and freight forwarders, the practical approach is to use Odoo's Sales Order as the shipment job header (one order per shipment or per client's periodic job), with a linked Project or Task representing the operational milestones of that shipment: booking confirmed, documents received, customs assessment, duty payment, delivery. This keeps invoicing tied naturally to the Sales Order while giving operations staff a task-based view of where each shipment stands, without needing custom development for a first implementation.
How do I link HS codes to billing for customs duty pass-through in Odoo?
Set up your cleared goods as products or a generic "Customs Clearance" service line item with an HS code reference field (custom field or the product's internal reference), and record the assessed duty, VAT, and AIT at source amounts the client actually owes NBR as pass-through cost lines on the shipment's Sales Order, separate from your own service fee. This keeps the duty pass-through (money that flows through you to the government on the client's behalf) clearly distinct from your margin (the C&F service fee and handling charges), which matters both for your own P&L clarity and for defending your invoice if a client questions what portion of the bill is your fee versus statutory duty.
How should a freight forwarder manage multiple clients with different billing terms in Odoo?
Use Odoo's Contacts and Sales pricelists to set client-specific rate cards (per-container handling fee, per-shipment documentation fee, agreed markup percentage on duty advance), and use payment terms on each client's contact record to reflect their actual credit arrangement, whether that is advance payment before customs release, 15/30-day credit, or a running account settled monthly. Because freight forwarding margins are thin and cash flow sensitive (duty and VAT must often be paid to NBR before goods are released, ahead of client payment), configuring accurate payment terms and monitoring the Accounts Receivable aging report in Odoo Accounting is more operationally important here than in most other business types.
How do I track shipping documents like Bill of Lading, LC documents, and Certificate of Origin in Odoo?
Attach each document type directly to the shipment's Sales Order or linked Task using Odoo's native document attachment feature, and use a checklist (a simple set of sub-tasks or a custom Quality Control Point-style checklist) to track which required documents have been received and which are outstanding for a given shipment: Bill of Lading or Airway Bill, Commercial Invoice, Packing List, Certificate of Origin, and where applicable the LC documents required by the bank. This turns document completeness from something tracked in someone's memory or a WhatsApp thread into a visible status on the shipment record.
How do I track margin per shipment in Odoo for a freight forwarding business?
Record all shipment costs (ocean or air freight paid to the carrier, inland haulage, port and terminal handling charges, customs clearance fees paid to C&F staff or sub-agents, and duty/VAT advanced on the client's behalf) as Purchase Orders or vendor bills linked to the same Sales Order or a shared analytic account for that shipment. Odoo's Sales Order margin field, or a simple analytic account profitability report, then shows revenue billed to the client against actual cost incurred, giving you a true per-shipment margin rather than only knowing profitability at the end of the month across all shipments combined.
