> ## Documentation Index
> Fetch the complete documentation index at: https://developers.perform.ai/llms.txt
> Use this file to discover all available pages before exploring further.

# PUDO Delivery

> PUDO Delivery books a parcel to the pick-up or drop-off point a shopper chose, using one location ID that works across carriers.

**Available to all Logistics customers with booking enabled.** No separate PUDO setting is needed.

## Summary

PUDO Delivery lets you book an outbound shipment to a pick-up or drop-off point (a parcel locker, parcel shop or post office) instead of the shopper’s home, by passing one Perform.AI location ID in the booking. Perform.AI resolves the carrier’s own location ID, validates the booking and produces a label routed to that point, and the shipment keeps a record of every PUDO location involved in its journey.

## Who it’s for

Engineering teams that offer pick-up points at checkout and want one booking integration rather than one per carrier, and operations teams that need to see where a parcel was actually delivered when a carrier diverts it to a locker or shop.

## Key benefits

* **One ID across carriers.** The `pudo_location_uuid` from the PUDO Locations API is carrier-agnostic; Perform.AI maps it to the carrier-specific ID the label needs.
* **Errors before the label.** Three checks run at booking time: the shipping service supports PUDO, the location exists and is still active, and the carrier accepts it. Each failure returns a named error.
* **The home address is preserved.** `to_address` on the shipment is never changed; the label uses the PUDO address while notifications and returns keep the shopper’s address.
* **The full PUDO history on the shipment.** Both the point you booked and any point the carrier reports in tracking are stored, with live opening hours.

## How it works

### The flow

1. Retrieve the point the shopper chose with the [PUDO Locations API](https://developers.perform.ai/guides/pudo-locations.md). The response contains a `pudo_location_uuid`.
2. Pass that `pudo_location_uuid` in the [Create Booking](https://developers.perform.ai/guides/create-booking.md) request. A booking without it is a normal home delivery.
3. Perform.AI validates the request, resolves the carrier-specific PUDO ID and sends it to the carrier’s label API.
4. On success the label is routed to the PUDO point, and the location is stored on the shipment as an Outbound Delivery entry. On failure nothing is written.

### Validation at booking time

| Check | Error code | Message |
| - | - | - |
| The selected shipping service supports PUDO delivery | `UNSUPPORTED_PUDO_SERVICE` | The selected shipping service does not support PUDO delivery. Please select a PUDO supported shipping service. |
| The location ID exists | `PUDO_LOCATION_NOT_FOUND` | The specified PUDO location ID was not found. Please verify the location ID from the PUDO Locations API. |
| The location is still active | `PUDO_LOCATION_INACTIVE` | The specified PUDO location is expired. Please select a new PUDO location. |
| The carrier accepts the location | Carrier-defined | The carrier’s error is returned as received. |

The location is re-validated at booking, which catches points that closed between the shopper’s choice and the booking. PUDO master data is refreshed on a schedule, so a location that closed since the last refresh can still fail at the carrier.

### PUDO-supported shipping services

Under **Settings** > **Carriers** > carrier > **Booking**, the Shipping Service dropdown marks services that support PUDO delivery with a **PUDO Supported** tag. The tag is informational and does not restrict selection; the booking validation enforces compatibility.

### Supported carriers

Outbound PUDO booking is live for PostNord, DPD Germany, Colissimo and InPost. Other carriers are added after carrier assessment; ask your account team about a carrier not listed.

### PUDO history on a shipment

Each shipment keeps an append-only list of PUDO locations. Entries are added, never changed or removed:

| Entry type | Added when |
| - | - |
| Outbound Delivery | A PUDO booking succeeds |
| Carrier Reported | A carrier tracking event reports a PUDO point, even without a booking. If it reports the same point already booked, no duplicate is added. |

Each entry stores the Perform.AI location ID, the carrier’s location ID at the time of booking, the name and the address on the label, the type and the time added. Opening hours, cut-off hours and closing periods are looked up live from the location each time they are displayed, so they are current when the shopper collects.

### Where it appears

* **Shipment Details** and **Booking Details** show a **PUDO Location** section, directly after the tracking or booking details, whenever the shipment has at least one entry. It shows the most recent entry: location ID, PUDO type, name, address and opening hours. If the location has expired, the section shows “PUDO Location is no longer supported. Please contact us for assistance.”
* The Create Booking response echoes the confirmed location details.

### Limitations

* Return PUDO bookings (shopper drop-off for a return) are not supported through this flow.
* PUDO details are not yet included in Perform.AI delivery notification emails; retrieve them from the booking and include them in your own shopper communication.
* A `pudo_location_uuid` cannot be stored at shipment creation; pass it in the booking request.

## Set up in the portal

1. Go to **Settings** > **Carriers**, open the carrier and its **Booking** section.
2. In the Shipping Service dropdown, choose a service that carries the **PUDO Supported** tag.
3. Confirm the carrier’s booking connection is active. See [Multi-Carrier Shipping](https://developers.perform.ai/products/logistics/multi-carrier-shipping.md).
4. In your integration, add `pudo_location_uuid` to booking requests whenever the shopper selected a pick-up point. There is no further portal setting.

## Use via API and MCP

* [Retrieve PUDO locations](https://developers.perform.ai/guides/pudo-locations.md) ([`GET /v5/pudo-locations/`](https://developers.perform.ai/api-reference/v5/pudo-locations/retrieve-pudo-locations)): search pick-up and drop-off points by postal code, country, coordinates or carrier and obtain the `pudo_location_uuid`.
* [Create a Booking](https://developers.perform.ai/guides/create-booking.md) ([`POST /v5/booking/`](https://developers.perform.ai/api-reference/v5/booking/create-booking)): book the shipment with `pudo_location_uuid`.

To offer pick-up points at checkout, see [Pick-Up Point Selector](https://developers.perform.ai/products/checkout/pick-up-point-selector.md).

## FAQ

### How do I know which shipping services support PUDO delivery?

Open the carrier’s **Booking** section under **Settings** > **Carriers**; PUDO-capable services carry the **PUDO Supported** tag in the Shipping Service dropdown. If a service you need is not tagged, ask your account team.

### What happens to the shopper’s home address?

`to_address` is never modified. The label uses the PUDO address resolved from `pudo_location_uuid`, and the home address stays on the shipment for notifications, return labels and reconciliation.

### My booking returned `PUDO_LOCATION_INACTIVE`. What does it mean?

The location exists but is expired or closed, usually because the ID came from an older PUDO Locations response. Query the PUDO Locations API again for an active point and book again.

### Why is there no PUDO Location section on my shipment?

The section appears only when the shipment has at least one PUDO entry: the booking was a home delivery, the PUDO booking failed (nothing is written on failure), or no carrier event has reported a point yet.

### Why are opening hours blank?

Opening hours are fetched live from the location. If the location returns no hours, the section is hidden; if the location has expired, an error message is shown instead.

## Troubleshooting

| Symptom | Cause | Fix |
| - | - | - |
| `UNSUPPORTED_PUDO_SERVICE` | The carrier reference uses a shipping service without the PUDO Supported tag | Select a tagged shipping service on the carrier reference, or ask your account team to map the service. |
| `PUDO_LOCATION_NOT_FOUND` | The `pudo_location_uuid` is not in the PUDO master data | Check the value against a fresh PUDO Locations API response. |
| `PUDO_LOCATION_INACTIVE` | The location closed or expired since it was retrieved | Retrieve an active location and book again. |
| Carrier error on a valid location | The carrier rejected the PUDO ID, for example after a change on the carrier’s side | Retry with another nearby location; if it persists, contact your account team. |
| Two entries for the same point, Outbound Delivery and Carrier Reported | The carrier reported the point with a different ID format than the one booked | Expected; the most recent entry is shown. |

## Related

* [Multi-Carrier Shipping](https://developers.perform.ai/products/logistics/multi-carrier-shipping.md)
* [Auto Carrier Selection](https://developers.perform.ai/products/logistics/auto-carrier-selection.md)
* [Pick-Up Point Selector](https://developers.perform.ai/products/checkout/pick-up-point-selector.md)
* [Logistics overview](https://developers.perform.ai/products/logistics/overview.md)


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.