HG Hulo Global

Quotations — User Manual

Overview

Quotations is an end-to-end quotation engine for Vendure. The full lifecycle lives in your admin: build a quote from the live catalogue (or free-text lines), email the customer a branded page with a signed link, watch it move through sent → viewed → accepted / declined, chase automatically, and convert wins to draft orders at the exact quoted total.

  • Statuses: draft → sent → viewed → accepted / declined / expired / cancelled → converted.
  • Money: integer minor units throughout; per-line % discount, quote-level % or fixed discount (applied before VAT), configurable VAT rate per quote.
  • Audit: every step (including chasers and customer opens) is an event on the quote.

Install & configure

Install and register the plugin:

yarn add @huloglobal/vendure-plugin-quotations
import { QuotationsPlugin } from '@huloglobal/vendure-plugin-quotations';

plugins: [
  QuotationsPlugin.init({
    publicBaseUrl: 'https://shop.example.com',   // used for customer quote links
    licenceKey: process.env.HULO_LICENCE_KEY_QUOTATIONS,  // optional — or activate in the admin
  }),
]

Add QuotationsPlugin.uiExtensions to your admin-ui compileUiExtensions extensions list and rebuild the admin. Tables are created automatically on boot (MySQL, MariaDB and PostgreSQL).

Emails send via SMTP from SMTP_SERVER / SMTP_PORT / SMTP_USER / SMTP_PASSWORD / SMTP_FROM, or pass smtp in init().

In the admin Quotations → Settings, set your business name, logo URL, accent colour, notification address, numbering prefix, default validity/VAT/terms, and the chaser/expiry-reminder cadence — per channel.

The quoting workflow

  1. Build: New quote → search existing customers to autofill their details, then search the catalogue by name/SKU (price pre-fills) or add custom lines. Set quantities, unit-price overrides and per-line discounts; add a quote-level discount, VAT rate, validity and notes/terms. Totals preview live.
  2. Send: "Save & send" emails the customer a branded message with the signed quote link — sent as the member of staff you pick in the editor (their name fronts the From header, replies go to them, and the quote page shows "Prepared by"). Preview the rendered email or test-send it to yourself first. Re-send any time; the link is stable.
  3. Track: the first open flips the quote to viewed (optionally emailing you at that moment — the best follow-up cue). Add internal notes to the activity trail; extend validity (reviving expired quotes) in one click. The customer accepts by typing their full name (recorded as a signature with a timestamp) or declines with a reason — you're notified by email either way.
  4. Chase: the hourly worker sends one reminder for unopened quotes after N days, an expires-soon nudge before the validity date, and expires overdue quotes automatically.
  5. Convert: on an accepted quote, "Convert to order" creates a Vendure draft order: catalogue lines become real order lines and one "Quotation pricing" surcharge reconciles any difference, so the draft total equals the quote exactly. Complete the draft in Orders as usual.

Sent quotes that have been decided are immutable — use Duplicate to spin a linked revision when the deal changes.

HTTP endpoints

MethodPathPurpose
GET/quotations/quote/:tokenPublic customer quote page (signed link; marks viewed)
POST/quotations/quote/:tokenPublic accept (typed signature) / decline
GET/POST/quotations/quotesAdmin: list / create
PUT/DELETE/quotations/quotes/:idAdmin: update draft/open · delete draft
POST/quotations/quotes/:id/sendAdmin: email the customer (licensed)
POST/quotations/quotes/:id/convertAdmin: accepted quote → draft order (licensed)
POST/quotations/quotes/:id/duplicateAdmin: duplicate / revise
POST/quotations/quotes/:id/cancelAdmin: withdraw an open quote
GET/quotations/statsAdmin: win rate, open pipeline, response time
GET/quotations/variants/searchAdmin: catalogue search for the editor

Licensing & tiers

Unlicensed installs run in the free tier — start the 14-day free trial from the admin banner (card required, nothing charged until day 15, cancel any time) to switch everything on. Free tier: drafting, pricing and previewing quotes stay free — sending, chasers and order conversion require a licence. Click Buy licence on the admin banner and the key installs itself within a minute of checkout (renewals too); or paste a key into the admin (Activate) or set HULO_LICENCE_KEY_QUOTATIONS; the env key wins when both are present. Buy at huloglobal.com/vendure-plugins/quotations — monthly, annual (two months free), or lifetime.

Troubleshooting

  • Emails not sending: check the SMTP env vars; the send response surfaces the SMTP error verbatim in the admin notification.
  • Customer link 404s: draft quotes have no public page — send the quote first. Withdrawn (cancelled) quotes deliberately stop resolving.
  • Convert fails on a line: the referenced variant must still be enabled and in the channel; the error names the offending line. Free-text-only quotes convert as a single surcharge.
  • Chasers not going out: they run on the worker process, hourly, licensed installs only, and each quote gets at most one chaser.