PHPackages                             quellabs/canvas-shipments-dpd - PHPackages - PHPackages  [Skip to content](#main-content)[PHPackages](/)[Directory](/)[Categories](/categories)[Trending](/trending)[Leaderboard](/leaderboard)[Changelog](/changelog)[Analyze](/analyze)[Collections](/collections)[Log in](/login)[Sign up](/register)

1. [Directory](/)
2. /
3. quellabs/canvas-shipments-dpd

ActiveLibrary

quellabs/canvas-shipments-dpd
=============================

DPD NL/BE shipping provider integration for the Canvas PHP framework

1.0.0(today)00MITPHPPHP ^8.2

Since Apr 3Pushed todayCompare

[ Source](https://github.com/quellabs/canvas-shipments-dpd)[ Packagist](https://packagist.org/packages/quellabs/canvas-shipments-dpd)[ RSS](/packages/quellabs-canvas-shipments-dpd/feed)WikiDiscussions main Synced today

READMEChangelogDependencies (4)Versions (2)Used By (0)

DPD Shipping Provider
=====================

[](#dpd-shipping-provider)

A DPD NL/BE shipping provider for the Canvas framework.

Installation
------------

[](#installation)

```
composer require quellabs/canvas-shipments-dpd
```

Configuration
-------------

[](#configuration)

`config/dpd.php` is published automatically when you install the package. Fill in your credentials:

```
return [
    'delis_id'      => '',      // 6–10 character ID provided by DPD
    'password'      => '',      // password provided by DPD
    'sending_depot' => '',      // depot code from your DPD contract (e.g. '0522')
    'test_mode'     => false,
    'sender_address' => [
        'company'     => 'My Webshop B.V.',
        'name'        => 'Logistics Dept',
        'street'      => 'Keizersgracht',
        'number'      => '123',
        'postal_code' => '1015CJ',
        'city'        => 'Amsterdam',
        'cc'          => 'NL',
        'email'       => 'logistics@example.com',
        'phone'       => '+31201234567',
    ],
];
```

`delis_id`, `password`, and `sending_depot` are provided by DPD when your shipper account is set up. Contact DPD customer IT or your account manager to request access. Each new integration must be validated and approved by DPD before production use.

Important behaviours
--------------------

[](#important-behaviours)

**The API is SOAP-based, not REST.** The DPD Shipper Webservice uses SOAP 1.1 over HTTPS with XML request/response bodies. The gateway handles all XML serialisation and parsing internally — no SOAP extension or WSDL tooling is required from the caller.

**Auth tokens are valid for 24 hours and must be cached.** DPD enforces a maximum of 10 login calls per day. The gateway caches the token in-memory and re-authenticates only when it has expired, with a 5-minute safety margin. For long-running processes or queue workers that may outlive a single request lifecycle, implement persistent token caching and inject a pre-warmed token via the config if needed.

**Labels are not returned by default.** `ShipmentResult` does not include a label. The label PDF is embedded as base64 in the creation response and stored in `ShipmentResult::$rawResponse['labelContent']`. Persist this value to storage immediately after creation — DPD does not offer a label re-fetch endpoint. `getLabelUrl()` will throw a `ShipmentLabelException` with instructions to use the cached raw response value.

**Tracking code equals the parcel label number.** DPD uses a 14-digit parcel label number as the stable identifier across creation, tracking, and label generation. This is stored as both `ShipmentResult::$parcelId` and `$trackingCode`.

**No webhook support.** DPD's Shipper Webservice does not offer push notifications. Use the `handleRefresh` endpoint (or call `exchange()` directly) from a scheduled job to poll parcel status via the ParcelLifeCycle Service.

**Cancellation is not supported via the API.** `cancel()` always throws `ShipmentCancellationException`. Contact DPD customer service before 22:00 on the day the order was placed to cancel manually.

**Delivery options are not available.** `getDeliveryOptions()` always returns an empty array. DPD does not expose a consumer-facing timeslot picker.

**Pickup options require a recipient address.** Pass a `ShipmentAddress` as the second argument to `getPickupOptions()`. The address postal code, city, and country are used to search nearby DPD parcel shops. Without an address an empty array is returned.

**Test mode uses the DPD stage environment.** Setting `test_mode => true` switches to `shipperadmintest.dpd.nl`. Stage and live credentials are separate — request stage credentials from DPD customer IT. Labels generated on stage are not valid and must not be used for real shipments. DPD requires that all integrations are tested and approved on stage before production access is granted.

**Sequential requests only.** DPD prohibits concurrent shipment service calls per account. The driver sends requests sequentially by design; do not parallelize shipment creation across the same account credentials.

Supported modules
-----------------

[](#supported-modules)

ModuleDPD productService`dpd_b2b``B2B`DPD Business (standard)`dpd_b2c``B2C`DPD Home (consumer delivery)`dpd_parcel_letter``PL`DPD ParcelLetter`dpd_b2b_saturday``B2B`DPD Business Saturday delivery`dpd_b2c_saturday``B2C`DPD Home Saturday delivery`dpd_b2b_age_check``B2B`DPD Business + age check 18+`dpd_b2c_age_check``B2C`DPD Home + age check 18+`dpd_shop``B2C`DPD Shop (parcel shop delivery)`dpd_shop_return``B2C`DPD Shop Return`dpd_express_830``E830`DPD Express before 08:30`dpd_express_10``E10`DPD Express before 10:00`dpd_express_12``E12`DPD Express before 12:00`dpd_guarantee``PM2`DPD GuaranteeNot all products are available on every DPD account. Confirm which services are enabled on your contract with your DPD account manager before using a module in production.

License
-------

[](#license)

MIT

###  Health Score

39

—

LowBetter than 86% of packages

Maintenance100

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity45

Maturing project, gaining track record

How is this calculated?**Maintenance (25%)** — Last commit recency, latest release date, and issue-to-star ratio. Uses a 2-year decay window.

**Popularity (30%)** — Total and monthly downloads, GitHub stars, and forks. Logarithmic scaling prevents top-heavy scores.

**Community (15%)** — Contributors, dependents, forks, watchers, and maintainers. Measures real ecosystem engagement.

**Maturity (30%)** — Project age, version count, PHP version support, and release stability.

###  Release Activity

Cadence

Unknown

Total

1

Last Release

0d ago

### Community

Maintainers

![](https://www.gravatar.com/avatar/57e4ab872b3e37536367f2d26b192df3d3bb6a6a1cebec9a104d14a6d2ffe157?d=identicon)[noescom](/maintainers/noescom)

---

Tags

canvasshippingshipmentdpdcanvas-shipments

### Embed Badge

![Health badge](/badges/quellabs-canvas-shipments-dpd/health.svg)

```
[![Health](https://phpackages.com/badges/quellabs-canvas-shipments-dpd/health.svg)](https://phpackages.com/packages/quellabs-canvas-shipments-dpd)
```

###  Alternatives

[magepsycho/magento2-custom-shipping

Magento 2 Custom Shipping

697.5k](/packages/magepsycho-magento2-custom-shipping)

PHPackages © 2026

[Directory](/)[Categories](/categories)[Trending](/trending)[Changelog](/changelog)[Analyze](/analyze)
