DEV Community

iCustoms
iCustoms

Posted on

B2B Parcel Declaration Workflow: Decision Logic for TSS

A B2B parcel declaration workflow for Northern Ireland is a short chain of decisions: classify the movement, test whether the goods are at risk, check UKIMS cover, then route the data to the right declaration. If you build or maintain systems that feed TSS, it helps to model this logic explicitly so every rule is easy to trace.

Step 1: Classify the Movement

Only business to business parcels enter this workflow. Consumer parcels for personal use need no customs declaration, and correspondence sits outside the rules entirely.

Step 2: Model At-Risk Status and Route

Goods can count as not at risk on duty rates alone, or move under UKIMS held by either party. Here is the logic as Python-style pseudocode, based on the published rules for declaring B2B parcels through TSS.

def not_at_risk_by_duty_rate(goods):
    if goods.in_gb_free_circulation:
        return goods.eu_rate == 0
    if goods.from_outside_eu_uk:
        # UK rate no more than 3 points below the EU rate
        return goods.uk_rate + 3 >= goods.eu_rate
    return False

def declaration_route(goods, sender, receiver):
    ukims = sender.has_ukims or receiver.has_ukims  # one side is enough
    if ukims and not goods.at_risk_of_moving_to_eu \
            and goods.for_uk_end_consumers:
        return "IMMI"  # no full declaration, no duty
    return "FULL_DECLARATION"  # EU-rate duty may apply
Enter fullscreen mode Exit fullscreen mode

Step 3: Pick the EORI Prefix

eori_prefix = "XI" if (biz.established_in_ni or biz.fixed_place_in_ni) else "GB"
Enter fullscreen mode Exit fullscreen mode

Step 4: Pass the Right Data

In TSS, goods that qualify under UKIMS go through Internal Market Movement Information (IMMI). Others need a full declaration. Either way, goods are still categorised as Standard, Category 1 or Category 2. If a carrier declares for you, pass it the UKIMS authorisation number and the associated EORI number.

Step 5: Store the Evidence

TSS does not decide UKIMS eligibility or at-risk status. Store the evidence behind each decision for five years against the movement it supports.

Edge Cases Worth Coding For

  • Mixed order books: flag each parcel as B2B or consumer, because carriers handle the two differently.
  • Entry summary declarations: only some parcel movements need one, so don't reuse a freight rule here.
  • Declaration channel: TSS, a carrier's service or a customs intermediary can submit, and each must apply the same duty-rate, UKIMS and processing conditions.
  • UKIMS-EIDR users: businesses declaring with their own software can apply the same UKIMS conditions to parcel movements. Prefer not to build this logic yourself? iCustoms runs the UKIMS eligibility and not-at-risk checks against your goods data for you. Watch a demo.

Top comments (0)