Skip to content

Shipping to the UK after Brexit broke the paperwork

A delivery truck - cross-border shipping

TL;DR

Diagnosis

After Brexit, shipping directly from Poland to a customer in the UK meant the customer had to pay customs duty on top. The first alternative was to ship a container to the UK entity and then send individual parcels on to customers, but that took ~20 days. The solution turned out to be much less spectacular than changing the route. All it took was a three-party invoice with the right parties in the right fields. Then the parcel clears customs and can go straight to the customer. Once our order system started generating that invoice automatically (it sent requests to the invoicing system and to the courier’s system), direct shipping made sense again. Delivery dropped to ~7–10 days, and the customer paid no duty.

flowchart TD
    A1["Poland"] -->|"direct, duty on the customer"| 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

Horizontal bar chart: the container route ~20 days and direct shipping with a three-party invoice ~7–10 days

Thanks to the three-party invoice, the parcel could take the shorter, direct route.

The problem

What did Brexit do to shipping to the UK?

After Brexit, shipping a parcel directly from Poland to a customer in the UK meant customs duty was charged to that customer. The company worked around it by shipping a container to the UK entity and sending parcels out from there. That took ~20 days. Customers waited a long time for their packaging, so their experience was poor.

Why not just ship directly?

Because customs rules made it hard. The duty couldn’t be solved by switching couriers, because it came from regulations, not from logistics. The solution had to be found in the shipping documents, specifically in what the invoice says about who ships to whom.

My role / scope

Process

Key decisions & trade-offs

flowchart LR
    F["Three-party invoice"] --> N["Sender = PL 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["Courier system<br/>old XML"]
    A --> P["Connecting the systems"]
    B --> P
    P --> C["Three-party invoice generated automatically"]

    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 the customerDifficulty
Container through the UK entity~20 daysnonelow (regular logistics)
Direct (three-party invoice)~7–10 daysnoneintegrating two different APIs

How it turned out

Delivery to the UK dropped from ~20 days to ~7–10 (~50% faster), and customers paid no duty. The three-party invoice let the parcel clear customs on the direct route. The hardest part was the integration itself. Our order system had to talk at the same time to a modern API on one side and old XML on the other, and neither partner was prepared for the other, or for us.

What I took away