The problem
Freight is one of the few costs that is charged to the customer and paid to a supplier on the same transaction, and in most NetSuite accounts neither half is under control.
On the sell side, the shipping cost quoted at order entry is usually a lookup: a flat rate, a percentage of order value, or a table someone maintained two carrier price increases ago. Nobody knows at the moment of quoting whether this particular carton, to this particular postcode, at this particular service level, actually costs what is being charged. On the buy side, the carrier invoice arrives weeks later as a single line for hundreds of shipments, gets coded to a freight expense account, and is never connected back to the orders that generated it. The result is a gross margin figure that is confidently wrong at line level.
The symptoms are familiar. Heavy or bulky items are systematically underquoted and quietly loss-making. Remote-area surcharges, residential delivery fees, dimensional weight adjustments and fuel surcharges appear only on the invoice. Nobody can answer "which customers cost us more to ship to than we charge them" because the data required to answer it was never captured against the transaction. And when a cheaper carrier would have served the same delivery date, the order shipped on the expensive one because the person keying it only had one account open.
NetSuite has shipping items and can integrate with carrier accounts, but a live multi-carrier comparison at the point of order entry, and a disciplined path from carrier invoice back to shipment cost, is custom work in every account we have seen.
What ECOSIRE builds
This is a build-to-order NetSuite customization, developed against your account after a scoping call and a fixed quote. Nothing downloads instantly and nothing is pre-packaged.
Live rate shopping at order entry
A Client script on the Sales Order calls a Suitelet or RESTlet, which in turn calls each configured carrier's rating API with the parcel data derived from the order: item weights, dimensions, package configuration, ship-from location, ship-to address, declared value, residential flag and requested service level. The responses come back into a comparison panel on the order showing each carrier and service, the quoted cost, the transit time and the projected delivery date, ranked by whatever rule you choose — cheapest, fastest, cheapest meeting the promised date, or a preferred-carrier hierarchy.
Carrier credentials, account numbers, negotiated rate flags and API endpoints are held in a custom record and secured with the N/https module and NetSuite's credential handling, so account numbers are not scattered through script parameters. Each carrier is a separate connector module: the ones you actually use are built, and the framework accepts more later without rework.
Packing logic and dimensional weight
Rating is only as good as the parcel data. A packing routine derives cartons from the order lines using item weight, item dimensions and your box catalogue, held as a custom record. Dimensional weight is calculated per carrier's divisor, because the same shipment rates differently depending on whose formula applies. Multi-carton, multi-package and hazardous or oversize flags are handled explicitly rather than being assumed away.
Marking up and applying the rate
The selected rate is written to the shipping cost field and to custom fields recording which carrier, which service, what the raw rate was and what markup rule applied. Markup rules live in a custom record — percentage, flat uplift, tiered by cost band, free over a threshold, or per-customer contract — so the customer-facing shipping charge is derived, auditable and consistent instead of typed.
Actual cost allocation
The second half is where margin is actually protected. A RESTlet or scheduled import accepts the carrier's billed charges, matched to the shipment by tracking number. A Map/Reduce script reconciles billed cost against the rated cost, flags variances beyond a tolerance you set, and allocates the actual freight across the fulfilment's lines by weight, value, volume or unit count. The allocated cost is written to custom transaction line fields and, where you want it in the ledger, posted through a landed-cost or journal entry path agreed at scoping. From that point, a saved search can rank customers, items, lanes and carriers by realised shipping margin, because the actual cost is finally sitting on the transaction.
Operational plumbing
Scheduled scripts refresh rate caches and retry failed carrier calls. Every API request and response is logged to a custom record with the request id, so a disputed charge can be traced back to exactly what the carrier quoted and when. SuiteFlow drives variance approvals where a billed charge exceeds the quoted rate by more than your tolerance. Failures degrade gracefully — if a carrier API is unreachable, the order falls back to your existing rate table and flags the line rather than blocking order entry.
Who this is for
Distributors, e-commerce sellers and manufacturers shipping parcel or LTL volume from NetSuite, particularly those with more than one carrier account, negotiated rates worth comparing, or a product mix where weight and dimensions vary enough that a flat rate is guesswork. It is most valuable where shipping is a visible share of order value and where nobody currently reconciles the carrier invoice back to individual shipments.
How delivery works
1. Scoping call. We identify the carriers and services in play, whether you hold direct API credentials or work through an aggregator account, your box catalogue, how shipping is currently charged to customers, and how the carrier invoice arrives — file, API, or portal export. We agree the allocation basis and the GL treatment.
2. Fixed quote. A written scope and a fixed price, issued before any development begins. Additional carriers or changes to the allocation logic are quoted separately.
3. Build. Developed as an SDF project on SuiteScript 2.1: Client and User Event scripts on the Sales Order, Suitelets for the comparison panel and configuration screens, Map/Reduce for allocation and reconciliation, Scheduled scripts for imports and retries, RESTlets for inbound carrier billing data, and custom records for carriers, boxes, markup rules and API logs.
4. Install in sandbox. Deployed to your sandbox against carrier test or production credentials as appropriate. You rate real orders, compare the results to what your carriers actually charge, and we tune the packing and markup logic against what you find.
5. Install in production. After sandbox sign-off, we deploy in an agreed window, configure roles and permissions, load live carrier credentials, and verify against live shipments with you.
6. Support window. A defect-fix support period runs after go-live. You own the SDF project and the unmanaged bundle; there is no runtime licence and no per-shipment fee to ECOSIRE.
Typical lead time is two to four weeks from signed quote to production install, depending on how many carrier connectors are in scope and how quickly carrier API credentials become available.