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.

Example of a cancellation offer in Spike
Example of a cancellation offer in Spike

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.