End-to-end quotation engine for Vendure:
Works on MySQL, MariaDB and PostgreSQL. Admin UI included (Quotes, editor with catalogue search, Settings, a Help drawer and a set-up checklist), a dashboard widget, and a weekly report by email. Licence activation in the admin, one-click in-app updates.
Catalogue search in the editor reads Vendure's search index once the
channel has been indexed (the default search plugin's search_index_item
table) and falls back to the live product tables when it is empty or absent,
so it works with or without the default search plugin.
SMTP comes from SMTP_SERVER / SMTP_PORT / SMTP_USER / SMTP_PASSWORD
/ SMTP_FROM (or pass smtp in init()).
Post JSON from your storefront (server-side or from the browser — the
endpoint is public and CORS follows your Vendure apiOptions.cors). Send
the channel's token so the request lands on the right channel:
The quote appears under Sales → Quotations as requested; price any
free-text lines, then Send to customer. Turn requests off per channel in
Settings. Requests are throttled (10 an hour per client) and a hidden
website field discards bots.
Sales → Quotations (requires the ReadSettings permission; writes need
UpdateSettings). The page has three tabs — Quotes (inbox, KPIs, detail
and activity trail), the step-by-step editor, and Settings — plus a
Help button in the header that opens a three-step drawer (New quote →
Send → Convert).
Dashboard → Add widget → Quotations adds a card with the last 7 days' quotes sent, accepted and value won, the licence notice when one applies, and a link into the page.
Set-up checklist. The top of the Quotes tab shows what is left to do,
each item checked against the real state: an email server reachable
(SMTP_* env or the smtp option), a reply-to or notify address saved
for a channel, your business name or logo saved, quote requests arriving
from the storefront (or dismissed, if you only quote by hand) and the
first quote sent. Hide collapses it; it disappears for good once every
item is done and comes back if one becomes undone.
Weekly report. Every Monday at 08:00 (server-local time) the plugin emails one short report for the week just gone: quotes created, sent and accepted, value won from accepted quotes, storefront requests received and the win rate on quotes sent, each against the previous week, plus up to three next steps taken from the checklist. The numbers are the same ones the plugin reports anonymously to the licence server (counts and totals only, never customer data).
SMTP_SERVER,
SMTP_PORT, SMTP_USER, SMTP_PASSWORD, SMTP_FROM or smtp in
init()); without them nothing is sent and the test button says why.disableCron: true also disables it.Endpoints (admin session): GET /quotations/setup,
POST /quotations/setup/dismiss, GET|POST /quotations/digest/settings,
POST /quotations/digest/send-test, GET /quotations/digest/preview,
GET /quotations/widget.
Unlicensed installs run in the free tier; the 14-day free trial (card required) is started from the admin banner. Afterwards the plugin drops to the free tier: drafting, pricing and previews stay free — sending, chasers and order conversion require a licence from https://huloglobal.com/vendure-plugins/quotations/.
Pick monthly or annual on the plugin's admin banner and click Start 14-day free trial (card required, nothing charged until day 15, cancel any time), or choose lifetime — checkout opens in a new tab and the key installs itself within a minute. You can also buy at https://elite.charity/licence/buy/vendure-plugin-quotations and paste the emailed key into the admin.
All notable changes to @huloglobal/vendure-plugin-quotations are
documented here. The format follows
Keep a Changelog and this project
adheres to semantic versioning.
GET|POST /quotations/digest/settings, POST /quotations/digest/send-test, GET /quotations/digest/preview.GET /quotations/setup, POST /quotations/setup/dismiss.GET /quotations/widget.meta / licence/status gain notice, premiumFeatures, recentStats and buyUrl.quotesCreated, quotesSent, quotesAccepted, valueWonPence, requestsReceived, winRatePct (counts and totals only). Licensed installs keep reporting via the heartbeat.https://elite.charity/licence/buy/vendure-plugin-quotations; the admin UI renders any licence-required error as one sentence pointing at the banner.eval.leadEmail) as the report's last-resort recipient.@huloglobal/vendure-licence-sdk ^0.15.0. New shared table hulo_plugin_prefs (created on boot; shared by all HULO plugins).search_index_item) when the channel has been indexed: translated names, SKU and channel price live in one table, so no translation joins. It searches in the admin's language, falls back to English index rows, and to the live product-variant tables when the index is empty or absent (Elasticsearch hosts, before the first reindex). Results and their shape are unchanged; the decision is re-checked every minute.tests/pg-corpus.test.ts, runs when HULO_PG_URL is set) extracts every SQL statement in src/, translates it with the SDK's dialect adapter and prepares it against a scratch database with quoted stand-ins for the Vendure tables, so a quoting or dialect regression fails the unit suite.(channelId, reference) is unique.enabled IS TRUE instead of = 1) and in non-English shops (the admin's language, falling back to English).requested quotes are no longer served on the public quote URL before they are priced.POST /quotations/request lets any site — a basket, a product page, a calculator or a plain form — ask for a quote. Each request lands in the admin as a requested quote with catalogue lines (by variant id or SKU) pre-priced at the channel's list price, free-text lines left for you to price, the customer's message and where it came from. The channel's notify address gets the details, and the customer receives an acknowledgement carrying the quote reference (editable template in Settings). Existing customers are linked by email.website field acts as a honeypot, and the endpoint never needs a licence — sending the finished quote does, as before.quotation.requestMessage / requestSource / requestedAt, quotation_config.acceptRequests / requestAckBody (added automatically on boot).hulo-global-logo.svg is now the HG wordmark on the HULO black rounded square (the same mark as the huloglobal.com header), with explicit -light and -dark variants alongside the auto-switching default..env edit, no restart. Renewed subscription keys are picked up automatically too. New admin endpoints licence/purchase-link and licence/claim-status.@huloglobal/vendure-licence-sdk ^0.12.0.{{staffName}} variable signs the email body, and accept/decline/
opened notifications reach them directly.