Skip to content

Satellites

Enabling a satellite

bash
# Selective at install
node ace configure @adonisjs-lasagna/saas-tenancy --with=audit,webhooks

# Add a new one later — re-run with the satellite list you want
node ace configure @adonisjs-lasagna/saas-tenancy --with=audit,webhooks,sso

The configure command is idempotent; re-running it does not duplicate migrations or tenant model scaffolding.

The nine satellites

SatelliteWhat it gives youStorage
AuditStructured audit trail with actor + payload, queryable by date range.tenant_audit_logs
Feature flagsPer-tenant flags with percentage rollout.tenant_feature_flags
WebhooksHMAC-signed outbound events with delivery state machine and retries.tenant_webhooks, tenant_webhook_deliveries
BrandingPer-tenant logo, colors, custom domain, encrypted SMTP.tenant_brandings
SSOPer-tenant OIDC config with JWKS-backed verification.tenant_sso_configs
MetricsTime-series counters per tenant with cursor-based aggregation.tenant_metrics
QuotasPlan-bound limits; rolling and snapshot, served as middleware.tenant_quotas, tenant_plans
BillingStripe integration — idempotent webhook, dunning, metered, checkout/portal, lifecycle hook.stripe_customers, stripe_subscriptions, stripe_processed_events, stripe_meter_events
ImpersonationAdmin enters a tenant as a target user, time-boxed and audited.Redis (no DB row)

Cross-satellite invariants

  • Every satellite that writes to a database table goes through the backoffice schema; never the per-tenant schema. This makes cross-tenant reporting and aggregate queries straightforward.
  • Every satellite that mutates state writes an audit row when the audit satellite is enabled. The audit service is the single point of truth for "who did what".
  • Satellites never call each other directly; they go through their respective service contracts. Replace one and the rest keep working.

Pick a satellite from the table above, or look at the admin REST API for the HTTP surface they share.

Was this page helpful?

Released under the MIT License.