SellubDevelopersPlugin architecture

Plugin architecture

Sellub’s server is a Vendure application; almost every Sellub-specific behaviour ships as a Vendure plugin under apps/sellub/sellub-server/src/plugins/. This page is the canonical map of those plugins, what they own, and how they relate.

Naming convention. New, Sellub-owned plugins use the sellub-* prefix. A small handful of older or “library-flavoured” plugins keep their original names (multivendor-plugin, marketplace-shop-plugin, seller-profile-plugin, admin-customer-plugin, inventory-sync-plugin, arkesel-sms-plugin). All future plugins should use the prefix.

At a glance

PluginPurposeOwns custom fields
sellub-coreShared utilities, channel guards, RBAC primitives
sellub-api-keysChannel-scoped publishable/secret keys; embed sessionsChannel.sellubApiKeys, etc.
sellub-pricing-pluginPersists OrderFeeBreakdown; commission/processor mathSeller.sellerPlan, etc.
sellub-commerce-api-pluginPlan subscriptions, sandbox channels, API usage logs, webhooksChannel.sellubIsSandbox, etc.
sellub-event-bridgeForwards Vendure events to DPS (dps_vendure_event cloud function)
sellub-paymentPaystack integration (handler + webhook controller)
sellub-external-paymentsOne-shot payments outside the cart (donations, hosted invoices)
sellub-subscriptionsRecurring billing primitives (Paystack subs)
sellub-billingOperator-facing billing (invoicing platform fees)
sellub-deliveryWrapper that registers the delivery base plugin
sellub-delivery-baseLocal-courier delivery method, address validation, dispatch hooksOrder.deliveryQuote
sellub-fulfilmentVendure fulfilment handler glue
sellub-freightInternational / multi-leg freight quoting(planned)
sellub-printPrint-on-demand product type and POD partner adapters(planned)
sellub-servicesTime-bookable services (lessons, consultations)(planned)
sellub-bundlesBundle/composite products(planned)
sellub-socialSocial-graph product surfacing (likes, follows, sharing hooks)(planned)
multivendor-pluginMarketplace channel-per-seller scaffoldingvarious seller fields
marketplace-shop-pluginAggregated marketplace shop API (cross-channel listings)
seller-profile-pluginSeller public profile resolver + admin mutationsvarious seller fields
admin-customer-pluginAdmin-side customer management extensions
inventory-sync-pluginCross-channel stock sync, partner inventory webhooks(planned)
arkesel-sms-pluginArkesel SMS provider for Vendure notifications

Layering

                        Vendure core

                ┌────────────┼────────────┐
                │            │            │
           sellub-core    multivendor   admin-customer

   ┌────────────┼────────────────────────┐
   │            │                        │
 sellub-       sellub-                sellub-
 api-keys      pricing-plugin         commerce-api-plugin
                │                        │
                └────► sellub-event-bridge ────► DPS
   sellub-payment ──► sellub-external-payments
                  └─► sellub-subscriptions ──► sellub-billing
   sellub-delivery ──► sellub-delivery-base
                       sellub-fulfilment
   sellub-freight, sellub-print, sellub-services,
   sellub-bundles, sellub-social  (vertical product types)
   marketplace-shop-plugin, seller-profile-plugin (storefront/admin views)
   inventory-sync-plugin (sync glue)
   arkesel-sms-plugin (notifications)

When to add a new plugin

Create one when any of these are true:

  1. You’re introducing a new product type (freight, services, bundles, etc.).
  2. You need new custom fields on a Vendure entity.
  3. You’re integrating a new third-party provider (payments, courier, SMS).
  4. You’re forwarding events to a system outside the Vendure DB.

Otherwise, extend an existing plugin.

Plugin authoring rules

  • One plugin = one concern. Don’t bolt sandbox-channel logic into sellub-payment; that’s sellub-commerce-api-plugin’s job.
  • Channel-aware by default. Resolvers must enforce the active channel; see sellub-core/RequireSellubChannel.
  • No DPS imports in plugins other than sellub-event-bridge. Other plugins talk to DPS via Vendure events that the bridge forwards.
  • Custom fields live with their owning plugin. The plugin that reads a field also declares it.
  • Admin GraphQL ≠ Shop GraphQL. Operator features go on Admin; storefront features go on Shop. Don’t mix.
  • READMEs are required. Every src/plugins/* directory has a README.md describing scope, custom fields, GraphQL surface and env vars.

Deprecated / removed plugins

Removed pluginReplaced byNotes
dps-e-*sellub-* equivalents (Path B, May 2026)Renamed in place; same code
dps-delivery-pluginsellub-delivery-baseRestored from git history
dps-event-bridgesellub-event-bridgeRestored from git history
16× @duabalabs/sellub-vendure-* npm packages(none — internal only)Deprecated on npm + deleted on GitHub on 2026-05-11

See also