Logistics & supply chain

Logistics software is an integration problem wearing a UI.

The dashboard is the easy part. The hard part is that your largest customer sends an EDI 856 through a value-added network older than most of your engineers, your carrier rates arrive from three REST APIs that disagree about what a valid address is, and your driver is in a dead zone holding a signed proof of delivery on a phone with no bars. That’s what custom logistics software development has to solve.

Scope your integration surface

The integration surface

EDI isn’t legacy trivia. It’s the contract.

ANSI X12 is a living standard in North American freight, and UN/EDIFACT messages such as IFTMIN and IFTSTA are the same story in Europe and Asia. Documents travel inside a three-level envelope: ISA for the interchange, GS for the functional group, ST for the transaction set, each with its own control number and matching trailer. Those control numbers are not ceremony. They’re how you prove a file arrived, and how you avoid processing the same interchange twice when a partner replays it.

The architecture that holds up is an API-first core with an EDI translation layer at the boundary. Your domain model should be clean JSON and typed events; X12 should exist only inside an adapter, because the shipper on the other end isn’t migrating to your REST API for you. That same boundary carries warehouse traffic: a 940 shipping order out, a 945 shipping advice back, a 947 inventory adjustment when the count disagrees with the system.

204

Motor carrier load tender

The shipper offers a load. Shipment ID, stop sequence, appointment windows: every reference number the rest of the lifecycle depends on is set here, and none of them renegotiate cleanly afterwards.

990

Response to a load tender

Accept or decline. The window is measured in minutes, so the decline path has to be automated or a dispatcher becomes the rate limiter for your entire network.

214

Shipment status message

The status feed, carrying codes such as AF for departed pickup and X1 for arrived at the delivery location. Your customer-facing tracking page is mostly a rendering of 214 traffic.

856

Advance ship notice

A nested hierarchy: shipment, order, pack, item. Build the HL loop wrong and the receiving dock rejects the whole ASN, which in retail comes back as a chargeback rather than an error message.

810

Invoice

Where the money is. It has to reconcile against the tender, the rate confirmation and every accessorial applied after the truck left. That reconciliation is the line item nobody budgets for.

997

Functional acknowledgement

The only document that tells you whether any of the previous six actually landed. Unreconciled 997s are the classic silent failure. You believe you shipped, the partner has no record, and you find out at month end.

Transport matters as much as the payload. A value-added network is a mailbox you poll, with per-character billing and a support queue. AS2 is a direct HTTP exchange with signed receipts, which is faster and cheaper right up until a certificate expires at 2am and both sides stop talking without raising an alarm. Whichever you use, treat acknowledgement latency as a monitored metric in its own right.

Carriers, warehouses, inventory

Where the quoted rate and the invoiced rate stop matching.

Carrier API integration looks trivial until you compare a quote with an invoice. FedEx, UPS and DHL each expose rate, label and tracking endpoints with their own OAuth lifecycles, their own address models and their own opinion about what counts as residential. Address validation is the quiet killer. A normalisation that silently reclassifies a commercial address as residential adds a surcharge you never quoted, and it doesn’t return an error while doing it. Dimensional weight does the rest, since billable weight is the greater of actual weight and volume divided by the dimensional divisor in your contract, 139 being the common US domestic figure. Add address correction fees, liftgate, delivery area and fuel surcharges, and the gap between what you charged the customer and what the carrier billed you becomes a monthly reconciliation job. Design for it on day one rather than bolting it on in month six.

Label generation deserves the same respect. Creating a label is a financial event rather than a PDF render. Once it’s manifested the carrier can bill it whether or not the parcel ever moves, void windows are finite, and a naive retry loop that generates duplicates on timeout costs real money before anyone notices. Idempotency keys on every rate and ship call, and a stored carrier response for every label, are not optional here.

On the warehouse side the first question is which system owns what. A WMS owns location-level stock, licence plates, putaway and pick paths. An ERP owns the financial value of inventory and the purchase and sales orders. Your application usually owns the promise you made to a customer, and that’s the only one of the three you should store as truth. Writing directly into a WMS database is a decision you regret at the first vendor upgrade, when your inserts bypass the triggers maintaining their allocation tables and you discover the support contract no longer covers you.

Then the data-model problem this vertical owns outright. Inventory is an eventually-consistent number rather than a fact. On-hand, allocated, available-to-promise and in-transit are four different quantities that disagree at any given second. Soft reservations expire, hard allocations don’t, cycle counts reconcile against a physical reality neither system observed, and a picker who can’t find a case creates a short-ship that has to unwind an allocation, a customer promise and possibly a payment. Model reservations explicitly with expiry, keep an event log of every quantity change, and never expose a single integer called stock to your checkout.

Field operations

Offline-first is the baseline, not a feature request.

A driver app that needs connectivity is a driver app that produces paper. Loading docks are steel boxes, rural routes have gaps measured in tens of minutes, and cross-border roaming is a policy decision made by someone in finance. Everything the driver does has to complete locally and reconcile later, which makes the sync layer the most expensive component in the build and the one most often estimated as an afterthought. That’s where offline-first mobile app development does the real work.

Offline write queue

SQLite, operation log, server authority

Sync an append-only log of intents, not rows. Rows lose the reason a change happened; a log lets you replay a scan, a status change and a signature in the order the driver performed them.

Conflict resolution

Per-field merge, monotonic sequence

Last-writer-wins quietly destroys data when a dispatcher edits a stop the driver just completed. Merge per field, and treat driver-captured facts as authoritative over office-entered plans.

Background location

iOS Always, Android foreground service

iOS re-prompts on the Always permission and downgrades silently. Android Doze, standby buckets and OEM battery managers on Xiaomi, Huawei and Samsung kill naive trackers with no crash and no log.

Geofencing

20 regions on iOS, 100 on Android

Platform caps, not suggestions. With docks clustered inside a few hundred metres and GPS drift between buildings, a raw geofence entry needs a dwell time and a speed gate before you let it move a shipment status.

Proof of delivery

Signature, photo, resumable upload

Capture has to complete with the radio off. Compress on device, queue media separately from metadata, and store a device timestamp alongside a server timestamp, because drivers do change device clocks.

Telematics ingest

Positions, fault codes, duty events

Five hundred vehicles pinging every thirty seconds is roughly 1.4 million position rows a day. That’s an ingest and storage problem long before it’s a mapping problem.

Position history is time-series data and it does not belong in your transactional tables. Keep one small hot row per vehicle for last-known position, and write history to a partitioned or purpose-built time-series store where you can downsample after thirty days and tier the rest to cheap storage. Retention is a cost decision with a legal floor underneath it, so decide it deliberately instead of discovering it when the table passes a billion rows and every tracking query starts timing out.

Route optimisation

Anyone promising optimal routes is selling you a heuristic.

What you’re asking for is the vehicle routing problem with time windows and capacity constraints. It generalises the travelling salesman problem, it’s NP-hard, and exact methods stop being practical well below the size of a real urban fleet. You’re running a heuristic either way. The question is which one, and what it costs you.

In practice: a Clarke-Wright savings or cheapest-insertion pass to reach a feasible plan quickly, then local search with 2-opt, Or-opt, relocate and swap moves, then a metaheuristic such as large neighbourhood search or guided local search if you can afford the runtime. Google OR-Tools covers most of that without anyone writing a solver. The tradeoff is blunt. Five seconds of search and five minutes of search usually differ by a few percent of distance, and dispatchers care far more about a plan that stays stable between runs than about those few percent.

Two things sink these projects. First, the travel-time matrix. Five hundred stops means 250,000 pairs, and live traffic matrix calls are typically the largest running cost in the whole feature, so cache aggressively and batch. Second, the objective function. Optimising pure distance produces routes drivers refuse to run. The real objective mixes driver hours and overtime, missed-window penalties, vehicle access limits and territory familiarity, and tuning those weights against your own historical days is the work that decides whether anybody uses the output.

Where AI genuinely belongs

The paperwork arrives as a scan attached to an email.

The partners who aren’t on EDI are on email. Bills of lading, signed delivery receipts, rate confirmations, customs paperwork and carrier invoices arrive as photographs and scanned PDFs in a hundred different layouts, and somebody in operations retypes them every morning. This is the one place in a logistics build where a model earns its cost, because the input is genuinely unstructured and the alternative is a person.

Workflow tools alone don’t solve it, and the reason is worth stating precisely. An orchestrator moves the attachment and calls the next step; it can’t read a crumpled bill of lading photographed at an angle, because an orchestrator isn’t an extractor. The working shape is a deterministic parser first, a model only on the pages that defeat it, a confidence threshold per field, and a review queue for everything below it. That pattern is set out in full in our guide to automating document processing, and it’s the same approach behind our AI automation and extraction pipelines. Where your ops team should be able to change the flow without us, we build the orchestration in n8n and keep the extraction behind an API.

The regulatory surface

What the rules demand of the architecture.

Not a summary of the law, which your counsel owns. These are the points where a regulation reaches into the data layer and changes what you have to store, log, retain and prove.

FMCSA ELD mandate

49 CFR Part 395, Appendix A

If your app records duty status it’s an electronic logging device, and you have to self-certify it against the published technical specification and register it on the FMCSA list. Most builds should read hours from an already-registered provider instead of becoming one.

Hours of service

11-hour drive, 14-hour window, 30-minute break

Planning constraints as much as compliance rules. A route plan that ignores the 14-hour window and the 60 or 70-hour cycle produces schedules dispatchers cannot legally run.

Records of duty status

Six-month retention, 49 CFR 395.8(k)

Retention is an architecture decision. Duty records and their supporting documents have to survive device loss, driver turnover and your own data-pruning job.

Customs and export filing

ACE, ISF 10+2, AES

Importer Security Filing data is due before vessel lading, not before arrival, so the system has to hold commercial-party and container-stuffing detail far earlier in the flow than a domestic-only build ever would.

Hazardous materials

49 CFR Part 172

Shipping papers and emergency response information must physically accompany the load. A digital bill of lading is an addition to the paper in the cab, never a replacement for it.

Food transport

FSMA sanitary transportation, 21 CFR Part 1 Subpart O

Written procedures, precooling and temperature records, and defined retention periods. Cold-chain telemetry stops being a dashboard and becomes an evidentiary record you must be able to produce.

Pharmaceutical distribution

DSCSA, EPCIS, GS1 identifiers

Unit-level serialisation and interoperable EPCIS event exchange between trading partners, plus authorised-trading-partner verification. Software doesn’t confer that status on anyone; the licence does.

Driver personal data

GDPR lawful basis, works council agreements

Continuous location is personal data about an identifiable employee. In Germany that means agreement with the works council before rollout, and everywhere it means retention minimisation and a documented purpose.

Being plain about the limits saves everyone a wasted call. EdgeBrain Studios is an engineering studio. We hold no SOC 2 attestation, no C-TPAT validation and no customs brokerage licence, and we are not a registered ELD provider. If your buyer or your insurer requires any of those, you bring the accreditation or the accredited vendor and we build against it: reading hours from a registered ELD platform rather than recording duty status ourselves, filing through a licensed broker rather than direct. Where the open question is whether a model belongs in a regulated step at all, that’s what an AI readiness assessment is for.

When not to hire us

Most of this vertical should buy, not build.

If you run a small fleet on standard parcel and LTL lanes, buy a TMS. If you operate a warehouse with conventional receiving, putaway and wave picking, buy a WMS. The long tail of a mature WMS runs five to ten years of product work: slotting strategies, cycle count variance rules, licence plate handling, cartonisation. No fixed-scope engagement reproduces that. A subscription is the correct answer, and we will say so rather than quote you.

The same applies to X12 itself. Don’t commission a hand-written EDI parser. Buy a translator or an EDI-as-an-API service and spend your budget on the mapping and the reconciliation logic, where the domain complexity actually lives and where no vendor can help you.

Custom is right when your operating model is the product: a service promise nobody sells software for, a customer-facing tracking and booking experience that’s part of how you win accounts, a pricing engine encoding rules that currently live in one person’s head, or the connective tissue between five systems no vendor integrates. That last one comes up most often, and it’s usually a Next.js application layered over your existing systems rather than a replacement for any of them. You can see the range of what we ship in the case studies we publish.

Budget and timeline

What a build like this costs.

Our published bands, in USD, with a $7,500 minimum on build work. The readiness sprint sits below that line and is credited back against the build. In this vertical one variable moves the estimate more than any other: how many external systems you have to speak to, and how badly each one behaves.

Integration readiness sprint

from $3,500

1 to 2 weeks

We map the real integration surface: which partners are on EDI and which are on APIs, which carrier contracts you hold, what your WMS or ERP will and won’t expose, and where the data model already contradicts itself. You get a written architecture and a build estimate, and the fee is credited in full against a build that starts within 30 days.

Integration pilot

from $8,000

3 to 4 weeks

One end-to-end slice running against real data. Usually a live 204 to 990 to 214 loop with a single trading partner, or rate shopping and label generation across two carriers, so the risky part is proven before the platform is scoped.

Platform build

from $28,000

10 to 16 weeks

The API-first core, the translation layer at the boundary, the operational dashboards and the position store. Most projects across the studio land between $18,000 and $45,000, and work of this shape sits in the upper half of that depending on how many partners and carriers are in scope.

Driver or warehouse app

from $20,000

6 to 10 weeks

Offline-first React Native, local queue, background location, scanning and proof-of-delivery capture. Priced separately because the sync layer is the expensive component and it deserves its own estimate.

Document extraction pipelines are priced as production workflows, from $12,000. Ongoing support runs from $2,500 per month, which in this vertical mostly buys somebody who notices a trading partner changed their 214 mapping before your customers do.

The bands above are estimates, shown in US dollars and drawn from comparable work already delivered, because no two projects carry the same scope. Your own quote is not an estimate: it is fixed in writing after scoping, before kickoff, and it does not move.

Send us the integration list.

Name the systems: the trading partners, the carriers, the WMS or ERP, the telematics provider. We come back with an architecture and a number inside two working days.