Cart-to-Quote for WooCommerce
Our WooCommerce cart to quote plugin lets customers request a shipping quote right at the checkout. Fully compatible with HPOS, and it includes a Purchase Order payment gateway too.
Licences for this plugin need to be renewed each year
100% No-Risk, Money Back Guarantee!
Over the next 14 days, if our plugins aren't right for you, we’ll refund 100% of your money. No questions asked!
About Cart to Quote for WooCommerce
“There are no shipping options available. Please ensure that your address has been entered correctly, or contact us if you need any help”
When a customer get to the checkout but their cart cannot be shipped… replace the “no shipping options” message with a “Request a quote” button.
The customer’s cart is converted into a WooCommerce order in a “pending quote” stage. The store manager can add shipping manually (and adjust anything else on the order) and then move the order/quote to “pending payment”. The quote will remain valid for 30 days (configurable), and the customer can pay for it in their account area, or by clicking a link in an email (if you’re using “Guest Checkout”).
Checkout quote configuration options
By default, the Request a Quote button is only available when a cart cannot be shipped. But you can also add the button to the checkout for all customers, as well as to the cart page.
Developer friendly
All the quote button functionality is accessible via WordPress filters, and we use standard WooCommerce for underlying functionality where possible. So customer/store-manager emails are easy to override, and the plugin’s configuration is easy to modify for your store’s particular requirements.
- Add a checkout “Convert cart into a quote” button for cart that can already be shipped (optional).
- Create manual, custom quotes on behalf of a customer.
- Let your customers to pay by Purchase Order (payment gateway) – optional and configurable
- Fully compatible with WooCommerce High-Performance Order Storage (HPOS)
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.
Let Any User Request a Quote
If you enable the option to let any customer convert their cart to a quote, you’ll see a new button beneath the Place Order button at the checkout. It works with guest checkout, as well as for customers who have website login accounts.
WooCommerce My Account Page
Quotes are stored as regular WooCommerce orders, but with a new order-status of “Pending Quote”. This means that the quote is not yet available to be paid, usually because the store admin needs to calculate shipping, or apply a customer-specific price adjustment.
When an order has been moved from “Pending Quote” to “Pending Payment”, the customer is able to pay for it.
There’s also a neat feature that lets the customer email the quote to an external address (i.e. their accounts department) and attach a note to the order. This is great when the person who has requested the quote needs to get an internal Purchase Order raised.
Manually Created Quotes
Quite often you might find that you want to create a quote on behalf of a customer. Thankfully, Cart to Quote makes that process is easy!
Simply do the following steps:
- Firstly, make sure you have the ‘Some Users can create Quotes for other customers’ option selected in WooCommerce > Settings > Cart to Quote. Make sure to add the users roles you want to have this capability.
- Go to the website frontend and add the products in question to your cart.
- Proceed to Checkout.
- At the top of the Checkout page you’ll see this panel (only visible to the user roles selected in step 1):
- Now, either search for an existing customer or click on ‘Create a new customer’.
- Click ‘Create the quote now’.
A quote will now be generated in the usual fashion ready for adjustment, approval, or completion.
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:
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.
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. unset($gateways['pp-cto-review-purchase-order']); } return $gateways; } add_filter('woocommerce_available_payment_gateways', 'conditional_po_gateway', 10, 1);
Actions & Filter Hooks
Hook | Parameters | Notes |
---|---|---|
cto_is_cart_to_quote_forced filter : bool | $is_cto_forced | Set 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. |
cto_received_quote_confirmation_text filter : string | $response_text | Short text message that’s shown to the customer after their cart has been converted into a quote. |
cto_received_quote_ok_redirect_url filter : string (URL) | $response_url | The URL to redirect customers to after their quote has been created. The default is to redirect logged-in users to their My Account area. |
cto_are_new_quote_email_enabled filter : bool | $are_emails_enabled | Return false if you want to prevent the system sending emails to the customer and site-admin when a new quote is created. |
cto_checkout_button_label filter : string | $label | The text to show on the checkout button. Default is “Request a Bespoke Quote” |
cto_custom_email_quote_is_pending_review filter : string | $subject | Subject for the customer-facing email stating that the store has received their request for a quote. |
cto_custom_email_quote_is_ready filter : string | $subject | Subject for the customer-facing email stating that their quote is ready. |
cto_before_shipping_quote_button cto_after_shipping_quote_button action | Action hooks are fires immediately before and after the shipping quote button on the checkout page, so you can inject your own HTML around the button. Useful if you want to show an additional message to the customer. |
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.19.0
Released: 2024-08-07
- Added the following actions to email templates so you can inject additional user-facing (or admin-facing) information. All actions take the single parameter $order : cto_new_order_admin_email_before_table, cto_new_order_admin_email_after_table, cto_new_quote_admin_email_before_table, cto_new_quote_admin_email_after_table, cto_new_quote_email_before_order_table, cto_new_quote_email_after_order_table
Version 1.18.0
Released: 2024-07-29
Add a new option to include shipping and sub-totals in the new/pending quote email to customers. This option only applies if you choose the "Line items listed as a quote" option for the Quote Pending email type.
Version 1.17.0
Released: 2024-07-13
- Added three new filters so you can customise the email subject for admin-facing emails, "cto_new_quote_email_to_admin_subject", "cto_quote_ready_email_to_admin_subject" and "cto_quote_paid_email_to_admin_subject"
Older releases
- When a quote is requested from the cart page and the user is already logged-in, we now populate the billing and shipping addresses with those stored against the user account (instead of leaving them blank).
- Fixed a problem that stopped you being able to set the title of the PO gateway in the checkout.
- Fixed a problem that caused new quotes to be not editable in some situations.
- The new filter "cto_quote_order_statuses" lets you use a custom order status for quotes that are pending review and quotes that are expired.
- Added an option to let customers approve/accept their quotes without having to pay for them - so they can go from pending-review to processing. This is useful if your store processes customer payments outside of the WooCommerce payment gateway workflow.
- Improved templates for "New Quote" and "Quote Is Ready" emails. To use the new emails, go to WooCommerce/Settings/Cart-to-Quote. Then choose "Line items listed as a quote" and "Line items and a link to pay" as your Email Types.
- Added the cto_before_shipping_quote_button and cto_after_shipping_quote_button actions to make it easy to inject text before/after the Request a Quote button when no shipping is available.
- Fixed a bug with the new option that can force the quote stage when the cart has a particular shipping-class item in it. The plugin was adding an arbitrary shipping method, instead of leaving the shipping empty.
- New option to create a Shipping Class that forces a cart to go through the quote stage. Assign your shipping class (e.g. "Quote Shipping") to any products you want to always be quoted, and set the "
Shipping class to quote" option in our plugin.
- Extended the new option that sends a detailed quote (new order) email (instead of the welcome note email) so it works with quotes that are still at the pending quote/review stage too.
- Full support for WooCommerce High Performance Order Storage (HPOS).
- New option to use the "New Order/Quote" email (detail) instead of the welcome message and link. See also the "cto_prefer_woocommerce_invoice_email" bool filter.
- UI enhancement to the checkout page. When both "Use for All Orders" AND "Can any customer convert their cart into a quote" are enabled, we now suppress the request a bespoke shipping quote button and always use the Convert your Cart into a quote button.
- Fixed: In some cases, newly created customers were not being assigned to their newly created quotes.
- Fixed an issue where some guest users were able to request a cart from the checkout page without entering a billing address.
- Updated the fr-FR translations (machine translated)
- Updated translations for de-DE and es-ES (machine translated)
- FIX: The "create account" checkbox on the cart page (quote popup) is now disabled if the WooCommerce option to enable account-creation at the checkout is disabled.
- New feature: Add a request-a-quote button the cart page.
- New options on the WooCommerce > Settings > Cart-to-Quote tab for editing the button texts.
- FIX: Remove scheduled actions when the plugin is deactivated.
- FIX: The "WooCommerce Email Styles" option should work properly now. It was always-on due to using the wrong wp option.
- Added an option/action to reactivate a quote. This can be used to reactivate an expired quote, or reset the expiration duration on an existing/open quote. The option is in the Quote Actions meta box when you edit an order.
- Updated core power-plugins support library to the latest version.
- Fixed a problem when reporting on the successful manual resending of reminder emails.
- Added a new email template for quote-reminder emails. If you have reminder emails enabled, it will be used automatically
- There's also a new meta box when editing an active quote that lets you manually send reminder emails
- When reminder emails are sent (either automatically or manually) it's now recorded against the order/quote as a note.
To override the contents of the reminder email, copy the file...
wp-content/plugins/cart-to-order-review/public-templates/emails/email-to-customer-quote-reminder.php
...to...
wp-content/yourtheme/woocommerce/emails/email-to-customer-quote-reminder.php
- Added a new filter so you can replace the "your quote is ready" email with the standard WooCommerce "New Invoice" email. To use this standard WC invoice, return true from the "cto_prefer_woocommerce_invoice_email" filter.
- Added a new option in WooCommerce > Settings > Cart to Quote so you can choose where to place the "Convert cart into a quote" button in different locations.
- Fixed a bug where the billing phone number was not always being captured on new quotes.
- Updated core Power Plugins libraries
- Added a new option to apply the WooCommerce email templates to customer-facing quote emails.
- Minor update to remove some diagnostic messages that were popping up in the error logs unnecessarily.
- Updated the core power-plugins support library.
- Minor bug fix for logged-in customers who use the "Convert cart to quote" button on the checkout page.
- Updated Dutch nl_NL translations (machine-translated)
- Added support for guest checkout, so customers can create quotes without needing to create an account first
- Better housekeeping to switch expired quotes to a new order-status of "Expired Quote"
- Updated Power Plugins core library
Minor update to the core Power Plugins support library.
- New feature. Allow some users (e.g. Store Managers) to create quotes for other customers at the checkout. Add items into your cart, go to the checkout and search for an existing customer... or enter your own billing/shipping details and save the quote against your own account. Great when you've got a sales team who want to create quotes for their clients.
- Updated Dutch 🇳🇱 translations (machine-translated)
Minor update to fix an edge-case issue similar to that in release 1.4.0. In some cases, a quote that transitioned straight to "pending payment" status wasn't picking up the shipping address. This only affected sites that had custom JavaScript running on the checkout page.
- New feature : Send out reminder emails before a quote expires. note By default, this feature is not enabled. Go to your WooCommerce Settings > Cart-to-Quote and configure how many days before reminder emails are sent.
- Fix: There was an edge case that caused the billing and shipping addresses to be blank on new quotes - if there was custom JavaScript in the checkout. This has been resolved.
Fixed a bug with the new automatic quote-to-pending-payment function. If a customer requests a bespoke shipping quote, we need to bypass the automatic jump-to-pending-payment so the store owner can adjust the quote before it is ready for payment.
- New option to move new quotes straight to the Pending Payment stage, if all the packages can be shipped.
- New option so customers can send their quotes to a third party, right from their My Account / Orders page. Useful when the customer needs to send a quote to their accounts department to get a PO reference.
- Added version one of the es_ES translations (machine-translated).
- Added version one of the it_IT translations (machine-translated).
- Added version one of the fr_FR translations (machine-translated)
- Tidied up the emails sent to administrators when new quotes are made and paid for
- Added version one of de-DE customer-facing translations (machine-translated).
- Tidied up the customer email templates and added comment-headers to them.
- Moved public-templates/cart/convert-cart-to-quote-button.php to public-templates/checkout/convert-cart-to-quote-button.php
- New feature. Enable a button at the checkout so users can request a quote, even if the Pay Now button is available. Configurable and hookable.
- Added Dutch translations to customer-facing strings
Minor update. Prevent the Mini WP GDPR plugin from enforcing GDPR/Terms acceptance when creating a new user (while creating a quote) at the checkout.
- Replaced internal template functions with calls to the standard wc_get_template()
- Tidied some bits-and-bobs. Removed some old/unused code.
Initial public release on Power Plugins.
- 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.
- Added support for new filters and hooks to better-control special situations in the checkout.
- Initial release.
Andrew –
Excellent plugin. Does exactly what was required. Also, the customer service has been excellent too – needed some help with setup and also some tweaks to exactly how the plugin worked which were sorted out very quickly. Highly recommend this plugin and generally Power Plugins
Paul –
Thanks Andrew – happy to help!
Alexe –
I received wonderful proactive support from Paul and his team. I am very happy with my purchase and I recommend 100%.
Brian –
Worth Every Penny.
Our business was struggling with another plugin that simply kept falling short of what we needed it to do. Discouraged, we sought out different options and then we found the cart-to-quote plugin. Hesitant, I messaged the developer, Paul, and told him about our scenario. He was FAST to respond and gave great advice. When it came down to it, we needed a more custom solution than what the plugin originally offered. Paul did not push our business away but instead offered a solution. He quickly added custom code to the plugin to make it work for us.
When you purchase this plugin (which I highly recommend you do) you not only get a great plugin but you get a WordPress plugin developer that will listen to your needs. I am thankful to Paul and his team for blowing away my expectations. The support is phenomenal.
Paul –
Cheers Brian. Your request to led us creating the Shipping Class trigger for forcing the quote stage. A nice addition to the plugin’s functionality that should help other clients too. Good luck with your web store 👍
Phillip Wilson –
I have tried a bunch of other, build a quote plugins, for woo commerce but nothing compares to what Paul has managed to build here with this one. The functionality is second to none. Because it builds the quote off the check out page (not a seperate quote page) it keeps all the customisation of how you have built your own e-commerce site and allows instant quotations to be emailed out. The other apps couldn’t even calculate shipping!! not only that, but it stores all the quotes in the back end for easy customisation and future reference, massively improving our workflow. We have spend hours, days, manually creating customers quotes from our system and now they can simply do it themselves. It also doesn’t affect stock management whilst sitting in the system as a quote so there is no limit to how many quotes it can make.
The back end functionality means you can custom edit the quote as you need too, and then easily convert it from a quote to a new order! sending out the payment details to the customer.
Although this app seems like its in early days, it really isn’t, it’s very far along. Paul is also happy to engage with customers and their needs to better improve it going forward.
When it comes to an app this is a horse worth backing, and that is why I am happy to endorse it.
Paul –
Thanks for the kind words Phill. It’s been fun working with you, getting the new email option built in to the plugin to help your workflow 👍
Ram Gupta Kandula –
Paul Faulkner demonstrated a remarkable commitment to resolving our plugin issues, exceeding expectations by working through weekends and quickly addressing critical problems. His efforts ensured we launched on schedule. From answering queries before the purchase to providing ongoing support, Paul’s assistance has been invaluable.
Bob –
The guys at Power Plugins are a breath of fresh air. Submitting a bug to WP plugin developers in general is often met with arrogance or the simple refusal to acknowledge a problem. Paul was not only open to looking into my issue, but quickly identified the cause which in this case was the result of a recent WooCommerce update. Outstanding customer service, thank you!
Elliot –
Thank you Bob. We really appreciate your kind comments. All the best, Elliot.
Donal –
Very quick support & very helpful with my suggestions for added features.
Dochia –
This plug in the most elegant solution out there for submitting quotes. The way it integrates with WooCommerce order management system makes it easy to work with and very logical.
The customer support was also great. The dev elopment team answered my questions fast and upgraded the plugin to solve my email formatting requests.
I totally recommend using this plugin.
Daniel Seirawan –
I am so glad I found the Cart-to-Quote plugin. To start, the authors answered my pre-sales questions very promptly. They have made a simple and elegant solution for a common problem, Quotes — very flexible ones.
This plugin solves some common problems: Allows customers to Request a Quote (any time) OR uses a Quote Pending status for the order IF a shipping method is NOT available. Once reviewed by the Sales team, it auto-sends emails allowing the customer to access it and pay from their My Account page.
I like it because Quotes are NOT separated out from the Orders in a separate Post Type. Quotes simply have a different order status WITHIN the Orders area and quickly revert to a normal order.
The authors are very keen to get feedback for improvements. I suggested allowing Admins & Shop Managers to create quotes for clients. They said, we actually already have that code waiting in the wings and were looking for a good reason to push it forward … < 24 hrs later, it is part of the plugin and working well.
Elliot –
Hi Daniel, thank you for your kind review of Cart to Quote. We are always aiming for continuous improvement, so the type of feedback you’ve been providing us with on this plugin is extremely appreciated. Kind regards, Elliot.