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 / 32
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 / 32
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 / 32
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 / 32
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 / 32
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 / 32
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 / 32
CMS plugin
CMS-plugin bundle · everything marketing needs

CMS-plugin bundle
pages, content, theme, widgets, menus.

One plugin trio (backend + fe-admin + fe-user) covers every CMS job a SaaS site needs. Marketing edits in the admin; the user-facing renderer picks it up on next request — no deploy, no shipping engineer.

Create & edit pages

Slug-routed pages with rich body, SEO fields, locale variants, draft/publish workflow. Per-page access level (public / authed / role-gated).

Import / export content

JSON / Markdown export per page, per category, or the whole site. Re-import into another instance to clone a content tree across deployments.

Theming

CSS custom properties drive every visual surface. Theme switcher per instance, per locale, or per landing — same components, different brand.

Widgets

Hero, pricing table, FAQ, testimonials, gallery, plus widgets contributed by other plugins (booking form, shop grid, taro reading). Drop into any layout.

Menus

Multi-level menus, page or external links, per-locale. Menu changes are a CMS edit — not a frontend deploy.

Categories & access

Tag pages into categories for taxonomy + listings; gate categories or individual pages by user role / plan / token balance.

VBWD · CMS overview
09 / 32
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 / 32
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.
Import / export

POST /api/v1/admin/cms/export dumps any page, category, or the whole tree to JSON / Markdown with embedded asset refs. POST /import rehydrates on a target instance — clone an entire content tree across deployments in one request.

Categories & access

Pages join one or more cms_category nodes (taxonomy, listings, breadcrumbs). Each page and category carries an access_level: public · authed · role · plan · tokens>=N — enforced server-side before the renderer ever runs.

VBWD · CMS architecture
11 / 32
Section
Section opener
Payments

Take money the way
your customer pays.

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

VBWD · Payments
12 / 32
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 / 32
Section
Section opener
Plugins

Demo plugins
to demonstrate the use of the VBWD platform.

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

VBWD · Plugins
14 / 32
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 / 32
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 / 32
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 / 32
Demo plugin
LLM-Chat · token metering + external API plumbing, demonstrated

A reference demo for two platform features:
internal tokens + external API services.

LLM-Chat is a deliberately thin plugin whose only job is to demonstrate how the platform's internal token wallet integrates with any external API service behind it (OpenAI, Anthropic, Mistral, a self-hosted endpoint — anything). Clone this plugin, replace "LLM" with "your-external-service", and you have a billing-ready feature in an afternoon.

flowchart LR U(("User
sends message")) F["fe-user
llm-chat plugin"] A["/api/v1/plugins/chat
backend plugin"] T["Token wallet
(VBWD core)"] L[["External API
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
① Internal token system
  • Wallet per user — funded by subscription grant + bought bundles + admin top-up.
  • Pre-call meter. @meter("chat.send", cost=10) deducts before the external call fires — no half-charged round-trips.
  • Per-call ledger in the dashboard: provider, model, prompt + response tokens, USD cost, customer-facing token cost.
② External API connector
  • Provider-agnostic adapter. One config switch between OpenAI, Anthropic, Mistral, or a self-hosted endpoint — no plugin code changes.
  • Reusable pattern. Swap "LLM" for any paid 3rd-party API (image-gen, transcription, geo-lookup). The metering scaffold is identical.
  • Secrets in plugins/llm-chat/config.json, never in the user UI. API key rotation is one admin action.
VBWD · LLM-Chat
18 / 32
Demo plugin
Taro · subscription-plan configuration, demonstrated

Taro — a reference demo for
subscription-plan configuration.

Taro is a deliberately small AI tarot-reading plugin whose primary purpose is to show what the platform's subscription engine can configure: tiered plans, monthly feature grants, included token allowances, plan-gated spreads, add-on bundles, prorated upgrades. Marketing edits the plans in the admin; the plugin reads the rules at runtime. Nothing about pricing is hardcoded.

Tiered plans

Free / Reader / Pro tiers, each defined entirely in the admin: monthly price, included readings, allowed spread types, refresh cadence.

Token grants + add-ons

"Pro = €19 + 30 readings/month"; sell extra token bundles for users who burn through their grant. Roll over or expire — admin chooses.

Plan-gated features

Celtic-cross spread + custom prompts unlocked only on Pro; Free tier limited to single-card draw. All toggled from the plan definition.

What the subscription engine handles

  • Plan catalogue with add-ons, discounts, trials, intro pricing.
  • Monthly billing cycle + prorated upgrades / downgrades.
  • Dunning, retries, payment-method failure handling.
  • Token grant refresh on each renewal.
  • Cancellation flow + grace period.

What Taro itself ships

  • The deck, the spreads, the prompt library.
  • ~600 lines of plugin code, no core changes.
  • One config.json mapping plan → feature flags.
  • An admin panel for prompts + usage review.
The lesson. Taro proves the subscription engine can drive any niche product's pricing model — replace "tarot" with "code review", "essay coach", "diet planner": the plan substrate is identical.
VBWD · Taro
19 / 32
Plugins
Discounts and Checkout plugin

Discounts and Checkout plugin —
two halves that meet at the cart.

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 / 32
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 / 32
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
22 / 32
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
23 / 32
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
24 / 32
VBWD Core
Engineering patterns · how the code stays honest

Patterns the core enforces —
not as decoration, but as contracts.

SOLID

  • S · Single Responsibility. Routes validate, services orchestrate, repositories persist, models describe. One reason to change per class.
  • O · Open / Closed. Extend by adding plugins, never by editing core. Every extension point is a contract: BasePlugin, PaymentProviderPlugin, line-item handler, event subscriber.
  • L · Liskov substitution. Every payment provider is interchangeable — Stripe / PayPal / Conekta share interface, return shapes, exception surface. Checkout doesn't branch by provider.
  • I · Interface segregation. Plugin SDK is split: a plugin emitting events doesn't need to know about line items or shipping.
  • D · Dependency inversion. Services take repository interfaces; container injects SQLAlchemy in prod, in-memory in tests. Event-bus is an interface — durable queue is a wiring change, not a rewrite.

Beyond SOLID

  • TDD-first. Every new model / service / route lands with unit tests in the same PR. make test is the gate; CI re-runs on every push. No tests, no merge.
  • Clean code. Readable names, small functions, explicit returns. No clever one-liners, no abbreviations. If a reviewer has to ask "what does this variable mean", the variable gets renamed.
  • DRY. Shared logic lives in core.utils or a base class — never copy-pasted. A bug fix happens once, in one place.
  • DevOps-first. One image pipeline, one CI workflow, one deploy command. Adding a client is a config diff, not a release. ./deploy.sh <instance> from clean clone to live: <5 min.
  • Liskov + interfaces over inheritance. The plugin contract is composition by default; subclassing core base classes is the exception, not the rule.
The contract is the architecture. Plugins consume interfaces; core defines them; tests pin them. Every "yes, we can ship that" promise rests on these five letters plus the four practices above — they're what makes a one-week MVP for a new client a sane statement, not optimism.
VBWD · SOLID
25 / 32
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
26 / 32
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
27 / 32
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
28 / 32
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

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
29 / 32
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
30 / 32
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
31 / 32
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
32 / 32