Österreichische Post, DPD AT and GLS — shipment-tracking webhooks
Normalised tracking states for Post Empfangsbox, self-service stations and home delivery
Without normalisation, every carrier brings its own vocabulary: Post says ’Übernahme von Versender', DPD says ’Pickup completed', GLS says ’Inbound at hub’. If the e-commerce platform forwards every status 1:1, the customer sees a patchwork of German, English and mixed terms — often with carrier-specific typos. Outcome: support tickets rise, customers think their parcel is in two different stages at once.
The Austrian parcel market splits between Österreichische Post (~56%), DPD Austria (~22%), GLS Austria (~12%) and a tail of smaller operators (Hermes, FedEx, UPS). Each maintains its own status codes, its own webhook format and its own pickup-station logic — Post Empfangsbox at home, DPD Pickup stations, GLS ParcelShops. For e-commerce platforms with a mixed carrier base, normalising these statuses is the key lever: customers want consistent wording (’Parcel arrived at hub', ’Out for delivery', ’Ready for pickup in Mariahilf') regardless of carrier. 4notify ingests the raw webhooks, normalises to a canonical status list and fans out to the configured endpoints.
| Channel | Primary provider | Fallback |
|---|---|---|
| Post-Webhook | post.at/sendungsverfolgung/webhook | REST API polling (5 min) |
| DPD-Webhook | DPD MyAccount push | DPD CSV-Export per E-Mail |
| GLS-Webhook | GLS Track & Trace API | GLS event polling (10 min) |
| Kanonischer Status-Mapper | 4notify Status-Normalizer | Default-Mapping mit Warnung |
| Kunden-SMS Abholerinnerung | BP-AT-002 SMS-Routing | E-Mail mit Karten-Link |
Consumers have a right to status transparency for parcel shipments. Carriers must keep the status history retrievable for at least 90 days.
Recipient address + phone may only be used for delivery. Marketing reactivation based on tracking events is not permitted without separate consent.
If the recipient doesn't collect the parcel within the storage period (Post: 14 days, DPD: 7 days, GLS: 7 days) they fall into default of acceptance. Status notifications help avoid that.
Register webhooks with all three carriers
With Post via the business portal post.at/business; with DPD via DPD MyAccount → webhook configuration; with GLS via the Track & Trace back office. Each carrier uses its own auth — Post: HMAC, DPD: Basic Auth, GLS: API key. 4notify abstracts that behind a unified connection config.
Map raw status to canonical vocabulary
The status table: `created`, `picked_up`, `at_origin_hub`, `in_transit`, `at_destination_hub`, `out_for_delivery`, `delivered`, `at_pickup_point`, `picked_up_by_recipient`, `returned`, `lost`. Each carrier raw status maps to one of these eleven canonical values; unknown statuses are logged with a warning and mapped to a default (`in_transit`).
Detect and flag Empfangsbox specifics
Post Empfangsbox = delivered, but to the home Empfangsbox (not to the recipient directly). Status stays `delivered` but an extra field `pickup_location: empfangsbox` is set — so the SMS template can distinguish ’Parcel delivered’ from ’Parcel in Empfangsbox at the door’.
Pickup reminders 48 h + 24 h before storage cutoff
On status `at_pickup_point` a timer is created automatically: first reminder 48 h before the storage cutoff (Post 14, DPD 7, GLS 7 days), second 24 h before. On pickup (status `picked_up_by_recipient`) the timers are cancelled.
Test procedure: (1) Inject a test shipment via Post / DPD / GLS sandbox — three shipment IDs simultaneously. (2) Trigger status changes in the sandbox (pickup → in transit → at hub → out for delivery). (3) On each change, verify customer SMS within 60 seconds, canonical status must be correct. (4) Simulate a pickup-point delivery instead of doorstep — status `at_pickup_point` must arrive, timers for 48 h + 24 h before deadline must be created. (5) Simulate Empfangsbox delivery — status `delivered` with `pickup_location: empfangsbox`, SMS text must contain ’Empfangsbox’.
bash
curl -X POST https://api.4notify.net/v1/shipments/register \
-H "Authorization: Bearer $API_KEY' \
-H "Content-Type: application/json' \
-d '{
"carrier': 'post_at",
"tracking_number': 'AT123456789",
"recipient_phone': '+436641234567",
"notify_on": [
"out_for_delivery",
"delivered",
"at_pickup_point",
"returned"
],
"pickup_reminders_hours_before_deadline": [48, 24],
"carrier_webhook_signature': 'sha256=…"
}'Post.at: parcel AT123456789 is waiting at the Post office 1070 Vienna, Mariahilfer Str. 88 until 09.06. for pickup. Bring ID.
- Webhooks active with all relevant carriers (Post / DPD / GLS at minimum)
- Idempotency key per event implemented (24-hour window against duplicates)
- Status mapping table reconciled with each carrier's raw status flow
- Empfangsbox detection active in Post webhooks
- Pickup reminders configured with the correct storage windows per carrier
- Unknown statuses are logged and reported to support@ (no silent fail)
Instead of forwarding carrier statuses 1:1, 4notify normalises to eleven canonical values — and detects Empfangsbox specifics, without which the customer can't tell whether the parcel is in the flat or in the front yard.
What if a carrier webhook fails?
4notify falls back to polling (5-10 min interval, depending on carrier) and triggers an ops alarm. Webhooks have 30-day replay capability; once restored, missed events are replayed without duplicates (idempotency key).
How do you handle Hermes / FedEx / UPS?
Adapters exist for FedEx and UPS (API-based webhooks). Hermes Austria currently uses a polling API; we poll every 10 minutes and write events into the same canonical status stream. Status coverage is 100% for Post/DPD/GLS and ~92% for the smaller carriers.
Can we remind customers across multiple delivery addresses?
Yes. If the recipient maintains multiple addresses in their online account (home + office), 4notify can accompany the office shipment with an extra SMS ’Note: shipped to office gate’. The logic boundary: address tagging happens in the e-commerce platform; 4notify just consumes the tag.
Open a free account
14 days, no card. German-language support.