{"id":357776,"date":"2026-08-25T17:15:18","date_gmt":"2026-08-25T17:15:18","guid":{"rendered":"https:\/\/wordpress.org\/plugins\/tackquote-for-woocommerce\/"},"modified":"2026-10-26T03:34:05","modified_gmt":"2026-10-26T03:34:05","slug":"tackquote","status":"publish","type":"plugin","link":"https:\/\/dv.wordpress.org\/plugins\/tackquote\/","author":23553833,"comment_status":"closed","ping_status":"closed","template":"","meta":{"version":"1.12.0","stable_tag":"1.12.0","tested":"7.1.3","requires":"6.4","requires_php":"7.4","requires_plugins":null,"header_name":"TackQuote: Request a Quote & B2B Wholesale for WooCommerce","header_author":"TackQuote","header_description":"Add a \"Request a Quote\" button to your WooCommerce store and sync orders with your TackQuote B2B quoting account.","assets_banners_color":"c2c4c2","last_updated":"2026-10-26 03:34:05","external_support_url":"","external_repository_url":"","donate_link":"","header_plugin_uri":"https:\/\/tackquote.com\/integrations\/woocommerce","header_author_uri":"https:\/\/tackquote.com","rating":0,"author_block_rating":0,"active_installs":0,"downloads":347,"num_ratings":0,"support_threads":0,"support_threads_resolved":0,"author_block_count":0,"sections":["description","installation","faq","changelog"],"tags":{"1.10.2":{"tag":"1.10.2","author":"tackquote","date":"2026-10-10 17:15:20","revision":3738419},"1.11.0":{"tag":"1.11.0","author":"tackquote","date":"2026-10-10 17:57:05","revision":3738453},"1.11.1":{"tag":"1.11.1","author":"tackquote","date":"2026-10-18 19:38:06","revision":3753528},"1.12.0":{"tag":"1.12.0","author":"tackquote","date":"2026-10-26 03:34:05","revision":3765476},"1.5.0":{"tag":"1.5.0","author":"tackquote","date":"2026-08-25 17:14:46","revision":3665749},"1.5.1":{"tag":"1.5.1","author":"tackquote","date":"2026-08-25 17:35:21","revision":3665762}},"upgrade_notice":[],"ratings":[],"assets_icons":{"icon-128x128.png":{"filename":"icon-128x128.png","revision":3738377,"resolution":"128x128","location":"assets","locale":"","width":128,"height":128},"icon-256x256.png":{"filename":"icon-256x256.png","revision":3738377,"resolution":"256x256","location":"assets","locale":"","width":256,"height":256}},"assets_banners":{"banner-1544x500.png":{"filename":"banner-1544x500.png","revision":3738398,"resolution":"1544x500","location":"assets","locale":"","width":1544,"height":500},"banner-772x250.png":{"filename":"banner-772x250.png","revision":3738398,"resolution":"772x250","location":"assets","locale":"","width":772,"height":250}},"assets_blueprints":{},"all_blocks":[],"tagged_versions":["1.10.2","1.11.0","1.11.1","1.12.0","1.5.0","1.5.1"],"block_files":[],"assets_screenshots":{"screenshot-1.png":{"filename":"screenshot-1.png","revision":3738377,"resolution":"1","location":"assets","locale":"","width":1280,"height":800},"screenshot-10.png":{"filename":"screenshot-10.png","revision":3738377,"resolution":"10","location":"assets","locale":"","width":1280,"height":800},"screenshot-11.png":{"filename":"screenshot-11.png","revision":3738377,"resolution":"11","location":"assets","locale":"","width":1280,"height":800},"screenshot-12.png":{"filename":"screenshot-12.png","revision":3738377,"resolution":"12","location":"assets","locale":"","width":1280,"height":800},"screenshot-13.png":{"filename":"screenshot-13.png","revision":3753528,"resolution":"13","location":"assets","locale":"","width":1280,"height":800},"screenshot-14.png":{"filename":"screenshot-14.png","revision":3738377,"resolution":"14","location":"assets","locale":"","width":1280,"height":800},"screenshot-15.png":{"filename":"screenshot-15.png","revision":3738377,"resolution":"15","location":"assets","locale":"","width":1280,"height":800},"screenshot-16.png":{"filename":"screenshot-16.png","revision":3738377,"resolution":"16","location":"assets","locale":"","width":1280,"height":800},"screenshot-2.png":{"filename":"screenshot-2.png","revision":3738377,"resolution":"2","location":"assets","locale":"","width":1280,"height":800},"screenshot-3.png":{"filename":"screenshot-3.png","revision":3738377,"resolution":"3","location":"assets","locale":"","width":1280,"height":800},"screenshot-4.png":{"filename":"screenshot-4.png","revision":3738377,"resolution":"4","location":"assets","locale":"","width":1280,"height":800},"screenshot-5.png":{"filename":"screenshot-5.png","revision":3738377,"resolution":"5","location":"assets","locale":"","width":1280,"height":800},"screenshot-6.png":{"filename":"screenshot-6.png","revision":3738377,"resolution":"6","location":"assets","locale":"","width":1280,"height":800},"screenshot-7.png":{"filename":"screenshot-7.png","revision":3738377,"resolution":"7","location":"assets","locale":"","width":1280,"height":800},"screenshot-8.png":{"filename":"screenshot-8.png","revision":3738377,"resolution":"8","location":"assets","locale":"","width":1280,"height":800},"screenshot-9.png":{"filename":"screenshot-9.png","revision":3738377,"resolution":"9","location":"assets","locale":"","width":1280,"height":800}},"screenshots":{"1":"Add to Quote and Request a Quote sit beside Add to cart on the product page (Twenty Twenty-Five).","2":"Product cards in the shop grid can carry an Add to Quote button.","3":"The quote drawer lists the chosen products and quantities, with Checkout as Quote.","4":"The quote page from the <code>[tackquote_quote_page]<\/code> shortcode takes target prices and a message, and the request form can carry attachments.","5":"Quote-only mode shows \"Price on request\" in place of prices, and single products can be marked \"Available on quote\".","6":"A signed-in buyer sees their account price, their buyer group badge and a volume pricing table.","7":"Order limits show on the product page and are enforced in the cart and the Checkout block.","8":"Buyers TackQuote has approved can pay on net terms at checkout and add a purchase order number.","9":"The wholesale application form in My Account is the form you design in TackQuote, file fields included.","10":"A checkout link from an accepted quote fills the cart at the quoted prices with the quantities locked.","11":"Categories hidden per buyer group: a guest (left) does not see the trade range that a Tier 2 buyer (right) sees.","12":"Storefront buttons in German from the bundled translations.","13":"The Overview tab shows the connection, the storefront mode, order sync and every B2B switch.","14":"The Styling section of the Storefront tab: use the theme's styles only, or pick an accent colour.","15":"The Buyer groups tab keeps payment and shipping methods for the groups you tick.","16":"With an accent colour set, the quote buttons blend into Twenty Twenty-Four."}},"plugin_section":[],"plugin_tags":[10553,5055,13770,51032,190090],"plugin_category":[45],"plugin_contributors":[277460],"plugin_business_model":[],"class_list":["post-357776","plugin","type-plugin","status-publish","hentry","plugin_tags-b2b","plugin_tags-quote","plugin_tags-request-a-quote","plugin_tags-wholesale","plugin_tags-woocommerce-b2b","plugin_category-ecommerce","plugin_contributors-tackquote","plugin_committers-tackquote"],"banners":{"banner":"https:\/\/ps.w.org\/tackquote\/assets\/banner-772x250.png?rev=3738398","banner_2x":"https:\/\/ps.w.org\/tackquote\/assets\/banner-1544x500.png?rev=3738398","banner_rtl":false,"banner_2x_rtl":false},"icons":{"svg":false,"icon":"https:\/\/ps.w.org\/tackquote\/assets\/icon-128x128.png?rev=3738377","icon_2x":"https:\/\/ps.w.org\/tackquote\/assets\/icon-256x256.png?rev=3738377","generated":false},"screenshots":[{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-1.png?rev=3738377","caption":"Add to Quote and Request a Quote sit beside Add to cart on the product page (Twenty Twenty-Five)."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-2.png?rev=3738377","caption":"Product cards in the shop grid can carry an Add to Quote button."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-3.png?rev=3738377","caption":"The quote drawer lists the chosen products and quantities, with Checkout as Quote."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-4.png?rev=3738377","caption":"The quote page from the <code>[tackquote_quote_page]<\/code> shortcode takes target prices and a message, and the request form can carry attachments."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-5.png?rev=3738377","caption":"Quote-only mode shows \"Price on request\" in place of prices, and single products can be marked \"Available on quote\"."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-6.png?rev=3738377","caption":"A signed-in buyer sees their account price, their buyer group badge and a volume pricing table."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-7.png?rev=3738377","caption":"Order limits show on the product page and are enforced in the cart and the Checkout block."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-8.png?rev=3738377","caption":"Buyers TackQuote has approved can pay on net terms at checkout and add a purchase order number."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-9.png?rev=3738377","caption":"The wholesale application form in My Account is the form you design in TackQuote, file fields included."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-10.png?rev=3738377","caption":"A checkout link from an accepted quote fills the cart at the quoted prices with the quantities locked."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-11.png?rev=3738377","caption":"Categories hidden per buyer group: a guest (left) does not see the trade range that a Tier 2 buyer (right) sees."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-12.png?rev=3738377","caption":"Storefront buttons in German from the bundled translations."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-13.png?rev=3753528","caption":"The Overview tab shows the connection, the storefront mode, order sync and every B2B switch."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-14.png?rev=3738377","caption":"The Styling section of the Storefront tab: use the theme's styles only, or pick an accent colour."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-15.png?rev=3738377","caption":"The Buyer groups tab keeps payment and shipping methods for the groups you tick."},{"src":"https:\/\/ps.w.org\/tackquote\/assets\/screenshot-16.png?rev=3738377","caption":"With an accent colour set, the quote buttons blend into Twenty Twenty-Four."}],"raw_content":"<!--section=description-->\n<p><strong>TackQuote: Request a Quote &amp; B2B Wholesale for WooCommerce<\/strong> adds Request a Quote and Add to Quote buttons, a quote list and a quote page to your store, so trade buyers can ask for a price on the exact products and quantities they need instead of checking out. Approved wholesale customers see their own prices, volume tables and order limits, can apply for net terms and pay with a purchase order, and pay an accepted quote at your normal checkout at the quoted prices. Quotes are managed in your TackQuote account (a free plan is available).<\/p>\n\n<p>Setup is one button: press <strong>Connect with TackQuote<\/strong>, sign in or create an account, and approve. Pasting an API key still works.<\/p>\n\n<p><a href=\"https:\/\/tackquote.com\/integrations\/woocommerce\">Learn more about the WooCommerce integration<\/a> \u00b7 <a href=\"https:\/\/app.tackquote.com\/register\">Create a free TackQuote account<\/a><\/p>\n\n<h4>Features<\/h4>\n\n<ul>\n<li><strong>Add to Quote<\/strong> and <strong>Request a Quote<\/strong> buttons on product pages, product cards and the cart.<\/li>\n<li>A floating <strong>quote list<\/strong> with <strong>Checkout as Quote<\/strong>, a <strong>quote page<\/strong> with target prices, and <strong>your own quote request form<\/strong> designed in TackQuote.<\/li>\n<li><strong>Quick order<\/strong> by SKU, to the cart or the quote list.<\/li>\n<li><strong>Quote-only mode<\/strong> for the whole store, signed-out visitors, chosen roles or all but approved wholesale accounts, or per product.<\/li>\n<li><strong>B2B pricing<\/strong> (account prices, volume tables), <strong>order limits<\/strong>, a <strong>buyer-group badge<\/strong> and <strong>tax-exempt buyers<\/strong>.<\/li>\n<li>Per buyer group: hidden <strong>product categories<\/strong>, free or discounted <strong>shipping<\/strong>, an optional <strong>WordPress role<\/strong>.<\/li>\n<li><strong>Wholesale<\/strong> and <strong>net-terms application forms<\/strong>, and a <strong>Net terms<\/strong> payment method with an optional PO number.<\/li>\n<li><strong>Accepted quote checkout<\/strong> at the quoted prices.<\/li>\n<li>Optional one-way <strong>order sync<\/strong>, off by default and queued so it never runs inside checkout; with one more approval, TackQuote's <strong>catalogue and order sync<\/strong> through a WooCommerce REST API key.<\/li>\n<li><strong>TackQuote inside WooCommerce admin<\/strong>, each person signed in as themselves.<\/li>\n<li>Works with <strong>HPOS<\/strong>, the Cart and Checkout blocks, and block and classic themes. Storefront text in English and seven more languages.<\/li>\n<\/ul>\n\n<p>The FAQ lists exactly what the plugin sends and stores.<\/p>\n\n<h4>What it does not do<\/h4>\n\n<ul>\n<li>It does not replace WooCommerce checkout or act as a full CPQ workspace.<\/li>\n<li>The plugin's own order sync is one-way, WooCommerce to TackQuote. Catalogue, stock and orders written back come only from catalogue and order sync, which needs your approval in WooCommerce.<\/li>\n<li>Failed syncs are logged (WooCommerce \u2192 Status \u2192 Logs, source <code>tackquote<\/code>) and never block checkout.<\/li>\n<\/ul>\n\n<p>Source code: <a href=\"https:\/\/github.com\/tackquote\/woocommerce\">github.com\/tackquote\/woocommerce<\/a>.<\/p>\n\n<h3>External services<\/h3>\n\n<p>This plugin connects to the TackQuote API, a third-party B2B quoting service operated by\nTackQuote, to send quote requests that shoppers submit on your store and \u2014 only if you\nswitch it on \u2014 to send data about orders placed in your store.<\/p>\n\n<p>The service is required for the plugin to work. Until the store is connected, quote requests\ncannot be sent: the shopper is told so and the Connection tab shows why. Nothing is sent anywhere\nuntil you enter an API key or press <strong>Connect with TackQuote<\/strong>.<\/p>\n\n<p>All requests go to the API base URL set under <strong>TackQuote \u2192 TackQuote API URL<\/strong>, which is\n    https:\/\/api.tackquote.com\/v1 unless your TackQuote support contact gave you a different\none. Every request (except the two Connect with TackQuote calls in item 12, made before the\nstore has a key) carries your TackQuote API key so the service can identify your account,\nand (since 1.10.0) headers naming this plugin's version (<code>X-TackQuote-Plugin-Version<\/code>) and the\nstore's address (<code>X-TackQuote-Site-Url<\/code>), so TackQuote can tell which build and store sent it. The API key needs the <code>buyers:write<\/code> scope for\nthe two application forms below; the read-only storefront lookups need no extra scope.<\/p>\n\n<ol>\n<li><p><strong>Connection test<\/strong> \u2014 <code>GET \/integrations\/woocommerce\/ping<\/code>; on 404, <code>GET \/health<\/code> (key unverified).\nSent when an administrator clicks \"Test TackQuote connection\", at most daily from the storefront\nfor item 11, and since 1.12.0 at most every ten minutes in the background (never during a\nshopper's request), once more to confirm a refused key, and once on deactivation. Sends your API key and the store's address; since 1.12.0, to a TackQuote server that asks for them, also the site name, the WordPress time zone, the WooCommerce currency and the store base address (WooCommerce \u2192 Settings \u2192 General). No order or customer data.<\/p><\/li>\n<li><p><strong>Quote form field policy<\/strong> \u2014 <code>GET \/integrations\/woocommerce\/registration-config<\/code>.\nSent on storefront page views while quote buttons are on, at most every 15 minutes. Your API key and the store's address.<\/p><\/li>\n<li><p><strong>Quote request<\/strong> \u2014 <code>POST \/integrations\/woocommerce\/quote-requests<\/code>.\nSent when a shopper submits the quote form. Sends what that shopper typed\ninto the form, plus the products being quoted: email address, first and last name, phone\nnumber if given, company name and any company details the seller's registration policy\nrequires (legal name, tax\/VAT ID, registration number, website, address, city, state, postal\ncode, country, company phone, industry, employee count), the free-text note if written, and\nfor each requested product its name, SKU, quantity, unit price excluding tax, WooCommerce\nproduct ID (since 1.12.0, a variation as <code>&lt;product ID&gt;_&lt;variation ID&gt;<\/code> on a server that supports it) and any target price, together with the store's currency code. Since 1.12.0, when\nthe quote modal shows the form you designed in TackQuote, it sends that form's answers instead\n(what the shopper typed into each of your fields, and the upload ids of any files) together with\nthe form version shown, and the same products.<\/p><\/li>\n<li><p><strong>Order sync<\/strong> \u2014 <code>POST \/integrations\/woocommerce\/order-sync<\/code>. <strong>Off by default.<\/strong>\nSent when an order is created and each time its status changes, but only if the merchant has\nswitched on \"Sync orders to TackQuote\". Sends the whole order: the customer's billing and\nshipping addresses, email address and phone numbers, WooCommerce customer ID, their order\nnote, the order ID, number and status, currency and totals, coupon codes, timestamps, the\npayment method ID and title, the payment gateway's transaction ID, and every line item with\nits name, SKU, product and variation IDs, quantities, totals, taxes and item meta. No card\nnumbers, no card details and no gateway credentials are ever sent. The <strong>Privacy<\/strong> section\nbelow lists every field individually.<\/p><\/li>\n<li><p><strong>B2B pricing, order limits and buyer group<\/strong> \u2014 <code>POST \/storefront-pricing\/resolve<\/code> (cart\nprices), <code>GET \/storefront\/v1\/wholesale-price<\/code>, <code>GET \/storefront\/v1\/quantity-breaks<\/code>,\nGET \/storefront\/v1\/order-limits and <code>GET \/storefront\/v1\/buyer-group<\/code>, falling back to the\nolder <code>GET \/storefront-b2b\/order-limits<\/code> and <code>GET \/storefront-b2b\/buyer-group<\/code> on a TackQuote\nserver without the <code>\/storefront\/v1<\/code> routes. Only when the merchant has switched on B2B pricing,\norder limits, the buyer-group badge, any buyer-group rule or tax-exempt buyers. Sent while\ncustomers browse (order limits also for guests). Sends the product SKU and quantity and, for\na signed-in customer, their email address and WordPress user ID (digits only).<\/p><\/li>\n<li><p><strong>Wholesale application<\/strong> \u2014 <code>GET \/integrations\/woocommerce\/wholesale-form<\/code> (the form's\nfields, by form slug; sends no customer data) and <code>POST \/integrations\/woocommerce\/wholesale-form\/submit<\/code>.\nSent when a page with the <code>[tackquote_wholesale_application]<\/code> shortcode or the \"Wholesale account\"\nMy Account tab is viewed, and when a shopper submits that form. Sends the answers the shopper\ntyped into the seller's form (for example company name, email, phone, address, tax ID) and,\nfor a signed-in customer, their WordPress user ID as <code>wooCustomerId<\/code>. An application that carries\nfiles is sent instead to <code>POST \/storefront\/v1\/wholesale-signup\/&lt;slug&gt;<\/code> with the same\nanswers, the signed-in customer's account email address and WordPress user ID\n(<code>buyerEmail<\/code>, <code>buyerExternalId<\/code>), and the upload IDs of item 11.<\/p><\/li>\n<li><p><strong>Net-terms application<\/strong> \u2014 <code>POST \/storefront\/v1\/credit-application<\/code>, falling back to\nPOST \/integrations\/woocommerce\/credit-application on an older TackQuote server. Signed-in\ncustomers only, when they submit the \"Net terms\" form. Sends the account's email address, the\nWordPress user ID (in the query, v1 route only), and what the customer typed: legal business\nname, contact phone, tax\/VAT ID, billing address, requested credit limit, requested payment\nterms, up to three trade references (company, contact name, email, phone) and notes.<\/p><\/li>\n<li><p><strong>Wholesale price gate and Wholesale account tab<\/strong> \u2014 <code>GET \/storefront\/v1\/price-access<\/code>. <strong>Off by default.<\/strong>\nSent only when the merchant chose the quote-only scope \"Everyone except approved wholesale\naccounts\", or (since 1.11.0) when a signed-in customer opens the \"Wholesale account\" My Account\ntab or a page with the <code>[tackquote_wholesale_application]<\/code> shortcode, and only for a signed-in customer, at most once every five minutes per customer\n(one minute after a failure). Sends that customer's account email address and their\nWordPress user ID (<code>buyerEmail<\/code>, <code>buyerExternalId<\/code>). TackQuote answers whether that buyer's\nwholesale application is approved. Nothing is sent for a signed-out visitor.<\/p><\/li>\n<li><p><strong>Net terms<\/strong> \u2014 <code>GET \/storefront\/v1\/net-terms<\/code>. Sent for a signed-in customer at checkout\nwhile the \"Net terms (TackQuote)\" payment method is enabled (off by default), and when a\nsigned-in customer views the \"Net terms\" My Account tab or the <code>[tackquote_net_terms_application]<\/code>\nshortcode (the tab is off by default), to show their terms or a pending application instead of\nthe form. Sends the account email and WordPress user ID. One answer per customer is reused for\nup to a minute. Fails closed: without an answer, checkout hides the method and the tab shows\nthe application form.<\/p><\/li>\n<li><p><strong>Accepted quote checkout<\/strong> \u2014 <code>GET \/integrations\/woocommerce\/quote-checkout\/&lt;token&gt;<\/code>, when a\nbuyer opens a TackQuote checkout link (<code>?tackquote_checkout=<\/code>) on your store. Sends only the\nlink's single-use token and your API key.<\/p><\/li>\n<li><p><strong>Attachments<\/strong> \u2014 <code>POST \/storefront\/v1\/quote-upload<\/code> and\nPOST \/storefront\/v1\/wholesale-upload. Quote-request files only when the merchant switched on\n\"Allow attachments on quote requests\" (off by default); wholesale-application files only for a\nsigned-in customer; both only when the TackQuote server's connection check (<code>ping<\/code>) lists\nattachments. Sent when a shopper attaches a file. Sends the file's bytes (a PDF, JPEG or PNG of\nat most 5 MB, checked on your store first) and its file name, plus, for a signed-in customer, the\naccount email address and WordPress user ID (<code>buyerEmail<\/code>, <code>buyerExternalId<\/code>); for a wholesale\nform also the form slug and field key. A guest's quote files carry no identity, only the\nsingle-use upload token TackQuote issues. Files are streamed from your server and never stored\non your site. The quote request then sends the upload IDs (<code>uploadIds<\/code>) and, for a guest, the\ntoken (<code>uploadToken<\/code>). TackQuote deletes a file that was never attached to a request after 24\nhours (quote files) or 7 days (application files); attached files are kept with the quote or\napplication for the seller.<\/p><\/li>\n<li><p><strong>Connect with TackQuote<\/strong> (since 1.11.0) \u2014 <code>POST \/woocommerce-connect\/requests<\/code> and\nPOST \/woocommerce-connect\/exchange. Sent only when an administrator presses \"Connect with\nTackQuote\" on the Connection tab, and carry no API key. The first sends your store's address\n(<code>home_url()<\/code>), its WordPress admin address, the return address on your own site\n(<code>wp-admin\/admin-post.php?action=tackquote_connect_return<\/code>), the site name, the plugin,\nWordPress and WooCommerce versions, the site language, a random value signed by your site,\nand a one-way code challenge (SHA-256 of a secret that stays on your site). No customer,\norder or product data. Your browser then signs in to TackQuote (or creates an account),\napproves or cancels, and returns to your site with a one-time code. The second call sends\nthat code, the secret behind the code challenge, and your store's address, and TackQuote\nanswers once with an API key, which is stored exactly like a pasted one.<\/p><\/li>\n<li><p><strong>Revoke a Connect key<\/strong> (since 1.11.0) \u2014 <code>POST \/integrations\/woocommerce\/plugin-key\/revoke<\/code>.\nSent only when an administrator presses \"Remove saved API key\" and the saved key came from\nConnect with TackQuote. Sends that key (to say which key to revoke) and nothing else. A key you\npasted is never revoked: it is only deleted from your site.<\/p><\/li>\n<li><p><strong>Your quote request form<\/strong> (since 1.12.0) \u2014 <code>GET \/storefront\/v1\/quote-form?locale=<\/code>.\nSent on storefront page views while quote buttons are on and TackQuote's connection test\nlists <code>quote-form<\/code>, at most every five minutes per language. Sends your API key and the\nvisitor's language only: no customer data.<\/p><\/li>\n<\/ol>\n\n<p>Quick order (since 1.12.0) sends nothing to TackQuote: SKUs are matched in your own catalogue.<\/p>\n\n<ol>\n<li><p><strong>Catalogue and order sync<\/strong> (since 1.12.0, needs a TackQuote server that offers it) \u2014\nPOST \/integrations\/woocommerce\/rest-keys\/authorize and <code>GET \/integrations\/woocommerce\/rest-keys\/status<\/code>.\nSent on \"Allow catalogue and order sync\", or right after Connect with TackQuote. The first call sends your site's <code>wp-admin\/admin-post.php<\/code> address, and your browser\nopens WooCommerce's own approval screen. If you approve, <strong>WooCommerce itself<\/strong> creates a\nRead\/Write REST API key and sends it to TackQuote directly; this plugin never sees it. The\nstatus call sends nothing but the headers above. TackQuote then uses that key to read your\nproducts, stock and categories, register store webhooks and write orders back; you can revoke it\nunder WooCommerce \u2192 Settings \u2192 Advanced \u2192 REST API at any time; deleting this plugin deletes it once\nTackQuote confirms it let go of it.<\/p><\/li>\n<li><p><strong>Plugin deactivated or deleted<\/strong> (since 1.12.0) \u2014 <code>POST \/integrations\/woocommerce\/plugin-lifecycle<\/code>.\nSent once when the plugin is deactivated or deleted (not when WordPress updates it), so TackQuote\npauses a connection that runs through the plugin only. Sends <code>deactivated<\/code> or <code>uninstalled<\/code> and the\nheaders above.<\/p><\/li>\n<li><p><strong>Update check of the zip from the TackQuote website<\/strong> (since 1.12.0; not in the WordPress.org\nbuild) \u2014 <code>GET https:\/\/api.github.com\/repos\/tackquote\/woocommerce\/releases\/latest<\/code>, at most every\ntwelve hours, by WordPress's own update check. Sends nothing about your store beyond the plugin\nversion in the User-Agent. The update itself downloads <code>tackquote.zip<\/code>\nfrom the TackQuote GitHub release. GitHub privacy statement:\nhttps:\/\/docs.github.com\/site-policy\/privacy-policies\/github-general-privacy-statement<\/p><\/li>\n<li><p><strong>TackQuote inside WooCommerce admin<\/strong> (since 1.12.0, needs a TackQuote server that offers it) \u2014\nPOST \/integrations\/woocommerce\/embed\/open, <code>POST \/integrations\/woocommerce\/embed\/claim<\/code> and\nPOST \/integrations\/woocommerce\/embed\/unlink. Sent only when a user who can manage WooCommerce opens\nWooCommerce \u2192 TackQuote or presses its buttons. Sends that user's WordPress user ID, a random secret\nkept in their user meta and, to open, <code>purpose<\/code> (<code>frame<\/code> in the page or <code>tab<\/code> for a new tab); linking\nalso sends the one-time code they typed and their login name. No customer or order data.<\/p><\/li>\n<\/ol>\n\n<p>This plugin sends data to no other external service.<\/p>\n\n<p>The TackQuote service is provided by TackQuote. By using this plugin you agree to their\nterms. Please review them before entering an API key:<\/p>\n\n<ul>\n<li>Terms of Service: https:\/\/tackquote.com\/terms<\/li>\n<li>Privacy Policy: https:\/\/tackquote.com\/privacy<\/li>\n<\/ul>\n\n<h3>Privacy<\/h3>\n\n<p>This plugin sends data to TackQuote, a third-party service, over HTTPS. It sends nothing anywhere else, and it never sends payment card data.<\/p>\n\n<h4>Where data is sent<\/h4>\n\n<p>To the TackQuote API base URL set under <strong>TackQuote \u2192 TackQuote API URL<\/strong>: <code>https:\/\/api.tackquote.com\/v1<\/code> unless your TackQuote support contact gave you another one. <strong>External services<\/strong> above lists every endpoint the plugin calls, when it calls it and exactly what it sends, and the headers every request carries. The B2B features call TackQuote only when you switch them on, and order sync is off by default.<\/p>\n\n<h4>The full lists<\/h4>\n\n<p>Every field the plugin sends, and everything it stores on your site and deletes on uninstall, is listed in the FAQ below.<\/p>\n\n<h4>If you are a merchant in the EU, UK or another jurisdiction with a transfer regime<\/h4>\n\n<p>Order sync sends personal data about your customers to TackQuote, which makes\nTackQuote a processor acting on your instructions. That is why it ships switched\n<strong>off<\/strong>. Before you\nenable it, satisfy yourself that you have a lawful basis and, where required, a data\nprocessing agreement in place with TackQuote. Your own privacy policy should name\nTackQuote as a recipient; the plugin adds suggested wording to\n<strong>Settings \u2192 Privacy \u2192 Policy guide<\/strong>, listing the same fields, for you to review and adapt.<\/p>\n\n<!--section=installation-->\n<p>WooCommerce must be installed and active first, and you need a TackQuote account \u2014\n<a href=\"https:\/\/app.tackquote.com\/register\">create one here<\/a> if you do not have one yet.<\/p>\n\n<h4>Install<\/h4>\n\n<ol>\n<li>In WP Admin go to <strong>Plugins \u2192 Add New<\/strong>, search for <strong>TackQuote<\/strong>, and click <strong>Install Now<\/strong>.<\/li>\n<li>Activate <strong>TackQuote: Request a Quote &amp; B2B Wholesale for WooCommerce<\/strong>.<\/li>\n<li>Open <strong>TackQuote<\/strong> in the admin menu.<\/li>\n<li>On the <strong>Connection<\/strong> tab press <strong>Connect with TackQuote<\/strong>, sign in to TackQuote (or create an account) and approve; you come back to the Connection tab connected. Or paste your <strong>TackQuote API Key<\/strong> (TackQuote \u2192 Settings \u2192 Developer \u2192 API Keys) and save. Leave the API URL as the default unless support gives you another base URL.<\/li>\n<li>Work down the numbered sections in order \u2014 they are arranged as a setup sequence, and each one only depends on the ones above it. Then click <strong>Save TackQuote settings<\/strong>.<\/li>\n<li>Click <strong>Test TackQuote connection<\/strong> to verify (Connect with TackQuote runs this test for you).<\/li>\n<\/ol>\n\n<p>Before you enter an API key, read the <strong>External services<\/strong> section above: the plugin cannot\ncreate quotes without sending data to the TackQuote API.<\/p>\n\n<h4>Manual install<\/h4>\n\n<ol>\n<li>Download <code>tackquote.zip<\/code> from <a href=\"https:\/\/github.com\/tackquote\/woocommerce\/releases\">the releases page<\/a>, or build it from source with <code>bash bin\/build.sh<\/code>.<\/li>\n<li>In WP Admin go to <strong>Plugins \u2192 Add New \u2192 Upload Plugin<\/strong>, upload the ZIP, and choose <strong>Replace current with uploaded<\/strong> if an older copy is already installed.<\/li>\n<li>Activate, then follow steps 3\u20136 above.<\/li>\n<li>Your API key and toggles are stored as WordPress options and are preserved across updates.<\/li>\n<\/ol>\n\n<!--section=faq-->\n<dl>\n<dt id=\"where%20do%20i%20get%20an%20api%20key%3F\"><h3>Where do I get an API key?<\/h3><\/dt>\n<dd><p>You may not need one: press <strong>Connect with TackQuote<\/strong> on the plugin's Connection tab, sign in and approve, and TackQuote creates a key for this store and sends it back to your site directly. To paste one by hand instead, in TackQuote go to <strong>Settings \u2192 Developer \u2192 API Keys<\/strong>.<\/p><\/dd>\n<dt id=\"does%20connect%20with%20tackquote%20work%20on%20a%20local%20or%20staging%20site%3F\"><h3>Does Connect with TackQuote work on a local or staging site?<\/h3><\/dt>\n<dd><p>It needs your site to use https. A development address (such as a <code>.test<\/code> name or a private IP) may use plain http. Other http sites can paste an API key instead.<\/p><\/dd>\n<dt id=\"does%20it%20work%20with%20high-performance%20order%20storage%20%28hpos%29%3F\"><h3>Does it work with High-Performance Order Storage (HPOS)?<\/h3><\/dt>\n<dd><p>Yes. The plugin declares HPOS (<code>custom_order_tables<\/code>) compatibility via WooCommerce <code>FeaturesUtil<\/code> and uses the WooCommerce order CRUD APIs (<code>wc_get_order<\/code>, order status hooks) rather than direct <code>wp_posts<\/code> order queries. You can run with HPOS enabled.<\/p><\/dd>\n<dt id=\"is%20order%20sync%20bidirectional%3F\"><h3>Is order sync bidirectional?<\/h3><\/dt>\n<dd><p>No. Sync is one-way: WooCommerce \u2192 TackQuote on order create and status change. Turning the toggle off stops new pushes; it does not delete data already in TackQuote.<\/p><\/dd>\n<dt id=\"my%20store%20collects%20a%20purchase-order%20number%20at%20checkout.%20can%20it%20be%20synced%3F\"><h3>My store collects a purchase-order number at checkout. Can it be synced?<\/h3><\/dt>\n<dd><p>Yes, with one line of code. WooCommerce core has no purchase-order field, and there is no\nmeta key this plugin could guess that would be right for every B2B extension \u2014 a guess that\nlooks correct and silently returns nothing is worse than an empty field. So the value is\nread through a filter your theme or a small site plugin fills in:<\/p>\n\n<pre><code>add_filter( 'tack_quotes_order_po_number', function ( $po, $order ) { return $order-&gt;get_meta( '_my_checkout_po_field' ); }, 10, 2 );\n<\/code><\/pre>\n\n<p>Replace <code>_my_checkout_po_field<\/code> with the meta key your checkout writes. Without this filter\nnothing is sent and TackQuote records no purchase-order number.<\/p><\/dd>\n<dt id=\"do%20the%20quote%20buttons%20replace%20checkout%2C%20or%20touch%20the%20woocommerce%20cart%3F\"><h3>Do the quote buttons replace checkout, or touch the WooCommerce cart?<\/h3><\/dt>\n<dd><p>No, and no. \"Add to Quote\" adds the product to a separate, browser-side quote list \u2014 it never touches the WooCommerce cart, stock, or totals. \"Checkout as Quote\" creates a quote request in TackQuote from that list's contents. Customers can still shop and check out through WooCommerce completely normally, at the same time, with no interaction between the two.<\/p><\/dd>\n<dt id=\"why%20doesn%27t%20%22add%20to%20quote%22%20send%20a%20quote%20request%20immediately%3F\"><h3>Why doesn't \"Add to Quote\" send a quote request immediately?<\/h3><\/dt>\n<dd><p>So shoppers can add multiple products before requesting one combined quote. Use the floating \"Quote list\" button (bottom-right) once you've added everything you want quoted, then click \"Checkout as Quote\".<\/p><\/dd>\n<dt id=\"can%20shoppers%20start%20a%20quote%20from%20the%20shop%20page%20or%20the%20cart%3F\"><h3>Can shoppers start a quote from the shop page or the cart?<\/h3><\/dt>\n<dd><p>Yes, since 1.10.0, and both are off until you switch them on under <strong>TackQuote \u2192 Storefront<\/strong>. \"Product cards\" adds \"Add to Quote\" to every simple product in the shop, category and search lists and (since 1.12.0) in product grids built with blocks, such as a Product Collection on your home page or related products; variable, grouped and external products link to their page instead, because a card cannot say which variation is wanted. \"Cart page\" adds \"Request a quote for your cart\" under Proceed to checkout on the classic cart, and (since 1.12.0) inside the Cart block, below the totals and above Proceed to checkout. It copies the cart into the quote list and leaves the WooCommerce cart as it was.<\/p><\/dd>\n<dt id=\"is%20there%20a%20quick%20order%20form%3F\"><h3>Is there a quick order form?<\/h3><\/dt>\n<dd><p>Yes, since 1.12.0. Put the shortcode <code>[tackquote_quick_order]<\/code> or the \"TackQuote quick order\" block on a page. Buyers type SKUs and quantities, or paste a list with one SKU and quantity per line, press \"Check items\", and then choose \"Add to cart\" or your \"Add to Quote\" label. SKUs are matched in your own catalogue; a variable product's own SKU asks the buyer to choose options on its page, and a variation's SKU is added as that variation. \"Add to cart\" uses WooCommerce's own add-to-cart rules, so quote-only products are offered for the quote list only.<\/p><\/dd>\n<dt id=\"can%20i%20use%20the%20quote%20request%20form%20i%20designed%20in%20tackquote%3F\"><h3>Can I use the quote request form I designed in TackQuote?<\/h3><\/dt>\n<dd><p>Yes, since 1.12.0, when your TackQuote server supports it: the quote modal then shows the form you designed in TackQuote (fields, conditional fields, files, dates on your calendar) instead of the built-in one. Nothing to switch on. If you never designed one, the built-in form stays. A form with a required file field needs <strong>Allow attachments on quote requests<\/strong> on; otherwise the built-in form is shown and the reason is written to the WooCommerce log.<\/p><\/dd>\n<dt id=\"how%20do%20i%20make%20a%20single%20product%20quote-only%3F\"><h3>How do I make a single product quote-only?<\/h3><\/dt>\n<dd><p>Edit the product and tick <strong>Quote only<\/strong> in the General tab of the product data panel. Add to Cart disappears for that product (and for every variation of a variable product), a hand-made <code>?add-to-cart=<\/code> link and the Cart\/Checkout blocks refuse it too, and a cart that already held it loses that line with a notice. Unlike the store-wide mode, this applies to shop managers as well, so your own test sees what customers see.<\/p><\/dd>\n<dt id=\"can%20i%20keep%20the%20cart%20for%20approved%20wholesale%20customers%20only%3F\"><h3>Can I keep the cart for approved wholesale customers only?<\/h3><\/dt>\n<dd><p>Yes. Turn on quote-only mode and choose \"Everyone except approved wholesale accounts\". The plugin asks TackQuote whether the signed-in customer's wholesale application is approved, and only then shows the cart. If TackQuote cannot be reached, the customer sees the quote-only catalogue (this one check fails closed, because it is a price gate). It needs the API key.<\/p><\/dd>\n<dt id=\"which%20features%20need%20a%20linked%20account%3F\"><h3>Which features need a linked account?<\/h3><\/dt>\n<dd><p>Prices, quantity breaks, order limits, the buyer-group badge and the price gate follow the customer's account email. Net terms, tax exemption and credit standing go only to customers the seller has linked to a TackQuote buyer: approving the customer's wholesale application or their net-terms application sent from this store links them (both carry the WordPress user id since 1.10.0), or the seller links the WordPress user under <strong>Buyers \u2192 buyer \u2192 WooCommerce customer<\/strong> in TackQuote. A matching email alone never links one, because WooCommerce does not verify the email at registration. If the email belongs to a buyer already linked to a different WordPress user, that customer gets none of these B2B features.<\/p><\/dd>\n<dt id=\"where%20do%20target%20prices%20on%20the%20quote%20page%20go%3F\"><h3>Where do target prices on the quote page go?<\/h3><\/dt>\n<dd><p>To the quote line, where the seller sees \"Buyer asked for \u2026\" beside your store price, which the quote keeps. A TackQuote server older than the attachments feature cannot take the field, so there they go into the request's note instead, one line per product (\"Target prices: \u2026\"), after the shopper's own message.<\/p><\/dd>\n<dt id=\"can%20i%20change%20how%20it%20looks%3F\"><h3>Can I change how it looks?<\/h3><\/dt>\n<dd><p>It takes your theme's look by default: every button is your theme's button (so Site Editor &gt; Styles &gt; Blocks\/Elements &gt; Button restyles them), fields and tables use WooCommerce's classes, and the drawer and quote form use your theme's colours and fonts. Under <strong>TackQuote \u2192 Storefront \u2192 Styling<\/strong> you can pick an accent colour for the quote buttons and launcher, or tick \"Use the theme's styles only\" to load layout rules alone. For finer changes, set CSS variables in Appearance &gt; Customize &gt; Additional CSS or the Site Editor's custom CSS, for example <code>:root { --tackquote-radius: 0; --tackquote-drawer-width: 26rem; }<\/code> (also <code>--tackquote-accent<\/code>, <code>--tackquote-surface<\/code>, <code>--tackquote-text<\/code>, <code>--tackquote-border<\/code>, <code>--tackquote-shadow<\/code>, <code>--tackquote-z-index<\/code>, <code>--tackquote-launcher-offset-x<\/code> \/ <code>-y<\/code>). Developers can copy any file from the plugin's <code>templates\/tackquote\/<\/code> folder (quote page, quote list drawer, volume table, wholesale and net-terms forms) into <code>yourtheme\/woocommerce\/tackquote\/<\/code> and edit it there, as with WooCommerce's own templates, and use the filters <code>tackquote_button_label<\/code>, <code>tackquote_button_classes<\/code>, <code>tackquote_theme_styles_only<\/code>, <code>tackquote_quote_page_args<\/code>, <code>tackquote_quote_list_drawer_args<\/code>, <code>tackquote_quantity_breaks_args<\/code> and <code>tackquote_storefront_form_args<\/code>. The full list is in <code>docs\/CUSTOMISATION.md<\/code> in the plugin's GitHub repository. A theme that overrides WooCommerce's grouped product template (<code>single-product\/add-to-cart\/grouped.php<\/code>) must keep its hidden <code>add-to-cart<\/code> input and the <code>quantity[&lt;product ID&gt;]<\/code> fields: the quote buttons find a grouped product's form and quantities through them.<\/p><\/dd>\n<dt id=\"which%20languages%20does%20it%20ship%20in%3F\"><h3>Which languages does it ship in?<\/h3><\/dt>\n<dd><p>English, plus German, Spanish, French, Italian, Japanese, Dutch and Brazilian Portuguese for the storefront text, in <code>languages\/<\/code> (machine-assisted from the TackQuote storefront catalogue; Italian awaits native review). A translate.wordpress.org language pack, when one exists, replaces the bundled file.<\/p><\/dd>\n<dt id=\"what%20does%20a%20quote%20request%20send%3F\"><h3>What does a quote request send?<\/h3><\/dt>\n<dd><p>Sent when a shopper submits the quote form, using only what they typed into it:<\/p>\n\n<ul>\n<li>Email address<\/li>\n<li>First name, last name<\/li>\n<li>Phone number (if provided)<\/li>\n<li>Company name, and any company fields the seller's registration policy requires (for example legal name, tax\/VAT ID, registration number, address, city, state, postal code, country, company phone, industry, employee count)<\/li>\n<li>The free-text note, if written (capped at 2,000 characters). On a TackQuote server older than the attachments feature, any target prices the shopper typed on the quote page are added to the note, one line per product<\/li>\n<li>The requested products: name, SKU, quantity, unit price excluding tax, the WooCommerce product ID and, from the quote page, the target price if the shopper typed one<\/li>\n<li>The store's currency code<\/li>\n<li>Attachments (only when \"Allow attachments on quote requests\" is on): each attached file's bytes and file name, sent before the request to <code>\/storefront\/v1\/quote-upload<\/code>, with the signed-in customer's account email address and WordPress user ID, or for a guest a single-use upload token; the request then carries the upload IDs and the guest token. Files are never stored on your site<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20do%20the%20b2b%20lookups%20and%20application%20forms%20send%3F\"><h3>What do the B2B lookups and application forms send?<\/h3><\/dt>\n<dd><ul>\n<li><strong>B2B lookups<\/strong>: the product SKU and quantity, the signed-in customer's email address, and their WordPress user ID (a number, sent only beside the email and only while they are signed in).<\/li>\n<li><strong>Wholesale application<\/strong>: exactly the answers the shopper typed into the seller's form, plus the WordPress user ID (<code>wooCustomerId<\/code>) when they are signed in. Files (signed-in customers only, when the TackQuote server supports attachments): each file's bytes and name, the form slug and field key, the account email address and WordPress user ID; the application then goes to <code>\/storefront\/v1\/wholesale-signup\/&lt;slug&gt;<\/code> with the same answers and the upload IDs.<\/li>\n<li><strong>Net-terms application<\/strong>: the account's own email address (never a typed one), the WordPress user ID, and the legal business name, phone, tax\/VAT ID, billing address, requested limit and terms, up to three trade references and notes the customer typed.<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20does%20order%20sync%20send%3F\"><h3>What does order sync send?<\/h3><\/dt>\n<dd><p>Sent for each order when it is created and when its status changes, if the merchant\nhas enabled <strong>Sync orders to TackQuote<\/strong>. This is the whole order. Read this list\nbefore switching order sync on.<\/p>\n\n<p><strong>The customer's identity and addresses<\/strong><\/p>\n\n<ul>\n<li>Billing address in full: first name, last name, company, street (both lines), city, state or county, postal code, country, email address and phone number<\/li>\n<li>Shipping address in full: the same fields, including shipping phone where WooCommerce holds one<\/li>\n<li>The WooCommerce customer ID, or <code>0<\/code> for a guest order<\/li>\n<li>The customer's order note, as they wrote it<\/li>\n<\/ul>\n\n<p><strong>The order<\/strong><\/p>\n\n<ul>\n<li>WooCommerce order ID, order number and status<\/li>\n<li>Currency, item subtotal, discount total, shipping total, tax total and order total<\/li>\n<li>Coupon codes applied<\/li>\n<li>A purchase-order number, from the optional checkout field (off by default) or the <code>tack_quotes_order_po_number<\/code> filter<\/li>\n<li>The quote reference, for an order placed through a quote checkout link<\/li>\n<li>Created, last-modified, paid and completed timestamps<\/li>\n<li>An idempotency key, so a repeated delivery of the same order state can be discarded<\/li>\n<\/ul>\n\n<p><strong>Payment<\/strong><\/p>\n\n<ul>\n<li>Payment method ID and its display title (for example <code>stripe<\/code> \/ \"Credit Card\")<\/li>\n<li>The gateway transaction ID, where the gateway recorded one<\/li>\n<li>Whether the order still needs payment, and when it was paid<\/li>\n<\/ul>\n\n<p><strong>No card numbers, no card details, and no gateway credentials are ever sent.<\/strong> The\ntransaction ID is a reference the gateway issued, not an instrument.<\/p>\n\n<p><strong>Line items<\/strong><\/p>\n\n<ul>\n<li>Product name, SKU, WooCommerce product ID and variation ID<\/li>\n<li>Quantity, line subtotal, line total and line tax<\/li>\n<li>Item meta \u2014 the variation attributes and any custom item fields your store records on a line (for example \"Size: Large\", \"Colour: Blue\"). If your checkout writes customer-supplied text onto a line item, it is included here<\/li>\n<li>Shipping lines: method title and cost. Fee lines: name and amount<\/li>\n<\/ul><\/dd>\n<dt id=\"what%20does%20the%20plugin%20store%20on%20my%20site%2C%20and%20what%20does%20deleting%20it%20remove%3F\"><h3>What does the plugin store on my site, and what does deleting it remove?<\/h3><\/dt>\n<dd><ul>\n<li>Plugin settings, as WordPress options: the TackQuote API key, API URL, button labels, and the feature toggles.<\/li>\n<li><code>tack_quotes_connect_secret<\/code> \u2014 a random value, created the first time Connect with TackQuote is pressed, that signs the connect request so this site can recognise the answer. Never sent anywhere. <code>tack_quotes_connected_via<\/code> (<code>connect<\/code> or <code>key<\/code>) and <code>tack_quotes_connected_at<\/code> record how and when the saved key arrived.<\/li>\n<li><code>tack_quotes_connect_&lt;hash&gt;<\/code> \u2014 a 15-minute transient holding one pending Connect with TackQuote (the code verifier, a hash of the signed value, the administrator's user ID and TackQuote's request ID), deleted when the administrator comes back. <code>tack_quotes_connect_notice_&lt;user id&gt;<\/code> \u2014 a 5-minute transient carrying the outcome to the settings page.<\/li>\n<li><code>tack_quotes_registration_config<\/code> \u2014 a transient caching the quote-form field policy for 15 minutes.<\/li>\n<li><code>tack_qr_*<\/code> \u2014 short-lived transients counting quote requests per visitor for rate limiting. They hold a salted hash of the visitor's IP address, never the address itself, and expire after 5 minutes.<\/li>\n<li><code>tack_quotes_wholesale_form_cache<\/code> \u2014 a transient caching wholesale form definitions for 5 minutes (60 seconds after a failure).<\/li>\n<li><code>tack_quotes_storefront_v1_missing<\/code> \u2014 a transient remembering for one hour that the TackQuote server has no <code>\/storefront\/v1<\/code> routes.<\/li>\n<li><code>tack_quotes_wholesale_form_missing<\/code> \u2014 a transient listing, for one day, the wholesale form slugs already logged as matching no form, so the log gets one line a day per slug.<\/li>\n<li><code>tack_quotes_server_capabilities<\/code> \u2014 a transient caching, for one day (ten minutes after a failed check), which optional features the TackQuote server advertises (for example <code>attachments<\/code>) and a 16-character SHA-256 prefix of the key it was read with (never the key).<\/li>\n<li><code>tack_qu_*<\/code>, <code>tack_qf_*<\/code>, <code>tack_qc_*<\/code> \u2014 ten-minute transients counting attachment uploads, applications and checkout links per visitor for rate limiting, keyed on a salted hash of the IP address, never the address. Each counter also has a <code>\u2026s<\/code> twin for the connecting address, which a client cannot forge. Attached files themselves are never written to your site: PHP's temporary copy is deleted as soon as the file has been sent.<\/li>\n<li><code>tack_quotes_storefront_failure<\/code> \u2014 a transient remembering, for one day, why TackQuote did not take a shopper's quote request when the reason is the store's to fix (the HTTP status, TackQuote's error code and message, and a 16-character SHA-256 prefix of the key, never the key), for the administrators' notice. Cleared when a quote request or a connection check succeeds.<\/li>\n<li><code>tack_quotes_connection_check<\/code> \u2014 a transient remembering for one day whether the settings page's last \"Test connection\" passed, when, the message shown, and a 16-character SHA-256 prefix of the key that was tested (never the key itself). It lets the Overview say \"Connected\" only for the key saved now.<\/li>\n<li><code>tack_sf_*<\/code> \u2014 two-minute transients carrying an application form's outcome (success or error text and what was typed, except phone numbers and tax, VAT or registration numbers, for refilling the form) back to the page after it is submitted. Read once and deleted.<\/li>\n<li><code>tack_quotes_vat_exempt_applied<\/code> \u2014 a WooCommerce session value remembering that this plugin set the customer tax exempt, so the exemption can be withdrawn. Never saved to the customer record.<\/li>\n<li>Net terms: <code>tack_nt_&lt;user id&gt;<\/code> (TackQuote's answer, one minute), order meta <code>_tackquote_net_terms<\/code> and <code>_tackquote_po_number<\/code>, option <code>woocommerce_tackquote_net_terms_settings<\/code>.<\/li>\n<li>Quote checkout: session value <code>tackquote_quote_checkout<\/code>, order meta <code>_tackquote_quote_ref<\/code> and <code>_tackquote_quote_number<\/code>.<\/li>\n<li><code>_tack_quotes_sync_key<\/code> \u2014 order meta recording which order state was last accepted by TackQuote, so the same state is not sent twice.<\/li>\n<li>Since 1.12.0: <code>tack_quotes_standing<\/code> \u2014 an option recording whether TackQuote still accepts this store's key (state, reason, a 16-character SHA-256 prefix of the key, never the key, and when it was checked), refreshed by the WP-Cron hook <code>tackquote_refresh_standing<\/code>; <code>tack_quotes_wc_rest_key_id<\/code> \u2014 WooCommerce's own id of the REST API key approved for TackQuote's catalogue and order sync (never the key).<\/li>\n<li>Since 1.12.0, transients: <code>tack_quotes_quote_form_cache<\/code> (your quote request form, five minutes, served up to 30 minutes longer while one request refreshes it, one minute after a failure); <code>tack_quotes_qf_refresh_*<\/code> (a 30-second lock so only one request refreshes it); <code>tack_quotes_quote_form_file_fallback<\/code> (one day, so the log notes once that the built-in form was shown); <code>tack_quotes_rest_keys_status<\/code> (the catalogue and order sync status, five minutes); the site transient <code>tack_quotes_github_release<\/code> (the latest GitHub release of the plugin, twelve hours, one hour after a failure; only in the zip from the TackQuote website); <code>tack_qo_*<\/code> and <code>tack_qa_*<\/code> (quick-order rate limits per visitor, five minutes, keyed on a salted hash of the IP address, never the address).<\/li>\n<li><p>Since 1.12.0: user meta <code>_tackquote_embed_secret<\/code> \u2014 a random per-user secret for TackQuote inside WooCommerce admin, sent only to TackQuote, server to server.<\/p><\/li>\n<li><p>User meta <code>_tack_known_email<\/code> (a copy of the account email), <code>_tack_email_unverified<\/code>, <code>_tack_mirrored_roles<\/code>, <code>_tack_role_mirror_checked<\/code>, <code>_tack_wholesale_applied<\/code> (when a wholesale application sent from the store was answered \"pending\"); product meta <code>_tackquote_quote_only<\/code>. Tools \u2192 Export\/Erase Personal Data covers the user meta, and WooCommerce's order export covers the order meta above. Erasure deletes only the purchase-order number, and only when WooCommerce's \"Remove personal data from orders on request\" is on; the quote reference, quote number and net terms are business records and stay.<\/p><\/li>\n<\/ul>\n\n<p>Deleting the plugin removes every option above, the fixed-name transients (and the site transient), the user meta, the product meta, queued order-sync jobs and the <code>tackquote_refresh_standing<\/code> schedule, on every site of a multisite network. It also deletes the WooCommerce REST API key approved for TackQuote, but only when TackQuote confirms it let go of that key and the key still has the name WooCommerce gave it; otherwise the key stays under WooCommerce \u2192 Settings \u2192 Advanced \u2192 REST API for you to revoke. Kept on purpose: <code>_tack_email_unverified<\/code> (no personal data; deleting it would trust a self-changed email again), the rate-limit counters (they expire within ten minutes and have no fixed name), and order meta (orders are financial records).<\/p><\/dd>\n\n<\/dl>\n\n<!--section=changelog-->\n<h4>1.12.0<\/h4>\n\n<p>Released 2026-10-26. Full notes for this and earlier releases are in <code>changelog.txt<\/code> in the plugin folder.<\/p>\n\n<ul>\n<li><strong>Your own quote request form<\/strong>, designed in TackQuote, in the quote modal (when your TackQuote server offers it).<\/li>\n<li><strong>Quick order<\/strong> by SKU (shortcode <code>[tackquote_quick_order]<\/code> and block), to the cart or the quote list.<\/li>\n<li><strong>Add to Quote on block product grids<\/strong>, and <strong>Request a quote for your cart<\/strong> inside the Cart block.<\/li>\n<li><strong>Net terms in the Checkout block<\/strong> follow the cart, and the method always has a label.<\/li>\n<li><strong>Catalogue and order sync with one approval<\/strong>, through a WooCommerce REST API key that WooCommerce sends to TackQuote directly (https only).<\/li>\n<li><strong>TackQuote inside WooCommerce admin<\/strong>: each person links their own WordPress login and is signed in as themselves.<\/li>\n<li><strong>Disconnect stand-down<\/strong>: when TackQuote revokes the store's key, the storefront quote features hide until the store is connected again. Deactivating or deleting the plugin tells TackQuote.<\/li>\n<li><strong>Update available<\/strong> notice, and the website's zip now receives WordPress updates.<\/li>\n<li>Quote lines for every product type: a grouped product is quoted as its products, one line each; a variation's \"Any\" choice stays on its line; quote-only, out-of-stock and external products get a quantity; a product sold individually is quoted as one.<\/li>\n<li>Store details (name, address, time zone, currency) and variation keys go to a TackQuote server that asks for them.<\/li>\n<li>Fixes from live testing: calmer shopper messages when the store's connection fails, a truthful Connection tab, quick order and card layout, the designed form's company field, optional addresses, and wording.<\/li>\n<li>WordPress and WooCommerce coding standards throughout; new storefront text in the seven bundled languages.<\/li>\n<\/ul>","raw_excerpt":"Add Request a Quote and a quote list to WooCommerce, with B2B wholesale prices, net terms and checkout at the quoted price.","jetpack_sharing_enabled":true,"_links":{"self":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin\/357776","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin"}],"about":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/types\/plugin"}],"replies":[{"embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/comments?post=357776"}],"author":[{"embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wporg\/v1\/users\/tackquote"}],"wp:attachment":[{"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/media?parent=357776"}],"wp:term":[{"taxonomy":"plugin_section","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_section?post=357776"},{"taxonomy":"plugin_tags","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_tags?post=357776"},{"taxonomy":"plugin_category","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_category?post=357776"},{"taxonomy":"plugin_contributors","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_contributors?post=357776"},{"taxonomy":"plugin_business_model","embeddable":true,"href":"https:\/\/dv.wordpress.org\/plugins\/wp-json\/wp\/v2\/plugin_business_model?post=357776"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}