Skip to main content

Custom carrier

Track shipments of your own delivery without a carrier API and update their status through the Tracking API.

Written by Ondřej Klusák

A custom carrier lets Retino Tracking follow shipments that none of the supported carriers deliver – typically your own delivery fleet or a local courier without a tracking API. The shipment then behaves like any other: it appears in the shipment list, Track & Trace, transactional emails and analytics, and you can build automations on it.

For pickup at your own stores or warehouses use Store Branches; a custom carrier is meant for delivery.

Note: A custom carrier has no source to pull the shipment status from. The status stays New Shipment until you update it through the API. Without that, automations tied to delivery never run.

How it works

  1. In settings you create a custom carrier and enter an automatic matching value – the exact shipping name or code your e-shop sends in the order.

  2. During order synchronization Retino compares this value with the shipping item of the order. On a match it creates a shipment under the custom carrier. The order does not need a tracking number.

  3. Your system sends the shipment status (in transit, delivered, returned…) through the Tracking API. Every received status goes through the same processing as with other carriers, including emails and automations.

You can have any number of custom carriers, for example one for your own vans and one for a contracted courier. Each has its own name, logo and statistics, and you can filter by it and use it in automation conditions.

Add a custom carrier

The custom carrier is one of the tiles when adding a carrier:

Carrier tiles with the Custom carrier tile highlighted
  1. Open Settings → Tracking → Carrier integrations and click Add credentials.

  2. Choose the Custom carrier tile.

  3. Fill in the Name. Customers see it in Track & Trace and in emails, so use a clear label such as Prague delivery.

  4. Optionally upload a Logo (PNG, JPG, GIF or WebP). Without a logo a generic icon is used.

  5. In Automatic matching, enter the value your e-shop sends for the shipping item in the order – its name, code or ID.

  6. Click Test. Retino searches orders from the last 30 days and shows whether the value matches any order.

  7. Save.

Add custom carrier form with Name, Logo and Automatic matching fields and the Test button

The carrier appears in the list of active carriers. From there you can edit or delete it at any time; existing shipments of a deleted carrier are kept.

Matching rules

  • Exact match. The whole value is compared, including letter case and accents. Prague delivery does not match prague delivery.

  • Where it looks. In the name, code and ID of the shipping item of the order. A match in any one of these fields is enough.

  • Takes precedence over the tracking number. When an order matches a custom carrier, the shipment is created under it even if the order contains a tracking number.

  • One value = one carrier. The same matching value cannot be used by two custom carriers.

  • New and changed orders. Matching happens during order synchronization. Orders processed before the carrier was created are matched only after their next change in the e-shop.

How Retino imports orders and their items is described in Order Integration.

Update the shipment status through the API

Your system (WMS, dispatch, ERP) sends the status of a custom-carrier shipment to POST /api/v2/tracking-shipping/{id}/status/. Authorization is the same as for other Tracking API calls.

1. Find the shipment ID

Look the shipment up by order code and carrier CUSTOM:

GET /api/v2/tracking-shipping/?order_code=ORD-2025-001&carrier=CUSTOM

The response contains the shipment id and a custom_carrier field with the ID and name of the custom carrier. The tracking_number is generated by Retino and is not shown to customers.

2. Send the status

POST /api/v2/tracking-shipping/550e8400-e29b-41d4-a716-446655440000/status/Authorization: your_api_tokenContent-Type: application/json{  "status": "DELIVERED",  "status_at": "2026-03-12T14:05:00+01:00",  "external_status_description": "Handed over to the customer at the store"}

Field

Meaning

status (required)

New shipment status, e.g. IN_TRANSIT, OUT_FOR_DELIVERY, AVAILABLE_FOR_PICKUP, DELIVERED, FAILED_ATTEMPT, RETURNED_TO_SENDER. Internal PENDING__* statuses cannot be sent.

status_at

When the change happened. Must not be in the future or older than the shipment's latest status. Defaults to the time of receipt.

external_status_code

Status code from your system. Stored in the shipment history.

external_status_description

Description for the shipment history.

The full list of statuses and their meaning is in Shipment States. Send at least DELIVERED so that delivery emails and delivery ratings work.

The endpoint returns the updated shipment. The same status with the same description and time is not stored twice, so resending is safe. Send statuses in the order they happened – a status older than the shipment's latest status is rejected with error 400. The endpoint also returns error 400 for a shipment that does not belong to a custom carrier; statuses of supported carriers are managed by Retino.

Limitations

  • A custom-carrier shipment has no carrier tracking link and no customer-facing tracking number. Track & Trace shows the name, logo and status history.

  • For the Available for Pickup status Retino does not compute a storage deadline; there is nothing to derive it from.

  • The carrier of a shipment cannot be changed manually to or from a custom carrier. Shipments are created only by matching during order synchronization.

  • Custom-carrier shipments are never synchronized with a carrier: the shipment detail has no Synchronize button and the Synchronize bulk action leaves them out with a notice. The status changes only through the API.

  • A custom carrier has no transit time settings and no cost analysis.

Did this answer your question?