Uber Direct Shipping

Uber Direct Shipping for WooCommerce quotes a live courier price at checkout, books the courier when the order is paid, and tracks the delivery to the door. Customers can take it immediately or schedule it for a slot you offer, and orders placed while you are closed are scheduled for your next opening. This page covers every setting, the product and checkout screens, the health check, what happens after the order, and the extensibility surface for developers.

Overview

↑ Back to top

Uber Direct Shipping for WooCommerce connects your store to Uber Direct, the courier service Uber operates for merchants. It asks Uber for a live price from your store address to the customer’s, shows it at checkout as a shipping method, and once the order reaches Processing it books the courier, stores the tracking link on the order, and follows the delivery through webhook updates until it is completed.

You control who can be delivered to through your shipping zones, which products qualify, how long you need to prepare an order, and whether customers may choose a delivery date and time slot. Orders that arrive while your store is closed are still accepted, with the pickup scheduled for your next opening slot.

The plugin quotes, books, tracks, and cancels deliveries through Uber’s API. It does not replace your Uber Direct contract, and it does not bill you. Your agreement, your pricing, and your invoices stay with Uber.

Requirements

↑ Back to top
  • WordPress 6.5 or higher.
  • WooCommerce 9.0 or higher, tested up to WooCommerce 11.0. WooCommerce must be active, and the plugin declares it as a required plugin, so WordPress will not let you activate Uber Direct Shipping without it.
  • PHP 7.4 or higher.
  • An Uber Direct account with API credentials: a Customer ID, a Client ID, and a Client Secret, issued by Uber.
  • A complete store address in WooCommerce, because it is the pickup address sent to Uber.
  • A phone number field required at checkout, because Uber needs a contact number for both the pickup and the dropoff.
  • Products with a weight and dimensions, because Uber quotes on package size and weight.

There are no license keys or setup wizards. After activation nothing appears at checkout until you add the shipping method to a zone and enter your credentials, so a half-finished setup never reaches a customer.

To start configuring, go to WooCommerce > Settings > Shipping and open the Uber Shipping section.

The Uber Direct Shipping settings screen showing the API credentials, opening hours, fee and advanced sections.
Uber Direct credentials are region-specific. A Customer ID issued for one Uber region authenticates successfully in another but returns no quotes, which looks like a broken integration rather than a wrong account. Check the region before anything else if quotes come back empty.

Usage

↑ Back to top

Configuration lives in one settings screen plus a tab on each product. Deliveries then show up in four places during day-to-day work: the checkout, the order screen, the orders list, and your customers’ order emails.

  • Adding the shipping method
  • Uber Shipping settings
  • The health check
  • Product settings
  • Enabling products in bulk
  • The checkout experience
  • What happens after the order
  • Tracking and customer emails

Adding the shipping method

↑ Back to top

Go to WooCommerce > Settings > Shipping, open the zone you deliver to, and add Uber Shipping as a method. The method has one setting of its own, a Title, which is the label customers see at checkout. Everything else is configured once at store level and shared by every zone.

Uber Direct is a local courier service, so the zone should describe the area you actually deliver to. A zone covering a whole country asks Uber for quotes it cannot fulfill, and the method simply disappears for those customers with no explanation.

You can add Uber Shipping alongside your other methods in the same zone. Customers see all of them and choose.

Uber Shipping enabled as a shipping method inside a WooCommerce shipping zone, alongside flat rate and local pickup.

Uber Shipping settings

↑ Back to top

WooCommerce > Settings > Shipping > Uber Shipping holds everything else. It is a single screen divided into sections.

API credentials

Environment switches between Sandbox and Production. Sandbox makes real API calls that create test deliveries rather than dispatching a courier, which is how you should verify the whole flow before going live. Each environment keeps its own credentials, so switching back and forth never means retyping anything.

Customer ID, Client ID, and Client Secret come from your Uber Direct developer account. There are two sets of fields, one for sandbox and one for production, and only the set matching the selected environment is used.

Store Phone Number is the pickup contact number. Uber gives it to the courier, who calls it when there is a problem collecting. It is required, and the health check flags it when empty. Enter it in international format, for example +16174951000 rather than +1 617-495-1000.

A Test Connection button below the fields authenticates against Uber with whatever you have entered, so you can confirm the credentials before going any further.

The Uber connection settings with the environment selector, sandbox credentials, store phone number and test connection button.

Store opening hours

Enable Opening Hours Restriction means couriers only collect parcels during your opening hours. Customers can still order at any time. This is the important part of the setting and it is easy to misread: turning it on does not hide the shipping method outside your hours, it schedules the pickup for your next opening slot instead.

When it is on, set an opening and a closing time per day and switch off the days you are closed. Everything is evaluated live in your site timezone, with no scheduled task involved, so a change here takes effect on the next page load.

Default preparation time (minutes) is the time you need to get an order ready before a courier can collect it. It applies to every product that does not set its own, which is what makes it usable for a restaurant or a bakery with a long menu.

For an order placed while you are closed, the preparation time is added on top of your opening time. A store opening at 10:00 with a 30 minute preparation time schedules the pickup at 10:30, not at 10:00.

When an order contains several products with different preparation times, the longest one wins, because the order is not ready until its slowest item is.

Turning the opening hours restriction off means Uber may be asked to collect at any hour. Only do that if someone is genuinely there to hand the parcel over.
Store opening hours configured per day with a default preparation time, and Sunday switched off.

Additional fee

Additional Fee Type is either a percentage of the price Uber quotes or a fixed amount, and Additional Fee Amount is the value. The fee is added to Uber’s price before the customer sees it, so the checkout shows one delivery cost rather than a price plus a surcharge.

Use it to cover packaging, handling, or the margin you want on delivery. Leave the amount at zero to pass Uber’s price through unchanged.

Delivery instructions

Pickup notes are shown to the courier when collecting, for example which entrance to use or who to ask for. Dropoff notes are shown at the destination. Both are limited to 280 characters by Uber, and both apply to every delivery, so keep them general rather than order-specific.

Undeliverable action tells Uber what to do when the courier cannot complete the delivery. Return to Pickup Location sends the parcel back to you, Leave at Door leaves it, and Discard disposes of it. Return is the default and the right answer for most stores.

Checkout and product list options

Enable Delivery Date & Time Fields turns on the delivery timing controls at checkout. It is off by default, which means every order is an immediate delivery and the customer has no choice to make. Switch it on to let customers schedule.

Uber Direct Column in Products List adds a sortable column to Products showing, for each product, whether it is enabled for Uber delivery and whether its weight makes it eligible. It reads one of three ways: enabled, enabled but invalid because of a weight problem, or disabled. Sorting by it is the fastest way to find the products holding your catalogue back.

Auto-cancel deliveries cancels the Uber delivery automatically when an order is cancelled or refunded. Leave it on unless you have a reason to manage cancellations yourself in the Uber dashboard, because a delivery you forget to cancel is a delivery you pay for.

Webhooks

Webhook Signature Key is the shared secret Uber signs its callbacks with. Uber posts delivery status updates to your site as the courier progresses, and the signature is what proves a request genuinely came from Uber rather than from someone who guessed your endpoint.

Set a key here and enter the same key, along with the webhook endpoint, in your Uber Direct dashboard. Without a matching signature, updates are rejected and your orders stop reflecting the real delivery status.

Advanced

Debug Mode writes every API request and response to WooCommerce > Status > Logs under the uber-shipping source. Leave it off in production, because the volume is considerable, and switch it on while diagnosing a problem. It is the only way to see exactly what Uber returned.

The additional fee settings and the advanced section with courier notes, undeliverable action, auto-cancel and the WooCommerce specific options.

The health check

↑ Back to top

The settings screen includes a health check that inspects your configuration and reports what will stop a delivery before a customer discovers it. It covers two areas.

System checks look at your store address, your site title, which are both sent to Uber, the pickup phone number, whether your API credentials are complete for the selected environment, and which environment you are in. It also detects whether your store uses the classic checkout or the Checkout block, or both, and whether a phone number field is required there. Where it can fix the phone field for you, it offers a button to do it.

Product checks count how many products are enabled for Uber delivery, how many are ready to ship, and how many need attention. A product needs attention almost always because its weight is missing or above the Uber Direct limit.

Run it after any change to your store address, your checkout, or your credentials.

The Uber Direct health check reporting store information, API configuration, checkout settings, webhook integration and a product analysis naming the products that exceed the weight limit.

Product settings

↑ Back to top

Each product has an Uber Shipping tab in the product data panel.

Enable Pickup via Uber decides whether an Uber courier may carry this product. A cart containing even one product that is not enabled will not be quoted, so this is the switch that most often explains a missing shipping option.

Preparation Time overrides the store default for this product. It is a list rather than a free field, running from 5 minutes to 4 hours: 5, 10, 15, 20, 30 and 45 minutes, then 1, 1.5, 2, 3 and 4 hours. Set it on the items that genuinely take longer, such as a made-to-order cake.

The first entry reads No additional time needed, and it is the default. Despite the wording it does not mean zero: a product left on it simply uses the store default preparation time. Set an explicit value only where the product differs from the rest of your catalogue.

Preparation Notes are internal instructions attached to the pickup for this product.

The Uber Shipping tab on a WooCommerce product, with pickup enabled, a four hour preparation time and preparation notes.

The tab also warns you when the product has no weight, or a weight above the Uber Direct limit of 22.65 kg, because either one stops the product being quoted. Variable products get the same warning on each variation, since Uber quotes the variation, not the parent.

A weight limit exceeded warning on the Uber Shipping product tab stating the maximum allowed weight is 22.65 kg.

Enabling products in bulk

↑ Back to top

Setting products one at a time does not scale past a small catalogue. The Products list has bulk actions for Enable Uber Pickup and Disable Uber Pickup, so you can select a whole category and switch it in one action.

Products that could not be enabled are reported back to you by name rather than silently skipped, which is how you find the weight problems in a catalogue you inherited. The same setting is also available in Quick Edit.

The WooCommerce products list with the Uber Shipping column showing enabled, needs attention and disabled products.

The checkout experience

↑ Back to top

When the customer’s address falls in a zone where Uber Shipping is active, every product in the cart is enabled and has a valid weight, and a phone number is present, the extension asks Uber for a live quote and shows it as a shipping option using your title and the quoted price, plus your additional fee if you set one.

Quotes are cached for two minutes per cart, so editing an unrelated checkout field does not trigger a new API call for the same basket.

With Enable Delivery Date & Time Fields switched on, selecting Uber Shipping reveals a timing choice directly beneath it:

  • As soon as possible books the delivery straight away. The label states when the parcel will be collected, for example “collected today at 4:15 pm”, or “collected tomorrow at 10:30 am” when your store is closed, so nobody assumes a same-evening delivery that is not happening.
  • Schedule for later asks for a delivery date and a time slot. The date is required, and the order cannot be placed without one, on both the classic checkout and the Checkout block.
The WooCommerce Checkout block with Uber Shipping selected, showing the collection time in the rate label and the as soon as possible option.

Dates come from your opening hours, so days you are closed never appear. Time slots are generated from that day’s opening hours and respect your preparation time, so a store opening at 10:00 with 30 minutes of preparation offers a first slot at 10:30. Slots that have already passed disappear from today’s list, and a day with no slot left disappears from the date list entirely.

A slot that straddles the earliest possible collection is shifted rather than dropped. With a 10:00 opening and 30 minutes of preparation, a 10:00 to 13:00 slot is offered as 10:30 to 13:00, so the window stays available instead of disappearing.

The WooCommerce Checkout block showing the delivery date and delivery time selectors after choosing to schedule an Uber delivery.

The shipping rate label itself also states the collection time while your store is closed, so the information is visible even when the timing controls are switched off.

The same controls render on the classic checkout, below the selected Uber Shipping rate in the order review table.

The classic WooCommerce checkout with Uber Shipping selected and a scheduled delivery date and time slot.

What happens after the order

↑ Back to top

When the order moves to Processing, the extension books the delivery with Uber and stores the delivery identifier, the fee, the status, and the tracking URL on the order.

The pickup window sent to Uber depends on what the customer chose:

  • For an immediate delivery during opening hours, the pickup is your preparation time from now.
  • For an immediate delivery placed while you were closed, the pickup is your next opening slot plus your preparation time.
  • For a scheduled delivery, the pickup is derived from the customer’s chosen slot and the opening hours of that day, so a courier is never sent to a shop that is shut.

If Uber refuses the delivery, the reason is written to the order as an order note. This matters more than it sounds: the most common refusal is a billing problem on the Uber Direct account rather than anything in WooCommerce, and without the note the failure is invisible.

The customer’s delivery preferences appear on the order screen under the shipping address, showing whether they chose an immediate or a scheduled delivery and which date and slot they picked.

A WooCommerce order screen showing the Uber delivery preferences under the shipping address, with the timing, preferred date and preferred time.

Cancelling or refunding the order cancels the Uber delivery when Auto-cancel deliveries is on.

Tracking and customer emails

↑ Back to top

Uber posts status updates to your webhook as the delivery progresses, through picked up to completed. Each update is stored on the order, and a Delivery Status panel is shown to the customer on the order details page under the order table, with the current status and a link to track the courier.

The WooCommerce order confirmation page showing a delivery status panel with the current status and a track your delivery link.

The extension also registers a WooCommerce email, Uber Delivery Status Update, sent to the customer when the delivery status changes. Configure it like any other WooCommerce email at WooCommerce > Settings > Emails, where you can enable or disable it, change the recipient, and edit the subject and heading. The subject supports the {order_number} and {status} placeholders and defaults to “Your order #{order_number} delivery status: {status}”.

The Uber delivery status update email settings with the subject, heading and a preview of the message the customer receives.

Use cases

↑ Back to top

A restaurant taking evening orders for the next morning. Enable the opening hours restriction and enter your real hours, for example 10:00 to 22:00. Set the default preparation time to 30 minutes and switch on the delivery date and time fields. A customer ordering at 23:00 still sees Uber Shipping, labeled with the collection time, and their order is scheduled for pickup at 10:30 the next morning rather than being turned away.

A florist with a delivery cut-off. Leave the delivery date and time fields off so every order is immediate, and set the opening hours to end at your cut-off time rather than when you lock the door. Orders after the cut-off are automatically scheduled for the next opening slot, so you never promise a delivery you cannot make and never have to explain it.

A bakery where some items need four hours. Set the store default preparation time to 15 minutes for everyday items, then open the Uber Shipping tab on your celebration cakes and set their preparation time to 240 minutes. An order containing a cake uses the longest preparation time in the basket, so the courier is not dispatched before the cake is out of the oven.

A store recovering its delivery costs. Set the additional fee type to Fixed and the amount to your packaging cost. Customers see one delivery price that already includes it. Use Percentage instead if your packaging cost scales with the size of the order.

A shop with a mixed catalogue. Enable Uber pickup only on the products that can realistically be carried by a courier, and use the Uber Direct column in the Products list, sorted, to find everything still missing a weight. Uber Shipping then appears only on carts it can actually serve, instead of failing at the quote stage.

A store trialling the integration. Leave the environment on Sandbox and fill in only the sandbox credentials. Place orders end to end, watch the deliveries appear in your Uber Direct sandbox dashboard, check the order notes and the tracking link, then enter the production credentials and switch the environment when you are satisfied.

Working with other W7S extensions

↑ Back to top

Uber Direct Shipping covers the journey from your counter to the customer’s door. These combinations from the W7S catalogue cover what happens around it.

Stop a delivery failing on a mistyped number. Pair it with Phone Number Validation. Uber requires a contact number for the dropoff and calls it when the courier cannot find the address, so a number with a missing digit turns into a failed delivery you still pay for. Validating the number at checkout removes an entire class of delivery failure before it reaches Uber.

Get the address right the first time. City Checkout Field replaces the free-text city field with a controlled list. A courier delivering locally is far less forgiving of a misspelled or ambiguous city than a postal carrier, and an address Uber cannot geocode simply returns no quote.

Track the parcels Uber does not carry. Order Shipment Tracking records carriers and tracking numbers for your postal shipments. Run both and every order carries a tracking link, whether it went out by courier or by post, so customers get one consistent experience.

Serve the customers who would rather collect. Cash Payment on Pickup for WooCommerce adds a pay-in-store gateway that can be restricted to your local pickup methods, so it never appears on an order going out by courier. A store offering local delivery usually offers collection too, and this covers the second half without the two getting in each other’s way.

Close the shop properly, not just the courier. Store Vacation Mode switches off purchasing entirely while keeping your pages online and indexable. Opening hours here handle the daily rhythm; vacation mode handles the fortnight you are away, when you do not want orders queueing up for a pickup slot that will never come.

Price cover against courier risk. Shipping Insurance Manager offers optional insurance at checkout, and a package can be restricted by shipping zone. Courier handoffs carry different risk from a standard parcel, so create a package restricted to your local delivery zone and price it separately from your national cover.

Ask about your deliveries instead of opening the orders list. MCP (Model Context Protocol) connects assistants such as Claude and ChatGPT to your store, and exposes the tools of the W7S extensions you have installed. Because it works across products, you can ask questions that cross them, such as which of today’s local deliveries are still not marked as picked up.

FAQ

↑ Back to top

Does this replace my Uber Direct account?

No. You need an Uber Direct account with API credentials, and Uber bills you for the deliveries. The plugin quotes, books, tracks, and cancels through Uber’s API on your behalf. Your contract, your rates, and your invoices are between you and Uber.

Why is Uber Shipping not showing at checkout?

Work through these in order. The method has to be added to the shipping zone matching the customer’s address. Your API credentials have to be complete for the environment you selected. Every product in the cart has to be enabled for Uber pickup and carry a valid weight. A phone number field has to be required at checkout. And if the opening hours restriction is on, there has to be a future opening slot to schedule into. The health check on the settings screen reports on most of these directly.

Can customers order while my store is closed?

Yes, and this is the default behavior when the opening hours restriction is on. The method stays available and the pickup is scheduled for your next opening slot plus your preparation time. Both the shipping rate label and the timing option state when the parcel will be collected. Developers can restore the older behavior, where the method is hidden entirely, with the uber_shipping_offer_outside_opening_hours filter.

Where do I set the preparation time, and which one wins?

There are two levels. The store default sits in the settings under the opening hours and applies to every product without its own value. A per-product preparation time in the Uber Shipping tab of the product overrides it. When an order contains several products, the longest preparation time in the basket wins.

A delivery failed with “auth hold could not be placed”. What does that mean?

Uber places a temporary authorization on the payment method attached to your Uber Direct account before dispatching a courier. That authorization was declined, so Uber refused the delivery outright. It is a billing matter on your Uber Direct account, not a WooCommerce problem, and it explains an order that was paid normally by your customer but never appeared in your Uber dashboard. Check that the payment method on file is valid and that your account is fully onboarded, then contact Uber support with the error and the timestamp from the order note.

Why do I have to fill in weights and dimensions?

Uber quotes on package size and weight, so a product missing either cannot be quoted, and it takes the whole cart down with it. The limit is 22.65 kg per delivery. The health check counts how many of your products still need attention, and the Uber Direct column in the Products list shows you which ones.

What happens if I cancel or refund an order?

With Auto-cancel deliveries on, the Uber delivery is cancelled automatically so you are not billed for a courier you no longer need. With it off, cancel it yourself in your Uber Direct dashboard.

Does it work with the Checkout block?

Yes. The delivery timing controls render on both the classic checkout and the Checkout block, and both use the same calculation, so a delivery costs the same either way. The plugin declares compatibility with the Cart and Checkout blocks and with High Performance Order Storage.

Can I offer delivery slots that do not match my opening hours?

Not from the settings, because slots are generated from your opening hours so that a courier is never sent to a closed shop. Developers can replace the generated slots with the uber_shipping_delivery_time_slots_for_date filter.

Can I dispatch from an address other than my store address?

Not from the settings. The pickup address is your WooCommerce store address. Developers can change it with the uber_shipping_pickup_address and uber_shipping_pickup_name filters, which is the route for a store whose warehouse differs from its registered address.

Is my customers’ data sent to Uber?

The delivery address, the contact phone number, and a manifest of the order contents are sent to Uber, because a courier cannot deliver without them. Your store address, store name, and pickup phone number are sent as the pickup details. The plugin ships privacy policy content that integrates with the WordPress privacy tools, so the disclosure is already written for you.

Should I test in sandbox first?

Yes. Sandbox makes real API calls that create test deliveries without dispatching a courier or charging you, which lets you verify credentials, quoting, order notes, webhooks, and the tracking link before a real customer relies on it. Switching to production is one setting, and your sandbox credentials are kept.

What happens when I deactivate or uninstall the plugin?

Deactivating removes the plugin’s scheduled event and stops all of its behavior. Uninstalling does not delete your settings, your credentials, or the delivery data stored on existing orders, so reinstalling picks up where you left off. Orders keep their delivery identifiers, statuses, and tracking links either way.

Where do I get help?

Open a ticket from your WooCommerce.com account, from the Uber Direct Shipping product page. If the problem involves a delivery Uber refused, switch on Debug Mode, reproduce it, and include the log entry from WooCommerce > Status > Logs.

Developer documentation

↑ Back to top

All identifiers below are stable as of version 1.5.3.

Options

↑ Back to top
OptionValues
uber_shipping_environmentsandbox or production
uber_shipping_customer_id, uber_shipping_client_id, uber_shipping_client_secretProduction credentials
uber_shipping_customer_id_sandbox, uber_shipping_client_id_sandbox, uber_shipping_client_secret_sandboxSandbox credentials
uber_shipping_pickup_phonePickup contact number, required
uber_shipping_default_phoneFallback dropoff number when the order has none
uber_shipping_opening_hours_enabledyes or no
uber_shipping_opening_hoursArray keyed by lowercase English day name (monday … sunday), each an array of open, close (both HH:MM), and enabled
uber_shipping_preparation_timeStore default, in minutes
uber_shipping_fee_typepercentage or fixed
uber_shipping_fee_amountAdditional fee value
uber_shipping_pickup_notes, uber_shipping_dropoff_notesCourier instructions, 280 characters each
uber_shipping_undeliverable_actionreturn, leave_at_door, or discard
uber_shipping_delivery_fields_enabledyes or no
uber_shipping_uber_direct_columnyes or no
uber_shipping_auto_cancel_deliveryyes or no
uber_shipping_webhook_signatureWebhook signing secret
uber_shipping_debug_modeyes or no

Opening hours are keyed by lowercase English day names regardless of site language. Reading them with a translated or capitalized day name silently matches nothing.

Product meta

↑ Back to top
Meta keyPurpose
_uber_pickup_enabledWhether an Uber courier may carry this product
_uber_preparation_timePer-product preparation time in minutes, overriding the store default
_uber_preparation_notesInternal preparation instructions

For a variation, the preparation time is read from the parent product.

Order data

↑ Back to top

Delivery data is written through the WooCommerce CRUD layer, so it works under both post storage and High Performance Order Storage.

Meta keyPurpose
_uber_delivery_idUber’s delivery identifier
_uber_delivery_statusLatest status received from Uber
_uber_delivery_tracking_urlCustomer-facing tracking link
_uber_delivery_fee, _uber_delivery_currencyWhat Uber charged
_uber_delivery_etaEstimated arrival
_uber_delivery_timingasap or scheduled
_uber_delivery_date, _uber_delivery_timeCustomer’s chosen date (Y-m-d) and slot (HH:MM-HH:MM)
_uber_delivery_datetimeCombined local datetime, kept for backward compatibility
_uber_preparation_timePreparation time resolved for this order
_uber_pickup_ready_timePickup window start actually sent to Uber, in UTC
_uber_delivery_picked_up, _uber_delivery_completedTimestamps recorded when the matching webhook arrives
_uber_delivery_cancelled_atWhen the delivery was cancelled
_uber_delivery_manifest, _uber_delivery_manifest_itemsThe manifest sent to Uber, kept for support
$order = wc_get_order( $order_id );

$delivery_id = $order->get_meta( '_uber_delivery_id' );
$status      = $order->get_meta( '_uber_delivery_status' );
$tracking    = $order->get_meta( '_uber_delivery_tracking_url' );

if ( 'scheduled' === $order->get_meta( '_uber_delivery_timing' ) ) {
    $date = $order->get_meta( '_uber_delivery_date' );
    $slot = $order->get_meta( '_uber_delivery_time' );
}

Scheduling

↑ Back to top

Uber_Shipping_Utils owns every time calculation, so the checkout, the rate label, and the API layer cannot drift apart. Static methods:

  • is_store_open() reports whether the store is open right now, honoring overnight hours.
  • get_earliest_pickup_for_date( $date, $preparation_time = 0 ) returns the earliest timestamp a courier can collect on a given day, being that day’s opening time plus the preparation time and never before now plus the preparation time, or false when nothing can be collected that day. This is the reference for anything tied to a specific date.
  • get_next_available_pickup_time( $preparation_time = 0 ) loops over the next 14 days and returns the first available pickup, or false.
  • calculate_preparation_time( $package ) returns the longest preparation time in a cart package, falling back to the store default.
  • get_product_preparation_time( $product_id ) returns a product’s own value, or the store default.
  • format_pickup_time_for_display( $timestamp ) renders “today at 4:15 pm”, “tomorrow at 10:30 am”, or a dated form.

A pickup is never scheduled less than 20 minutes from now, because Uber rejects a window that is effectively immediate.

Package sizing

↑ Back to top

Package size is derived from the volume of the cart contents and sent to Uber as small, medium, large, or xlarge. The defaults are 8000 cm³ for medium, 27000 cm³ for large, and anything above that is extra large. The maximum weight per delivery is 22.65 kg, exposed as UBER_SHIPPING_MAX_WEIGHT_KG.

Filters

↑ Back to top

uber_shipping_offer_outside_opening_hours

Arguments: $offer (bool), $package (array). Return false to hide Uber Shipping entirely while the store is closed, which was the behavior before version 1.5.0.

add_filter( 'uber_shipping_offer_outside_opening_hours', '__return_false' );

uber_shipping_closed_rate_label

Arguments: $label (string), $next_pickup (timestamp), $title (string). Rewrites the shipping rate label shown while the store is closed.

add_filter(
    'uber_shipping_closed_rate_label',
    function ( $label, $next_pickup, $title ) {
        return sprintf(
            '%s (next delivery %s)',
            $title,
            wp_date( 'D j M', $next_pickup )
        );
    },
    10,
    3
);

uber_shipping_delivery_dates

Arguments: $dates (array keyed by Y-m-d, values are display labels). Adds or removes dates from the scheduled delivery picker. The example blocks a public holiday.

add_filter(
    'uber_shipping_delivery_dates',
    function ( $dates ) {
        unset( $dates['2026-12-25'] );
        return $dates;
    }
);

uber_shipping_delivery_time_slots_for_date

Arguments: $slots (array keyed by HH:MM-HH:MM), $open_time, $close_time. Replaces the slots generated from a day’s opening hours, for a store whose delivery windows do not follow the hours it is open.

uber_shipping_delivery_time_slots

Arguments: $slots. The default slot set used when the opening hours restriction is off.

uber_shipping_preparation_time_options

Arguments: $options (array keyed by minutes, values are display labels; the empty key means “use the store default”). Replaces the choices in the per-product Preparation Time list, which runs from 5 minutes to 4 hours by default.

add_filter(
    'uber_shipping_preparation_time_options',
    function ( $options ) {
        $options['360'] = __( '6 hours', 'your-textdomain' );
        $options['480'] = __( '8 hours', 'your-textdomain' );

        return $options;
    }
);

uber_shipping_pickup_address

Arguments: $address (array with street_address, city, state, zip_code, country). Changes the pickup location sent to Uber, for a store dispatching from somewhere other than its WooCommerce store address.

add_filter(
    'uber_shipping_pickup_address',
    function ( $address ) {
        $address['street_address'] = array( '12 Warehouse Road' );
        $address['city']           = 'Manchester';
        $address['zip_code']       = 'M1 2AB';

        return $address;
    }
);

uber_shipping_pickup_name

Arguments: $name. Changes the pickup contact name, which defaults to your site title.

uber_shipping_external_store_id

Arguments: $store_id. Returns a store identifier to send with the delivery, for merchants running several Uber Direct locations under one account. Empty by default, in which case the pickup address alone determines the location.

uber_shipping_size_thresholds

Arguments: $thresholds (array of size and max_volume pairs, in cm³, ordered smallest first). Adjusts the volume bands used to describe the package to Uber.

add_filter(
    'uber_shipping_size_thresholds',
    function ( $thresholds ) {
        return array(
            array( 'size' => 'small',  'max_volume' => 4000 ),
            array( 'size' => 'medium', 'max_volume' => 12000 ),
            array( 'size' => 'large',  'max_volume' => 30000 ),
        );
    }
);

uber_shipping_rate_limiter

Arguments: $limiter. Supplies a rate limiter object applied to Uber API calls. Null by default.

Actions

↑ Back to top
ActionFires whenArguments
uber_shipping_delivery_status_changedA webhook reports a new delivery status$order, $status, $payload
uber_shipping_delivery_picked_upThe courier collects the order$order, $payload
uber_shipping_delivery_completedThe delivery is completed$order, $payload
uber_shipping_delivery_cancelledA delivery is cancelled$order
add_action(
    'uber_shipping_delivery_completed',
    function ( $order ) {
        $order->update_status( 'completed', __( 'Delivered by Uber courier.', 'your-textdomain' ) );
    }
);

REST routes

↑ Back to top

Namespace uber-shipping/v1.

RoutePurpose
/settingsRead and write the extension settings
/health-checkThe system and product checks shown on the settings screen
/test-connectionAuthenticate against Uber with the current credentials
/test-webhookVerify the webhook endpoint responds
/tracking/(?P<id>\d+)Delivery tracking data for an order
/delivery/createCreate a delivery for an order
/update-phone-fieldMake the checkout phone field required, on either checkout type

Administrative routes require the manage_woocommerce capability. The webhook endpoint is separate and authenticates by signature rather than by capability, using the key set in Webhook Signature Key.

Caching

↑ Back to top

Quotes are cached in a transient for two minutes, keyed by the package contents and the environment, so repeated checkout recalculations for an unchanged basket do not hit the API. The access token is cached for the life of the token and refreshed automatically. Changing the environment or the credentials clears the cached quotes.

Logging

↑ Back to top

Logging is off unless uber_shipping_debug_mode is set to yes. When on, Uber_Shipping_Debug::log_debug( $message, $level, $context ) writes through wc_get_logger() under the source uber-shipping, and every API request and response is recorded. Find the output at WooCommerce > Status > Logs.

update_option( 'uber_shipping_debug_mode', 'yes' );

The customer email

↑ Back to top

The email is registered with WooCommerce under the id uber_shipping_status, as the class Uber_Shipping_Status_Email, so it can be retrieved with WC()->mailer()->emails['uber_shipping_status'].

Its template is uber-shipping/templates/emails/uber-shipping-status.php. Override it by copying that file to your-theme/woocommerce/emails/uber-shipping-status.php. The email settings screen has a Copy file to theme button that does it for you.

The template receives $order, $status_label, $email_heading and $email, and reads the tracking link from the _uber_delivery_tracking_url order meta.

Compatibility

↑ Back to top

The plugin declares compatibility with High Performance Order Storage (HPOS) and with the Cart and Checkout blocks through before_woocommerce_init. It works with the classic cart and checkout, the block cart and checkout, and the Store API.

Deactivation clears the plugin’s scheduled event. Uninstall is a no-op, so settings, credentials, and the delivery data on existing orders all survive a remove and reinstall cycle.

Related Products

Offer add-ons like gift wrapping, special messages or other special options for your products.

WooCommerce Subscriptions is a WooCommerce extension that lets customers subscribe to your products or services and pay on a weekly,...

Use of your personal data
We and our partners process your personal data (such as browsing data, IP Addresses, cookie information, and other unique identifiers) based on your consent and/or our legitimate interest to optimize our website, marketing activities, and your user experience.