Overview ↑ Back to top
WooCommerce Local Pickup Plus extends WooCommerce shipping to allow you to define multiple local pickup locations for your products, restrict locations to certain products, configure costs or discounts for local pickup, and allows your customers to select a pickup date during checkout (if appointments are enabled).
You can also enable geocoding to geocode your pickup locations and show them to customers sorted by distance from their billing address at checkout, helping to make choosing a pickup location easier.
Requirements ↑ Back to top
- WooCommerce 2.6.14+
- PHP 5.3+ (you can view this under WooCommerce > Status)
- If you disallow pickup for some items, be sure you have at least one fallback shipping method for these items
Installation ↑ Back to top
- Download the extension from your WooCommerce dashboard
- Go to Plugins > Add New > Upload and select the ZIP file you just downloaded
- Click Install Now, and then Activate
- Go to WooCommerce > Settings > Shipping > Local Pickup Plus and read the next section to learn how to setup and configure the plugin.
Setup and Configuration ↑ Back to top
To configure the plugin, go to WooCommerce > Settings > Shipping. You should see “Local Pickup Plus” as an option at the top of the screen. Click Local Pickup Plus to see the settings:
Plugin Settings ↑ Back to top
- Enable – Enable or disable the shipping method.
- Title – Controls the shipping method title the customer sees during checkout.
- Google Maps Geocoding API Key – (Optional) used if you want to enable geocoding locations and sorting by location. See instructions below to get an API key if you’d like to enable this.
- Enable logging – (Shown if geocoding is used) Enables logging Google geocoding API requests for troubleshooting. For best performance, please leave this disabled unless you encounter issues with geocoding.
- Choosing Locations – Determine whether customers can choose a pickup location for each item in the cart, or only choose one pickup location per order.
- Cart Item Handling – Determine whether items should be automatically grouped into as few packages as possible, or if customers can choose pickup vs shipping for each item in the cart.
- Default Handling – Shown if one pickup location is allowed per order. Determines whether items should be shipped by default using an available shipping method, or should be set to pickup by default.
- Location Sort Order – Choose how pickup locations are sorted when customers select them for items:
- Default — Sort locations in WordPress menu order (how they’re listed in the admin)
- Distance from customer — (If geocoding enabled) Sort locations by distance from customer geolocation
- Alphabetically by location name — Sorts based on location name — just like it sounds 🙂
- Most recently added location — Also as expected; shows newer locations first
Pickup appointments are entirely optional; if enabled, a date selector will be shown to the customer at checkout. This allows the customer to choose the pickup date for the order. Only business days are allowed for pickup at a location.
- Pickup Appointments Mode – Determines if pickup appointments are hidden, allowed, or required to choose local pickup as a shipping method. If allowed or required, additional settings are shown.
- Default Business Hours – Determines the default business hours for pickup locations, which can be overridden on a per-location basis. Multiple time slots can be added per day.
- Common Public Holidays – Set the dates during the year that will be default holidays for each location (can be overridden on a per-location basis). For holidays that shift dates, these can be re-set each year.
- Default Lead Time – Set the default time time required before allowing a pickup. This affects which dates are shown as available for a pickup appointment, i.e., lead times of “2 days” will prevent pickup within the next 2 days.
- Default Deadline – Set the default deadline for a pickup appointment. This affects dates shown for pickup, as a date after the deadline cannot be selected. For example, if the default deadline is 1 month, an order on September 1 cannot be picked up after October 1.
Price & Tax
Determine if pickup should charge a fee or assess a discount by default, along with how taxes are handled for pickup orders.
- Default Price Adjustment – If pickup should either charge additional fees or provide a discount by default, choose whether the cost or discount should be assessed, enter the amount, and whether this is a set amount or percentage fee / discount. Pickup locations can override their own price adjustments, so if no default price change should occur, set this to
- Pickup Location Tax – Determine whether the customer address or the pickup location address should be used as the taxable address for the order, which can affect tax calculation.
Pickup Locations ↑ Back to top
Pickup Locations can be configured under WooCommerce > Settings > Shipping > Pickup Locations. From here, locations can be added one-by-one, deleted, exported to CSV, or imported from a CSV. See more on importing and exporting locations.
A new location can be added by clicking “Add New Location” and configuring location details. Every location must have a title, which is shown in the location selector on the cart page and checkout.
A pickup location must have an address configured, and can also have notes entered, which will be shown at checkout. This is helpful if there are specific pickup instructions, such as “Please pickup packages at the warehouse garage door”.
By default, any product can be picked up at a pickup location, so product availability will be set to “All Products”. However, if a location only carries certain stock or products, you can can choose “Some products” and set which products and / or categories are available here.
If only some products are available at a location, this means that the location may not be available as a choice for every product in a cart.
Costs & Discounts
If the location should use the default price adjustment, you can leave this setting disabled. If the location should override the default price adjustment, you can set a cost or discount for the location here, or set the cost to
0 to avoid charging a fee or adding a discount.
By default, locations will use the global settings for business hours, holidays, lead time, and deadline if appointments are enabled. By enabling an override here, you can set a custom schedule for this location.
If employees or others should be notified when an order contains an item at this pickup location, enter a comma-separated list of email addresses here. This will add the list of recipients to the WooCommerce order emails. In order to notify these recipients, please be sure these emails are enabled under WooCommerce > Settings > Emails.
Product Pickup Settings ↑ Back to top
While locations can restrict the stock they have available to certain products or categories, products can also restrict their pickup availability. This is useful if some products must be picked up, or cannot be picked up.
When editing a product, you can define this under the “Shipping” settings.
You can also define this on a per-category basis to expedite pickup availability set up. A product-level setting will always override a more general category setting.
Managing Orders ↑ Back to top
A new column will be added to the orders list to show the pickup location(s) selected in the order. You can also filter orders by the included pickup location, which can be helpful if exporting orders.
Manually Creating a Pickup Order ↑ Back to top
Local Pickup can be manually added to an order by adding a new shipping rate item.
As pickup must be set for the items in an order, when adding a new order or manually adding a pickup method, you must save the order to be able to set location details. Once you’ve added the shipping line item, along with products, create or update the order.
You’ll then see the location fields pulled in for the shipping line item. Click “Edit” to modify the location pickup data.
You can then select the items being picked up at the given location, along with setting a pickup date if appointments are accepted.
Note that there is a known issue with manually updating orders: if the order items table is refreshed via ajax (only the table refreshes, not the entire page), you’ll notice that the location details are hidden. This is normal and due to the way WooCommerce styles this table. If you refresh the page or update the order, you’ll see that the location data is still present.
Customer Experience ↑ Back to top
The customer experience in the cart and checkout depends on your “Choosing Locations” and potentially “Cart Item Handling” settings, as these determine whether customers can choose pickup location selection per item, or only one location per order.
Choosing Locations ↑ Back to top
If you allow customers to choose a pickup location per cart item, customers will always be shown pickup selectors inline with cart items. If you opt to only allow one pickup location per order, customers can see two flows: either choosing pickup for all eligible cart items (if you automatically group packages), or they will see a toggle to choose whether to ship or pickup each item (if you allow shipping selection on a per-item basis). Here are examples of these 3 flows.
Per-Item Location Selection
Per-item location selection is useful if you have some items that are available at some locations, but not all locations. Using this pickup selection method allows for product availability settings.
When choosing pickup, customers must choose a location per item. This is due to both the product’s pickup availability settings along with the location’s available stock settings influencing where an item can be picked up.
On the cart and checkout pages,
- if an item requires shipping, it will not have pickup locations shown.
- if an item requires pickup, it will force the customer to choose a location.
- if the item can be picked up, it will allow customers to choose pickup or shipping and a location.
Checkout will use a similar UI. In either case, if multiple items will be picked up at the same location, these items will be combined into one shipping package (which ensures fees are only charged ones or discounts only applied once).
If items are available at different locations, or the customer opts to choose different locations, these will be split into multiple pickup packages at checkout.
One Location Per Order + Automatic Grouping
This occurs when Choosing Locations is set to “one location per order” and Cart Item Handling is set to “Automatically group cart items into as few packages as possible”. Customers can move all eligible items between pickup or shipping packages.
All items that are eligible for pickup are placed in the pickup package by default.
Customers can opt to ship items instead, and all items that are eligible for shipping will be moved to a shipping package.
One Location Per Order + Per-Item Toggles
This occurs when Choosing Locations is set to “one location per order” and Cart Item Handling is set to “Allow customers to toggle pickup or shipping for each item”. Even though customers will be able to choose what is shipped vs picked up, all pickup items will be combined into one pickup package. The customer must then choose the location for the pickup package to complete checkout (which can be selected on the cart or checkout pages).
On the cart and checkout pages,
- if an item requires shipping, it will not have a toggle to allow pickup. A note will be shown that it must be shipped.
- if an item requires pickup, it will be forced into a pickup package at checkout, prompting the customer to choose the location for the order..
- if the item can be picked up, it will allow customers to choose pickup or shipping for the item.
Pickup Appointments ↑ Back to top
If pickup appointments are allowed or required, a date-picker will be shown at checkout. This allows the customer to choose the pickup date after your lead time, but before your deadline for that location.
Once a date has been chosen, the business hours for the location on that day will be shown as well.
All pickup details, including location details, appointments, and items to be picked up, will be shown to the customer in order emails, and as well as the account section when viewing an order.
Plugin Compatibility ↑ Back to top
Local Pickup Plus has built-in compatibility for several plugins. While this is not an exhaustive list, here are a few plugins Local Pickup Plus works well with out-of-the-box.
Customer / Order CSV Export ↑ Back to top
Local Pickup Plus works with WooCommerce Customer / Order CSV Export to improve the exported order CSVs, and provide an export filter.
When manually exporting orders, the export can be filtered to only include orders that contain pickups at specific locations.
The exported order CSV will also add dedicated data to the
Customer / Order XML Export ↑ Back to top
Local Pickup Plus works with WooCommerce Customer / Order XML Export to improve the exported order CSVs, and provide an export filter.
When manually exporting orders, the export can be filtered to only include orders that contain pickups at specific locations.
The exported order CSV will add additional data to the
ShippingItems XML tag as well when pickup is chosen for the order:
Print Invoices / Packing Lists ↑ Back to top
When WooCommerce Print Invoices / Packing Lists is used to generate order invoices, Local Pickup Plus will automatically add pickup location information to invoices when relevant.
Geocoding Setup ↑ Back to top
If you’d like to enable geocoding and sorting by distance, you must get a (free) geocoding API key from the Google Developer console. This is not a required set up step to use the plugin; this is only needed to enable extra features that leverage geocoding and geolocation.
This API key will be entered in the plugin settings to enable geocoding, which will also enable sorting locations by distance from the customer.
Get an API key ↑ Back to top
You must follow the following steps while logged into your Google Account.
- Navigate to the Google developers console. Click Projects > “Create Project”:
- Enter your project’s name (such as “Local Pickup Plus Geocoding”) and click “Create”. Wait a moment for Google to create your project, as it may take a bit of time for the page to refresh.
- Under Library > Google Maps APIs, click “Google Maps Geolocation API”:
- Click “Enable” at the top of the screen to turn this API on for your account.
- Now click “Credentials”, then “Create Credentials”, and choose to create an API key.
- Copy your new API key and save it in the plugin settings, then click “Close”. You should not click “Restrict Key” — your API key will never be exposed to users browsing your site, and since our plugin will be making server-side requests, it cannot be limited by URL, or Google may reject your geocoding requests.
Geocoding Locations ↑ Back to top
Once geocoding is enabled, you’ll see a new column for geocoding status in your pickup locations list. Locations will automatically be geocoded if possible when saved, and you can geocode locations in bulk via bulk action.
Individual locations will show geocoding status and link to view the location in Google Maps. If, for any reason, a single location can’t be automatically geocoded, you can also enter coordinates manually.
Location Import & Export ↑ Back to top
To manage locations in bulk, you can use the built-in CSV import and export functionality. This will allow you to export, update, and merge changes to location data. Note that exports and imports may require you to break up your CSV files if managing hundreds of locations.
Export Locations ↑ Back to top
Locations can be exported by clicking the “Export Pickup Locations” button from the location list, or by using the bulk action to export:
If using the dedicated export screen, you can configure a few options:
- Separate fields by – Set the delimiter for the CSV file. If you’re not sure what this should be, leave it as a comma.
- Limit Records – Set the maximum number of locations to include in the export file. Use this if you have a large list of locations to avoid timeouts while exporting.
- Offset Records – Set the number of records to skip when generating a file. This is useful to create batches of exports; for example, export 1 = limit: 250, offset: 0; export 2 = limit 250, offset 250. This would give you a group of the first 500 locations, broken into 2 files.
Exports will use the format required for imports, and you can see an example here.
Import Locations ↑ Back to top
To see how location import CSVs are formatted, it’s best to manually add a location, then perform an export so you can see the columns included in the CSV file (you can also see an example here).
When importing, there are a few settings you can configure for your import file. Choose a file to import, then set the following:
- Import options:
- Update existing records if a matching pickup location is found – If an existing pickup location has an ID that matches the row in the CSV file, the CSV data will be used to update the location. If disabled, rows that match an existing location are skipped.
- Create new pickup locations if a matching pickup location is not found – If a location is not matched by ID in the import row, enable this to create a new location. Disable this to skip the non-matching row.
- Fields are separated by – Choose the delimiter for your CSV file. If you’re not sure of the delimiter, choose “comma”.
When importing your file, you must also ensure that the CSV format matches the data expected by the plugin. Note that some values may not be possible to build by hand, so using a sample location, then exporting it, is useful to manually build an import file.
||if merging / updating||the post ID of the location||integer|
||no||the location status: “publish” or “draft”||string|
||yes||the two-letter country code||string (2 characters)|
||yes||the location postcode||numeric|
||no||the two-letter state code||string (2 characters)|
||yes||the location’s city||string|
||yes||the location street address||string|
||no||additional address line||string|
||no||the location’s phone number||numeric|
||no||if using geocoding, the location’s latitude coordinate||numeric|
||no||if using geocoding, the location’s longitude coordinate||numeric|
||no||to limit the available products, use a comma-separated list of product IDs||integer list|
||no||to limit the available products, use a comma-separated list of product category IDs||integer list|
||no||the price adjustment value; positive for cost, negative for discount. use an amount for “amount” and a percentage sign to indicate a percent cost / discount||numeric (accepts
||no||JSON-encoded list of time-ranges for opening hours (in seconds); use index 0 – 7 for days of the week||JSON|
||no||comma-separated list of holidays in mm-dd format||numerical list|
||no||lead time for pickup, ie “1 week” or “5 hours”||string|
||no||lead time for pickup, ie “1 week” or “5 hours”||string|
||no||comma-separated list of email addresses for pickup notifications||list|
Upgrading to v2 ↑ Back to top
When upgrading to Local Pickup Plus version 2.0 from a previous version, all pickup locations will be updated to use the new pickup location format. While this should be fairly error-proof, you should double-check that locations use the correct country and state.
However, previous order data cannot be converted, as not enough information was stored on the order to use the new location format. While orders will still retain the legacy data, they can’t be upgraded for full support for pickup locations and therefore filtering will only work with new orders.
As category and product pickup availability are now more flexible, along with product availability at locations, you may want to adjust your set up to leverage these new settings.
Troubleshooting ↑ Back to top
Updating Orders ↑ Back to top
Note that there is a known issue with manually updating orders: if the order items table is refreshed via ajax (only the table refreshes, not the entire page, such as when recalculating order totals), you’ll notice that the location details are hidden. This is normal and due to the way WooCommerce styles this table. If you refresh the page or update the order, you’ll see that the location data is still present.
Shipping Methods Missing ↑ Back to top
This is commonly a problem when plugins are incompatible with WooCommerce 2.6+ shipping zones. Local Pickup Plus requires WooCommerce 2.6+ because it leverages zones to see if there are other shipping methods available, and forces pickup if there are no shippable methods on the site.
For plugins that do not leverage the core WooCommerce zones (primarily those from XAdapter), this means that Local Pickup Plus is unaware of them. In order to work with Local Pickup Plus, they’ll need to use standardized ways of adding shipping methods to WooCommerce, so at this time plugins that don’t use core zones are not compatible with this plugin.
Other Troubleshooting ↑ Back to top
Having a different kind of trouble? Please follow these steps to make sure everything is setup correctly before posting a support request:
- Looking for shipping zones support? Please read this FAQ entry.
- Looking to remove billing fields? Please read this FAQ entry.
- Have you disabled the core WooCommerce Local Pickup method for your store?
- If you use geocoding and see issues with geocoding or location sorting, please check that your API credentials are correct.
- Then please double-check that your credentials are correct 😉
- Issue still with geocoding? Please enable debug mode to log geocoding requests.
- Submit a support ticket so we can troubleshoot further.
Frequently Asked Questions ↑ Back to top
Q: Will this plugin support Shipping Zones in the future?
A: Local Pickup Plus will not support shipping zones, as a shipping zone and a pickup location are fundamentally different and at odds with one another 🙂
A shipping zone is great for telling you where the customer is — which is super-useful if the package is going to the customer so you know how to ship it, how much it will cost, how long it will take, etc. However, the concept of pickup is exactly opposite: the customer is coming to the package.
As such, a zone is more harmful than helpful; we don’t need to know where the customer is, we need the customer to tell us where they’re going. As such, Local Pickup Plus will include several helpful sorting options to show the most relevant locations first, but it will not restrict pickup locations to the zone the customer has been matched to. Here are a couple scenarios where zones would “break” things for the customer, but Local Pickup Plus works just fine:
- A customer with a New York billing address is going on vacation. They want to order boogie boards from a surf shop in South Carolina to pick up on the way to vacation. If the customer is matched to a zone (outside SC) that doesn’t have a pickup location assigned, they won’t be able to select pickup for the order. However, since Local Pickup Plus doesn’t listen to zones, pickup will still be available, and will simply show them the closest location (or first alphabetical location, etc., depending on your sorting).
- A customer recently moved to Portland, OR, but has not updated billing information yet, which is still in Pennsylvania. The merchant has pickup locations across the US, so the customer wants to pick up in Portland. However, with a billing address in PA (and no shipping address entered due to pickup), the customer only sees pickup locations in the Eastern US zone instead of those relevant to Portland. Local Pickup Plus avoids this by showing all locations to anyone.
- A customer in Houston, TX wants to order a gift for a friend in Atlanta, GA, and have the friend’s husband pick up the gift. If the customer orders with a Houston address and is matched to a midwest US zone, they can’t select an Atlanta pickup and leave an order note as to who will get the package. Local Pickup Plus also avoids this issue by showing all locations.
Q: Can I remove my billing fields when pickup is selected?
A: This is not something our plugin will do by default. Local Pickup Plus is tied to the shipping information for the order; billing information is separate, and is required by most payment methods, such as credit cards or PayPal. Therefore, Local Pickup Plus cannot remove these fields by default.
If you’re using a gateway that allows for payment on pickup, then this should be the gateway’s responsibility to remove fields since billing fields are intended for payment gateway use.
Q: Can customers set a pickup time for their appointment?
A: This is not currently possible. However, you can ask customers to include an approximate time with their order notes by using your location description. If this is important to you, please let our team know via the help desk!
Q: Can pickup locations be outside of the US?
A: Absolutely — you can have pickup locations across any country you sell to.
Q: Why can’t I determine which products are available at a location when I use “one location per order” for pickup?
A: This is due to the logic involved in building, splitting, or merging packages when both the product’s pickup availability (whether it can be picked up or not) along with its availability at specific locations is involved in determining available locations. For example, if all items can be picked up at Location B, but only some can be picked up at Location C, should Location C be shown as an option at first for the package? We could do this, but then we’d need to handle splitting the package, and potentially re-merging items together if location B is then later chosen. Likewise, what if no location supports pickup for all products? How should the packages be broken up then, or should pickup even be available?
While these problems can be solved, they require a more robust package handling system than WooCommerce provides right now. We have opted not to include this in the plugin yet, as it would make Local Pickup Plus have far more limited compatibility with other shipping plugins (as it would need to completely take over the package handling process from WooCommerce). Contributing more to package handling within WooCommerce is something on our radar, so if this is important to you, please get in touch with your feedback and what you’re looking to accomplish to let our team know!
Questions & Support ↑ Back to top
Have a question before you buy? Please fill out this pre-sales form.
Already purchased and need some assistance? Get in touch with support via the help desk.