Directory / plugin

TackQuote: Request a Quote & B2B Wholesale for WooCommerce

v1.13.1 · by TackQuote

Add Request a Quote and a quote list to WooCommerce, with B2B wholesale prices, net terms and checkout at the quoted price.

About this plugin

TackQuote: Request a Quote & B2B Wholesale for WooCommerce 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).

Setup is one button: press Connect with TackQuote, sign in or create an account, and approve. Pasting an API key still works.

Learn more about the WooCommerce integration · Create a free TackQuote account

Features

  • Add to Quote and Request a Quote buttons on product pages, product cards and the cart.
  • A floating quote list with Checkout as Quote, a quote page with target prices, and your own quote request form designed in TackQuote.
  • Quick order by SKU, to the cart or the quote list.
  • Quote-only mode for the whole store, signed-out visitors, chosen roles or all but approved wholesale accounts, or per product.
  • B2B pricing (account prices, volume tables), order limits, a buyer-group badge and tax-exempt buyers.
  • Per buyer group: hidden product categories, free or discounted shipping, an optional WordPress role.
  • Wholesale and net-terms application forms, and a Net terms payment method with an optional PO number.
  • Accepted quote checkout at the quoted prices.
  • Optional one-way order sync, off by default and queued so it never runs inside checkout; with one more approval, TackQuote’s catalogue and order sync through a WooCommerce REST API key.
  • TackQuote inside WooCommerce admin, each person signed in as themselves.
  • Works with HPOS, the Cart and Checkout blocks, and block and classic themes. Storefront text in English and seven more languages.

The FAQ lists exactly what the plugin sends and stores.

What it does not do

  • It does not replace WooCommerce checkout or act as a full CPQ workspace.
  • 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.
  • Failed syncs are logged (WooCommerce Status Logs, source tackquote) and never block checkout.

Source code: github.com/tackquote/woocommerce.

External services

This plugin connects to the TackQuote API, a third-party B2B quoting service operated by
TackQuote, to send quote requests that shoppers submit on your store and — only if you
switch it on — to send data about orders placed in your store.

The service is required for the plugin to work. Until the store is connected, quote requests
cannot be sent. Nothing is sent anywhere
until you enter an API key or press Connect with TackQuote.

All requests go to the API base URL set under TackQuote Settings Connection Advanced, which is
https://api.tackquote.com/v1 unless your TackQuote support contact gave you a different
one. Every request (except the two Connect with TackQuote calls in item 12, made before the
store has a key) carries your TackQuote API key so the service can identify your account,
and (since 1.10.0) headers naming this plugin’s version (X-TackQuote-Plugin-Version) and the
store’s address (X-TackQuote-Site-Url), so TackQuote can tell which build and store sent it. The API key needs the buyers:write scope for
the two application forms below; the read-only storefront lookups need no extra scope.

  1. Connection test — GET /integrations/woocommerce/ping; on 404, GET /health (key unverified).
    Sent when an administrator clicks “Test TackQuote connection”, at most daily from the storefront
    for item 11, and since 1.12.0 at most every ten minutes in the background (never during a
    shopper’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 Settings General). No order or customer data.

  2. Quote form field policy — GET /integrations/woocommerce/registration-config.
    Sent on storefront page views while quote buttons are on, at most every 15 minutes. Your API key and the store’s address.

  3. Quote request — POST /integrations/woocommerce/quote-requests.
    Sent when a shopper submits the quote form. Sends what that shopper typed
    into the form, plus the products being quoted: email address, first and last name, phone
    number if given, company name and any company details the seller’s registration policy
    requires (legal name, tax/VAT ID, registration number, website, address, city, state, postal
    code, country, company phone, industry, employee count), answers to the seller’s registration
    questions, the free-text note if written, and
    for each requested product its name, SKU, quantity, unit price excluding tax, WooCommerce
    product ID (since 1.12.0, a variation as <product ID>_<variation ID> on a server that supports it) and any target price, together with the store’s currency code. Since 1.12.0, when
    the quote modal shows the form you designed in TackQuote, it sends that form’s answers instead
    (what the shopper typed into each of your fields, and the upload ids of any files) together with
    the form version shown, and the same products.

  4. Order sync — POST /integrations/woocommerce/order-sync. Off by default.
    Sent when an order is created and each time its status changes, but only if the merchant has
    switched on “Sync orders to TackQuote” (since 1.13.0 in TackQuote; the store can still turn it off). Sends the whole order: the customer’s billing and
    shipping addresses, email address and phone numbers, WooCommerce customer ID, their order
    note, the order ID, number and status, currency and totals, coupon codes, timestamps, the
    payment method ID and title, the payment gateway’s transaction ID, and every line item with
    its name, SKU, product and variation IDs, quantities, totals, taxes and item meta. No card
    numbers, no card details and no gateway credentials are ever sent. The FAQ lists every field.

  5. B2B pricing, order limits and buyer group — POST /storefront-pricing/resolve (cart
    prices), GET /storefront/v1/wholesale-price, GET /storefront/v1/quantity-breaks,
    GET /storefront/v1/order-limits and GET /storefront/v1/buyer-group, falling back to
    /storefront-b2b/order-limits and /storefront-b2b/buyer-group on older servers. Only when the merchant has switched on B2B pricing,
    order limits, the buyer-group badge, any buyer-group rule or tax-exempt buyers. Sent while
    customers browse (order limits also for guests). Sends the product SKU and quantity and, for
    a signed-in customer, their email address and WordPress user ID (digits only).

  6. Wholesale application — GET /integrations/woocommerce/wholesale-form (the form’s
    fields, by form slug; sends no customer data) and POST /integrations/woocommerce/wholesale-form/submit.
    Sent when a page with the [tackquote_wholesale_application] shortcode or the “Wholesale account”
    My Account tab is viewed, and when a shopper submits that form. Sends the answers the shopper
    typed into the seller’s form (for example company name, email, phone, address, tax ID) and,
    for a signed-in customer, their WordPress user ID as wooCustomerId. An application that carries
    files is sent instead to POST /storefront/v1/wholesale-signup/<slug> with the same
    answers, the signed-in customer’s account email address and WordPress user ID
    (buyerEmail, buyerExternalId), and the upload IDs of item 11.

  7. Net-terms application — POST /storefront/v1/credit-application, falling back to
    POST /integrations/woocommerce/credit-application on an older TackQuote server. Signed-in
    customers only, when they submit the “Net terms” form. Sends the account’s email address, the
    WordPress user ID (in the query, v1 route only), and what the customer typed: legal business
    name, contact phone, tax/VAT ID, billing address, requested credit limit, requested payment
    terms, up to three trade references (company, contact name, email, phone) and notes.

  8. Wholesale price gate and Wholesale account tab — GET /storefront/v1/price-access. Off by default.
    Sent only when the merchant chose the quote-only scope “Everyone except approved wholesale
    accounts”, or (since 1.11.0) when a signed-in customer opens the “Wholesale account” My Account
    tab or a page with the [tackquote_wholesale_application] shortcode, at most once every five minutes per customer
    (one minute after a failure). Sends that customer’s account email address and their
    WordPress user ID (buyerEmail, buyerExternalId). TackQuote answers whether that buyer’s
    wholesale application is approved. Nothing is sent for a signed-out visitor.

  9. Net terms — GET /storefront/v1/net-terms. Sent for a signed-in customer at checkout
    while the “Net terms (TackQuote)” payment method is enabled (off by default), and when a
    signed-in customer views the “Net terms” My Account tab or the [tackquote_net_terms_application]
    shortcode (the tab is off by default). Sends the account email and WordPress user ID. One answer per customer is reused for
    up to a minute. Fails closed: without an answer, checkout hides the method and the tab shows
    the application form.

  10. Accepted quote checkout — GET /integrations/woocommerce/quote-checkout/<token>, when a
    buyer opens a TackQuote checkout link (?tackquote_checkout=) on your store. Sends only the
    link’s single-use token and your API key.

  11. Attachments — POST /storefront/v1/quote-upload and
    POST /storefront/v1/wholesale-upload. Quote-request files only when the merchant switched on
    “Allow attachments on quote requests” (off by default); wholesale-application files only for a
    signed-in customer; both only when the TackQuote server’s connection check (ping) lists
    attachments. Sent when a shopper attaches a file. Sends the file’s bytes (a PDF, JPEG or PNG of
    at most 5 MB, checked on your store first) and its file name, plus, for a signed-in customer, the
    account email address and WordPress user ID (buyerEmail, buyerExternalId); for a wholesale
    form also the form slug and field key. A guest’s quote files carry no identity, only the
    single-use upload token TackQuote issues. Files are streamed from your server and never stored
    on your site. The quote request then sends the upload IDs (uploadIds) and, for a guest, the
    token (uploadToken). TackQuote deletes a file that was never attached to a request after 24
    hours (quote files) or 7 days (application files); attached files are kept with the quote or
    application for the seller.

  12. Connect with TackQuote (since 1.11.0) — POST /woocommerce-connect/requests and
    POST /woocommerce-connect/exchange. Sent only when an administrator presses “Connect with
    TackQuote” on the Connection tab, and carry no API key. The first sends your store’s address
    (home_url()), its WordPress admin address, the return address on your own site
    (wp-admin/admin-post.php?action=tackquote_connect_return), the site name, the plugin,
    WordPress and WooCommerce versions, the site language, a random value signed by your site,
    and a one-way code challenge (SHA-256 of a secret that stays on your site). No customer,
    order or product data. Your browser then signs in to TackQuote (or creates an account),
    approves or cancels, and returns to your site with a one-time code. The second call sends
    that code, the secret behind the code challenge, and your store’s address, and TackQuote
    answers once with an API key, which is stored exactly like a pasted one.

  13. Revoke a Connect key (since 1.11.0) — POST /integrations/woocommerce/plugin-key/revoke.
    Sent only when an administrator presses “Remove saved API key” and the saved key came from
    Connect with TackQuote. Sends that key (to say which key to revoke) and nothing else. A key you
    pasted is never revoked: it is only deleted from your site.

  14. Your quote request form (since 1.12.0) — GET /storefront/v1/quote-form?locale=.
    Sent on storefront page views while quote buttons are on and TackQuote’s connection test
    lists quote-form, at most every five minutes per language. Sends your API key and the
    visitor’s language only: no customer data.

Quick order (since 1.12.0) sends nothing to TackQuote: SKUs are matched in your own catalogue.

  1. Catalogue and order sync (since 1.12.0, needs a TackQuote server that offers it) —
    POST /integrations/woocommerce/rest-keys/authorize and GET /integrations/woocommerce/rest-keys/status.
    Sent on “Allow catalogue and order sync”, or right after Connect with TackQuote. The first call sends your site’s wp-admin/admin-post.php address, and your browser
    opens WooCommerce’s own approval screen. If you approve, WooCommerce itself creates a
    Read/Write REST API key and sends it to TackQuote directly; this plugin never sees it. The
    status call sends nothing but the headers above. TackQuote then uses that key to read your
    products, stock and categories, register store webhooks and write orders back; you can revoke it
    under WooCommerce Settings Advanced REST API at any time; deleting this plugin deletes it once
    TackQuote confirms it let go of it.

  2. Plugin deactivated or deleted (since 1.12.0) — POST /integrations/woocommerce/plugin-lifecycle.
    Sent once when the plugin is deactivated or deleted (not when WordPress updates it), so TackQuote
    pauses a connection that runs through the plugin only. Sends deactivated or uninstalled and the
    headers above.

  3. Update check of the zip from the TackQuote website (since 1.12.0; not in the WordPress.org
    build) — GET https://api.github.com/repos/tackquote/woocommerce/releases/latest, at most every
    twelve hours, by WordPress’s own update check. Sends nothing about your store beyond the plugin
    version in the User-Agent. The update itself downloads tackquote.zip
    from the TackQuote GitHub release. GitHub privacy statement:
    https://docs.github.com/site-policy/privacy-policies/github-general-privacy-statement

  4. TackQuote inside WordPress admin (since 1.12.0, needs a TackQuote server that offers it) —
    POST /integrations/woocommerce/embed/open, POST /integrations/woocommerce/embed/claim and
    POST /integrations/woocommerce/embed/unlink. Sent only when a user who can manage WooCommerce opens
    TackQuote Dashboard or presses its buttons. Sends that user’s WordPress user ID, a random secret
    kept in their user meta and, to open, purpose (frame or tab); linking also sends the one-time
    code typed and their login name (1.13.0: …/embed/link-requests, …/link-exchange). No customer or
    order data.

  5. Store settings (since 1.13.0) — GET /integrations/woocommerce/store-settings every
    ten minutes and when settings open; headers only. PUT …/from-plugin sends settings you change and
    your WordPress user ID. While TackQuote holds none, POST …/seed sends the five switches and the form slug.

This plugin sends data to no other external service.

The TackQuote service is provided by TackQuote. By using this plugin you agree to their
terms. Please review them before entering an API key:

  • Terms of Service: https://tackquote.com/terms
  • Privacy Policy: https://tackquote.com/privacy

Privacy

This plugin sends data to TackQuote, a third-party service, over HTTPS. It sends nothing anywhere else, and it never sends payment card data.

Where data is sent

To the TackQuote API base URL set under TackQuote Settings Connection Advanced: https://api.tackquote.com/v1 unless your TackQuote support contact gave you another one. External services above lists every call, when it is made and what it sends. The B2B features and order sync call TackQuote only when switched on.

The full lists

Every field the plugin sends, and everything it stores on your site and deletes on uninstall, is listed in the FAQ below.

If you are a merchant in the EU, UK or another jurisdiction with a transfer regime

Order sync sends personal data about your customers to TackQuote, which makes
TackQuote a processor acting on your instructions. That is why it ships switched
off. Before you
enable it, satisfy yourself that you have a lawful basis and, where required, a data
processing agreement in place with TackQuote. Your own privacy policy should name
TackQuote as a recipient; the plugin adds suggested wording to
Settings Privacy Policy guide, listing the same fields, for you to review and adapt.

Plugin tags