Keyboard shortcuts

Press ← or → to navigate between chapters

Press S or / to search in the book

Press ? to show this help

Press Esc to hide this help

Laravel: Cashier and Stripe ($) for Custom Checkouts

Not every “we need to take payments” request is a storefront. Often it’s a single subscription plan, a one-time checkout, or a usage-based billing model bolted onto an app that isn’t a store at all. Cashier is Laravel’s official wrapper around Stripe (and, in a separate package, Paddle), designed for exactly that.

composer require laravel/cashier
php artisan vendor:publish --tag="cashier-migrations"
php artisan migrate
class User extends Authenticatable
{
    use Billable;
}

// starting a subscription
$user->newSubscription('default', 'price_monthly_pro')
    ->create($paymentMethodId);

// checking access
if ($user->subscribed('default')) {
    // grant access
}

// a one-time checkout, no subscription
return $user->checkout(['price_one_time_item']);

Webhooks (payment succeeded, subscription canceled, card expired) are handled by a route Cashier registers automatically, keeping your database in sync with Stripe’s state without polling.

Pricing

Stripe itself is a paid, transaction-fee-based service (a percentage plus a fixed amount per successful charge), which is what earns it the $ here. Cashier, the Laravel integration package, is free and open source; the cost is entirely on the payment processing side.

When to reach for this

A Laravel app that needs subscriptions, one-time payments, or usage billing, but isn’t a multi-product catalog store. Think SaaS pricing tiers, not a shopping cart.

When it’s the wrong fit

An actual product catalog with inventory, variations, and shipping. That’s WooCommerce or Sylius territory; Cashier has no concept of a “product” beyond a Stripe price ID.

Under the hood: Cashier verifies incoming Stripe webhooks using a cryptographic signature check against a shared secret, confirming the request genuinely came from Stripe and wasn’t spoofed, before ever trusting its payload to update a subscription’s status in your database.