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,ssoThe configure command is idempotent; re-running it does not duplicate migrations or tenant model scaffolding.
The nine satellites
| Satellite | What it gives you | Storage |
|---|---|---|
| Audit | Structured audit trail with actor + payload, queryable by date range. | tenant_audit_logs |
| Feature flags | Per-tenant flags with percentage rollout. | tenant_feature_flags |
| Webhooks | HMAC-signed outbound events with delivery state machine and retries. | tenant_webhooks, tenant_webhook_deliveries |
| Branding | Per-tenant logo, colors, custom domain, encrypted SMTP. | tenant_brandings |
| SSO | Per-tenant OIDC config with JWKS-backed verification. | tenant_sso_configs |
| Metrics | Time-series counters per tenant with cursor-based aggregation. | tenant_metrics |
| Quotas | Plan-bound limits; rolling and snapshot, served as middleware. | tenant_quotas, tenant_plans |
| Billing | Stripe integration — idempotent webhook, dunning, metered, checkout/portal, lifecycle hook. | stripe_customers, stripe_subscriptions, stripe_processed_events, stripe_meter_events |
| Impersonation | Admin 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
backofficeschema; 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.
Read next
Pick a satellite from the table above, or look at the admin REST API for the HTTP surface they share.