379 lines
11 KiB
Markdown
379 lines
11 KiB
Markdown
---
|
|
name: laravel-cashier-paddle
|
|
description: Laravel Cashier (Paddle) - Subscription billing and payment processing
|
|
---
|
|
|
|
# Laravel Cashier (Paddle) Skill
|
|
|
|
Comprehensive assistance with Laravel Cashier Paddle - an expressive, fluent interface to Paddle's subscription billing services for Laravel applications.
|
|
|
|
## When to Use This Skill
|
|
|
|
This skill should be triggered when:
|
|
- Implementing subscription billing with Paddle in Laravel applications
|
|
- Setting up checkout flows for products or subscriptions
|
|
- Managing subscription lifecycle (create, swap, pause, cancel)
|
|
- Handling webhook events from Paddle
|
|
- Working with customer management and payment methods
|
|
- Implementing trial periods or multi-product subscriptions
|
|
- Processing transactions, refunds, or credits
|
|
- Generating invoices or receipts
|
|
- Previewing prices with currency/tax calculations
|
|
- Debugging Paddle integration issues in Laravel
|
|
|
|
## Quick Reference
|
|
|
|
### 1. Basic Setup - Billable Model
|
|
|
|
```php
|
|
use Laravel\Paddle\Billable;
|
|
|
|
class User extends Authenticatable
|
|
{
|
|
use Billable;
|
|
|
|
public function paddleName(): string|null
|
|
{
|
|
return $this->name;
|
|
}
|
|
|
|
public function paddleEmail(): string|null
|
|
{
|
|
return $this->email;
|
|
}
|
|
}
|
|
```
|
|
|
|
### 2. Simple Product Checkout
|
|
|
|
```php
|
|
// Create checkout session
|
|
$checkout = $user->checkout('pri_deluxe_album')
|
|
->returnTo(route('dashboard'));
|
|
|
|
// Display checkout button
|
|
<x-paddle-button :checkout="$checkout" class="px-8 py-4">
|
|
Subscribe
|
|
</x-paddle-button>
|
|
```
|
|
|
|
### 3. Subscription Creation
|
|
|
|
```php
|
|
// Single subscription
|
|
$checkout = $user->subscribe('price_basic_monthly', 'default')
|
|
->returnTo(route('home'));
|
|
|
|
// Multi-product subscription
|
|
$checkout = $user->subscribe([
|
|
'price_monthly',
|
|
'price_chat' => 5 // with quantity
|
|
]);
|
|
```
|
|
|
|
### 4. Price Preview with Tax
|
|
|
|
```php
|
|
use Laravel\Paddle\Cashier;
|
|
|
|
// Preview prices for country
|
|
$prices = Cashier::previewPrices(['pri_123', 'pri_456'], [
|
|
'address' => ['country_code' => 'BE', 'postal_code' => '1234']
|
|
]);
|
|
|
|
// Display in Blade
|
|
@foreach ($prices as $price)
|
|
<li>{{ $price->product['name'] }} - {{ $price->total() }}</li>
|
|
<li>Subtotal: {{ $price->subtotal() }} + Tax: {{ $price->tax() }}</li>
|
|
@endforeach
|
|
```
|
|
|
|
### 5. Subscription Status Checks
|
|
|
|
```php
|
|
// Check various subscription states
|
|
if ($user->subscribed()) { }
|
|
if ($user->subscribed('default')) { }
|
|
if ($user->subscribedToProduct('pro_basic')) { }
|
|
if ($user->subscription()->onTrial()) { }
|
|
if ($user->subscription()->onGracePeriod()) { }
|
|
if ($user->subscription()->canceled()) { }
|
|
if ($user->subscription()->pastDue()) { }
|
|
```
|
|
|
|
### 6. Plan Swapping
|
|
|
|
```php
|
|
// Immediate swap with proration
|
|
$user->subscription()->swap('pri_456');
|
|
|
|
// Swap and invoice immediately
|
|
$user->subscription()->swapAndInvoice('pri_456');
|
|
|
|
// Swap without proration
|
|
$user->subscription()->noProrate()->swap('pri_456');
|
|
```
|
|
|
|
### 7. Subscription Quantity Management
|
|
|
|
```php
|
|
// Increment/decrement quantity
|
|
$user->subscription()->incrementQuantity();
|
|
$user->subscription()->incrementQuantity(5);
|
|
$user->subscription()->decrementQuantity();
|
|
|
|
// Set specific quantity
|
|
$user->subscription()->updateQuantity(10);
|
|
|
|
// Multi-product quantity
|
|
$user->subscription()->incrementQuantity(1, 'price_chat');
|
|
```
|
|
|
|
### 8. Pause and Resume Subscriptions
|
|
|
|
```php
|
|
// Pause at period end
|
|
$user->subscription()->pause();
|
|
|
|
// Pause immediately
|
|
$user->subscription()->pauseNow();
|
|
|
|
// Pause until specific date
|
|
$user->subscription()->pauseUntil(now()->addMonth());
|
|
|
|
// Resume paused subscription
|
|
$user->subscription()->resume();
|
|
```
|
|
|
|
### 9. Webhook Event Handling
|
|
|
|
```php
|
|
use Laravel\Paddle\Events\WebhookReceived;
|
|
use Laravel\Paddle\Events\TransactionCompleted;
|
|
|
|
// Listen for specific events
|
|
Event::listen(TransactionCompleted::class, function ($event) {
|
|
$transaction = $event->transaction;
|
|
// Process completed transaction
|
|
});
|
|
|
|
// Handle custom webhook events
|
|
public function handle(WebhookReceived $event): void
|
|
{
|
|
if ($event->payload['event_type'] === 'transaction.billed') {
|
|
// Handle custom event
|
|
}
|
|
}
|
|
```
|
|
|
|
### 10. Transaction Management
|
|
|
|
```php
|
|
// Retrieve transactions
|
|
$transactions = $user->transactions;
|
|
|
|
// Refund with specific items
|
|
$response = $transaction->refund('Accidental charge', [
|
|
'pri_123',
|
|
'pri_456' => 200 // partial refund amount
|
|
]);
|
|
|
|
// Full refund
|
|
$response = $transaction->refund('Customer request');
|
|
|
|
// Download invoice PDF
|
|
return $transaction->redirectToInvoicePdf();
|
|
```
|
|
|
|
## Key Concepts
|
|
|
|
### Checkout Sessions
|
|
Cashier Paddle uses checkout sessions to initiate payments. Sessions can be for one-time products, subscriptions, or guest checkouts. They support both overlay and inline display modes.
|
|
|
|
### Billable Models
|
|
Any Eloquent model can become "billable" by using the `Billable` trait. This adds subscription and payment methods to your models (typically the User model).
|
|
|
|
### Subscriptions
|
|
Subscriptions represent recurring billing arrangements. They can have multiple products, quantities, trial periods, and various lifecycle states (active, paused, canceled, on grace period).
|
|
|
|
### Transactions
|
|
Transactions represent completed payments. They include invoice data, line items, tax information, and support refunds/credits.
|
|
|
|
### Webhooks
|
|
Paddle sends webhook events for important subscription and payment events. Cashier automatically handles webhook signature verification and provides Laravel events for common webhook types.
|
|
|
|
### Proration
|
|
When swapping plans or changing quantities, Cashier can automatically calculate prorated amounts or you can disable proration using `noProrate()`.
|
|
|
|
### Grace Periods
|
|
When subscriptions are paused or canceled, they remain active until the end of the current billing period. This is called a "grace period" - the subscription is technically paused/canceled but still accessible.
|
|
|
|
## Reference Files
|
|
|
|
This skill includes comprehensive documentation in `references/`:
|
|
|
|
- **other.md** - Complete Laravel Cashier Paddle documentation including:
|
|
- Installation and configuration steps
|
|
- Checkout session creation (overlay, inline, guest)
|
|
- Customer management and defaults
|
|
- Subscription operations (create, swap, pause, cancel)
|
|
- Multi-product and multi-subscription support
|
|
- Trial period management
|
|
- Quantity management and proration
|
|
- Webhook configuration and event handling
|
|
- Transaction history, refunds, and credits
|
|
- Invoice generation and downloads
|
|
- Middleware examples for subscription protection
|
|
|
|
Use `view` to read the reference file when detailed information is needed.
|
|
|
|
## Working with This Skill
|
|
|
|
### For Beginners
|
|
1. Start by understanding the **Billable** trait and how to add it to your User model
|
|
2. Learn **basic checkout** creation for simple product purchases
|
|
3. Study **subscription creation** patterns for recurring billing
|
|
4. Understand **environment configuration** (sandbox vs production)
|
|
|
|
### For Intermediate Users
|
|
1. Implement **subscription lifecycle management** (pause, resume, cancel)
|
|
2. Work with **plan swapping** and proration logic
|
|
3. Handle **webhook events** for subscription updates
|
|
4. Implement **trial periods** with or without upfront payment
|
|
5. Manage **multi-product subscriptions** with quantities
|
|
|
|
### For Advanced Users
|
|
1. Build **custom subscription middleware** for route protection
|
|
2. Implement **multi-subscription** support for different product lines
|
|
3. Create **transaction refund** and **credit** workflows
|
|
4. Customize **invoice generation** and delivery
|
|
5. Build **subscription analytics** using query scopes
|
|
6. Handle **payment method updates** with redirect flows
|
|
|
|
### Navigation Tips
|
|
- Use the Quick Reference above for common code patterns
|
|
- Check `references/other.md` for complete API documentation
|
|
- Search for specific methods like `swap()`, `pause()`, or `refund()`
|
|
- Webhook events are documented with their payload structure
|
|
- All code examples include proper error handling context
|
|
|
|
## Common Patterns
|
|
|
|
### Subscription Protection Middleware
|
|
```php
|
|
namespace App\Http\Middleware;
|
|
|
|
class Subscribed
|
|
{
|
|
public function handle(Request $request, Closure $next): Response
|
|
{
|
|
if (!$request->user()?->subscribed()) {
|
|
return redirect('/subscribe');
|
|
}
|
|
return $next($request);
|
|
}
|
|
}
|
|
|
|
Route::get('/dashboard', fn () => '...')->middleware([Subscribed::class]);
|
|
```
|
|
|
|
### Trial Management
|
|
```php
|
|
// With payment method up front
|
|
$checkout = $user->subscribe('pri_monthly')
|
|
->returnTo(route('home'));
|
|
|
|
// Without payment method (generic trial)
|
|
$user->createAsCustomer(['trial_ends_at' => now()->addDays(10)]);
|
|
|
|
// Extend existing trial
|
|
$user->subscription()->extendTrial(now()->addDays(5));
|
|
|
|
// Activate trial early
|
|
$user->subscription()->activate();
|
|
```
|
|
|
|
### Guest Checkout
|
|
```php
|
|
use Laravel\Paddle\Checkout;
|
|
|
|
$checkout = Checkout::guest(['pri_34567'])
|
|
->returnTo(route('home'));
|
|
```
|
|
|
|
## Environment Configuration
|
|
|
|
```env
|
|
PADDLE_CLIENT_SIDE_TOKEN=your-paddle-client-side-token
|
|
PADDLE_API_KEY=your-paddle-api-key
|
|
PADDLE_RETAIN_KEY=your-paddle-retain-key
|
|
PADDLE_WEBHOOK_SECRET="your-paddle-webhook-secret"
|
|
PADDLE_SANDBOX=true
|
|
CASHIER_CURRENCY_LOCALE=nl_BE
|
|
```
|
|
|
|
## Available Webhook Events
|
|
|
|
- `CustomerUpdated` - Customer information changed
|
|
- `TransactionCompleted` - Payment completed successfully
|
|
- `TransactionUpdated` - Transaction details changed
|
|
- `SubscriptionCreated` - New subscription created
|
|
- `SubscriptionUpdated` - Subscription modified
|
|
- `SubscriptionPaused` - Subscription paused
|
|
- `SubscriptionCanceled` - Subscription canceled
|
|
|
|
## Subscription Query Scopes
|
|
|
|
```php
|
|
// Filter subscriptions by status
|
|
Subscription::query()->valid();
|
|
Subscription::query()->onTrial();
|
|
Subscription::query()->active();
|
|
Subscription::query()->canceled();
|
|
Subscription::query()->paused();
|
|
Subscription::query()->onGracePeriod();
|
|
```
|
|
|
|
## Resources
|
|
|
|
### Official Documentation
|
|
- Laravel Cashier Paddle Docs: https://laravel.com/docs/cashier-paddle
|
|
- Paddle Developer Portal: https://developer.paddle.com/
|
|
|
|
### references/
|
|
Organized documentation extracted from official sources containing:
|
|
- Detailed API method explanations
|
|
- Complete code examples with context
|
|
- Webhook payload structures
|
|
- Configuration options
|
|
- Best practices and patterns
|
|
|
|
### scripts/
|
|
Add helper scripts here for:
|
|
- Webhook testing utilities
|
|
- Subscription migration scripts
|
|
- Invoice batch generation
|
|
|
|
### assets/
|
|
Add templates or examples:
|
|
- Checkout page templates
|
|
- Email notification templates
|
|
- Subscription management UI components
|
|
|
|
## Notes
|
|
|
|
- This skill was automatically generated from official Laravel Cashier Paddle documentation
|
|
- All code examples are tested patterns from the official docs
|
|
- Webhook handling includes automatic CSRF protection exemption
|
|
- Sandbox mode is enabled by default for development
|
|
- Price previews include automatic tax calculation based on customer location
|
|
- Subscriptions support both immediate and grace period cancellations
|
|
- Multi-product subscriptions allow different quantities per product
|
|
|
|
## Updating
|
|
|
|
To refresh this skill with updated documentation:
|
|
1. Re-run the scraper with the same configuration
|
|
2. The skill will be rebuilt with the latest information from Laravel docs
|
|
3. New features and API changes will be automatically incorporated
|