- Fix bulk delete and individual delete actions using before() hook with halt()
- Add daily/weekly billing cycle options to plan resource and Polar provider
- Enhance payment confirmation with dynamic polling and loading states
- Add graceful handling for deleted plans in subscription display
- Update Polar provider to support dynamic billing cycles
Add comprehensive webhook validation and processing system with Polar.sh integration:
- Create built-in Standard Webhooks package following official specification
- Implement HMAC-SHA256 signature validation with base64 encoding
- Add webhook factory for multi-provider support (Polar, Stripe, generic)
- Replace custom Polar webhook validation with Standard Webhooks implementation
- Add proper exception handling with custom WebhookVerificationException
- Support sandbox mode bypass for development environments
- Update Polar provider to use database-driven configuration
- Enhance webhook test suite with proper Standard Webhooks format
- Add PaymentProvider model HasFactory trait for testing
- Implement timestamp tolerance checking (±5 minutes) for replay protection
- Support multiple signature versions and proper header validation
This provides a secure, reusable webhook validation system that can be extended
to other payment providers while maintaining full compliance with Standard
Webhooks specification.
BREAKING CHANGE: Polar webhook validation now uses Standard Webhooks format
with headers 'webhook-id', 'webhook-timestamp', 'webhook-signature' instead of
previous Polar-specific headers.
- Add Polar-specific date field mapping in PaymentOrchestrator (current_period_start, current_period_end, cancelled_at, trial_end)
- Handle both cancellation scenarios: cancel_at_period_end=true and existing cancelled_at timestamp
- Map customer_cancellation_reason and customer_cancellation_comment from Polar to database
- Update billing page to show correct renewal vs expiry dates based on cancellation status
- Restrict cancel button to activation_key provider only (Polar uses customer portal)
- Fix button spacing between "Manage in Polar" and "Sync" buttons
- Ensure both "Sync" and "Recheck Status" buttons use identical sync functionality
- Add provider_checkout_id column to separate checkout ID from subscription ID
- Update Polar provider to store checkout ID separately and set subscription ID to null initially
- Implement smart sync logic that queries Polar API when subscription ID is missing
- Add fetchPolarSubscriptionId method to find active subscriptions via customer ID
- Update webhook handlers to use provider_checkout_id for subscription lookup
- Make makeAuthenticatedRequest public to enable Subscription model API access
- Support plan metadata matching for accurate subscription identification
- Add fallback to most recent active subscription when no exact match found
This resolves sync button issues by properly tracking checkout vs subscription IDs
and enables automatic subscription ID recovery when webhooks fail.
- Add comprehensive rate limiting (300 req/min) with automatic throttling
- Implement centralized API request method for consistent authentication
- Add support for Polar-specific webhook events (order.created, order.paid, subscription.active, customer.state_changed, benefit_grant.created)
- Update API endpoints to match Polar's official structure (remove /v1 prefix)
- Add external_id support for reliable customer-user mapping
- Implement sandbox mode with separate credentials configuration
- Add discount code support in checkout flow
- Add credential validation method for API connectivity testing
- Update webhook signature validation and event handling
- Enhance error handling and logging throughout provider
- Add proper metadata structure with user and plan information
- Update services configuration and environment variables for sandbox support
BREAKING CHANGE: Updated API endpoint structure and webhook event handling to comply with Polar.sh official API specification.
- Replace Laravel Cashier methods with new subscription system
- Remove session-based subscription checking in bulk components
- Update Dashboard.php to use PaymentOrchestrator for provider-agnostic sync
- Maintain backward compatibility with existing Stripe subscriptions
- Improve performance by eliminating session overhead
- Add automatic migration of legacy subscriptions to new system
BREAKING CHANGE: Subscription checking now uses unified payment system instead of Laravel Cashier methods
- Add unified payment provider architecture with contract-based design
- Implement 6 payment providers: Stripe, Lemon Squeezy, Polar, Oxapay, Crypto, Activation Keys
- Create subscription management with lifecycle handling (create, cancel, pause, resume, update)
- Add coupon system with usage tracking and trial extensions
- Build Filament admin resources for payment providers, subscriptions, coupons, and trials
- Implement payment orchestration service with provider registry and configuration management
- Add comprehensive payment logging and webhook handling for all providers
- Create customer analytics dashboard with revenue, churn, and lifetime value metrics
- Add subscription migration service for provider switching
- Include extensive test coverage for all payment functionality