PHPackages                             quellabs/canvas-shipments - 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. [Framework](/categories/framework)
4. /
5. quellabs/canvas-shipments

ActiveLibrary[Framework](/categories/framework)

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

Shipment router for the Canvas PHP framework. Discovers and routes shipment operations to installed provider packages.

1.1.0(3w ago)00MITPHPPHP ^8.2

Since Apr 2Pushed 3w agoCompare

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

READMEChangelogDependencies (16)Versions (7)Used By (0)

Canvas Shipments
================

[](#canvas-shipments)

Shipment router for the Canvas framework. Discovers installed shipping provider packages automatically via composer metadata and routes shipment operations to the correct provider.

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

[](#installation)

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

How it works
------------

[](#how-it-works)

`ShipmentRouter` scans installed packages for composer metadata declaring a `provider` class under the `shipments`discovery key. Any package that declares one and implements `ShipmentProviderInterface` is registered automatically — no manual configuration required.

The provider class must implement a static `getMetadata()` method returning a `modules` array. Each entry becomes a routable module identifier.

```
"extra": {
"discover": {
"canvas": {
"controller": "Quellabs\\Shipments\\SendCloud\\SendCloudController"
},
"shipments": {
"provider": "Quellabs\\Shipments\\SendCloud\\Driver",
"config": "config/sendcloud.php"
}
}
}
```

At runtime, `ShipmentRouter` uses the `shippingModule` field on the request to route calls to the correct provider.

Usage
-----

[](#usage)

Inject `ShipmentRouter` via Canvas DI:

```
use Quellabs\Shipments\ShipmentRouter;
use Quellabs\Shipments\Contracts\ShipmentRequest;
use Quellabs\Shipments\Contracts\ShipmentAddress;
use Quellabs\Shipments\Contracts\CancelRequest;

class FulfillmentService {
    public function __construct(private ShipmentRouter $router) {}

    public function ship(): ShipmentResult {
        return $this->router->create(new ShipmentRequest(
            shippingModule:  'sendcloud_postnl',
            reference:       'order-12345',
            deliveryAddress: new ShipmentAddress(
                name:              'Jan de Vries',
                street:            'Keizersgracht',
                houseNumber:       '123',
                houseNumberSuffix: null,
                postalCode:        '1015 CJ',
                city:              'Amsterdam',
                country:           'NL',
                email:             'jan@example.com',
            ),
            weightGrams: 1200,
            methodId:    8,
        ));
    }
}
```

Available methods
-----------------

[](#available-methods)

MethodDescription`create(ShipmentRequest)`Create a parcel, returns tracking code and label URL`cancel(CancelRequest)`Cancel a parcel before carrier pickup`exchange(string $driver, string $parcelId)`Fetch current shipment state (call to reconcile missed webhooks)`getShippingOptions(string $module)`Fetch available shipping methods for a module`getRegisteredModules()`Returns all discovered module identifiersRequirements
------------

[](#requirements)

- PHP 8.2+
- Quellabs Canvas framework

License
-------

[](#license)

MIT

###  Health Score

39

—

LowBetter than 84% of packages

Maintenance95

Actively maintained with recent releases

Popularity0

Limited adoption so far

Community2

Small or concentrated contributor base

Maturity51

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

Every ~13 days

Total

6

Last Release

23d ago

### Community

Maintainers

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

---

Tags

routerdiscoverycanvasshippingshipmentscanvas-shipments

### Embed Badge

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

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

###  Alternatives

[slim/slim

Slim is a PHP micro framework that helps you quickly write simple yet powerful web applications and APIs

12.3k52.9M1.4k](/packages/slim-slim)[sylius/shipping-bundle

Flexible shipping system for Symfony ecommerce applications.

14179.2k9](/packages/sylius-shipping-bundle)[yiisoft/router-fastroute

Yii router FastRoute adapter

42336.1k19](/packages/yiisoft-router-fastroute)[joomla/router

Joomla Router Package

10323.3k1](/packages/joomla-router)

PHPackages © 2026

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