tightenco/nova-stripe
Stripe metrics for Laravel Nova. Adds dashboard cards that pull monthly recurring revenue, new customers, churn, and subscription activity straight from the Stripe API, so you can monitor key billing stats inside Nova without leaving your admin panel.
Architecture fit
v2 was instrumentation: a Nova tool that called the Stripe API on render, held no state, and could not corrupt anything. v3 is a different class of component. It is a sync pipeline plus an admin UI: Stripe Products, Customers, Charges, and Subscriptions are replicated into the application's own database, then surfaced through native Nova resources with search, filters, and pagination.
That materially improves the product — search and filtering over local tables is exactly what made the Stripe Dashboard preferable to the old tool for anything beyond a glance at recent charges — but it changes the architectural contract:
Adoption remains gated on a Nova licence, and now also on scheduler/queue infrastructure and a data-retention stance.
Integration feasibility
Still conventional, but no longer trivial — the day-one estimate now depends heavily on account size.
composer require tightenco/nova-stripe (pin to 3.0.x)migrateNovaServiceProvidercanSeeEffort: well under a day for wiring, plus a backfill window that scales with charge history — negligible for a small account, potentially hours of throttled job time for one with tens of thousands of charges and subscriptions.
Technical risk
Overall: moderate, up from low-to-moderate. The correctness and security risks have moved from "an operator sees something they shouldn't" to "the org stores PII it did not previously store and trusts a copy that may be stale."
| Risk | Severity | Notes |
|---|---|---|
| Persistent PII replication | High | Customer name/email/address and charge metadata now live in your DB — in scope for GDPR/CCPA access and erasure requests, backups, and any log/screenshot that persists |
| Stale or silently broken sync | High | The UI now looks authoritative because it is searchable and filterable; a dead scheduler produces confident, wrong answers with no error surface |
| Stripe secret key handling | High | Still required; needs read scopes across four resource families, and a webhook secret if applicable — use a restricted key, never the transactional key |
| Breaking v2→v3 upgrade | High (if already on v2) | Complete rewrite: new config, new schema, new sync model; in-place upgrade is not a supported path |
| Over-broad data exposure | High | Unchanged, and broader now — subscriptions and customer records join charges in the visible set |
| Sync idempotency / drift | Medium | Duplicate or partial records if the upsert key or cursor handling is wrong; verify re-runs are safe |
| Large-account backfill & DB growth | Medium | Initial sync duration and table size scale with history; needs indexes and batching |
| Nova version lockstep | Medium | Unchanged; the rewrite adds a new surface to re-verify on every Nova major |
| Stripe API version drift | Medium | Now a sync correctness concern (field/status changes) rather than a render-time one |
| Maintenance concentration | Medium | v3.0.0 is a fresh, thinly battle-tested code path from a single vendor — but the rewrite is genuine evidence of investment, which partially offsets the earlier concern |
The v3 rewrite significantly raises the package's value: the reason to keep a browser tab on the Stripe Dashboard was that the old tool could not answer "find this customer's charges." That gap is now closed. The cost is that a convenience mirror has become a data store.
Key questions
created watermark) or a full re-pull? Incremental is the difference between a viable and an unviable large-account install.Stack fit
Laravel 10/11 (Laravel 11 support landed in this release, removing a real blocker), PHP 8.1+, Nova 4/5, Stripe PHP SDK — and now a scheduler and queue workers as hard prerequisites. Still assumes a single Stripe account per application instance; multi-tenant architectures mapping tenants to distinct Stripe accounts remain out of scope.
Migration path
This is now a genuine migration, not an additive install. Two migrations exist:
Compatibility
Sequencing
canSee/policy gating on every resource before production; unchanged as the highest-blast-radius step.Maintenance
Meaningfully higher than v2, and the increase is structural rather than cosmetic. You now own: composer upgrades on every Laravel/Nova bump, schema migrations on package upgrades, sync job health, queue worker capacity, credential rotation, Stripe API version reviews, and a data-retention obligation that did not previously exist. Budget roughly a half-day per Laravel/Nova major upgrade plus a migration review, not the few hours v2 required. The zero-dependents problem persists: no ecosystem pressure forces the maintainer to track Nova releases, so a pin-and-fork scenario remains plausible.
Support
MIT, community-supported via GitHub issues, no SLA, single-vendor stewardship. The rewrite is a positive signal — it is real engineering investment, not abandonment — and the arrival of additional contributors is mildly reassuring. But 3.0.0 is a new code path with a small user base; expect to self-diagnose sync problems. The exit cost has risen: v2 could be replaced by a ~100-line Nova card, whereas replacing v3 means rebuilding a sync pipeline plus UI — a few days, not an afternoon. Evaluate that cost explicitly at install time rather than assuming the old escape hatch still applies.
Scaling
The read path improved dramatically: Nova now queries local indexed tables, so search and pagination are fast and independent of Stripe latency. This eliminates the v2 timeout-behind-a-load-balancer concern entirely.
The write path is the new constraint:
stripe_id, customer_id, and created, and decide whether to prune old records.withoutOverlapping) or you will get duplicate upserts and rate-limit contention.Failure modes
Ramp-up
Low for operators — it is now a familiar Nova resource experience with search and filters, arguably easier than v2. Low-to-moderate for engineers: install is still a day, but the team must learn the sync model, the failure signature of a stalled job, and the rule that this view is a mirror, not a ledger. The organizational ramp-up is the real cost, and it has grown: security must approve a new PII store, legal must approve retention and erasure, and finance must be trained not to reconcile against a synced snapshot.
TPM recommendation: v3 changes the calculus in both directions. The value case is now genuinely strong — local search and filtering remove the main reason operators kept a Stripe Dashboard tab open — but the package is no longer disposable instrumentation; it is a PII-bearing data pipeline with a schema, a scheduler, and a staleness failure mode. Adopt if a Nova licence already exists and you can commit to sync monitoring plus a retention policy, and prefer a clean install on 3.0.x over an in-place v2 upgrade. The earlier "replace with a ~100-line Nova card" fallback no longer holds — recompute that exit cost before signing up.
How can I help you explore Laravel packages today?