Full fraud-prevention suite for Vendure. Every placed order is risk-scored server-side the moment it lands — no storefront integration required — and what happens next is up to your per-channel policy: log it, hold it for manual review, or hold it and tell the customer it's being verified.
Plugin page & pricing: https://huloglobal.com/vendure-plugins/fraud-prevention/
Each fired signal adds weighted points (all weights overridable per channel):
| Signal | Default points |
|---|---|
| Blocklisted email / domain | 60 / 45 |
| Blocklisted IP / IP in CIDR range | 55 |
| Disposable email domain | 50 |
| Failed payments from IP (1h) | 45 |
| IP order velocity (hour / day) | 40 / 30 |
| High-risk country | 40 |
| Email order velocity (24h) | 35 |
| Email daily value ceiling | 30 |
| Order value ceiling | 25 |
| First order + high value | 18 |
Plus-addressed email (x+7@gmail) | 12 |
Emails are canonicalised before velocity counting — x+1@gmail.com,
x+2@gmail.com and x.y@gmail.com all count as one identity. Allowlisted
identities bypass everything.
Daily sync (03:00) into the blocklist: FireHOL Level 1, Spamhaus DROP (CIDR ranges are matched properly), Tor exit nodes, and the community disposable-email-domains list. Manual allow/block entries ride on top.
Admin UI (multi-tab dashboard: Overview, Rules, Review queue, Lists, Simulate, Activity, Settings):
The plugin marks orders as held; your fulfilment path asks before shipping:
POST /fraud-prevention/check { email, orderValuePence, channelId } →
{ allowed, riskLevel } — rate-limited, minimal response shape by design.
Without a licence key the plugin runs in the free tier: monitor mode, manual lists and simulate. Enforce mode, review-queue holds, threat-feed sync and email alerts require a licence from https://huloglobal.com/vendure-plugins/fraud-prevention/.
Vendure >=3.5 <4. MariaDB/MySQL. Tables are created/migrated automatically
on boot; upgrading from the pre-plugin HULO implementation preserves all
existing config, log and list data.
AGPL-3.0-or-later — commercial licences available from HULO Global.
All notable changes to @huloglobal/vendure-plugin-fraud-prevention are
documented here. The format follows
Keep a Changelog and this project
adheres to semantic versioning.
# comments
ignored), typed as IP / CIDR range / email / email-domain. They sync
nightly alongside the built-ins and are matched identically (CIDR
included), with per-feed enable/disable, on-demand sync, and last
sync count / error surfaced. Licensed feature.GET/POST /fraud-prevention/feeds/custom,
POST /feeds/custom/:id (edit / {sync:true}), DELETE /feeds/custom/:id.POST /fraud-prevention/check returned Nest's default 201 for
a POST; it's a read-only risk check, so it now returns 200.@vendure/testing, real MariaDB dialect): admin
auth gating, public-check shape + rate limiting, and the assessment
engine (disposable email, order value, returning-customer trust credit,
blocklist incl. CIDR ranges, allowlist bypass, unlicensed enforce
downgrade). 11 e2e tests.[ngModel]="caseNotify(id)") which
Angular re-evaluated every change-detection pass. The per-case ticks
are now seeded from the global defaults when cases load and bound to
plain state. The Settings integrations list likewise iterates a stable
array instead of one rebuilt each cycle.@ escape was corrupted by the release tooling (sed &
back-reference) and still shipped a bare @ — admin builds kept
failing. Repaired and verified: no bare @ remains in any template
text node.@BotFather in the Telegram help text is now the @ entity.X-Hulo-Signature) — every held, approved,
rejected and auto-released case pings all configured channels. Each
transport fails independently.{{orderCode}}, {{firstName}}, {{supportEmail}} and
{{reviewHours}} variables, live preview and one-click reset. Bodies
are plain text (blank lines = paragraphs) so tone is editable without
HTML foot-guns. Defaults rewritten to be honest without being alarming
— a held order is "a quick security check", never an accusation, and a
rejection includes a human-appeal path.reviewHours promise surfaced in the templates.fraud_ip_intel,
fails open): VPN/proxy and datacentre-IP signals — the blockVpnProxy
toggle finally does something — plus IP vs billing-country mismatch.First release as a standalone plugin — a full rebuild of the fraud tooling that previously lived inside the HULO host project, with the piece that implementation never had: real enforcement.
OrderPlacedEvent is assessed — the
old /check endpoint required the storefront to call it, and nothing did.ipInCidr verification (unit-tested).pendingOrderIds()); approve releases + emails the customer, reject
cancels + emails. All decisions audited.fraud_config, fraud_log, fraud_blocked_orders, fraud_blocklist,
fraud_whitelist, fraud_notification_config) — upgrading preserves all
live data; new columns are added automatically.ReadCatalog / UpdateCatalog) — previously these endpoints were
mounted without any auth guard. The public /check endpoint is
rate-limited and returns a minimal shape (no signal internals to probe).