We've got another update to keep you updated on the progress with Spike. Some big, some small improvements. Nonetheless, all important in helping you get the most out our billing portal. Let's get started!
Bug fixes & small improvements
First of all, throughout the different version updates there has been numerous bug fixes and improvements, such as:
- (Stripe) Fix credit purchases not being provided after requiring 3D-Secure card authorisation
- (Stripe) Fix when fetching coupons/promo codes when handling webhooks
- (Paddle) Fix the ability to set a different currency via
config('cashier.currency')
- (Paddle) Fix for credits still renewed after subscription renewal failed
- ... and more, less noticeable improvements.
So whichever version of Spike you're currently rocking, don't forget to upgrade to get the latest fixes and improvements.
Now, let's move to bigger changes that can help you run your business better.
Spike v3.17
Usage chart component
The usage chart is now a Blade component, allowing you to embed it anywhere you'd like in your Laravel app. Can be useful if you'd like your customers to be aware of their credit usage outside of the billing portal.
The component is <x-spike::usage-chart />
Spike v3.18
Laravel 12 support
Always on top of it! You can use latest and greatest of Laravel without sacrifices. Additionally, we've removed an icon package dependency, which should significantly reduce the size of your vendor
folder ;)
Spike v3.19
(Stripe) Improved subscription handling when payments fail
Previously, if a payment failed when switching subscription plans, the subscription would be put in "past_due" state, causing subscription to be inactive until the user pays their outstanding invoice. More often than not, this is not the desired effect.
With Spike v3.19, the default behaviour is changed: if a payment fails, the subscription will not be changed. It will continue being active with whatever plan the user had before.
If you prefer the old behaviour, you can switch it by setting spike.stripe.allow_incomplete_subscription_updates
to true.
Spike v3.20
Date localisation and translation improvements
First, the dates across Spike now respect your app's locale as set in config('app.locale')
.
Second, a few additional translations were added:
// Credit transaction types
'transaction_type_subscription' => 'subscription',
'transaction_type_product' => 'purchase',
'transaction_type_adjustment' => 'adjustment',
'transaction_type_usage' => 'usage',
resources/lang/vendor/spike/en/translations.php
And lastly, you can now change the date formats used across Spike. You can configure them in Spike's config:
/*
|--------------------------------------------------------------------------
| Date formats
|--------------------------------------------------------------------------
|
| Here you can configure the date format patterns used across the application.
| These formats use PHP date format strings and will be used with Carbon's
| translatedFormat method for localization support.
|
*/
'date_formats' => [
// Credit transaction formats
'transaction_date' => 'F j, Y', // Credit transaction date with year
'transaction_date_current_year' => 'F j', // Credit transaction date in current year
'transaction_expiry_date' => 'F j, Y', // Credit expiration date with year
'transaction_expiry_current_year' => 'F j', // Credit expiration date in current year
'transaction_time' => 'g:i a', // Time format for usage transactions
'transaction_usage_datetime' => 'F j, H:i:s', // Usage date with time in current year
'transaction_usage_with_year' => 'F j Y, H:i:s', // Usage date with time for previous years
// Invoice formats
'invoice_date' => 'F j, Y', // Date format on invoices
// Subscription formats
'subscription_end_date' => 'F j, Y', // Subscription end date
// Payment method formats
'payment_method_expiry' => 'F, Y', // Payment method expiry date
],
config/spike.php
Spike v3.21
CreditManager method improvements
- Introduces
CreditManager::spentOnDate(CarbonInterface|string $date): int
- allows you to check how many credits were spent on a specific date - Updates
CreditManager::spend()
method to also allow overriding transaction attributes, such as notes, created_at, expires_at, and more. Great for programmatic backfilling of credits. See the updated docs here - https://spike.opcodes.io/docs/v3/using-spike/credits#spending-credits
Spike v3.22
(Stripe) Cancellation offers
New feature alert! 🚨
"Cancellation offers" feature allows you set up custom offers that your users will be presented when they wish to cancel their subscription.

You can configure multiple offers too. If the first offer is too small and the user still decides to leave, they will be presented with the next offer! And so on, until they run out of offers configured.
This is an especially good way to reduce churn, so be sure to experiment and let me know your results!
Spike comes with Stripe's Coupon and Promotion code offer types built-in, and it's also possible to build your own offers.
You can read more in the Cancellation Offers documentation.
Spike v3.23
InvoicePaid event
Sometimes you'd like to just send an invoice to the customer when it's paid. If you don't care whether it's a subscription renewal or a product purchase, then this event will work perfectly for you.
Just listen to Opcodes\Spike\Events\InvoicePaid
event, which contains your billable object, and Spike's invoice object, where you can find the invoice ID and the amount paid. Documentation here.
How to upgrade?
Simply run the Composer require command with the latest version.
composer require opcodes/spike:^3.23
If you're installing Spike from scratch, learn how to Install Spike here.