Purchase Orders & Cart-to-Quote

Convert a cart/basket into a WooCommerce order that's in a pending-review state (a quote). Includes a Purchase Order payment gateway too.

Licences for this plugin need to be renewed annually.

SKU: N/A Category: Current: 1.2.2
money-back guarantee sticker

100% No-Risk, Money Back Guarantee!

We're excited to have you experience the power of our plugins. So over the next 14 days, if any Power Plugins aren’t the best fit for your project, simply reach out! We’ll happily refund 100% of your money. No questions asked.

About Purchase Orders & Cart to Quote

This plugin enhances your checkout experience by doing two things:

  • Customers can convert their basket into a quote at the checkout. You (the Store Owner) can review the quote, adjust/add shipping and then set it to “Pending Payment”. The user can then pay for their quote for the period it’s valid for (e.g. 30 days).
  • Enable your customers to pay by Purchase Order (gateway)
    optional and configurable
Request a bespoke quote for large WooCommerce orders
An example large order

By default, the “Request a Bespoke Quote” button is visible at the checkout when no shipping methods are available for any deliverable packages (so no payment methods are available). This is a great way to avoid missing out on high-value orders because the site couldn’t automatically calculate the shipping costs.

Although we like to do one thing and do it well, we’ve included a Purchase Order payment gateway too, as the functional requirements for both features are closely aligned.

Request a Bespoke Quote

The main cart-to-quote feature works straight out of the box, but you should review the plugin’s settings to see if anything needs tweaking for your shop’s workflow.

When you’ve installed the plugin, go to WooCommerce > Settings and click the “Cart to Quote” tab.

The main setting of note is the option to use quotes for all orders. By default this option is unchecked, which means the “Request a Bespoke Quote” button will only be visible if an order can’t be shipped (and therefore can’t be paid for). If you check this option, every user will go through the quote stage at the checkout.

The other options you should review are the email notifications. You’ll probably want to enter your store administrator’s email address for the “New Quote Created” setting, otherwise you won’t receive email notifications for new quotes.

Settings for creating quotes form the checkout in WooCommerce
Settings for converting a WooCommerce cart into a bespoke quote

Purchase Orders

Enabling the Purchase Order payment gateway is a two-stage process. If you’re using another Purchase Order payment gateway plugin, you don’t need to take any action – this plugin won’t interfere with it.

One: Make the PO Payment Gateway available to WooCommerce

In the back-end of your website, Go to WooCommerce > Settings and select the “Cart to Quote” tab. Enable the Payment Gateway option and then save the options:

Enable the pourchase order payment gateway
Enable the Purchase Order payment gateway

Two: Activate the Payment Gateway

In the back-end of your website, Go to WooCommerce > Settings and select the “Payments” tab. Locate the “Purchase Order” payment gateway and enable it.

Activate the pourchase order payment gateway
Activate the Purchase Order payment gateway in WooCommerce

Restricting Access to the Purchase Order Payment Gateway

A common requirement is to only make the PO payment gateway available to some customers by their account role. You can add the following code snippet to your child theme’s functions.php, or use a code-snippets plugin.

 * If a user is not in the "trade_customer" role, remove Purchase Order from
 * the list of available payment gateways.
function conditional_po_gateway($gateways) {
	if (is_admin()) {
		// If we're in the back-end of the website, don't make any changes.
	} elseif (current_user_can('administrator')) {
		// If the user is an administrator, don't make any changes.
	} elseif (!empty($user = wp_get_current_user()) && in_array('trade_customer', $user->roles)) {
		// If the user is a "trade_customer", don't make any changes.
	} else {
		// Remove the PO payment gateway.

	return $gateways;
add_filter('woocommerce_available_payment_gateways', 'conditional_po_gateway', 10, 1);

Actions & Filter Hooks

filter : bool
$is_cto_forcedSet to true to force the checkout to remove all shipping methods and show the Request a Bespoke Quote” button. Return false to let the plugin make its own decision as to whether or not to show the button.
filter : string
$response_textShort text message that’s shown to the customer after their cart has been converted into a quote.
filter : string (URL)
$response_urlThe URL to redirect customers to after their quote has been created. The default is to redirect logged-in users to their My Account area.
filter : bool
$are_emails_enabledReturn false if you want to prevent the system sending emails to the customer and site-admin when a new quote is created.
filter : string
$labelThe text to show on the checkout button. Default is “Request a Bespoke Quote”
Hooks you can override with the Purchase Orders and Cart-to-Quote plugin

Conditional Force Cart-to-Quote

If you want to force guests (non-logged-in users) to go through a quote stage, but let logged-in customers pay with your usual gateways, you can do something like this:

 * Guests are forced to go through the quote stage, but logged-in users can use
 * any available payment gateway.
function force_guests_to_use_quote_stage($is_cto_forced) {
	if (is_admin()) {
		// Don't make any changes if we're in the back-end of the website.
	} elseif (is_user_logged_in()) {
		// Don't make any changes if the user is logged-in to the site.
	} else {
		// Non logged-in users are forced to go through the quote stage.
		$is_cto_forced = true;

	return $is_cto_forced;
add_filter('cto_is_cart_to_quote_forced', 'force_guests_to_use_quote_stage', 10, 1);

ImportantYou should disable the “User for all orders” option in the settings page before using this snippet.

Changelog: Cart to Quote

Version 1.2.2

Released: 2022-08-04

  • Replaced internal template functions with calls to the standard wc_get_template()
  • Tidied some bits-and-bobs. Removed some old/unused code.

Version 1.2.1

Released: 2022-08-04

Initial public release on Power Plugins.

Version 1.2.0

Released: 2022-05-04

  • New Feature: Allow certain user roles to convert their cart into a quote at the checkout, for other users. Great for when a shop manager needs to create a quote for a client, and it's easier to use the front end of the website to put together the order. When it gets converted to a quote, you can adjust the order before notifying the customer (adjust the shipping, apply discounts, etc.
  • Partial implementation of the new Purchase Order Payment gateway - to be extended in the next release.

Older releases

  • Added support for new filters and hooks to better-control special situations in the checkout.
  • Initial release.


There are no reviews yet.

Be the first to review “Purchase Orders & Cart-to-Quote”