status = 'paused' and does not enter a grace period. The subscriber can resume at any time to return to active status. This pattern is useful for seasonal products, temporary budget concerns, or situations where a subscriber needs to step away without permanently ending the relationship.
PauseSubscription
Use thePauseSubscription action to suspend an active or trialing subscription.
- Direct action
- Facade
PauseSubscription::execute() sets status = 'paused' and records paused_at on the Subscription model. It also contacts the configured gateway to suspend the billing schedule.
ResumeSubscription
Use theResumeSubscription action or the facade shortcut to bring a paused subscription back to active status.
- Facade
- Direct action
Paused vs. canceled
| Paused | Canceled (grace period) | Canceled (immediate) | |
|---|---|---|---|
status | paused | grace | canceled |
subscribed() | false | true | false |
onGracePeriod() | false | true | false |
| Can resume | Yes | Yes (before period end) | No |
| Access to features | No | Yes | No |
| Billing suspended | Yes | No (final cycle runs) | Yes |
Query scope
Find all paused subscriptions with the built-in Eloquent scope.Audit history via previous_subscription_id
Some gateways (PayPal, Braintree) create a new gateway subscription when you resume a paused one, rather than reactivating the original. In those cases,ResumeSubscription records the original subscription’s ID on the new record via the previous_subscription_id column, forming a linked audit chain.
Stripe reactivates the same subscription record on resume, so
previous_subscription_id is null for Stripe-managed subscriptions. The column is always populated for PayPal and Braintree resumes.Valid status transitions
TheSubscriptionStatus state machine enforces which transitions are legal. For pause and resume:
active→paused(pause allowed)trialing→paused(pause allowed)paused→active(resume)paused→canceled(cancel a paused subscription)
SubscriptionException.