Changelog

Welcome to the changelog section of Freemius, here you'll find our weekly technical update notes. You can subscribe to all posts via Newsletter or follow us on Twitter to stay updated.

Miscellaneous Changes – November 4, 2024

This week, we deployed the following updates:

  • API Documentation Enhancements: We’ve expanded our API documentation with additional endpoints to improve your development experience.
  • Webhook Fix for user.email_status.bounced: We resolved an issue where this webhook could incorrectly trigger irrelevant events.
  • Deployment Mechanism Bug Fix: An edge case bug was identified and fixed where the deployment process could break when changing a product from a “static” type (e.g., templates, widgets) to a “dynamic” type (e.g., WordPress plugins or themes).
  • Simplified Checkout Links: We are now generating short links for checkouts from the Developer Dashboard. Instead of using links like https://checkout.freemius.com/mode/dialog/<productType>/<productID>/, you’ll see the cleaner format https://checkout.freemius.com/<productType>/<productID>. The old links will still work, but the new format is more visually appealing, and the mode/dialog part is no longer necessary for modern usage.

New Feature: Customize the Confirmation Dialog for Freemius Checkout

We’re excited to announce another new feature for Freemius that empowers SaaS makers! You can now customize the confirmation dialog for the Freemius Checkout.

Previously, customization was not supported due to:

  1. Tight integration of the confirmation dialog for WordPress products.
  2. Optimized download links for static products.

However, we recognize that SaaS products have unique needs that can vary significantly.

With this new feature, you can customize the confirmation dialog and specify any custom link for the dialog to forward users to.

To get started, go to Plans → Customization and enable the “Customize after-purchase dialog” switch.

From there, you can set the title, message, button text, and link. If you’d like to see more customization options, please let us know through our feature board.

New Freemius Checkout JS SDK Out of Beta

We recently announced the beta availability of the new version of the Freemius Checkout JS SDK. Today, we are excited to share that the library is officially out of beta. A huge thank you to everyone who helped us test it in real-world scenarios!

Our Developer Dashboard and website documentation have been updated to reflect these changes. Here’s a brief recap of what the new JS SDK offers:

  1. No dependencies: The new SDK does not require jQuery or other dependencies.
  2. Improved performance: It loads faster than the legacy integration library.
  3. Package manager support: The SDK can be installed via package managers like NPM (refer to our GitHub repository for details).

We will soon retire our old library and replace it with the adapter the new library provides. However we urge that you update to the new library as soon as possible to take full advantage of the modular system.

New Coupon Type for Migrated Customers and Other Coupon-Related Bug Fixes

At Freemius, we support migrations from platforms like EDD, WooCommerce, Envato, and more. To help you maximize the benefits of the Freemius platform—such as tax compliance and subscription recovery—we recommend encouraging your buyers to update their licenses through Freemius.

To make this easier, we’ve introduced a new coupon type called “Migrated Customers”. This option allows you to target customers with a migrated license who have never purchased your product through Freemius, providing an incentive while minimizing the risk of misuse.

This feature was inspired by feedback from our community of makers. Thank you for your valuable suggestions! If you have more feedback or ideas to help us enhance our platform, please share them on our feature board.

Other coupon related bug fixes

Exit intent popup bug fix

We identified an issue where the exit intent coupon modal would display even if the coupon configuration did not match the current pricing, currency, or billing cycle. This has now been resolved.

Issues with renewing migrated licenses

We also addressed several edge-case bugs related to renewing migrated licenses with coupons and applying renewal discounts to migrated subscriptions. The following improvements have been made:

  • The system now extends the license with the full coupon discount if the migrated subscription is inactive.
  • If the migrated subscription is active, it will be canceled with a prorated discount and the appropriate coupon discount.

Additionally, the UI will now display a detailed breakdown of coupon discounts to avoid any confusion.

If you want to migrate your product from any platform to Freemius, please get in touch with our support.

Developer Dashboard bug fixes

We identified a bug in the Developer Dashboard where the “Create new product” form wasn’t functioning properly when accessed from a bundle’s view.

This issue has been resolved.

Additionally, we noticed a conflict between the Help Scout beacon icon and toast messages, which has also been fixed.

API Documentation update and bug fix

We’ve added more endpoint documentation to our website, available here.

Please note that the documentation site is a “work in progress.” We’ll continue to publish updates as development progresses. The documentation follows the OpenAPI schema to ensure standardized usage.

Bug fixes & improvements

  • We identified a bug in the /products/{product_id}/tags/latest.json endpoint, where the returned downloadable URL was invalid. This issue has now been fixed.
  • The bundle endpoint /bundles/{bundle_id}/plugins.json now supports a DELETE request to remove a product’s association with a bundle. We will add the documentation soon.

Legal agreements update

We’ve introduced Terms & Conditions of Sale, a legal agreement for SaaS products, which is now part of the checkout experience.

If you’re using Freemius integration with your SaaS products, the Terms & Conditions of Sale page is available at the following link:

https://freemius.com/product/<productID>/<productSlug>/legal/terms-of-sale

The productID and productSlug can be found on the Settings page in the Developer Dashboard.


Additionally, we discovered that the affiliate email mistakenly linked to the EULA instead of the Affiliate Agreement. This has now been corrected. We thank our maker for reporting this issue.

Fixed UI bug in proration discount for migrated licenses

Freemius supports both proration discounts and migrations from various other platforms.

Freemius proration applying 100% first-time discount on a migrated license

Additionally, Freemius automatically offers a proration discount to your customers when they upgrade an existing license to renew through Freemius. This helps with transferring your subscription from the old platform to Freemius, where we handle taxes, disputes, and many other details.

Recently, we identified an edge case bug where the UI incorrectly displayed a proration discount for some migrated licenses that shouldn’t have received one. Although the final payment did not apply the discount, the UI caused confusion for both buyers and makers. We have now fixed this issue.

Exporting payment refund reason

Freemius allows you to issue full or partial refunds to your customers. When issuing a refund, you can also add a Refund reason for your team members to see.

Now, when exporting payments, if you select the “Refunds” filter from the UI, the exported CSV will include the refund reason.

This update is designed to help our makers perform custom analytics with all the necessary information.

Design refresh of the EULA page

We have updated the design of Freemius products’ EULA page to feature a modern, user-friendly appearance.

Example EULA page of a Freemius product

You can access the End User License Agreement (EULA) for your product at the following URL:

  • https://freemius.com/product/<productID>/<productSlug>/legal/eula/

Please replace <productID> and <slug> with the relevant values, which can be found under the “Settings” page of your product in the Developer Dashboard.

The EULA page is used during checkout, by affiliates, and in other related processes.

Enhanced Language Support and UI Updates for Freemius Checkout Translation

Following our release of Checkout Translation, we have made additional updates to the UI.

We now always display the language selector dropdown in the footer, with the default language set to ‘English.’ If you want to automatically select a supported language based on the buyer’s location, you can pass language: 'auto' to the JavaScript SDK.

const handler = new FS.Checkout({
  plugin_id: 'x',
  public_key: '...',
  language: 'auto',
});

Additionally,

  1. We have renamed the language labels to their native names (e.g., ‘Español’ instead of ‘Spanish’) to help users select the correct language.
  2. We have also added flag icons to better represent each language’s locale.
  3. The German translation has been updated to fix a few minor UI glitches.

Stay tuned for more product updates.

Various bug fixes

This week’s deployment includes the following bug fixes:

  • In the Developer Dashboard and our WordPress SDK, when changing a user’s email address (transferring assets), we noticed that whitelisted sites were not being transferred. This issue has been resolved.
  • We fixed an issue on the Analytics page of the Developer Dashboard where the filtering UI would not appear in certain cases.
  • The Customer Portal would incorrectly redirect when embedded and loaded in Safari. This has now been fixed.
  • We noticed a bug where team members with the ‘developer’ role could modify coupons but not coupon notes. This issue has now been resolved.

Freemius Checkout translations out of beta

Great news! The Freemius Checkout now fully supports the following languages out of the box.

  • Spanish
  • German
  • French
  • Italian
  • Dutch
Freemius Checkout in Italian

Loading the checkout page in a buyer’s native language significantly improves conversion rates. That’s why we’ve prioritized translating the Checkout into the most popular languages.

To display the Checkout in a specific language, you can use the language parameter when configuring the Checkout JavaScript SDK. For example:

const handler = new FS.Checkout({
  plugin_id: 'x',
  public_key: '...',
  language: 'de_DE',
});

The example above will load the Checkout in German. Alternatively, you can use the value 'auto', which automatically determines the buyer’s location and loads the Checkout in their supported language. For more information please see our documentation here.

New JavaScript SDK for Freemius Checkout – Calling for testers

We have released a new beta version of our JS SDK for our Checkout. This version aims to:

  1. Remove jQuery from the dependencies.
  2. Provide better Developer Experience (DX) through type documents.
  3. Provide both CDN and npm packages for any type of consumer.

We’ve also open-sourced it under the MIT license to accept contributions from our makers. You can find the repository here on GitHub along with the usage guide.

While we aim to replace the Legacy JS SDK soon, we would like to call for testers to help with this new system. Please read below to get started quickly.

Using the new JS SDK

Instead of https://checkout.freemius.com/checkout.min.js, please use the new CDN under https://checkout.freemius.com/js/v1/. Here’s a quick code example:

<select id="licenses">
    <option value="1" selected="selected">Single Site License</option>
    <option value="2">2-Site License</option>
    <option value="unlimited">Unlimited Sites License</option>
</select>
<button id="purchase">Buy Button</button>

<script
    type="text/javascript"
    src="https://checkout.freemius.com/js/v1/"
></script>

<script type="text/javascript">
    const handler = new FS.Checkout({
        plugin_id: '9885',
        plan_id: '16634',
        public_key: 'pk_ccca7be7fa43aec791448b43c6266',
        image: 'https://your-plugin-site.com/logo-100x100.png',
    });

    document.querySelector('#purchase').addEventListener('click', (e) => {
        handler.open({
            name: 'My Awesome Plugin',
            licenses: document.querySelector('#licenses').value,
            // You can consume the response for after purchase logic.
            purchaseCompleted: function (response) {
                // The logic here will be executed immediately after the purchase confirmation.
                // alert(response.user.email);
            },
            success: function (response) {
                // The logic here will be executed after the customer closes the checkout, after a successful purchase.
                // alert(response.user.email);
            },
        });

        e.preventDefault();
    });
</script>

The difference with the Legacy JS SDK is:

  1. We don’t need jQuery anymore. So you can remove it if you’re not using it for anything else.
  2. Instead of accessing the singleton handler from FS.Checkout.configure, we now create a new handler with new FS.Checkout and use the instance accordingly.

You are free to create any number of instances if you’re selling multiple products from the same page. Cart recovery will also work as soon as you’ve instantiated and will only target the product the instance is responsible for.

Easy migration from the Legacy JS SDK

To make it easy to migrate without changing much of your code, we have also developed a compatibility layer.

In your code, where you do

<script src="https://code.jquery.com/jquery-1.12.4.min.js"></script>
<script src="https://checkout.freemius.com/checkout.min.js"></script>
  1. Remove the jQuery script tag if you aren’t using jQuery.
  2. Replace the checkout script with the new one.
<script src="https://checkout.freemius.com/js/v1/legacy/"></script>

Now all your existing code should work as-is.

const handler = FS.Checkout.configure({
    plugin_id: '1234',
    plan_id: '5678',
    public_key: 'pk_ccca7be7fa43aec791448b43c6266',
    image: 'https://your-plugin-site.com/logo-100x100.png',
});

document.querySelector('#purchase').addEventListener('click', (e) => {
    handler.open({
        name: 'My Awesome Plugin',
        licenses: document.querySelector('#licenses').value,
        // You can consume the response for after purchase logic.
        purchaseCompleted: function (response) {
            // The logic here will be executed immediately after the purchase confirmation.
            // alert(response.user.email);
        },
        success: function (response) {
            // The logic here will be executed after the customer closes the checkout, after a successful purchase.
            // alert(response.user.email);
        },
    });

    e.preventDefault();
});

In the future, we will replace the Legacy JS SDK with this compatibility layer to reduce the footprint.

Please note that if you’re getting started or willing to refactor your code a little bit, kindly consider using the regular pattern instead of the legacy singleton pattern.

Performance improvements

While working on the new JS SDK, we also looked into improving performance. Here are the results:

  1. The new JS SDK loads about 60% faster than the Legacy JS SDK – Your pricing page will load faster by 1 second on average.
  2. The Checkout app itself also loads 40% faster – Once users click the buy button the checkout will appear faster than before.

We hope you’ll help us test the new JS SDK so that we can get it out in the wild as soon as possible. If you have any questions, please don’t hesitate to write to our support.

Load more