HULO Quotations

Description

HULO Quotations turns “can you send me a quote?” into a tidy, trackable workflow on any WordPress site: customers ask, you price the quote and e-mail it from your site, they accept it online, and with HULO Payments they pay straight away.

Customers ask for a quote

  • A “Quote request form” block, or the [hulo_quote_request] shortcode, on any page. [hulo_quote_request item="ID"] asks about one saved catalogue item.
  • Each request lands under HULO Quotations as a requested quote, with known items already priced. You get an e-mail with the details, and the customer gets an acknowledgement with their reference (your own wording; at most one a day per address, and nothing the requester typed is copied into it).
  • A hidden honeypot field and a limit of 10 requests an hour per visitor address and per e-mail address keep bots and floods out. Behind a proxy or CDN, list it in HULO_TRUSTED_PROXIES (see the FAQ).
  • Works on cached pages: visitors who are not signed in need no expiring WordPress nonce to send the form.

Build and price quotes

  • Quote builder with free-text lines and your own saved catalogue items (name, SKU, price, tax rate), quantities, per-line discounts, a quote-level percent or fixed discount, VAT, validity, notes, terms and internal notes. Prices can be typed as 1,850.00 or 1.850,00.
  • Quote in another currency when you need to: each quote keeps its amounts in its own currency (nothing is converted), and the figures and reports show each currency’s total on its own line.
  • Link a quote to a WordPress user (find any account by name, e-mail address or username), and choose the member of staff the quote is “prepared by”.
  • Safe sequential numbering (prefix-year-number, never issued twice, even under load).

Send, accept, track

  • “Send to customer” e-mails the quote from your site: your own subject and text, a button to the customer’s quote page, and the branded PDF attached. It is sent as the member of staff who prepared the quote (their name on the From line, replies to them). “Test send” shows you the e-mail and PDF exactly as the customer will see them.
  • Prefer to send it yourself? “Mark as sent” opens the quote for the customer’s response; then share the PDF or the customer link however you like, or let “Write the e-mail in your mail app” open a ready-written message in your own e-mail program.
  • Preview the customer’s page and the e-mail before you send. Your own visits while signed in are never counted as the customer opening the quote.
  • The customer’s quote page shows the lines and totals, prints cleanly, offers the PDF, and lets them accept with a typed-name signature or decline. You are e-mailed the response.
  • Reminders, checked every hour: one reminder for a quote the customer has not opened after a number of days you choose, and one shortly before a quote expires. Each goes out at most once per quote.
  • Every step lands in the quote’s activity trail: created, sent, opened, reminded, accepted or declined, paid, expired, comments. Optional “first opened” e-mail to you.
  • Each quote is valid for a number of days from the day it is sent; it expires on its own at the end, and you can extend or revive it in one click. Duplicate a quote, or revise it (the original is superseded so only one version can be accepted).
  • Take payment with HULO Payments, our own payments plugin: when the customer accepts, a pay link is created at exactly the quoted total and they go straight to the payment page. Prefer to check first? Switch that off and create the pay link from the quote, then e-mail it to the customer in one click. When the payment succeeds, the quote is marked paid.

My quotes and reports

  • The “My quotes” block or [hulo_my_quotes] lists the quotes linked to the signed-in user’s account (picked in the builder, or requested while signed in) with view, PDF and pay links.
  • The Quotes list has status views, search and figures (requests waiting, open pipeline, 30-day win rate and value won, average response time). Reports show quotes by status and the last 12 months.

With WooCommerce

  • Quote your products and variations in the builder (they take the place of saved catalogue items), and pick existing customers.
  • A request panel on product pages, on the classic cart and below the Cart block; basket requests copy the shopper’s cart.
  • My Account Quotes. Money uses your shop’s currency and format, and e-mails go through the shop’s mailer in its e-mail template.
  • Compatible with HPOS (custom order tables) and the Cart and Checkout blocks.

Quotations Pro

Everything above is free, with no limits. HULO Quotations Pro is a separate add-on from huloglobal.com that adds deposits with a separate balance payment, discount approval before quotes go out, quote templates, follow-up e-mail sequences, webhooks with Slack and Teams alerts, sales reports per member of staff with CSV export, a weekly e-mail report and, on WooCommerce shops, shop orders from accepted quotes.

External services

This plugin does not connect to any external service and sends no data to HULO Global or any third party. Everything happens on your own site:

  • E-mail is sent by your site through wp_mail() (on a shop, through its mailer), so your own mail or SMTP setup applies: quotes, reminders, request acknowledgements and payment links to your customers, and new requests, responses and the optional “first opened” notice to you.
  • Pay links are created by the HULO Payments plugin, if you install it, on your own site; it connects to the payment provider you set up there (see its own readme).
  • PDFs are generated on your server; no conversion service is used.
  • The quote page, the request form and the admin screens load only this plugin’s own files and WordPress’s bundled scripts.
  • If you enter a logo URL in Settings, the quote page and e-mails show the image from the address you entered.

Screenshots

Blocks

This plugin provides 2 blocks.

  • Quote request form
  • My quotes

Installation

  1. In Plugins Add New Plugin, search for “HULO Quotations”, then install and activate it (or upload the zip).
  2. Go to HULO Quotations Settings: add your business name, currency, reply-to and notification addresses.
  3. Add your regular items under Catalogue items (on a shop, your products are used instead).
  4. Add the “Quote request form” block to a page, and the “My quotes” block to another if your customers have accounts.
  5. Click New quote to build your first quote.

FAQ

Do I need WooCommerce?

No. Everything works on a plain WordPress site with saved catalogue items and free-text lines. If you do use it, your products, the cart panel and My Account join in. To take payment for accepted quotes, install HULO Payments, our own payments plugin.

How do I send a quote to my customer?

Click “Send to customer” on the quote. Your site e-mails the customer your message with a button to their quote page and the PDF attached, and the quote is open for their response. Use “Test send” first to see it yourself. To send it another way, click “Mark as sent”, then share the PDF or the customer link however you like, or click “Write the e-mail in your mail app” to open a ready-written message in your own e-mail program.

Does it chase customers who have not replied?

Yes. Under Settings Reminders, choose after how many days a customer who has not opened a quote gets one reminder, and how many days before a quote expires the customer is reminded. Both are checked every hour, and each goes out at most once per quote. Set either to off if you prefer to follow up yourself.

Can the customer pay an accepted quote online?

Yes, with HULO Payments, our own payments plugin: acceptance creates a pay link at the quoted total and takes the customer to the payment page, and the payment marks the quote paid. Without a payments plugin, acceptance is recorded and you are notified, and you take payment your usual way.

How are VAT and discounts calculated?

Line total = quantity × unit price × (100 − line discount) / 100. The quote discount is taken from the sum of the lines, VAT is charged on the discounted amount. All money is stored in whole minor units of the quote’s currency (pence, cents; whole yen) and rounded once per figure. On a shop, figures are rounded to the number of decimals it shows, so a shop without pence quotes whole pounds.

Can the PDF show my language?

The PDF is made on your server with the standard PDF fonts, which cover English and the other Western European languages. Other accented Latin letters print without their accent (Ł as L, ő as o), a currency symbol the fonts lack is printed as its code (PLN 2,500.00), and other scripts such as Greek, Cyrillic, Arabic or Chinese print as “?”. The quote builder tells you when a quote has such text. The customer’s quote page shows every language correctly, and its Print button can save the page as a PDF.

Does the request form work with page caching?

Yes. Visitors who are not signed in send the form without a WordPress nonce, so a page kept in a cache for days still works; the hidden honeypot field and the hourly limits per visitor address and per e-mail address protect the form instead. A signed-in visitor’s request is linked to their account, so their form still carries a nonce. If that has expired (the page was left open for a day or more), the form sends the request once more as a guest’s when JavaScript is on, and the form without JavaScript asks them to reload the page.

Is the customer link safe to share?

Each quote has its own 48-character random link, marked noindex. Customers see a quote there only once it has been sent; until then the link tells them it has not been sent yet. While you are signed in you can preview it at any time, and your own visits are not counted as the customer opening it.

My site is behind a proxy or CDN. Does the request limit still work?

By default the limit counts the address that connects to your site. If a reverse proxy or CDN sits in front and does not pass the visitor’s address on, every visitor would share one limit of 10 requests an hour. List your proxies in wp-config.php, for example define( 'HULO_TRUSTED_PROXIES', '203.0.113.10, 198.51.100.0/24' ); (addresses or CIDR ranges, comma-separated). The limit then counts each visitor separately, and the X-Forwarded-For and CF-Connecting-IP headers are read only on requests that come through those proxies.

Does the plugin send any data to HULO or anyone else?

No. The plugin makes no outbound connections; see “External services” below.

What happens to my data if I remove the plugin?

Nothing, unless you tick “Delete all quotes and settings when the plugin is deleted” in Settings first.

Reviews

There are no reviews for this plugin.

Contributors & Developers

“HULO Quotations” is open source software. The following people have contributed to this plugin.

Contributors

Translate “HULO Quotations” into your language.

Interested in development?

Browse the code, check out the SVN repository, or subscribe to the development log by RSS.

Changelog

0.1.3

  • New hulo_quotations_pre_send filter for extensions: it runs before a quote is sent, marked as sent or test-sent, and can stop it with a message. Nothing changes for sites that do not use it.

0.1.2

  • New: “Send to customer” e-mails the quote from your site, with a button to the customer’s quote page and the PDF attached (switchable), sent as the member of staff who prepared it; a first send starts the quote’s validity period, and a quote whose date has passed is revived before it is sent again. “Test send” e-mails it to you.
  • New: request acknowledgements. Each request gets an e-mail with its reference and the catalogue items asked for, in your own words, at most once a day per address and with a site-wide hourly cap; nothing the requester typed is copied into it.
  • New: reminders, checked every hour: one for a quote the customer has not opened after a number of days, and one a number of days before a quote expires (Settings Reminders).
  • New: with HULO Payments, acceptance creates a pay link at exactly the quoted total and takes the customer to it (or, if you prefer, create it from the quote yourself), and “E-mail the payment link” sends it to the customer.
  • The Quotes page no longer shows a box about the Pro add-on; Settings has one plain line about it instead.
  • The Quotes list’s “Order / payment” column is now “Payment”.

0.1.1

  • Security: “My quotes” lists only the quotes linked to the signed-in account (picked in the builder, or requested while signed in), never quotes matched by e-mail address alone; a request is linked to an account only when it is made while signed in.
  • New: behind a reverse proxy or CDN, define HULO_TRUSTED_PROXIES (comma-separated addresses or CIDR ranges) so the request limit counts each visitor separately; forwarding headers are read only from those proxies.
  • Fixed: opening a quote’s customer link while signed in as staff (to check it, or from the e-mail preview) no longer marks the quote as opened by the customer or sends the “first opened” e-mail, so the customer’s own first visit is the one recorded. Staff see the page with a note, and can preview a quote before it is sent.
  • Fixed: the link of a quote that has not been sent yet tells the customer so, instead of saying it was withdrawn. “Write the e-mail in your mail app” is offered once the quote is marked as sent, and PDFs include the accept-online link from then on.
  • Fixed: “Mark as sent” only opens drafts and requests. Using it again (from a second tab or after going back) no longer moves a quote the customer has opened back to “sent”, so their next visit is not reported as a first opening.
  • Fixed: the Quotes figures and Reports no longer add up quotes in different currencies. Open pipeline, value won and the value by status show one amount per currency, and the 30-day value won sent to the Pro weekly report counts quotes in the store currency only.
  • Fixed: on sites without a shop, the quote builder’s “WordPress user” field always shows the linked account, so saving a quote no longer unlinks it on sites with many users. Find any account by name, e-mail address or username; sites with up to 100 users also get the full list.
  • Fixed: the request form works on pages kept by a page cache. Visitors who are not signed in send it without a WordPress nonce. Signed-in visitors still use one: with JavaScript the form tries once more as a guest if WordPress turns an expired one down, and without JavaScript it asks them to reload the page.
  • Fixed: saving Settings no longer resets the options that only apply with or without WooCommerce: the product-page and cart request panels stay as set while it is absent (for when it is added), and the plugin’s own currency stays as set while it is active.
  • Fixed: prices typed as “1.850,00” or “1,850.00” are read as 1,850 (the builder’s live totals read them the same way), and a quote in a currency other than the site’s keeps its amounts in that currency, for example a yen quote on a euro site.
  • Fixed: stored amounts no longer depend on whether WooCommerce is active or on its “Number of decimals” setting, so switching it on or off never changes a quote (a ¥50,000 quote stays ¥50,000, also on its pay link). Each currency is kept in its own units (none for yen, three decimals for dinars), and existing quotes are converted once when the plugin is updated. On a shop, new figures are rounded to the decimals it shows, and quotes in currencies without minor units show none (¥100,000, not ¥100,000.00).
  • Fixed: a quote’s validity runs from the day it is sent or marked as sent. A request that waited longer than the validity period is no longer expired when the customer gets it, and a shorter wait no longer shortens the customer’s time to accept. Drafts and requests show their period (“14 days once sent”), and the builder warns when an open quote’s date has passed.
  • Fixed: after sending a request through the form without JavaScript, visitors return to the page they were on, also when WordPress is installed in a subdirectory.
  • Fixed: amounts from HULO Payments (the “Paid” entry in the activity trail and the pay button) are read in HULO Payments’ own minor units, so currencies it counts with different decimal places, such as HUF or KWD, show the right figure.
  • Fixed: on sites whose language groups thousands with a space, amounts in e-mails and PDFs show the space instead of  .
  • Fixed: the business address, terms and e-mail template keep their line breaks when saved from Settings, so the address reads “Unit 4, Mill Lane, Kilkenny” on the quote page, in PDFs and in e-mails, and the customer e-mail keeps its paragraphs with the quote link only on its button.
  • Fixed: the “first opened” e-mail is sent only for the customer’s very first visit; after a revival or a resend, a visit is recorded as “Opened again by the customer”. A quote whose date has passed is shown as expired when it is opened, without an “opened” notice.
  • PDFs print letters the PDF fonts lack without their accent (Ł as L) and currency symbols they lack as the currency code (PLN), and the quote builder says when a quote has text the PDF cannot show, such as Greek or Cyrillic. See the FAQ.
  • The customer quote page, the admin screens and the e-mail preview escape their output where it is printed (the e-mail preview is shown in a sandboxed frame whose links open in a new tab), the quote page’s styles and script are registered and printed through WordPress, and the quote builder has no inline styles.
  • The request form (REST and the no-JavaScript fallback), the quote builder and the settings, catalogue and response forms read and sanitise each declared field; fields of the wrong type are ignored.
  • Fixed: the “Quote request form” block and the [hulo_quote_request] shortcode laid the form out beside its heading instead of below it. The form’s fields now use the theme’s font with comfortable padding, and the block’s preview in the editor uses the same styles (its hidden spam-trap field no longer shows there).
  • The builder’s live totals use the same money format as the rest of the page (thousands separator, decimal point and symbol position) and follow the quote’s currency.
  • Deleting the plugin with “Delete all quotes and settings when the plugin is deleted” ticked also removes its per-user and scheduling leftovers.
  • The activity trail and the e-mails to the site owner are translatable, and the blocks load their translations.
  • The Pro box describes the add-on accurately, and it and the logo setting mention shop features (orders from accepted quotes, the shop’s e-mail header image) only on sites with a shop.

0.1.0

  • First release: quote request form block and shortcode, quote builder with free-text and saved catalogue items, safe sequential numbering, PDF quotes, customer quote page with typed-name acceptance, status trail, expiry and revival, revisions, My quotes block and shortcode, Quotes list and Reports, HULO Payments payments mark quotes paid. For shops: products, product-page and cart request panels (classic cart and Cart block), My Account Quotes.