An enterprise-grade headless commerce platform where wholesale and retail are first-class citizens — not plugins, not afterthoughts. One of the most powerful promotions engines in commerce. Shipping, rethought. Hosted or on-prem.
Built With
Origin
We tried the other commerce platforms. Open-source frameworks and the big hosted SaaS names alike. Each one picks a lane. B2C platforms treat wholesale as a plugin afterthought. B2B platforms strip out the merchandising, promotions, and storefront polish that retail needs. Nobody runs both with the same confidence.
Multi-location accounts, tiered pricing, net terms, approval workflows — in most platforms these are bolted on, not modeled. Promotions? A weak coupon system at best. Shipping? Duplicated carrier configs with no concept of the box itself. Extensibility? Usually a handful of webhooks with no real access to the internals that matter.
Performance is the other half of the problem. ORMs generating N+1 queries. No caching strategy for expensive operations like multi-tier pricing resolution. Systems that crumble under the catalog sizes and pricing complexity real businesses actually run.
So we stopped patching and started building. In Vectis, both B2B and B2C are first-class citizens of the core data model. Every module — accounts, pricing, promotions, fulfillment, order flow — is designed to serve wholesale and retail side by side. Channels let each audience have its own rules, pricing, visibility, and checkout, all on one engine, one catalog, one API. Hosted or on-prem, with every feature included from day one.
Platforms pick a lane. B2B or B2C — one side always suffers.
Duct-taped data models, weak promotions, shipping built backwards, brittle extensibility.
B2B & B2C both at the core. Serious promotions. Boxing-first shipping. Every feature, every tier.
Philip N. Deatherage
Founder
From the Founder
Vectis isn't a first project. It's the product of 30 years of building, running, and scaling e-commerce businesses — from the warehouse floor to the architecture whiteboard. Wholesale, distribution, multi-channel retail. The patterns that work, the mistakes that don't, and the frustration of watching platforms ignore the complexity that B2B actually demands.
That experience is in every decision. Why the pricing engine has five tiers instead of one. Why net terms and approval workflows are core modules, not plugins. Why the order state machine is configurable — because every business has a different flow and no platform should dictate yours. Why the admin panel puts the information operators actually need front and center, not buried three clicks deep.
Vectis is built by someone who's lived the problem. The goal isn't just a technically sound platform — it's one that's intuitive for the people who use it every day: warehouse managers, sales reps, buyers placing 500-line orders at 6am. If it doesn't make their job easier, it doesn't ship.
Platform
Wholesale needs. Retail needs. All of it, in the box — no paywalls, no plugins-that-should-have-been-core.
Global base, customer-group, account, location, and contract pricing with volume tiers. Redis-cached resolution. The feature every B2B platform gets wrong — Vectis gets right.
B2B accounts with multiple locations, employees, addresses, and customer groups — right next to individual B2C customers in the same data model. Per-location carts, pricing, and catalog visibility for wholesale. Fast guest checkout and individual accounts for retail.
Pricing, tax, shipping, inventory, and order flow all run through swappable strategies. Replace any business rule without forking core. This is what real extensibility looks like.
Temporal-powered durable workflows for order approvals, PO review, and compliance gates. Survives crashes and restarts without losing state. Try doing that with a webhook.
Net-15, Net-30, Net-60 payment terms per account. Automated invoice generation, store credit ledger, and payment tracking. Core module, not an aftermarket addon.
Auth-then-capture, saved cards (CIM), fraud hold states, auto void/refund on cancel. Authorize.net, NMI, ACH, and manual payments built in. Location-scoped card storage for B2B. One-click checkout with Accept.js tokenization.
3D bin packing engine calculates optimal box assignments. Product dimensions, carrier limits, and method-specific box restrictions — all resolved automatically. Split shipping for restricted items. 7 carrier extensions with channel-scoped zones.
Granular role-based permissions for admin staff. TOTP and email/SMS two-factor auth. Google/OAuth social login for storefront buyers. Keycloak SSO extension for enterprise identity.
TipTap rich text editor with AI action toolbar — improve, shorten, expand, fix grammar, translate, change tone. Claude, ChatGPT, and OpenAI extensions. Admin-configurable prompt templates per category.
Sales tax with cascading jurisdiction match down to city level. Vanilla excise tax in core (per-unit or percentage). Extension slots for TaxJar, Avalara, and ExciseIQ. Short-circuit evaluation skips exempt accounts and taxless channels before touching the pipeline.
Drag-and-drop form builder with geo-conditional rules. Document upload with AI/OCR verification. E-signature capture via DocuSign or HelloSign. Invitation codes. Temporal-driven approval workflows. Built for wholesale onboarding.
IP geolocation via MaxMind (auto-detect locale, currency, region). Address validation at checkout. ISO 3166 geo data seeded. Pluggable file storage — local, S3, MinIO, or DigitalOcean Spaces via strategy extensions.
Built-in rules engine with velocity checks, blocklist matching, AVS/CVV auto-hold, and IP geolocation distance. Signifyd, Riskified, and IPQS extensions for enterprise-grade scoring. Admin fraud review queue with approve/decline workflows.
See it in action
Every screen below is shipping UI from the Vectis admin — not mockups. Built on SvelteKit 2 + Svelte 5 + Houdini, with a keyboard-first workflow and a command palette on every page.
Keyboard-first
Jump to any order, customer, product, or page in two keystrokes. Fuzzy-matched across every entity in the system, with scoped shortcuts per module.
Operations
Real-time order volume, revenue, and inventory signals. Every order ships with fraud risk, AVS/CVV checks, IP geolocation distance, and a reviewable evidence trail.
Revenue, orders, customers, and inventory health in one glance.
Filter, segment, and bulk-act on orders across every channel.
Built-in velocity, blocklist, AVS/CVV, and geo-distance scoring.
Catalog & Accounts
Accounts with locations and employees. Products with unlimited variants, tiered pricing, and per-channel visibility. One catalog, every selling model.
Multi-tenant with locations, employees, and rep assignment.
Unified catalog across B2B and B2C with visibility rules.
5-level volume breaks, case packs, MOQ, per-channel price.
Promotions Engine
25+ condition types, 8 action types, stacking policies, priority, usage caps, mutually-exclusive rule lists, and bulk coupon generation — all evaluated in O(1) per cart via a prebuilt CartIndex.
Build any deal without SQL, scripts, or deploy cycles.
Subtotal, item count, weight, SKU match, category, collection.
Group, tier, lifetime value, order count, region, channel.
% off, fixed amount, BOGO, free shipping, gift, tier upgrade.
Per-customer, per-account, per-location, per-group, daily caps.
Mutually-exclusive lists, coupon-only stacking, max-in-cart.
Templated formats, thousands of codes at once, export-ready.
Trust & Compliance
A rules engine for fraud signals and regulatory gates — age verification, restricted shipping, PACT Act, state-by-state flavor bans. Signifyd, Riskified, and IPQS extensions available.
Risk-scored orders with approve/decline workflows.
Velocity, blocklist, AVS/CVV auto-hold, geo-distance.
Age gates, PACT Act, restricted SKUs by ship-to jurisdiction.
Content & Branding
Build landing pages, swap themes, and generate product copy without leaving the admin. Brand-consistent AI content generation is first-class — not an afterthought.
Flexible landing pages, blocks, and versioned drafts.
Swap storefront themes per channel without a redeploy.
Product copy, SEO metadata, and blog drafts on demand.
Commerce Operations
Gift cards, checkout agreements, self-service account management for B2B buyers, and a reports module purpose-built for wholesale and retail together.
Issue, redeem, and reconcile store credit.
Terms, age-gate, and per-jurisdiction acknowledgements.
Self-service for B2B buyers: locations, employees, roles.
Revenue, AOV, cohort, and promo attribution by channel.
Platform & Extensions
First-class extension points for tax, fulfillment, payments, ERP, fraud, and file storage. Install, configure, toggle — no patching the core.
Channels, currencies, tax, shipping, auth — unified config.
Install and toggle first-party and third-party integrations.
Avalara, TaxJar, or roll your own — swap via strategy.
Channels
B2B and B2C are both first-class in Vectis. Channels let you serve wholesale and retail buyers from a single catalog, a single order engine, and a single API — with pricing, visibility, checkout flow, and account model that adapt per channel.
Wholesale · Distribution · Trade
Retail · DTC · Consumer
Same product catalog, same inventory, same order engine under the hood.
Each channel defines its own pricing rules, checkout flow, visibility, and account model.
Storefronts connect to a channel. The API adapts behavior automatically.
Promotions Engine
A real rules engine, not a coupon codes table. Compose any promotion you can imagine from composable conditions and actions — with stacking policies, caps, priorities, and per-channel rules baked in.
Percentage off, fixed amount, fixed per line, volume-tiered percentage, bundle discount, free gift, buy-X-get-Y (BOGO and beyond), free shipping. Each action is composable with the others.
Cart min/max totals, item count thresholds, customer groups, categories, collections, brands, traits, first-order, channel, account, location, country, role, day-of-week, time-of-day, seasonal windows, blackout dates.
Stackable, exclusive, or coupon-only stacking. Mutually-exclusive rule lists. Max simultaneous in cart. Priority ordering. Auto-apply vs. coupon-code entry. The engine picks the best combo for the buyer every time.
Total redemption limit. Per-customer limit. Single-use codes. Daily caps. Max discount amount per rule. Once-per-order enforcement. Email whitelists. Staff-only and role-visible rules for sales reps.
Pre-built CartIndex in a single O(n) pass, then O(1) condition checks. Thousands of active rules evaluated per cart update without breaking a sweat.
Run retail coupons on the B2C channel, volume-tiered wholesale rebates on the B2B channel — from the same rule engine. Conditions route naturally by channel, account, or customer group.
{
"name": "Wholesale volume tiers — Vape category",
"type": "automatic",
"stacking_policy": "coupon_only",
"priority": 100,
"conditions": [
{ "type": "channel",
"config": { "channel_codes": ["b2b"] } },
{ "type": "product_in_category",
"config": { "category_ids": [42] } },
{ "type": "customer_in_group",
"config": { "group_ids": [7, 8] } }
],
"actions": [
{ "type": "volume_tiered_percentage",
"config": { "tiers": [
{ "min_qty": 12, "percent": 5 },
{ "min_qty": 48, "percent": 10 },
{ "min_qty": 144, "percent": 15 }
] } }
]
}
Shipping, Rethought
Every other platform starts with carriers. Pick a carrier, configure zones, assign rates, and then hope the box fits. You end up duplicating box configurations across every carrier and zone combination. Change a box size? Update it everywhere.
Vectis starts with the box. Define your box templates once — with inner dimensions, tare weight, and max capacity. Assign boxes to providers or methods. Then a 3D bin packing engine packs every order into the optimal set of boxes automatically. Those packed boxes are then handed to whichever carrier and method the zone selects.
Boxes are the universal constant. Carriers are interchangeable. Zones just filter which methods show up for an address. No more configuring the same box for UPS and then again for FedEx and then again for USPS. Define it once, assign it to a provider, and every method under that provider uses it.
3D bin packing engine fits items into eligible box templates. Inner dims, weight limits, fragile/priority handling.
Packed boxes inherit their carrier and method from box-to-provider or box-to-method assignments. One box template, many carriers.
Each packed box becomes a Package with real dimensions and weight. Carrier strategies quote rates per box. Flat-rate methods multiply by box count.
Each box gets its own tracking, carrier, and label. Ship by-box for warehouse precision or by-order for simpler operations.
A box template lives at the center. Assign it to UPS, FedEx, and USPS — one config, three carriers. When an order is placed, the 3D packing engine chooses which boxes to use, the zone picks the method, and each packed box carries real dimensions to the carrier for a rate.
EB-AFIT algorithm, multi-bin, gravity, load-bearing, fragile handling
Define once, assign to providers/methods. Inner dims, tare weight, material cost.
UPS, FedEx, USPS, GoShippo, ShipStation, OnTrac, Priority1. AfterShip tracking.
Restricted products auto-split into separate shipments by method.
Tech Stack
No framework roulette. Each layer was chosen for what B2B commerce actually demands at scale — performance, async I/O, type safety, and real extensibility.
Backend framework
Async from the ground up. Native Pydantic validation on every request. Auto-generated OpenAPI docs in dev. FastAPI handles thousands of concurrent connections without breaking a sweat — critical when your storefront, admin panel, and integrations are all hitting the same API.
Why not Django/Flask: synchronous by default. Retrofitting async onto a sync framework is duct tape.
API layer
Type-safe Python-first GraphQL. The schema is composed from domain modules — each module registers its own queries and mutations. Storefronts fetch exactly the data they need in one round trip. No over-fetching, no REST endpoint sprawl.
Why not REST: B2B frontends need flexible data shapes. A product page with pricing tiers, inventory per warehouse, and account-specific visibility is one query, not five.
Transactional data
The database that doesn't surprise you at 3am. ACID transactions, JSONB for flexible metadata, row-level security, and partitioning for large catalogs. SQLAlchemy 2.0 async with Alembic migrations — the ORM that gets out of the way.
Why not MongoDB: B2B pricing is relational. Five pricing tiers referencing accounts, locations, and customer groups is a JOIN problem, not a document problem.
Admin & Storefront
Both the admin panel and the buyer-facing storefronts are SvelteKit apps. Server-side rendering for SEO, BFF pattern with httpOnly cookies for security, Svelte 5 reactivity, Paraglide JS for type-safe i18n, LayerChart for visual dashboards, TanStack Virtual for 1000+ row tables. Tailwind CSS 4.
Why not Next.js/React: smaller bundles, less boilerplate, faster renders. Paraglide's compile-time i18n means zero runtime overhead for translations.
Durable workflows
Order approval chains, recurring order scheduling, and multi-step fulfillment flows that survive crashes, restarts, and deployments. Workflows are code, not YAML — version them, test them, debug them like any other module.
All workflows and background tasks unified under Temporal — durable business processes and scheduled jobs through a single system with full visibility.
Event streaming
Kafka-compatible but without the JVM tax. When an order is placed, inventory, notifications, fulfillment, and analytics all react in parallel through event topics. Decoupled modules, no cascading failures, full replay capability.
Why not RabbitMQ: topic-based fan-out, persistent log, replay from any offset. Event sourcing needs a log, not a queue.
Cache & sessions
Pricing resolution is the most expensive operation in B2B — five tiers with volume breaks, evaluated per line item. Redis caches resolved prices so the second request for the same account + product is sub-millisecond. Also backs BFF sessions.
Dual search engines
Typesense powers storefront product search with scoped API keys for catalog visibility. Meilisearch handles admin search. Both are typo-tolerant, faceted, and sub-50ms. No Elasticsearch cluster to babysit.
Why dual: storefront search needs scoped keys per buyer. Admin search needs full access. Different security models, different engines.
Architecture
38 domain modules behind a single GraphQL endpoint. Clean service boundaries internally, zero microservice overhead externally.
Strawberry GraphQL with async resolvers. Type-safe schema composed from 38 domain modules. One endpoint, full B2B and B2C surface area.
PostgreSQL 16 for transactional data. Redis for session cache and pricing resolution. Typesense + Meilisearch for search. MinIO (S3-compatible) for file and media storage.
Redpanda (Kafka-compatible) for event streaming via a dedicated consumer process. Temporal worker for durable workflows like approvals and recurring orders. In-process event bus for module communication.
Routes requests to the correct channel · Applies pricing, visibility, and checkout rules per channel
FastAPI + Strawberry · 36 domain modules · Strategy pattern
Modules
Every module is self-contained with its own models, services, resolvers, and events. Clean boundaries enforced by convention — no cross-module SQL.
Extensible
Vectis uses Python entry points for a true plugin architecture. Add custom tax providers, carrier integrations, compliance checks, or entirely new modules without touching core code. Extensions are scoped per storefront — your B2B store can run tobacco compliance while your B2C store doesn't.
Per-Storefront Extensions
Extensions activate per storefront. Different storefronts get different capabilities — no global on/off switches.
Strategy Registration
Register pricing, tax, and shipping strategies via entry points. The core discovers them at boot.
Event Hooks
Subscribe to domain events (order.placed, account.created) to trigger custom workflows.
41 Bundled Extensions
Payment, shipping, AI providers, fraud scoring, e-signatures, address validation, file storage, marketing, age verification, SSO, package protection — all ship out of the box.
# 41 extensions — payment, shipping, AI, fraud, address, storage, and more
# Payment
authorize_net nmi ach manual_payment
# Shipping
ups fedex usps usps_flatrate goshippo
shipstation ontrac priority1 aftership
# Address validation
smarty shipstation_address google_maps
# AI
anthropic claude openai chatgpt grok
# Fraud & compliance
signifyd riskified ipqs radar
agechecker
# Storage
s3 minio digitalocean_spaces dropbox
# E-signatures
docusign hellosign
# Marketing & messaging
omnisend elastic_email ses sns twilio
# Auth, geo, tax, commerce
keycloak maxmind exciseiq gift_cards package_protection
Open-source frameworks and hosted SaaS giants — great for B2C. Here's where they stop.
| Capability | Open-source / hosted SaaS | Vectis |
|---|---|---|
| Multi-location accounts | Not in data model | Core |
| Tiered B2B pricing | Plugin / manual | 5-level, cached |
| Net terms & invoicing | Build it yourself | Core |
| Approval workflows | Not available | Temporal-powered |
| Swap pricing / tax / shipping logic | Fork the core | Strategy pattern |
| Catalog visibility per account | Plugin | Core |
| Event-driven architecture | Hooks / basic events | Redpanda + EventBus |
| Durable business workflows | Not available | Temporal |
| B2B + B2C from one engine | Pick one | Channels |
| Multi-strategy tax (sales + excise) | Single provider | resolve_all pipeline |
| ISO geographic data (seeded) | String fields | FK-based, ISO 3166 |
| IP geolocation + address validation | Extension / paid only | Core (MaxMind free) |
| Fraud scoring (IP distance, VPN detection) | Not available | Async via Temporal |
| 3D bin packing engine | Not available | Built-in + fallback |
| Auth/capture + auto void/refund | Basic charge only | Full lifecycle |
| RBAC + 2FA + social login | Basic roles | Granular + TOTP + OAuth |
| Age verification | Not available | AgeChecker.net |
| AI content editing | Not available | Claude, ChatGPT, OpenAI |
| B2B registration + e-signatures | Not available | Form builder + DocuSign |
| Pluggable file storage | Local only | S3, MinIO, DO Spaces |
| Composable promotions engine | Coupon codes only | 25+ conditions · 8 actions |
| Volume-tiered B2B discounts | Not available | Native rule type |
| Stacking policy + mutually-exclusive rules | Manual / none | Built-in |
| Boxing-first shipping model | Duplicate box configs per carrier | Define once, assign to providers |
| Bundled extensions | 3-5 | 41 and growing |
Pricing
Every plan includes the full platform — all 38 modules, all 41 extensions, every feature. No gated tiers. Pick how you want it deployed.
per month · managed cloud
per month · managed cloud
annual · your infrastructure
Vectis is in active development. The source will be available on GitHub when it's ready. When it lands, setup looks like this: