# Couriers overview

DZBuild supports the major Algerian couriers. Once you link a courier in your dashboard, DZBuild can push new orders to the courier's API, return tracking numbers to your customer, and pull rates and stop-desk lists straight from the provider.

## 🎬 Video

[Couriers — connect your shipping provider in DZBuild](https://www.youtube.com/embed/ASUHRweCuOg)

## Supported couriers

| Courier                                                          | Slug                                                                                                                                          | Notes                                                                                                                                      |
| ---------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------- | ------------------------------------------------------------------------------------------------------------------------------------------ |
| [Yalidine](https://dzbuild.com/docs/couriers/yalidine.md)        | `yalidine`                                                                                                                                    | Mature API; wilayas, communes and desks are synced from Yalidine's own API                                                                 |
| [EcoTrack family](https://dzbuild.com/docs/couriers/ecotrack.md) | 82 courier tiles (`dhd`, `conexlog`, `msmgo`, `rocketdelivery`, `andersondelivery`, `speeddelivery`, `worldexpress`, …) plus `customecotrack` | There is no `ecotrack` slug to pick. EcoTrack is a shared Bearer-token API, so you pick **your own courier's tile**                        |
| [ZR Express](https://dzbuild.com/docs/couriers/zr-express.md)    | `zrexpressnew`                                                                                                                                | One merged tile. Paste either credential pair — DZBuild works out whether you are on the new platform or the legacy Procolis API           |
| [Maystro Delivery](https://dzbuild.com/docs/couriers/maystro.md) | `maystro`                                                                                                                                     | Single-token API                                                                                                                           |
| [Noest Express](https://dzbuild.com/docs/couriers/noest.md)      | `noest`                                                                                                                                       | API Token + User GUID                                                                                                                      |
| Abex Express, Leopard Express, Colilog Express, Flash Delivery   | `abexexpress`, `leopardexpress`, `colilog`, `flashdelivery`                                                                                   | Same Procolis API shape as legacy ZR Express, each with its own Token + Key                                                                |
| Zimou Express                                                    | `zimou`                                                                                                                                       | Standalone courier API                                                                                                                     |
| Colivraison                                                      | `colivraison`                                                                                                                                 | Standalone courier API                                                                                                                     |
| Ecom Delivery                                                    | `ecomdelivery`                                                                                                                                | Standalone courier API                                                                                                                     |
| MDM Express                                                      | `mdm`                                                                                                                                         | Single **API Key** field; each order line is matched to your products in your MDM account by SKU or name; no rate sync, set prices by hand |
| Near Delivery                                                    | `neardelivery`                                                                                                                                | API Key + API Secret; relay-point (desk) delivery only, home orders are refused; no rate sync, set prices by hand                          |
| Elogistia                                                        | `elogistia`                                                                                                                                   | Single **API Key** field; one of only two families whose own PDF bordereau prints from the dashboard                                       |
| [Stop Desk](https://dzbuild.com/docs/couriers/stop-desk.md)      | delivery type + addon                                                                                                                         | Customer pickup at courier offices; works with any linked provider                                                                         |

The Yalidine API service also works with **Yalitec**, **Guepex**, **Easy & Speed**, **Economiqua** and **We Can Services**. They share the same API shape and are exposed under their own slugs in the dashboard.

DHD and Conexlog are **EcoTrack tenants**, not separate integrations: they just live on their own hosts (`platform.dhd-dz.com` and `app.conexlog-dz.com`) instead of `*.ecotrack.dz`. See the [EcoTrack page](https://dzbuild.com/docs/couriers/ecotrack.md) for the full tile list.

## Where to link a courier

Couriers are linked at **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** — in the sidebar, **Paramètres de livraison → « Connecter un transporteur »** (« ربط شركة التوصيل »). The page is a searchable grid of courier tiles. From there you can:

* Link a courier: click **Lier / ربط** on its tile, fill the credentials, and save.
* Manage an already-linked courier: the tile's button becomes **Gérer / إدارة**.
* Set one linked courier as the store's default (**Définir comme transporteur par défaut** / **تعيين كشركة افتراضية**).
* Pause a courier (switch off **Activer l'envoi des commandes via API** / « تفعيل إرسال الطلبات عبر API » in its window) or **Délier / إلغاء الربط** it at any time without losing your existing orders.

Tile chips show link state, not a live credential check: green chips mean the courier is linked or active, amber chips mean it is the default or paused. A red **API expirée** (« بيانات API منتهية ») pill appears after repeated authentication failures over the last 30 days. A red **API expirée, envois arrêtés** (« بيانات API منتهية، الإرسال متوقف ») pill means the courier kept refusing your keys: sending and automatic tracking stop for that courier until you paste fresh credentials and click **Enregistrer les modifications**. To check credentials right now, open the tile and click **Tester la connexion**.

The separate page **[`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping)** (« Tarifs de livraison » / « أسعار الشحن ») is the per-wilaya shipping-**price** table. That is where you find:

* A home price and a desk price for every wilaya, each behind its own switch, so you can turn off home delivery, desk delivery, or both for a given wilaya.
* The wilaya list itself: **58 wilayas** (the courier-compatible list) or **69 wilayas** (which adds 11 newer ones such as Aflou, Barika and Bou Saâda). The mode selector sits at the top of the page. Courier APIs do not accept those newer wilayas, so the 69 option is greyed out while a courier is linked. Linking a courier does not move a store that is already on 69 back to 58: click 58 yourself.
* **Sync rates from provider** — pulls each wilaya's home + desk rates from the linked courier.

note

Shipping pages do not exist for **digital-product stores** (the digital theme redirects both pages to the dashboard). Team members need the `shipping.view` permission to open them and `shipping.edit` to change anything, and the store's subscription must be active.

If your business model needs **per-product** shipping prices (heavy items, size-based fees, free-shipping flags on specific SKUs), enable the **Custom Product Shipping** addon. It requires the **Pro** plan or higher (activating it on Free is refused with « هذه الإضافة تتطلب خطة pro »), is unavailable on the **digital** theme, and has its own page at `/dashboard/addons/custom-shipping`. It gives you a per-product flat rate or per-wilaya pricing, per-product free shipping, highest-price-wins for mixed carts, and a "copy from store rates" shortcut.

## What gets synced from the courier

| Data                | Yalidine | EcoTrack | ZR Express                             | Maystro            | Noest |
| ------------------- | -------- | -------- | -------------------------------------- | ------------------ | ----- |
| Wilayas list        | ✅       | ✅       | ✅                                     | ✅                 | ✅    |
| Communes per wilaya | ✅       | ✅       | ✅                                     | ✅                 | ✅    |
| Home + desk rates   | ✅       | ✅       | ✅                                     | ✅                 | ✅    |
| Stop desk list      | ✅       | ✅       | New platform ✅ / legacy: no desk list | ✅ (pickup points) | ✅    |

Every linked courier can sync rates except MDM Express and Near Delivery, whose prices you set by hand; a paused courier stays out of the sync list until you turn it back on. Maystro prices per commune, so each wilaya is quoted from its centre commune; Noest returns one home price and one desk price per wilaya.

The **legacy ZR Express (Procolis) platform publishes no desk list**: a whole wilaya counts as desk-eligible whenever its Stopdesk price is above zero, the customer sees a generic commune-level "ZR Express agency" option, and ZR picks the actual pickup point on dispatch. The new ZR platform returns a real hub list.

### Refreshing provider data

Everything in the table above refreshes automatically overnight, once a day. Your own prices are not part of it: the rates on `/dashboard/shipping` change when you run a rate sync with **Sync rates from provider** there (or the sync switch when you link a courier) or edit them by hand. To force a refresh of one courier's wilayas, communes and desks (the fix for *"my new courier shows no desks or communes yet"*), open the courier's tile at `/dashboard/link-shipping` and click **Actualiser** (« تحديث البيانات ») inside the modal. The button only appears for an already-linked courier, works only while that courier is active (not paused), and has a **5-minute cooldown** per courier.

## What happens when an order is sent to the courier

1. You confirm the order in [`/dashboard/orders`](https://dzbuild.com/dashboard/orders).
2. In the send-to-delivery modal you pick which linked courier ships it, and DZBuild calls that courier's API with the customer's name, phone, address, item list and the COD amount.
3. The courier returns a **tracking number**, saved on the order.
4. The order moves to **`processing`** — but only if it was `pending` or `confirmed`; a later status is left alone. DZBuild also stores the tracking number, the courier name, and the send timestamp.
5. The order becomes `shipped` on its own once the tracking sync sees a pickup or transit status, then `delivered` (or `returned` / `cancelled`).

The payload differs per courier family, and this is the part merchants most often get wrong:

| What is sent   | Yalidine family               | EcoTrack family                                | ZR Express (legacy)   | ZR Express (new)                         | Maystro                       | Noest                           |
| -------------- | ----------------------------- | ---------------------------------------------- | --------------------- | ---------------------------------------- | ----------------------------- | ------------------------------- |
| COD amount     | `price` = **subtotal**        | `montant` = order total                        | `Total` = order total | `amount` = order total                   | `product_price` = order total | `montant` = order total         |
| Desk reference | `is_stopdesk` + `stopdesk_id` | `stop_desk` 0/1 (commune = the desk's commune) | `TypeLivraison` 0/1   | `deliveryType: "pickup-point"` + `hubId` | `delivery_type: 2`            | `stop_desk: 1` + `station_code` |
| Weight         | ✅                            | ✅                                             | not sent              | not sent                                 | **not sent**                  | `poids`                         |
| Declared value | ✅                            | —                                              | —                     | —                                        | —                             | —                               |

Yalidine is the only family that receives a declared value and a `stopdesk_id`, and the only one whose COD amount is the subtotal rather than the order total (Yalidine bills the delivery fee separately).

### Printing labels

**Print label** fetches the *courier's* own PDF bordereau only for **EcoTrack-family** couriers and **Elogistia** (whose bordereau comes in three sizes — 15×20, 10×15 and 10×10 cm, with 10×15 as the default). For every other courier it prints DZBuild's own HTML bordereau. Yalidine, Maystro and Noest label URLs are captured and stored on the order, but no dashboard button opens them today — print those from the courier's own portal.

## Tracking sync

DZBuild checks each linked courier automatically for the orders it has in flight and moves them along on its own: `processing → shipped → delivered`, or `returned` / `cancelled`. A status change on the courier's side usually shows up on your order within a few minutes. A courier cancellation restores stock right away. A courier return restores it once the courier reports the parcel back with you, when you click **Retour reçu** (« استلمت المرتجع ») on the order, or 15 days after the return started, whichever comes first.

Two things worth knowing:

* A courier status DZBuild does not recognise leaves the order untouched.
* A parcel the courier cannot find is **never** cancelled automatically — it is left as-is and re-checked next cycle. Only an explicit `cancelled` status from the courier cancels an order.

## Weight surcharge

Parcels heavier than **5 kg** add a surcharge on top of the wilaya rate at checkout: **50 DA per extra kg**, rising to **100 DA per extra kg** for the 13 deep-south wilayas (Adrar, Béchar, Tamanrasset, El Bayadh, Illizi, Tindouf, Naâma, Timimoun, Bordj Badji Mokhtar, Béni Abbès, In Salah, In Guezzam, Djanet) when the courier is Yalidine, Yalitec or Guepex. Easy & Speed is deliberately excluded from the deep-south rate.

The surcharge is computed from your products' weights and is added to what the customer pays. It does not appear as a line in the shipping-rates table, so a wilaya priced at 600 DA can quote more than 600 DA for a heavy cart.

This is the courier's own pricing rule; DZBuild applies it rather than inventing it. If you do not want it charged on a given product, leave that product's weight empty, or set free shipping on it.

## Linking flow (high level)

1. Open **[`/dashboard/link-shipping`](https://dzbuild.com/dashboard/link-shipping)** and search the tile grid for your courier.
2. Click **Lier / ربط** on its tile.
3. Paste the credentials the courier issued you (token, ID, GUID — depends on the courier; see each per-courier page).
4. Click **Tester la connexion** (« اختبار الاتصال »).
5. Click **Lier et enregistrer** (« ربط وحفظ »). Optionally tick **Définir comme transporteur par défaut**. The first courier you link becomes the default on its own, and **Synchroniser les tarifs avec votre compte transporteur** (« مزامنة الأسعار مع حساب شركة التوصيل ») is already ticked for it, so its per-wilaya rates are pulled in the background right after linking.
6. Go to [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) to sync per-wilaya rates from the provider or set them by hand.

## When your courier is not on the list

Work through this in order.

1. **Ask your courier whether they run on EcoTrack.** A large share of Algerian couriers do, and 82 of them already have their own tile in the grid. If yours is an EcoTrack tenant with no tile of its own, the **Ecotrack personnalisé** (« Ecotrack مخصص ») tile takes the courier's name, its API URL (an `https://` address ending in `.ecotrack.dz`) and a bearer token, and behaves identically. See the [EcoTrack page](https://dzbuild.com/docs/couriers/ecotrack.md).
2. **Ship manually in the meantime.** Confirm the order, hand the parcel to the courier, then mark the order `shipped` in [`/dashboard/orders`](https://dzbuild.com/dashboard/orders). You lose automatic tracking; nothing else about the order changes.
3. **Send us the request.** Open a support ticket with the courier's name and a link to their API documentation. The documentation link is the part that matters, because without a public API there is nothing to build against. We cannot promise a date for any specific courier.

## Frequently asked

**Q: Can I link more than one courier?** A: Yes. Link as many as you want, and flag one as the store's default. When you send an order (single or in bulk) you choose the courier from a dropdown in the send-to-delivery modal, and DZBuild ships it through that courier's API. Nothing has to be shipped manually. For desk orders, couriers with no desk in the customer's wilaya are greyed out in that dropdown and labelled « لا يوجد مكتب », and when the customer picked a specific desk, the courier that owns it is selected for you.

**Q: How do COD payouts work?** A: The courier collects the cash at delivery and pays you directly, on its own schedule, under whatever terms you agreed with it. DZBuild never touches that money and is not part of the settlement. See [Cash on Delivery](https://dzbuild.com/docs/payments/cod.md).

**Q: My courier is not on the list. Can I still use DZBuild?** A: Yes. See the section just above for the three steps.

**Q: A wilaya my courier serves is missing from my rate table.** A: That list mirrors what your own courier account returns, not a DZBuild list, so it moves when the courier changes your account. Click **Sync rates from provider** on [`/dashboard/shipping`](https://dzbuild.com/dashboard/shipping) to pull your rates again; **Actualiser** on the courier's tile refreshes communes and desks, not your prices. If the wilaya is still missing, open a support ticket with the exact error message and the order number, and enter that one order directly in the courier's own platform while we look at it.
