Skip to content

Shipping to the UK after Brexit broke the paperwork

TL;DR

Diagnosis

The bottleneck wasn’t a truck — it was a document. After Brexit, shipping direct from Poland to a UK customer meant the customer got saddled with customs duty on top. The first workaround was shipping a container to the UK entity, then reshipping individual parcels to customers from there — but that took ~20 days. The fix was neither logistical nor political; it was a three-party invoice that named the right parties in the right fields, so the parcel could clear customs on a direct run. Once that document could be generated automatically — the internal order system firing API requests to the invoicing system (a modern API with templates) and to the logistics/courier system (legacy XML) — direct shipping opened up — ~20 days down to ~7–10, no duty on the customer.

flowchart TD
    A1["Poland"] -->|"direct, blocked by customs"| B1["UK customer pays duty"]
    A2["Poland"] -->|"container to UK entity, ~20 days"| B2["UK entity"] -->|"reship"| C2["UK customer"]
    A3["Poland"] -->|"three-party invoice, ~7-10 days"| C3["UK customer, no duty"]

    classDef good    fill:#e6f2ea,stroke:none,color:#1f4d33,rx:14,ry:14
    classDef bad     fill:#faeaea,stroke:none,color:#5f2626,rx:14,ry:14
    classDef accent  fill:#27272a,stroke:#3f3f46,stroke-width:1px,color:#fafafa,rx:14,ry:14
    class A1,B1 bad
    class A2,B2,C2 bad
    class A3 good
    class C3 accent
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px

What I did

Results

The problem

What did Brexit do to UK shipping?

After Brexit, shipping a parcel direct from Poland to a UK customer meant customs duty got charged to that customer. The workaround the business had was to ship a container to the UK entity and reship from there — which took ~20 days. Slow, and a poor experience for a customer waiting on packaging.

Why not just ship direct anyway?

Because the customs structure penalized it. The duty wasn’t a logistics problem you could throw a courier at; it was a regulatory one. The unlock had to live in how the shipment was documented — specifically, in who the invoice said was shipping to whom.

My role / scope

Process

Key decisions & trade-offs

flowchart LR
    F["Three-party invoice"] --> N["Shipper = Poland entity"]
    F --> K["Buyer = UK entity"]
    F --> O["Recipient = UK customer"]

    classDef info    fill:#e9eff8,stroke:none,color:#1e3a5f,rx:14,ry:14
    class F,N,K,O info
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px
flowchart LR
    W["Internal order system"] -->|"API request"| A["Invoicing system<br/>modern API + templates"]
    W -->|"API request"| B["Logistics/courier system<br/>legacy XML"]
    A --> P["Integration bridge"]
    B --> P
    P --> C["Three-party invoice auto-generated"]

    classDef info    fill:#e9eff8,stroke:none,color:#1e3a5f,rx:14,ry:14
    classDef accent  fill:#27272a,stroke:#3f3f46,stroke-width:1px,color:#fafafa,rx:14,ry:14
    class W,A,B,P info
    class C accent
    linkStyle default stroke:#a8a8b3,stroke-width:1.5px
RouteTimeDuty on customerComplexity
Container hub~20 daysnonelow (standard logistics)
Direct (three-party invoice)~7–10 daysnoneintegrating two different APIs

How it turned out

UK delivery dropped from ~20 days to ~7–10 (~50% faster), with no customs duty on the customer — the three-party invoice carried the parcel through customs on a direct run. The hardest part was the integration itself: the internal order system had to talk to a modern API on one side and legacy XML on the other, at the same time, with two vendors who weren’t built for each other or for it.

What I took away