Platform overviewVBWD SDK2026-05-07

VBWD

A sales platform for the digital world.

SaaS subscriptions, booking, CMS, software stores, an internal token economy, a first-class plugin system across three runtimes, and 20+ payment methods — one self-hosted backend, two Vue front-ends, infinite extensions.

Editions
CE — self-hosted
ME — cloud marketplace [planned]
Stack
Python · Flask · Vue 3
PostgreSQL · Redis
Plugin runtimes
vbwd-backend
vbwd-fe-admin · vbwd-fe-user
License
BSL 1.1
Source-available
Audience
VBWD · For whom
Universal billing, CRM, and CMS — for everyone shipping a digital product.

Built for builders
who'd rather ship than rebuild billing.

VBWD is the missing layer between "I have a product" and "I'm taking real money". Subscriptions, accounts, invoices, taxes, payments, CMS pages, and a token economy — installed once, extended forever via plugins.

SaaS builders

Tiered plans, add-ons, prorated upgrades, dunning, cancellation flows. Not a single payment provider — a marketplace of them.

Software engineers

Drop-in Python plugin SDK, typed Vue plugin SDK, event bus, DI container. Extend without forking the core.

Digital agencies

Multi-tenant routing, brand-able admin, CMS pages, white-label payment selectors. One stack, many clients.

Smart-app teams

Built-in token bundles, usage metering, LLM billing. Sell AI features without writing the meter.

The bet. Most teams don't need yet another payment integration — they need everything around the payment already wired up: identity, plans, invoices, taxes, retries, refunds, webhooks, and an admin UI. VBWD ships that surface, then gets out of your way.
VBWD · Audience
02 / 33
Architecture
VBWD · The three corners
Three runtimes. One contract. Plugins everywhere.

Backend, fe-admin, fe-user —
each one independently extensible.

Every corner of VBWD is its own runtime with the same plugin contract. A new feature lights up by shipping a coordinated trio: a backend plugin that adds the API + data model, an fe-admin plugin that adds the configuration UI, and an fe-user plugin that adds the customer surface. Or any subset — they're independent.

vbwd-backend
Python · Flask · PostgreSQL
REST API at /api/v1/*, SQLAlchemy 2.0, dependency-injector, event bus, Alembic migrations. Plugins register Flask blueprints, models, event handlers, line-item handlers, shipping providers, and admin permission scopes.
292+ tests · Gunicorn · Redis cache
vbwd-fe-admin
Vue 3 · Pinia · Vite
Admin backoffice — users, plans, subscriptions, invoices, payment gateways, analytics, plugin management. Plugins inject menu items, dashboard widgets, and per-plugin config screens.
Port 8081 · Playwright E2E · flat structure
vbwd-fe-user
Vue 3 · PluginRegistry · IPlatformSDK
Customer portal + public surfaces. Plugin SDK exposes addRoute, createStore, addComponent, addTranslations. Topological dependency resolution; circular dependencies caught at install time.
Port 8080 · vbwd-fe-core (submodule) · 23+ plugins
One source of truth for plugin state. Enable / disable lives in ${VAR_DIR}/plugins/ — backend writes, both frontends mount it read-only. No localStorage drift, no per-browser inconsistency.
VBWD · Architecture
03 / 33
Architecture
VBWD · What a plugin can inject

A plugin is not a config flag.
It is a coordinated trio of contributions.

A single plugin entry can register code into all three runtimes at once. Each runtime exposes a typed surface so plugins can extend it without forks, monkey-patching, or "please rebuild the core" tickets.

Backend surface

  • API endpoints. A Flask blueprint at /api/v1/<plugin>/*, mounted automatically when the plugin enables.
  • Data models. SQLAlchemy 2.0 entities + Alembic migration tied to the plugin lifecycle.
  • Event handlers. Subscribe to domain events (subscription.created, payment.captured, …) on a typed bus.
  • Domain events of its own. Plugins emit their own events that other plugins (or the host) can listen to.
  • Line-item / shipping handlers. Pluggable contributors to checkout totals and shipping options.

Front-end surface

  • Routes. Vue Router entries — admin pages on fe-admin, customer pages on fe-user, registered via sdk.addRoute().
  • Pinia stores. Plugin state isolated in its own namespace, instantiated via sdk.createStore().
  • Menu items. Dashboard navigation entries with permission gates and badges.
  • Widgets. Dashboard cards, settings panels, embeddable user-area components.
  • Translations. Per-locale dictionaries merged into the host i18n at install time.
Lifecycle. DISCOVERED → REGISTERED → INITIALIZED → ENABLED ↔ DISABLED (with an ERROR state for safe failure). Persistent across restarts via the plugin_config table; the backend is the only writer.
VBWD · Architecture
04 / 33
vbwd-backend
Backend plugins · features

The backend ships the core,
then steps aside for plugins.

Flask blueprint mount

get_blueprint() + get_url_prefix() auto-mount under /api/v1/<plugin>/* on enable, unmount on disable.

Models + migrations

SQLAlchemy 2.0 entities tied to the plugin. Migrations applied on enable, optionally rolled back on uninstall.

Event subscribers

register_event_handlers(bus) — listen to subscription, payment, checkout, security events. No polling.

Domain events of its own

Emit plugin events that other plugins consume. Cross-plugin coordination without direct imports.

Line-item handlers

Plug into checkout totals: discounts, taxes, shipping, token deductions. Each handler is a pure function over the cart.

Shipping providers

Register concrete shipping cost calculators (flat-rate, weight-based, region-based) consumed by the order pipeline.

Categories + routing

Contribute product / content categories with their own URL prefixes — picked up by routing rules at the edge.

Permission scopes

Declare admin_permissions / user_permissions. Surfaces in the admin RBAC matrix; gates fe-* routes.

Lifecycle hooks

  • on_enable() — runs migrations, seeds data, registers handlers.
  • on_disable() — unhooks handlers, halts background tasks.
  • Plugin state persisted in plugin_config; auto-rehydrated on app boot.

Configuration

  • get_config(key) / set_config(key, val) — namespaced KV store per plugin.
  • Validated against a JSON schema declared in PluginMetadata.
  • Editable from the fe-admin plugins page; secrets surface via env-var indirection only.
VBWD · Backend plugin surface
05 / 33
vbwd-fe-admin
Admin plugins · what they can do

Inject menu, view, store, widget, translation —
without rebuilding the admin shell.

Admin plugins are loaded by the host shell at boot. The shell keeps the chrome — login, layout, top-bar, theme — and yields every interior surface to plugins. A plugin can ship a single dashboard widget or a whole subsystem; the contract is the same.

Menu items

Sidebar entries with icon, label, route, permission scope, and badge. Order is computed from priority + plugin install order.

Admin views

Full-page Vue components mounted into the admin router. CRUD scaffolds + table / form / detail patterns provided by fe-core.

Dashboard widgets

Drop-in cards on the home dashboard — KPIs, charts, recent activity. Self-fetching, plugin-namespaced data sources.

Settings panels

Plugin config screen auto-bound to get_config / set_config on the backend. JSON-schema-driven form generation.

Permission gates

Declarative v-permission on routes, menu, action buttons. Drives both UI hiding and server-side enforcement.

Translations

Locale dictionaries merged into the host i18n. New languages light up across every plugin's UI without per-plugin work.

Discoverable, not hard-coded. The admin shell reads ${VAR_DIR}/plugins/fe-admin-plugins.json at boot. Toggling a plugin on the backend immediately changes what the next admin login sees — no rebuild, no redeploy.
VBWD · Admin plugin surface
06 / 33
vbwd-fe-admin
Admin features · the box you get on day one

A complete back-office —
before you write a single plugin.

Dashboard

Active sessions, MRR, churn, top plans, recent activity. Widgets contributed by every enabled plugin.

Users + access levels

List, search, edit, impersonate. RBAC matrix per role. Token-balance and invoice-history tabs in user detail.

Plans + add-ons

Tiered plans with categories, pricing, trial, billing-period rules. Add-ons attach to plans or stand alone.

Subscriptions

List, filter by state, manual upgrade / downgrade / cancel. Dunning view for past-due accounts.

Invoices

List + detail, payment status, capture / refund actions, downloadable PDFs.

Payment methods

Per-provider configuration screens — keys, webhooks, test toggles, country availability.

Token bundles

Bundle catalogue, pricing, currency. Used by every metered plugin (LLM-Chat, Taro, …).

Webhooks

Outbound webhook subscriptions — pick events, set endpoint, view delivery log + retry queue.

Categories + routing

Routing rules per domain / subdomain / path prefix — drives multi-tenant front-end config.

Tax + countries

Tax rules per jurisdiction, currency selection, country-availability matrix used by checkout.

Plugin manager

List backend / fe-admin / fe-user plugins, enable / disable, jump to the plugin's settings panel.

Settings + email

App config, email templates per locale, SMTP credentials, dunning schedules.

VBWD · Admin out of the box
07 / 33
vbwd-fe-user
User app · dashboard + public surfaces

One Vue app, two faces.
Authenticated dashboard. Public-facing surface.

The user app is a single Vue 3 build that serves both the customer dashboard (account, plans, invoices, tokens) and any public surface a plugin contributes (CMS pages, shop catalogue, public chat, booking pages). Routing rules at the edge decide which audience hits which mount point.

Authenticated dashboard

  • Home. Plan card, token balance, next-invoice estimate, quick actions.
  • Subscriptions. Active plans, upgrade / downgrade, cancel, billing history.
  • Plans + add-ons. Browse, compare, subscribe. Live discount-code preview.
  • Invoices. Past invoices, retry failed payments, download PDF.
  • Profile. Email, password, avatar, MFA, API keys.
  • Tokens. Balance, transaction history, purchase bundles.
  • Plugin pages. Each enabled fe-user plugin contributes its own dashboard tabs.

Public surfaces

  • Checkout. Anonymous + authenticated, multi-provider payment selector, server-validated discount codes.
  • CMS pages. Slug-routed marketing pages, docs, FAQs — rendered from the CMS plugin.
  • Shop. Product catalog, cart, order tracking from the shop plugin.
  • Booking. Slot-based appointment booking from the booking plugin.
  • Chat / Mainchat / LLM-Chat. Public chat surfaces with token metering.
  • Landing. First-paint marketing page; can be replaced by a CMS-managed landing in production.
Plugin SDK at the heart. IPlatformSDK exposes addRoute · createStore · addComponent · addTranslations. The PluginRegistry resolves dependencies topologically and refuses to install on a missing peer or cycle.
VBWD · User app
08 / 33
CMS plugin
CMS · the marketing layer baked in

A CMS that lives inside the platform
not next to it.

Every SaaS needs landing pages, docs, FAQs, blog posts, and feature tours. Most teams glue WordPress next to their app and pay the integration tax forever. VBWD's CMS plugin is a first-class citizen of the same Vue runtime, the same auth, the same plugin bus, the same i18n.

Pages

Slug-routed pages with rich-text body, metadata, SEO fields, locale variants. Versioned with draft / publish workflow.

Layouts + widgets

Layouts compose pages from reusable widgets — hero, pricing table, FAQ, testimonials, plugin-contributed components.

Menus + categories

Multi-level menus, category taxonomies, internal-link guarantees. Menu changes are a CMS edit, not a frontend deploy.

Images + assets

Upload, transform, attach. Stored under ${VAR_DIR}/cms/; served via the same edge cache as the app.

i18n native

Locale per page. Falls back to default language if a translation is missing — the language switcher never breaks.

Edit-in-place [planned]

Inline admin overlay on rendered pages — click an element, edit it, save. Skips the round-trip to the back-office UI.

VBWD · CMS overview
09 / 33
CMS plugin
CMS · feature breadth

Marketing features —
not "use the API and figure it out".

Page builder

Block-based editor — hero, copy, image, columns, embed, plugin-contributed components. JSON-stored, render-time-composed.

Versioning

Draft + publish + scheduled publish. Diff between versions; revert in one click. Full audit log of who changed what.

Locales

Per-page, per-block translations. Bulk translation export / import. The language switcher uses the page locale, not URL hacks.

SEO

Title, description, OG image, canonical, robots. Sitemap auto-generated; redirects table for retired pages.

Image transforms

On-the-fly resize / format conversion (WebP, AVIF). Width hints in the editor; srcset emitted to the browser.

Forms

Form widget — captures leads, posts to an event on the bus. Other plugins (email, mailchimp, ghrm) listen and act.

Menus

Multi-level navigation editor. Permission-aware: a CMS-page-only audience never sees admin links.

Routing rules

Subdomain / path-prefix / locale routing — same engine that powers multi-tenant. CMS pages bind to specific tenants.

Why this matters

  • Marketing iterates without a frontend deploy.
  • One auth, one user table, one analytics pipeline — no cookie war between WordPress and the app.
  • The same CMS pages serve as in-app help / onboarding flows.

Who owns it

  • Editorial: marketers + content writers using the fe-admin CMS panel.
  • Layouts: design system maintainers shipping reusable widgets.
  • Page rendering: fe-user CMS plugin — slug → page lookup → block tree → render.
VBWD · CMS features
10 / 33
CMS plugin
CMS · architecture under the hood

A CMS plugin is just a plugin —
that happens to ship a renderer.

flowchart LR A["Browser
GET /docs/getting-started"] --> R["Edge router
(routing rules)"] R --> U["fe-user app
CMS plugin route"] U --> API["GET /api/v1/cms/pages/by-slug?slug=docs/getting-started"] API --> M[("Pages · Layouts
Widgets · Menus
Images")] M --> API API --> U U --> RDR["Block tree
renderer"] RDR --> P["Plugin-contributed
widget components"] P --> H["Hydrated page"] style M fill:#dbeafe,stroke:#1e40af,color:#0b1424 style RDR fill:#fef3c7,stroke:#b45309,color:#0b1424 style P fill:#e0e7ff,stroke:#4338ca,color:#0b1424 style H fill:#d1fae5,stroke:#047857,color:#0b1424
Models
  • cms_page · slug, locale, layout_id, status, seo, body
  • cms_layout · named layout, ordered widget slots
  • cms_widget · type, props (JSON), order, layout_id
  • cms_menu · tree of menu nodes, page or external link
  • cms_category · taxonomy for pages + products
  • cms_image · upload + transform metadata
The renderer is a small, predictable function. Block tree → component lookup → props pass-through → render. Plugin-contributed widgets register themselves at fe-user boot; the CMS doesn't know what they do, only how to mount them.
VBWD · CMS architecture
11 / 33
Section
Section opener
Payments

Take money the way
your customer pays.

9 providers · 20+ payment methods · one checkout flow.

VBWD · Payments
12 / 33
Payments
Payment methods · the providers already shipped

Nine integrated providers.
Twenty-plus payment methods. All plugins.

Every payment provider in VBWD is a backend plugin implementing the same PaymentProviderPlugin interface — create_payment_intent, capture_payment, refund_payment, and a webhook handler. fe-user contributes the matching checkout component. Adding a tenth provider is one plugin, not a core change.

S

Stripe

Cards, SCA / 3DS2, subscriptions, ACH, SEPA. Webhooks reconciled against the provider as source of truth.

P

PayPal

Smart Buttons + redirect, Vault, Pay Later / BNPL, Apple Pay through PayPal, disputes flow.

Y

YooKassa

Russia / CIS — cards, SberPay, Yandex.Kassa, e-wallets, bank transfers.

M

Mercado Pago

LatAm / Brazil — cards, boleto, account transfer, regional installments.

C

Conekta

Mexico / LatAm — cards, OXXO cash voucher, SPEI bank transfer, monthly installments.

T

Toss Payments

Korea — cards, virtual accounts, mobile-carrier billing, KRW-native flows.

$

TrueMoney

Thailand — TrueMoney e-wallet integration, in-app QR confirmations.

Q

PromptPay

Thailand — QR-code bank-transfer payments, real-time confirmations.

G

Google Pay (C2P2)

Google Pay tokens via the C2P2 plugin. Mobile-first checkout with one-tap completion.

A

Apple Pay (C2P2)

Apple Pay tokens via the C2P2 plugin. Domain-association handled by the plugin.

Flat-rate shipping

Sister plugin — shipping cost calculator that plugs into the same line-item pipeline as payments.

+

Roll your own

Implement PaymentProviderPlugin, ship a fe-user checkout component. Two files; live in one enable.

VBWD · Payment methods
13 / 33
Section
Section opener
Plugins

Mainchat. Booking. Shop.
LLM-Chat. Taro. More.

Each one a complete feature; each one optional; each one composable.

VBWD · Plugins
14 / 33
Plugin
Mainchat · the front-of-house chat

Mainchat — the chat your customers see
before they have an account.

Mainchat is the public-facing conversational surface — pre-sales questions, support intake, lead capture. It does not bill tokens; it is free for the visitor. Conversations land in the same admin inbox as authenticated chats, so support never has two queues.

Front-of-house, by design

  • Public widget. Drops onto any page through the CMS or a script tag.
  • Anonymous → identified. A visitor can keep chatting after sign-up; the conversation thread carries over.
  • Operator hand-off. Bot greets, classifies, escalates to a human via the admin inbox.
  • Knowledge-base aware. Pulls from CMS pages tagged as KB content for the first response.

Admin side

  • Inbox. Threaded, assignable, taggable. Filter by status, tag, plan, country.
  • Canned responses. Per-locale, per-tag. Editable by support without a deploy.
  • Lead capture event. Emits lead.captured on the bus — email plugin, Mailchimp plugin, GHRM listen and act.
  • SLA timers. First-response and resolution clocks; alerts when a thread sits.

Token-Exchange · the feature

Inside any thread, a user can send tokens to another user with one tap — gift, tip, refund, peer-to-peer transfer. Same wallet primitive (UserTokenBalance) the rest of the platform uses; the chat surface is the UX.

Mainchat ⇄ token-bus

Mainchat events drive token flows: lead.captured ⇒ auto-credit the referrer · "priority response" purchase ⇒ token deduction · support tip ⇒ transfer to the operator's account. Events on the same bus the platform already uses.

Audited + reversible

Every in-chat transfer creates two ledger entries (sender / recipient) and emits tokens.transferred. Admin can reverse from the same inbox where the conversation lives. Daily caps + velocity rules apply.

Different from LLM-Chat. Mainchat is the public hub. LLM-Chat is the metered AI conversation surface inside the dashboard. Both share the same conversation model in the backend; the runtime differs.
VBWD · Mainchat
15 / 33
Plugin
Booking · slots, resources, inventory

Calendly-grade booking —
but on your data, your auth, your billing.

The booking plugin turns any account into a bookable resource — consultations, classes, equipment rental, room reservations, telemedicine slots. It composes with subscriptions (a plan can include N bookings / month), payments (charge per slot), and the token economy (book by spending tokens).

Resources + slots

Resources expose availability windows; slots are the bookable unit. Buffer time, lead time, capacity per slot, recurring patterns.

Inventory

Beyond time slots — physical inventory (rooms, equipment) with stock counts, holds during checkout, automatic release on timeout.

Cancel + reschedule

Customer-side flow with policy enforcement (free up to N hours before, partial refund window, no-show fee).

Event hooks

Emits booking.created · confirmed · cancelled · noshow. Email plugin sends confirmations; calendar plugin syncs to Google / Outlook.

Per-plan quotas

Plan defines monthly booking allowance; quota enforcement runs at booking time. Overflow can charge tokens or block.

Admin views

Resource calendar, booking list, no-show register. Bulk reschedule when a resource goes offline.

Why this isn't a separate SaaS. Booking on a generic calendar tool means a second user table, a second auth flow, a webhook bridge, a reconciliation spreadsheet. VBWD's booking is the same user, the same invoice, the same support inbox.
VBWD · Booking
16 / 33
Plugin
Shop · catalog, cart, orders

A software / digital-goods store —
using the same checkout as subscriptions.

The shop plugin gives VBWD a product catalogue alongside the subscription model. One-time purchases, downloadable products, license keys, physical goods. The checkout, the payment providers, the tax engine, the discount codes — all shared with subscriptions. Two billing models, one storefront.

Catalog

Products with variants (size, license tier, region). SKU-level inventory, per-variant pricing, category taxonomy from the CMS.

Cart

Multi-item, multi-currency, per-region tax preview. Shared session with the rest of the user app — never "where did my cart go".

Orders

Order list with state machine (pending → paid → fulfilled → shipped → delivered). Refund and partial-refund flows on every state.

Returns

RMA flow — customer-initiated, admin-approved, refund auto-issued through the original payment provider.

License keys

For software products — generate, deliver, revoke. Customer can view their keys in the dashboard, regenerate on lost-key request.

Downloadables

Time-limited signed URLs for digital products. Per-customer download caps. Watermarking hook for plugin extension.

Shipping

Composes with shipping provider plugins (flat-rate ships out of the box; weight-based or carrier-API plugins drop in).

Webhooks

order.created · paid · fulfilled · shipped · refunded · returned — fan out to fulfillment, accounting, CRM.

VBWD · Shop
17 / 33
Plugin
LLM-Chat · token economy in action

Sell AI conversations
without writing the meter.

LLM-Chat is the metered AI surface. Every message round-trip costs tokens drawn from the user's balance — sourced either from a subscription's monthly grant or from a token bundle they bought outright. The plugin only knows the LLM provider and the messages; the meter, the balance, the bundles, the receipts come from VBWD.

flowchart LR U(("User
sends message")) F["fe-user
llm-chat plugin"] A["/api/v1/plugins/chat
backend plugin"] T["Token service
balance check"] L[["LLM provider
(OpenAI · Anthropic · …)"]] D[("Conversation
messages · usage")] E["events.bus
chat.tokens.consumed"] U --> F F --> A A --> T T -- "balance >= cost" --> L L --> A A --> D A --> E A --> F F --> U T -. "balance < cost" .-> R["402 · prompt to top up"] style T fill:#fef3c7,stroke:#b45309,stroke-width:2px,color:#0b1424 style L fill:#e0e7ff,stroke:#4338ca,stroke-width:2px,color:#0b1424 style D fill:#dbeafe,stroke:#1e40af,color:#0b1424 style E fill:#d1fae5,stroke:#047857,color:#0b1424
What VBWD provides
  • Token balance per user. Source: subscription grant + purchased bundles + admin top-ups.
  • Pre-call balance check. 402 with a top-up CTA when the customer is dry — no half-charged calls.
  • Per-call ledger. Provider, model, prompt + response tokens, USD cost, customer-facing token cost.
  • Receipts in the dashboard. Customer sees "you spent N tokens on this conversation".
  • Provider-agnostic. Swap OpenAI for Anthropic by changing one config — no plugin code changes.
VBWD · LLM-Chat
18 / 33
Plugin
Taro · the first token-economy demo

Taro — the proof-of-concept
that the token economy just works.

Taro is an AI tarot-reading plugin: pick a question, draw cards, get an interpretation written by an LLM. It exists as the canonical demo of how a metered AI experience plugs into VBWD: subscribe to a plan, get N readings included, buy more when you run out. Every piece runs on platform primitives — there is no bespoke billing inside Taro.

Card draw + spread

Multiple spreads (single card, three-card, Celtic cross). Draw is server-side; the deck state is auditable in the admin panel.

LLM interpretation

Prompt template per spread, configurable from the admin. Output streamed to the user; full transcript saved to history.

Session history

The customer revisits past readings. Admin sees the same data for support and quality review.

What it borrows from VBWD

  • Token balance + bundles for metering.
  • Subscription grants for monthly inclusions.
  • Discount codes via the discount plugin.
  • Public landing + onboarding via CMS pages.
  • Email confirmations via the email plugin.

What Taro itself ships

  • The deck, the spreads, the prompt library.
  • A small Vue UI in fe-user.
  • An admin panel to edit prompts and review usage.
  • Roughly 600 lines of plugin code, no core changes.
The lesson. Taro proves the platform can host a niche AI product with a complete monetization story in a sprint, not a quarter. Replace "tarot" with "code review", "essay coach", "diet planner" — the substrate is identical.
VBWD · Taro
19 / 33
Plugins
Discount + Checkout · the conversion couple

Two plugins that meet at the cart —
and never let it leak.

Discount plugin

  • Codes. Percentage, fixed-amount, free-trial, BOGO, first-purchase. Per-code limits: total uses, per-customer, expiry, allowed plans / products.
  • Stacking rules. Whitelist or blacklist combinations. Conflict resolution at validation, before charge.
  • Server-validated. The frontend computes a preview, the backend is authoritative — no client-side discount fraud.
  • Line-item handler. Plugs into the same checkout pipeline as taxes and shipping. Order of application is deterministic and auditable.
  • Reporting. Code-level usage, redemption rate, attributed revenue. Visible in fe-admin's analytics widget.

Checkout plugin

  • Public + authenticated. Same flow for anonymous purchases and logged-in upgrades.
  • Multi-provider selector. Pulls the enabled payment-provider plugins; renders the right component for each.
  • Country / currency aware. Filters payment methods by what's actually available for the customer's country.
  • Address validation. Postal code, country format, optional VAT-ID lookup for tax-exempt B2B flows.
  • Idempotent. Double-click protection, retry-safe order creation, webhook reconciliation as the source of truth.
Why they ship together. Discounts only matter at checkout, and a checkout without discount support is a marketing veto on every campaign. VBWD ships both as first-party plugins because the alternative — gluing a coupon SaaS in — costs more conversion than it ever returns.
VBWD · Discount + Checkout
20 / 33
Section
Section opener
VBWD Core

Inside the core —
the part you'll never have to fork.

Models · events · services · DI · SOLID · security.

VBWD · Core
21 / 33
VBWD Core
Architecture · layers + boundaries

Routes → Services → Repositories → Models.
The boring layout that stays maintainable.

flowchart TB R["Routes
/api/v1/*
(Flask blueprints)"] S["Services
(business logic)"] P["Repositories
(data access)"] M[("Models
SQLAlchemy 2.0")] B(["Event bus"]) PL["Plugins
(backend / fe-*)"] R --> S S --> P P --> M S --> B B --> PL PL -. "register" .-> R PL -. "register" .-> S PL -. "register" .-> M style R fill:#dbeafe,stroke:#1e40af,color:#0b1424 style S fill:#e0e7ff,stroke:#4338ca,color:#0b1424 style P fill:#fef3c7,stroke:#b45309,color:#0b1424 style M fill:#fff,stroke:#0b1424,color:#0b1424 style B fill:#d1fae5,stroke:#047857,color:#0b1424 style PL fill:#fff,stroke:#8390ad,stroke-width:1px
The contract at each layer
  • Routes validate input, authenticate, authorise, hand off. No business logic, no SQL.
  • Services hold the business logic. Take typed inputs, return typed outputs, raise domain exceptions. Composable.
  • Repositories are the only layer that touches SQL. One repository per aggregate; no service-layer bypasses.
  • Models are SQLAlchemy 2.0 entities — relations, indices, column types. No behaviour creep.
  • Event bus is how cross-cutting and cross-plugin work happens. Synchronous in-process; durable queue [planned].
Why so plain. The boring layout outlives the clever one. Every plugin author can predict where their change goes; every reader of the code finds it where they expected.
VBWD · Core architecture
22 / 33
VBWD Core
Models · the entity catalogue

A finite, named set of aggregates —
not "anything goes".

Every domain in VBWD has a small, named set of SQLAlchemy 2.0 entities. New plugins add their own; the core never grows by accretion. The list below is what the platform ships with on day one — what every plugin can rely on existing.

Identity + access

  • User, UserDetails, UserAccessLevel, Role
  • UserTokenBalance — the wallet
  • PasswordResetToken
  • FeatureUsage — quota tracking

Plans + subscriptions

  • TarifPlan, TarifPlanCategory
  • Subscription — state machine, renewal, dunning
  • AddOn, AddOnSubscription

Token economy

  • TokenBundle, TokenBundlePurchase
  • Wallet ledger entries (per-call deductions)

Money

  • Invoice, InvoiceLineItem
  • PaymentMethod — provider + customer-instrument
  • Tax, Country, Currency

Plugin substrate

  • plugin_config — enable / disable + per-plugin KV
  • Per-plugin tables (CMS, shop, booking, chat, taro, …) owned by the plugin, not the core.

Glue

  • Webhook subscriptions + delivery log
  • Routing rules, categories
  • Audit / activity log entries
VBWD · Core models
23 / 33
VBWD Core
Events · how cross-cutting happens

Plugins don't import each other.
They listen.

The event bus is the platform's spinal cord. Every meaningful state change emits a typed domain event; plugins subscribe to what they care about. Email confirmations, analytics, Mailchimp sync, dunning, GHRM access grants — none of them are wired into the services that triggered them.

Named events shipped

  • Subscription: subscription.created · activated · cancelled · expired · dunning
  • Payment: payment.authorized · captured · failed · refunded · refund.reversed
  • Checkout: checkout.initiated · completed
  • Security: security.password_reset.request · execute · login.failed
  • Plugins: plugin.registered · initialized · enabled · disabled
  • Per-plugin events: e.g. chat.tokens.consumed, booking.created, order.fulfilled, lead.captured

Why events are the seam

  • Decoupling. Services emit; subscribers proliferate. No service grows tentacles into other plugins.
  • Pluggable side-effects. Add an audit listener, a Slack notifier, a metrics exporter — without touching the emitter.
  • Replayability. Events are recorded — debugging "what should have happened after this payment captured" is a query, not archaeology.
  • Testability. Service tests assert "event X was emitted with payload Y" — far easier than mocking N collaborators.
Synchronous today, async [planned]. Today the bus dispatches in-process. The same handler signature will continue to work when the bus moves to a durable queue for async fan-out — no plugin code changes.
VBWD · Core events
24 / 33
VBWD Core
Services + DI · the wiring

A typed DI container.
No globals. No singletons by accident.

The core uses dependency-injector to wire repositories, services, and infrastructure (database session, Redis client, event bus, secrets provider). Every consumer asks for what it needs; nothing reaches for it through a global. The container is configured once at app start and overrideable in tests.

Container

One Container per app, declared as a class with typed providers — singletons, factories, configurations, resources.

Wiring

Routes, services, plugins receive collaborators via constructor injection. @inject at the edges; pure constructors elsewhere.

Test override

In tests, providers are swapped: in-memory repositories, fake event bus, deterministic clock. No service knows it's been mocked.

Named services

  • AuthService, UserService, SubscriptionService
  • InvoiceService, RefundService, TokenService
  • PluginService · enable / disable / config
  • WebhookService, EmailService
  • EventDispatcher

Repositories

  • One per aggregate: UserRepository, SubscriptionRepository, InvoiceRepository, …
  • Read methods return domain objects, not ORM rows where it matters.
  • Write methods are explicit: no implicit flush, no cross-aggregate writes.
  • Services compose repositories; the orchestration of multi-aggregate writes lives in the service, not in the ORM session magic.
VBWD · Services + DI
25 / 33
VBWD Core
SOLID in practice · not as decoration

The five letters that keep
the plugin system honest.

S

Single Responsibility — one reason to change per class

Routes validate. Services orchestrate. Repositories persist. Models describe shape. Event handlers react. When a class wears two hats, the test suite gets harder to read — and that's the smell that triggers a split.

O

Open / Closed — extend by adding plugins, not by editing core

Every extension point is a contract: BasePlugin, PaymentProviderPlugin, line-item handler, shipping provider, event subscriber. New behaviour ships as a new class implementing one of these — never as an if <tenant>: in the core.

L

Liskov — every payment provider is interchangeable

Stripe, PayPal, Conekta — same interface, same return shapes, same exception surface. The checkout service does not branch by provider. If a provider can't honour the contract (e.g. no partial refund), it fails the same way every other provider would.

I

Interface Segregation — small surfaces, sharp tools

The plugin SDK is split: get_blueprint, register_event_handlers, register_line_item_handlers, register_shipping_providers. A plugin that only emits events doesn't need to know any of the others exist.

D

Dependency Inversion — code against contracts, not concretes

Services receive repository interfaces. The container injects the SQLAlchemy implementation in production, an in-memory one in tests. Plugins consume the event bus interface, not its in-process implementation — so the upgrade to a durable queue is a wiring change, not a rewrite.

VBWD · SOLID
26 / 33
VBWD Core
Security · what's wired in by default

Defaults that don't get you breached on a Tuesday.

JWT auth

Bearer tokens with short TTL + refresh. Signed with a per-deploy secret; rotated without invalidating live sessions.

RBAC

Roles + access levels. Plugins declare their own permission scopes; the matrix is editable from the admin UI.

Rate limiting

Public endpoints rate-limited per IP and per user. Login + password-reset flows have stricter caps + lockouts.

Password reset

Time-limited single-use tokens. Same response shape on success and on unknown email — no enumeration leak.

Webhook signing

Outbound webhooks signed with HMAC; inbound (from payment providers) verified before any state change.

Idempotency

Order creation, payment capture, refund — all idempotent against an idempotency-key column. Retries are safe.

Audit log

Every privileged action recorded — who, when, what, from where. Plugins extend the schema with their own audit entries.

Secrets

Provider keys via env vars or vault references — never in code, never in plugin_config. Fail-closed on default secrets.

Login + session safety

  • Argon2id password hashing.
  • login.failed events feed velocity-based blocks.
  • MFA hooks at the auth-service layer; TOTP shipped, WebAuthn [planned].
  • Same response on bad-password and unknown-user.

API + plugin safety

  • Plugin API allowlist — IP allowlist + signed key for content-publishing endpoints.
  • Schema validation at every route boundary.
  • Output filtered by RBAC scope before serialisation.
  • CORS deny-by-default; per-route opt-in.
VBWD · Security
27 / 33
Section
Section opener
Open source

All on GitHub.
Read the code.
Fork it. Ship it.

47 public repos under VBWD-platform. BSL 1.1 — self-host for free, license needed only at production scale.

VBWD · GitHub
28 / 33
GitHub
VBWD on GitHub · the summary
github.com/VBWD-platform

Three things to know before you clone.

Everything VBWD ships lives in one GitHub organisation. The architecture is in the open, the licensing is honest, and the plugin model means you can ship a feature without ever touching core. Three pillars — that's the whole pitch.

One organisation, 47 public repos

github.com/VBWD-platform hosts the full SDK plus every plugin as its own repo. Each plugin can ship at its own cadence; the umbrella SDK pins the versions that compose into a release.

§

BSL 1.1 — open for builders

Source-available under the Business Source License 1.1. Self-host for development, evaluation, and personal use without a commercial licence. Production use at scale → talk to us. Nothing hidden, nothing rugged.

Plugin-per-repo, not monolith

A backend plugin and its fe-user / fe-admin counterparts live in three independent repos. Build, test, release them separately. The SDK glues them together via standard Python and Vue plugin contracts — no fork.

How to read the next three slides. The platform (the canvas) → the feature plugins (what users actually pay for) → the payment marketplace (how money lands in the bank). Each card is a real GitHub repo you can clone today.
VBWD · GitHub · summary
29 / 33
GitHub · Part 1 of 3
The platform — the canvas every plugin paints on
Part 1 · The platform

Four repos. One platform.

The runtime that boots before any feature loads — auth, sessions, plans, invoices, events, the plugin loader. Read the code, run the test suite, file an issue. Everything below is one git clone away.

vbwd-sdk · the umbrella

Recipes, dev-install scripts, integration test harness. Start here to spin up the whole stack on a laptop in under five minutes.

→ github.com/VBWD-platform/vbwd-sdk

vbwd-backend · Python · Flask

The API — auth, billing, CMS, plugin host, event bus, DI container. Postgres + Redis. Drop-in plugins via standard Python imports.

→ github.com/VBWD-platform/vbwd-backend

vbwd-fe-user · Vue 3

The user-facing SPA — dashboard, checkout, plan picker, invoices, language switcher. Plugins inject their own routes + stores at boot.

→ github.com/VBWD-platform/vbwd-fe-user

vbwd-fe-admin · Vue 3

The back-office SPA — plans, users, invoices, plugin settings, content moderation. Same plugin contract as fe-user; same hot-reload story.

→ github.com/VBWD-platform/vbwd-fe-admin

Bonus repo: vbwd-fe-core — the shared Vue component library both SPAs depend on. Buttons, tables, forms, modals, theme tokens. Touch it once, both apps update.
VBWD · GitHub · platform
30 / 33
GitHub · Part 2 of 3
The plugins — what users pay for
Part 2 · Feature plugins

Six plugins, six businesses, one stack.

Each plugin trio — backend + fe-admin + fe-user — is a complete feature you can ship as-is or fork. Mix and match: a hotel ships booking + cms; a SaaS ships subscription + meinchat; a creator marketplace ships shop + discount. The core never changes.

cms · pages, layouts, widgets

Drop-in CMS with theme switcher, page-level access control, and a widget registry that other plugins extend.

→ vbwd-plugin-cms

booking · slots, rooms, seats

Calendars + bookable resources. Doctors, hotels, classrooms — same engine, different config. Includes admin moderation + user self-service.

→ vbwd-plugin-booking

shop · cart, products, inventory

Storefront catalogue + warehouse inventory + checkout flow. Pairs with discount for coupons and shipping_flat_rate for fulfilment.

→ vbwd-plugin-shop

meinchat · 1-on-1 messaging

Nicknames, address book, image attachments, peer-to-peer token transfer. Admin moderation: ban, audit, inspect any conversation.

→ vbwd-plugin-meinchat

$

subscription · plans & invoices

Tiered plans, add-ons, prorated upgrades, dunning, cancellation. The billing backbone every paying instance depends on.

→ vbwd-plugin-subscription

taro · LLM-metered surface

Token-billed AI conversation, tarot reading skin. Reference for how to ship an LLM feature with billing already wired.

→ vbwd-plugin-taro

Each plugin is a trio. Browse the org — vbwd-plugin-<name>, vbwd-fe-user-plugin-<name>, vbwd-fe-admin-plugin-<name> — three repos per feature, each with its own tests and CI.
VBWD · GitHub · plugins
31 / 33
GitHub · Part 3 of 3
The payment marketplace — global rails
Part 3 · Payment plugins

Nine rails. Five continents. Pick what your buyer pays with.

Every payment provider is a plugin — drop in the rails your market uses, ignore the rest. Card-first markets get Stripe / PayPal. Local-rail markets get Pix, OXXO, KakaoPay, PromptPay, TrueMoney. One checkout flow, many settlement paths.

stripe · global cards

The default. Cards, Apple/Google Pay, SEPA, Bacs.

→ vbwd-plugin-stripe

paypal · the trust badge

The conversion lift on the checkout page that every market still expects.

→ vbwd-plugin-paypal

yookassa · Russia & CIS

Cards, SBP, MIR, Yandex Pay. SBP QR is the standout.

→ vbwd-plugin-yookassa

c2p2 · ASEAN aggregator

2C2P v4: cards + PromptPay + PayNow + GCash + MoMo through one gateway.

→ vbwd-plugin-c2p2

mercado-pago · LATAM

7 countries: Pix, Boleto, OXXO, SPEI, PSE, Webpay, cards.

→ vbwd-plugin-mercado-pago

conekta · Mexico

Cards + MSI installments + OXXO + SPEI bank transfer.

→ vbwd-plugin-conekta

toss-payments · Korea

Widget checkout, KakaoPay, Naver Pay, cash receipts (현금영수증).

→ vbwd-plugin-toss-payments

truemoney · Thailand wallet

Direct QR + deep-link. The wallet most Thai customers already have.

→ vbwd-plugin-truemoney

promptpay · Thailand QR

Direct QR + bank-webhook reconciliation. No aggregator markup.

→ vbwd-plugin-promptpay

Browse them all → github.com/orgs/VBWD-platform — every payment plugin. New corridor? Fork the closest one — the plugin contract is identical.
VBWD · GitHub · payments
32 / 33
Next step
Section opener
Ready to start?

Three paths.
Pick yours.

Talk to us. Buy a license. Build a business on VBWD.

VBWD · Next step
33 / 37
CTA · Talk
Get in touch

Thirty minutes.
One call. Real answers.

We're a small team. The fastest path from "interesting" to "we can do this" is a single call — your stack, your billing problem, our take, your decision. No sales engineering, no deck-driven demo. Bring your hardest question.

What to bring to the call

  • Your stack. Where does identity live? What's your payment provider today? Is there a legacy billing tool we need to migrate from?
  • Your customer. Are they consumers or businesses? What's the average contract value? Do you bill annually, monthly, by usage?
  • Your timeline. "We want to ship in 6 weeks" and "we're scoping for next year" both work — just say which.
  • Your hardest objection. Self-hosted? Open-source? Plugin maintenance? Compliance? Lead with what scares you about VBWD.

Three ways to book

📅

Calendar — instant slot

vbwd.cc/book — pick a 30-min slot in the next two weeks.

Email — async-first

hello@vbwd.cc — start with three lines: your stack, your billing question, your timeline.

💬

GitHub Issue — public

Open an issue in the public repo with your question. Other readers benefit; you get a public, citeable answer.

What we won't do. No drip sequences. No "let me loop in my sales engineer." You'll talk to a builder. If we're not a fit, we'll say so — and point you at the tool that is.
VBWD · Get in touch
34 / 37
CTA · Buy
License a VBWD instance today

Four tiers. All self-hosted.
No usage limits. No surprise bills.

The license is annual and the price is a single number — no per-seat, no per-transaction, no API call counters. You self-host on your infrastructure (or ours, see managed hosting). Updates included for the year.

Community
Free · BSL 1.1
Under 5K EUR annual revenue OR fewer than 24 active users. All plugins. All payment providers. Community Discord, email support 48h. Perfect for solo builders and proof-of-concepts.
$0 / forever
Starter
Solo founders + small businesses
Above the Community thresholds. Same code, same plugins, just licensed for commercial scale. Email support, 48h SLA, monthly platform-updates webinar.
$499 / year
Professional
Growing businesses
Multiple plugins activated, priority support (8h SLA, Slack-shared channel), monthly architecture check-in, early access to new plugins. Most popular tier for funded startups.
$1,499 / year
Enterprise
Multi-deployment + white-label
White-label rights, multi-deployment license, 4h SLA, dedicated engineer, weekly check-in, custom plugin development included (40h/year). For agencies and platform-of-platforms operators.
$4,999 / year
Buy now. vbwd.cc/buy — card payment, instant license key delivery, money-back within 30 days, no questions. Tier upgrades pro-rate; you only pay the difference.
VBWD · Buy a license
35 / 37
CTA · Partner
Become an agency partner

Sell VBWD to your clients.
Keep 20–30%. Own the relationship.

If you run a digital agency, a dev shop, or you consult on billing and identity infrastructure, VBWD is a product you can resell. You sell the license + the implementation; we provide the platform, the updates, and tier-3 support. Your client's logo on the dashboard, your name on the contract.

Registered
Free · for starters
Listed in the public partner directory. 20% commission on every license you sell. Access to the partner Slack. Quarterly partner-update webinar. No annual fee. Good for "we'll see if this works."
Free / year · 20% commission
Certified
Trained + featured
25% commission. Early access to new plugins (test with clients before GA). Co-marketing budget (case studies, conference speaking slots). VBWD-Certified badge on your website. One annual architecture review with our team.
$999 / year · 25% commission
Premier
Inbound leads + featured listing
30% commission. Inbound leads from vbwd.cc routed to you by geography and specialty. Featured listing in the directory (above all Certified partners). Monthly strategy call. First-look at large RFPs we receive. Path to white-label.
$2,499 / year · 30% commission

Partner economics — one engaged partner

  • Sells 8 licenses / year (Pro tier) → your commission: ~$3,000 / yr
  • 3 clients move to your managed hosting → recurring ~$5,000 / yr
  • 2 clients need custom plugin work → billable to client at your rate
  • Becomes the regional VBWD expert in your market

Apply

  • Form: vbwd.cc/partner
  • Review: 5 business days; we look at portfolio + fit, not headcount.
  • Onboarding: 4-week certification track (free for Certified tier).
  • First sale: we'll co-sell your first license with you. Skin in the game.
VBWD · Agency partner program
36 / 37
VBWDPlatform overview2026-05-07

Thank you.

A sales platform for the digital world. One self-hosted backend, two Vue front-ends, one plugin contract, twenty-plus payment methods, an internal token economy, a CMS, a shop, a booking engine, and an extensible AI surface — installed once, extended forever.

Editions
CE — self-hosted today
ME — cloud marketplace [planned]
License
BSL 1.1
Source-available
Stack
Python 3.11 · Flask 3.0 · SQLAlchemy 2.0
Vue 3 · Vite · Pinia · TypeScript
Where to start
./recipes/dev-install-ce.sh
Backend + fe-admin + fe-user, locally
vbwd-sdk · sales platform for the digital world
33 / 33