Delivery Tracking
v1.4.14
Delivery Tracking
- Mises à jour et support inclus pendant 12 mois
- Clé de licence livrée immédiatement par email
- Garantie satisfait ou remboursé 30 jours
- Documentation complète incluse
- Compatible avec les thèmes Hyvä
- Installation prête pour Composer
Delivery Tracking
Une fois la commande expédiée, la plupart des boutiques se taisent. Le client a un numéro de suivi et le site du transporteur, et chaque question qu'il se pose ensuite arrive sous forme de ticket. Wimakeit Delivery Tracking comble ce silence : il suit chaque colis, en conserve l'historique complet, et prévient le client par email dès qu'il se passe quelque chose qui le concerne.
Ce qui « le concerne », c'est vous qui le décidez. Le module traduit les codes de statut bruts de chaque transporteur vers un jeu de statuts canoniques, et vous rattachez un email à ceux qui le méritent. Sans toucher au code, sans éditer de template.
À qui ça s'adresse
- Aux marchands qui expédient via DPD, UPS, bpost ou Mondial Relay, dans un pays ou plusieurs
- Aux boutiques où « où est mon colis ? » est un coût de support récurrent
- Aux marchands utilisant les points relais, où « en attente au relais » et « livré » ne doivent
- À ceux qui veulent des emails de livraison à leur ton et à leur rythme, par store view
surtout pas être confondus
Bénéfices clés
- Moins de tickets support. Le client est prévenu de la prise en charge, de la mise en livraison,
- Des déclencheurs pilotés depuis le backend. Chaque statut de colis peut envoyer son propre
- Une correspondance de statuts qui tient face au réel. Les transporteurs changent leurs codes et
- Prévenir avant que le colis ne reparte. Un colis oublié en point relais est renvoyé sans que
- Les réexpéditions suivies comme les autres. Un colis de remplacement part souvent de l'ERP et
- Le doublon est impossible, pas seulement improbable. La déduplication est portée par une
- Le client se débrouille seul. Une page « Mes colis » dans le compte, le statut du colis sur la
- Traçabilité complète. Chaque notification, y compris chacune volontairement non envoyée, est
de la mise à disposition en point relais et de la livraison, avant même d'y penser.
template d'email, avec ses conditions de transporteur, de store view et de groupe client, son délai et son plafond de fréquence.
les documentent rarement complètement. Les codes inconnus sont capturés automatiquement, classés par fréquence, et n'envoient jamais d'email tant qu'un humain n'a pas confirmé leur signification.
personne n'en soit averti : aucun transporteur n'annonce ce retour, la boutique l'apprend par la demande de remboursement. Un déclencheur peut se baser sur le temps écoulé et relancer le client pendant qu'il peut encore agir.
ne produit aucune expédition Magento. Le module sait les enregistrer depuis un flux fichier ou un import CSV, avec leur propre destinataire — c'est justement le colis sur lequel le client est le plus inquiet.
contrainte en base : deux passages de cron qui se chevauchent, un renvoi manuel et une commande CLI ne peuvent pas entrer en collision.
vue commande, et un lien de suivi sécurisé qui fonctionne sans connexion — indispensable pour les commandes invité.
journalisée avec son motif. « Pourquoi ce client n'a-t-il pas reçu l'email ? » tient en un filtre.
Compatibilité
Magento Open Source et Adobe Commerce 2.4.6+, Mage-OS 3.x, PHP 8.1 à 8.4. Indépendant du thème : fonctionne sur Luma, Hyvä et les thèmes sur mesure. Nécessite wimakeit/module-core et rien d'autre — aucune extension transporteur tierce n'est requise, et les transporteurs s'activent un par un.
Installez ce module via Composer. Assurez-vous que votre auth.json est configuré avec vos identifiants Wimakeit.
$ composer require wimakeit/module-delivery-tracking:^1.4.14
$ bin/magento setup:upgrade
$ bin/magento setup:di:compile
Installation
The standard composer require + setup:upgrade + setup:di:compile flow applies. The points below cover what's specific to this module.
Dependencies
| Package | Minimum |
|---|---|
php | 8.1 |
magento/framework | ^103.0 (Magento 2.4.6+, Mage-OS 3.x) |
wimakeit/module-core | ^3.0 |
No third-party carrier extension is required. Carrier integrations are built in and disabled by default.
Nothing is sent until you say so
Both safety nets are deliberate and worth knowing about before you go looking for missing emails:
- All six email triggers are installed inactive. Activate them under
- All four carriers are installed disabled. Enable and configure them one at a time.
Sales → Delivery Tracking → Email Triggers.
A fresh install therefore records parcels and shows tracking links, but sends nothing.
First steps after installing
1. Enable a carrier under Stores → Configuration → WiMakeIT → Delivery Tracking, or create a feed under Sales → Delivery Tracking → Carrier Feeds if your carrier delivers status files. 2. Let it run for a few days, then check Sales → Delivery Tracking → Status Mapping. It opens on the codes nobody has confirmed yet, most frequent first. Set what each one means and mark it confirmed. 3. Activate the triggers you want, starting with Out for delivery and Delivered. 4. Before going live, switch on Test mode in the Notifications group so every email is redirected to an address you choose, with the intended recipient shown in the subject.
ACL resources
Granted through System → User Roles. All sit under Sales.
| Resource | Grants |
|---|---|
Wimakeit_DeliveryTracking::tracking | Access to the whole section |
Wimakeit_DeliveryTracking::parcel | View tracked parcels |
Wimakeit_DeliveryTracking::parcel_refresh | Refresh a parcel against the carrier |
Wimakeit_DeliveryTracking::parcel_resend | Resend a delivery notification |
Wimakeit_DeliveryTracking::parcel_token | Issue a new guest tracking link |
Wimakeit_DeliveryTracking::parcel_delete | Delete parcels and their history |
Wimakeit_DeliveryTracking::trigger | View email triggers |
Wimakeit_DeliveryTracking::trigger_save | Create and edit triggers |
Wimakeit_DeliveryTracking::trigger_delete | Delete triggers |
Wimakeit_DeliveryTracking::status_map | View status mappings |
Wimakeit_DeliveryTracking::status_map_save | Edit status mappings |
Wimakeit_DeliveryTracking::feed | View and run carrier feeds |
Wimakeit_DeliveryTracking::feed_save | Create, edit and delete carrier feeds |
Wimakeit_DeliveryTracking::notification | Read the notification log |
Wimakeit_DeliveryTracking::config | Change the module configuration |
Cron jobs
Registered in the default group. No setup beyond a working Magento cron.
| Job | Schedule | Purpose |
|---|---|---|
wimakeit_delivery_tracking_ingest | /10 * | Pick up tracking numbers the real-time observer missed |
wimakeit_delivery_tracking_feed | /30 * | Read carrier status files |
wimakeit_delivery_tracking_poll | /15 * | Ask carriers what changed |
wimakeit_delivery_tracking_notify | /5 * | Send queued notifications |
wimakeit_delivery_tracking_purge | 0 3 0 | Retention cleanup |
Polling is self-pacing: each parcel decides its own next check from its status, so the 15-minute schedule is a ceiling rather than a per-parcel frequency.
Command line
| Command | Purpose |
|---|---|
bin/magento wimakeit:deliverytracking:poll --parcel=<id> --force | Refresh one parcel and print what changed |
bin/magento wimakeit:deliverytracking:feed --profile=<id> | Run one carrier feed and report the counters |
bin/magento wimakeit:deliverytracking:unmapped | List carrier codes still awaiting mapping, most frequent first |
Database tables
Created by declarative schema. wimakeit_delivery_tracking_parcel, _event, _status_map, _trigger, _notification, _preference and _feed_profile. Two data patches seed the status mappings and the inactive triggers; both complete in under a second.
Carrier notes
- DPD ships two source modes. File feed needs no API account and reads the status files DPD
- UPS authenticates with OAuth 2.0 client credentials; the legacy access key is retired. UPS
- bpost requires a Shipping Manager account with API access.
- Mondial Relay returns no status code at all, only a French label, so its mappings match on the
drops for you. REST calls DPD directly and returns richer history.
publishes no enumeration of its status codes, so expect to spend a week letting auto-discovery build the mapping before enabling UPS emails.
label. Its contract also caps polling at four to six calls per shipment per day, which the module enforces with a 240-minute floor. Do not lower it.
Configuration reference
Stores → Configuration → WiMakeIT → Delivery Tracking
General
| Setting | Path | Default |
|---|---|---|
| Enabled | wimakeit_delivery_tracking/general/enabled | 1 |
| Enable Debug Logging | wimakeit_delivery_tracking/general/debug_mode | 0 |
Parcel discovery
| Setting | Path | Default |
|---|---|---|
| Track Magento Shipments | wimakeit_delivery_tracking/sources/track_shipments | 1 |
| Catch-up Window (days) | wimakeit_delivery_tracking/sources/lookback_days | 14 |
| Create Parcels In Real Time | wimakeit_delivery_tracking/sources/auto_create_on_shipment | 1 |
Polling
| Setting | Path | Default |
|---|---|---|
| Enabled | wimakeit_delivery_tracking/polling/enabled | 1 |
| Parcels Per Run | wimakeit_delivery_tracking/polling/batch_size | 100 |
| Interval — Awaiting Handover (minutes) | wimakeit_delivery_tracking/polling/interval_pending_minutes | 120 |
| Interval — In Transit (minutes) | wimakeit_delivery_tracking/polling/interval_transit_minutes | 180 |
| Interval — Out For Delivery / Ready For Pickup (minutes) | wimakeit_delivery_tracking/polling/interval_active_minutes | 30 |
| Interval — Exception / Customs (minutes) | wimakeit_delivery_tracking/polling/interval_exception_minutes | 360 |
| Keep Polling After Delivery (hours) | wimakeit_delivery_tracking/polling/keep_polling_after_delivery_hours | 24 |
| Abandon After (days) | wimakeit_delivery_tracking/polling/max_tracking_days | 45 |
| Max Consecutive Failures | wimakeit_delivery_tracking/polling/max_failures | 8 |
| Max Calls Per Carrier Per Run | wimakeit_delivery_tracking/polling/max_calls_per_run | 200 |
Notifications
| Setting | Path | Default |
|---|---|---|
| Enabled | wimakeit_delivery_tracking/notifications/enabled | 1 |
| Copy Method | wimakeit_delivery_tracking/notifications/copy_method | bcc |
| Max Emails Per Parcel | wimakeit_delivery_tracking/notifications/max_emails_per_parcel | 6 |
| Notify Guest Orders | wimakeit_delivery_tracking/notifications/send_to_guests | 1 |
| Respect Customer Opt-out | wimakeit_delivery_tracking/notifications/respect_customer_preference | 1 |
| Test Mode | wimakeit_delivery_tracking/notifications/test_mode | 0 |
| Emails Per Run | wimakeit_delivery_tracking/notifications/send_batch_size | 50 |
| Max Send Attempts | wimakeit_delivery_tracking/notifications/max_send_attempts | 3 |
Storefront
| Setting | Path | Default |
|---|---|---|
| Enable "My Parcels" Account Page | wimakeit_delivery_tracking/frontend/account_page_enabled | 1 |
| Account Link Position | wimakeit_delivery_tracking/frontend/account_link_sort_order | 68 |
| Invert Account Link Position | wimakeit_delivery_tracking/frontend/account_link_invert_sort | 0 |
| Show Parcel Status On Order View | wimakeit_delivery_tracking/frontend/order_view_block_enabled | 1 |
| Show Parcel Summary On Order History | wimakeit_delivery_tracking/frontend/order_history_summary_enabled | 1 |
| Enable Guest Tracking Page | wimakeit_delivery_tracking/frontend/guest_page_enabled | 1 |
| Guest Link Lifetime After Delivery (days) | wimakeit_delivery_tracking/frontend/guest_token_lifetime_days | 30 |
| Guest Page Requests Per Hour Per IP | wimakeit_delivery_tracking/frontend/guest_rate_limit_per_hour | 30 |
| Parcel Detail Links Point To | wimakeit_delivery_tracking/frontend/detail_link_target | account |
Carrier resolution
| Setting | Path | Default |
|---|---|---|
| 3. Title Keywords — DPD | wimakeit_delivery_tracking/carrier_mapping/title_keywords_dpd | dpd |
| 3. Title Keywords — UPS | wimakeit_delivery_tracking/carrier_mapping/title_keywords_ups | ups |
| 3. Title Keywords — bpost | wimakeit_delivery_tracking/carrier_mapping/title_keywords_bpost | bpost, bpack, b-post |
| 3. Title Keywords — Mondial Relay | wimakeit_delivery_tracking/carrier_mapping/title_keywords_mondialrelay | mondial relay, mondialrelay, point relais |
| 5. Guess From Tracking Number Format | wimakeit_delivery_tracking/carrier_mapping/enable_pattern_fallback | 1 |
Data retention
| Setting | Path | Default |
|---|---|---|
| Delete Events After (days) | wimakeit_delivery_tracking/retention/events_days | 180 |
| Delete Notification Log After (days) | wimakeit_delivery_tracking/retention/notifications_days | 365 |
| Delete Parcels After (days) | wimakeit_delivery_tracking/retention/parcels_days | 730 |
Carrier — DPD
| Setting | Path | Default |
|---|---|---|
| Enabled | wimakeit_delivery_tracking/carrier_dpd/enabled | 0 |
| Source | wimakeit_delivery_tracking/carrier_dpd/mode | feed |
| Throttle Between Calls (ms) | wimakeit_delivery_tracking/carrier_dpd/throttle_ms | 0 |
| Minimum Interval Per Parcel (minutes) | wimakeit_delivery_tracking/carrier_dpd/min_poll_minutes | 0 |
| Tracking URL | wimakeit_delivery_tracking/carrier_dpd/tracking_url_template | https://www.dpdgroup.com/be/mydpd/my-parcels/incoming?parcelNumber={{number}} |
Carrier — UPS
| Setting | Path | Default |
|---|---|---|
| Enabled | wimakeit_delivery_tracking/carrier_ups/enabled | 0 |
| API URL | wimakeit_delivery_tracking/carrier_ups/api_url | https://onlinetools.ups.com |
| Throttle Between Calls (ms) | wimakeit_delivery_tracking/carrier_ups/throttle_ms | 250 |
| Minimum Interval Per Parcel (minutes) | wimakeit_delivery_tracking/carrier_ups/min_poll_minutes | 0 |
| Tracking URL | wimakeit_delivery_tracking/carrier_ups/tracking_url_template | https://www.ups.com/track?tracknum={{number}} |
Carrier — bpost
| Setting | Path | Default |
|---|---|---|
| Enabled | wimakeit_delivery_tracking/carrier_bpost/enabled | 0 |
| Throttle Between Calls (ms) | wimakeit_delivery_tracking/carrier_bpost/throttle_ms | 200 |
| Minimum Interval Per Parcel (minutes) | wimakeit_delivery_tracking/carrier_bpost/min_poll_minutes | 0 |
| Tracking URL | wimakeit_delivery_tracking/carrier_bpost/tracking_url_template | https://track.bpost.cloud/btr/web/#/search?itemCode={{number}} |
Carrier — Mondial Relay
| Setting | Path | Default |
|---|---|---|
| Enabled | wimakeit_delivery_tracking/carrier_mondialrelay/enabled | 0 |
| API | wimakeit_delivery_tracking/carrier_mondialrelay/mode | soap |
| Throttle Between Calls (ms) | wimakeit_delivery_tracking/carrier_mondialrelay/throttle_ms | 300 |
| Minimum Interval Per Parcel (minutes) | wimakeit_delivery_tracking/carrier_mondialrelay/min_poll_minutes | 240 |
| Tracking URL | wimakeit_delivery_tracking/carrier_mondialrelay/tracking_url_template | https://www.mondialrelay.fr/suivi-de-colis?numeroExpedition={{number}} |
Email fragments
| Setting | Path | Default |
|---|---|---|
| timeline_partial | wimakeit_delivery_tracking/email/timeline_partial | wimakeit_delivery_tracking_partial_timeline |
| footer_partial | wimakeit_delivery_tracking/email/footer_partial | wimakeit_delivery_tracking_partial_footer |
Storefront placement
The account link is added to the customer account navigation. If it appears at the very top of the menu instead of where you set it, your theme or another module inverts account link sort orders — switch Invert Account Link Position to Yes.
Parcel detail links never point at Magento's native shipment view, because stores that redirect that view elsewhere would drop the customer on a page they cannot open. Use Parcel Detail Links Point To to choose between the account page, the tokenised tracking page and the carrier's own site.
- Version
- v1.4.14
- Support
- 12 mois
- Dernière mise à jour
- 29 août 2026
- Magento
- Magento 2.4.4 Magento 2.4.5 Magento 2.4.6 Magento 2.4.7 Mage-OS 2.0 Mage-OS 2.1
- PHP
- PHP 8.1 PHP 8.2 PHP 8.3
- Hyvä
- Compatible
- Package
-
wimakeit/module-delivery-tracking
Vérifier la compatibilité
Indiquez votre stack pour vérifier la compatibilité du module.
Changelog
Categories: Security, Feature, Fix, Perf, Admin, Deps.
[1.1.0] - 2026-08-26
Feature
- Time-based triggers: a trigger can now fire because nothing happened, not only because a carrier scan arrived. Use it to warn a customer before a pickup point returns their parcel — no carrier announces that return, and the shop usually learns of it from the refund request.
- Ships a "Pickup Reminder" email and a pre-configured 5-day trigger, inactive like every other seeded trigger. Set the threshold against your own carrier agreement: retention runs from seven to fourteen days depending on country and contract.
- New
days_in_statusemail variable, so a reminder can say how long the parcel has been waiting. - Feed profiles can register parcels they do not recognise, taking the address from the file. A replacement parcel dispatched from an ERP produces no Magento shipment, so nothing else would ever create it.
- New CLI
wimakeit:deliverytracking:parcel:importfor the same case served differently: a list of parcels rather than a file of scans. Supports--dry-run. - Feed profiles gained a store setting, so parcels created without an order render their emails in the right locale and from the right sender.
Security
- A carrier feed password was redisplayed in clear text when the form failed validation. It is no longer carried back into the page, and the field is masked.
Fix
- Triggers restricted to a customer group never fired, and left no trace in the notification log because the filtering happened before anything was written. They work now.
- Time-based triggers honour the repeat delay the form offers; previously it could never take effect.
- Mass actions on large selections run in batches instead of one statement, so they no longer lock tables the storefront reads.
- The Email Trigger edit form failed to open at all: it referenced a customer-group source class that does not exist in Magento. Editing a trigger works again.
Admin
- Trigger form and grid expose the dwell threshold.
- Two new settings bound the time-based scan: how many parcels each trigger examines per run, and how stale a parcel may be and still earn a reminder.
[1.0.1] - 2026-08-25
Fix
- Mass actions now respect the filters applied to a grid: selecting every row on a filtered grid no longer acts on rows outside the filter.
- "Select all" works on the Email Triggers and Status Mapping grids, where it previously did nothing at all.
- Carrier feeds can only read inside a configurable base directory, so the feed permission can be delegated safely.
- A polling run now stops on a time budget as well as a parcel count, so an unresponsive carrier cannot make it overrun its schedule.
- The per-carrier call ceiling was set above the batch size and could never take effect.
Perf
- Carrier feed files are streamed and processed one at a time, so memory no longer grows with the number of files waiting.
- Feed ingestion resolves parcels in two queries per file instead of one or two per line.
- Event ingestion is written in bounded batches, whatever history length a carrier returns.
- Parcel timelines are capped in the database rather than after reading every stored event.
Admin
- New health command reporting degraded carriers, stuck notifications, failing feeds and unmapped status codes, with a non-zero exit code for monitoring.
[1.0.0] - 2025-08-25
Feature
- Parcel tracking for DPD, UPS, bpost and Mondial Relay behind one adapter interface, each carrier enabled independently.
- Carrier status codes are translated to a canonical set of parcel statuses through an editable mapping table.
- Unknown carrier codes are captured automatically, counted, and never send an email until confirmed by an operator.
- Sixteen canonical statuses, keeping "waiting at a pickup point" distinct from "delivered" so the customer gets the right instruction.
- Generic file ingestion over CSV drops, with the column mapping stored per feed so one carrier's country variants both work.
- Adaptive polling: parcels out for delivery are checked every 30 minutes, parcels awaiting handover every two hours.
- Seven email templates with shared header and footer fragments, rendered in the store view's own locale.
- Customer account page listing every parcel with its progress, timeline and pickup point details.
- Parcel status shown on the order view page and summarised under the order history.
- Secure tracking page reachable from the emails without signing in, which guest orders require.
- Notification preference in the customer account, plus an unsubscribe link in every email.
Admin
- Tracked Parcels grid with per-row refresh, resend and tracking-link regeneration, plus mass actions.
- Email Triggers grid and form: one status to one template, with carrier, store view, customer group, delay and frequency conditions.
- Status Mapping grid with inline editing, so correcting a carrier code is a click rather than a form round trip.
- Notification log recording every send and every deliberate non-send with its reason.
- Carrier Feeds grid and form, with a run-now action reporting how many rows matched.
- CLI commands to poll parcels, run a feed and list carrier codes still awaiting mapping.
Security
- Guest tracking links use 128 bits of entropy, expire, are rate limited per IP, and expose neither the delivery address nor the order total.
- Unsubscribing requires a confirmation step, so mail security scanners that pre-fetch links cannot opt customers out.
- Carrier credentials are stored encrypted and never returned to the admin form.
Perf
- Re-reading the same carrier response inserts nothing: event ingestion is idempotent through a unique index.
- Delivered and returned parcels stop being polled; parcels with no activity are abandoned after 45 days.
- Retention cleanup deletes old events and notifications in bounded chunks, keeping the admin grids responsive.
Deps
- Requires PHP 8.1 or later, Magento 2.4.6 or later, and
wimakeit/module-core3.0 or later.
Vous avez trouvé un bug ? Faites-nous-en part.
Un court formulaire s'ouvre dans un nouvel onglet — le nom du module et votre langue sont déjà pré-remplis. Décrivez ce que vous avez tenté, ce qui n'a pas fonctionné, et nous vous répondrons sous un jour ouvré.
Signaler un bug pour Delivery TrackingBesoin d'aide ?
Notre équipe est disponible pour vous accompagner dans l'intégration.