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.

Fixed bug in Developer Dashboard’s new product form

We noticed a bug where creating a new SaaS from the Developer Dashboard would incorrectly show the business model option, asking whether to create a Free plan.

Freemius Developer Dashboard New Product Form for SaaS

In this deployment, we removed the choice, since it was not intended.

Checkout Reskinning phase2 production rollout

Following up on last week’s announcement, today we are marking the checkout phase2 as production-ready.

Freemius Checkout Phase2 - Release Candidate

The deployment comes with a few improvements too.

  • We have optimized various UI and UX as it has gone through many QA tests.
  • We identified a bug where some strings were not translated and have fixed them.
  • The form focus and validation experience have also been improved.

Rollout Strategy

While the new checkout is production-ready, we have not yet made it the default. The old checkout will still show up unless you have specifically opted into the new system with checkout_style: 'phase2' JS parameter. For more information, please read our announcement post here.

Bug fixes for the old checkout

We noticed a bug in the old checkout where the form could not handle some errors in rare cases. We have deployed a fix for the same.

Checkout Reskinning: Preparing the phase2 version for production rollout

It has been a couple of weeks since we pushed updates to the new phase2 checkout and this week, we are starting to push it for production. Like before, we will do it gradually, without breaking any custom CSS you might be using. Please read on below to learn more.

Freemius Checkout Phase2 - Release Candidate

Recap: Beta releases so far

We first released the phase2 checkout on May 20, 2024. Since then there have been a few iterations and improvements.

Today with a few more bug fixes we are finally marking the checkout as release-candidate and preparing for the production switch.

Gradual rollout

  • On August 4th, 2024 we will make the phase2 checkout the default in production. However, if you have a custom checkout CSS for the phase1 checkout but not for the phase2 checkout, we will keep on showing the phase1 checkout for you.
  • On August 18th, 2024 two weeks after the production rollout, we will enable it for everyone. However, you will still have the option of using checkout_style=legacy to force load the phase1 checkout.
  • On September 29th, 2024 we will completely remove the legacy phase1 checkout.

Until the rollout

  1. You can switch to the new checkout by using the configuration checkout_style=phase2 in the URL parameter or JS snippet. More on it later in.
  2. You now have two different CSS configurations, one for the existing checkout and one for the new phase2 checkout.

Custom CSS migration

Starting today, you will notice that your existing checkout CSS style (if any) has been moved to the “(Legacy) Custom Checkout CSS file” under the plans page of the Developer Dashboard. The first input field is now empty.

CSS migration guide for Freemius Checkout phase 2

To migrate your CSS for the new version, simply put the stylesheet URL in the first input field and you are good to go. Please read our documentation to learn about CSS customization.

Call for testers

We would be glad to get your help to test the new checkout out in the wild.

Testing out phase2 checkout from the Freemius Developer Dashboard

Kindly go to the plans page and toggle the new configuration to get URLs and JS snippets to load the new checkout.

Alternatively, you can just add checkout_style=phase2 or checkout_style: 'phase2' in the URL or JS snippet to see it live. Here are some live demos:

If you find any issues please get in touch with our support.

We will make another announcement in July when we believe the checkout is ready to go into production. Until then, please stay tuned.

Checkout phase2 improvements and bug fixes

We are bringing a few small enhancements and bug fixes to the phase2 checkout (beta).

  • Fixed a regression in the money-back UI appearing below the breakdown, even when the product does not have a refund policy.
  • Fixed boolean values coming from the JS SDK which were not being respected in some cases.
  • Fixed a small glitch in the license input UI on smaller devices.
  • We improved the form validation UX by not showing errors under a field that was not focused specifically by the user.
  • Fixed a typo in the license dropdown where it said “Unlimited Site” instead of “Unlimited Sites”.
  • We updated the Spanish translation from a professional translator.
  • We did some performance improvements.

We are also getting ready to rollout the new checkout in production. Please read our announcement post here.

Various bug fixes for the Developer Dashboard

  • Fixed some edge case bugs when navigating between products of the same store could lose the current context.
  • Fixed a regression in the Tax Refund form, for old payments. The “Yes – Refund” button stayed disabled in some cases even after filling out the form. We have fixed this issue.

SaaS related improvements and tweaks to our system

We are rolling out various SaaS-related improvements and tweaks to our Developer Dashboard and marketing automation system. Please find the details below.

Removed unrelated features from the Developer Dashboard

Our Developer Dashboard is heavily tuned for WordPress.org products (plugins, themes, add-ons, etc). It has many pages, such as Deployment, Integration, etc., that are only relevant to a WP product. It also shows several notices and pop-ups for the SDK integration.

All these features have no meaning for a SaaS product and can create confusion. So we have improved the system by scoping those features only for a WordPress product and keeping the SaaS interface clean.

Introduced the option to change a product’s type to SaaS

We introduced the option to create a SaaS product from the Developer Dashboard a while back. But we didn’t allow changing an existing product to SaaS yet. A few of our partners have already been using our platform to facilitate their SaaS products. We have been asking our partners to use the “Plugin” type for SaaS products while we manually adjusted the platform to their specific needs. This gave us enough time to learn the specific necessities for SaaS and improve our system accordingly.

Change product type to SaaS - Freemius Developer Dashboard

Now that we have rolled out many platform improvements, we are opening up the settings to change your product type to SaaS. Simply navigate to the Settings page of your product from the Developer Dashboard and you can change the type from there.

Improvements to our marketing automation

We have made some more improvements to our marketing automation system to use the right terminology and phrases when dealing with a SaaS product.

Better ordering of upgrade option in User Dashboard

From the User Dashboard, we offer a way for the buyers to upgrade their subscriptions. One would simply need to navigate to a subscription from the “Renewals & Billing” page.

Option to upgrade a subscription from the Freemius User Dashboard

Previously the list was showing different options ordered by the quota of the licenses. This resulted in items with heavy pricing showing up on the top of the list, which could discourage the buyer from exploring other cheaper options. This issue was reported to us by a partner.

Optimized ordering of different upgrade option under Freemius User Dashboard

To fix this, we are now ordering the items showing the cheapest plan and pricing first and then gradually moving towards more expensive options.

Various UI/UX enhancements for the Developer Dashboard

With this week’s deployment, we are bringing some small yet meaningful enhancements to the Developer Dashboard. Please read below.

Dismiss option under store dashboard page

We’ve been showing a small notice under the store page to mention the list of products the data is relevant for.

Button to dismiss the store dashboard page notice

This notice can become overwhelming for stores with many products, taking up much real estate. Our partners suggested that we introduce an option to remove the notice. In this update, we did just that. Now you can click the close icon to make the notice disappear and it will not appear again under the same browser.

Icons to clarify the source of different entities

We’ve been offering migration services to partners coming from different platforms like EDD, CodeCanyon, ThemeForest, etc. We not only offer the first-time migration of payments, subscriptions, licenses, etc, but we also do ongoing sync for incoming payments from the subscription of the previous platforms. We do this to give a seamless licensing experience to the buyers.

As an advantage, partners can see the existing subscriptions and associated payments in the Developer Dashboard. But we understand the list can become confusing when there is a mixture of Freemius-sourced entities and migrated entities.

Icons to indicate source of payments, subscription, licenses etc in Freemius Developer Dashboard

To solve this, we have introduced a new icon in the columns, which will indicate whether the entity came from Freemius or the old platform. Please note the icons will show up when there are any migrated entities to save real estate.

Other fixes

  • We fixed some alignment issues in different UIs.
  • We made improvements to the different icons we show throughout the app.

Beta Checkout Updates: Flexible discounts and more

We have pushed various updates to the beta checkout. Just like before, to try it out, use checkout_style=phase2 in the URL parameter or checkout_style: 'phase2' in the JavaScript integration. If you’ve missed the various updates to the phase2 beta checkout, you can find it here and here.

Flexible discounts parameters

We have three kinds of discounts we show in the checkout before the subtotal.

Different discounts in Freemius Checkout

  • Annual Discount – The difference between the monthly billing cycle price and the annual billing cycle price.
  • Multisite Discount – The difference between the single license/site price and the multi-license/site price.
  • Bundle Discount – The difference between the compounded price of a bundle’s children and the price of the bundle itself.

The reason we show all these discounts is to encourage the purchase of a higher billing cycle, licenses, or bundles.

But over the year we received feedback from our partners asking us to give the flexibility to determine which discounts are to be shown. There are cases where a huge discount can discourage a buyer. For example, if a seller is providing 100-site pricing, then it can often result in an undiscounted price of $10,000, whereas the amount to pay could be less than $500.

Big multi site discount

So in this update, we are not only giving the ability to turn off discounts through configuration but also remade our discounting system from the ground up, making it smarter. Please find below the three newly introduced configuration parameters and their different values.

Property Description Accepted values Default value
annual_discount Determines whether the annual discount will be shown in the checkout. true | false true
multisite_discount Determines whether the multi-site discount will be shown. When the value is auto, the discount will only be shown if the single license pricing difference does not exceed 10 times more than the current pricing.

For example, say you have single-license pricing at $10 and a 100 license price at $90. For this configuration, the difference is 10*100 - 90 = 910 which is more than 10 times the current price (9*100 = 900). So by default when auto is selected, the discount will turned off. Please note, that the discount turns off for all license quotas, not just the one where the difference is high.

true | false | 'auto' 'auto'
bundle_discount Determines whether the bundle discount will be shown. The bundle discount itself depends on the compound price of its children. By default with maximize, we try to take the compound price from the lowest billing cycle and license. But with the value of true, we take it from the closest billing cycle and licenses.

While introducing this parameter, we also deprecated the old maximize_discounts parameter. The old parameter will only be used if the bundle_discount parameter is not explicitly set.

true | false | 'maximize' 'maximize

Please do give the new discounting system a try. The new system is meant to be backward compatible. The only exception is that the multi-site discount can be turned off depending on the pricing. You can always set a hard value of true to enable it back.

Here are some examples and live demos you can check. Feel free to modify the URL parameters.

Other UI configuration parameters

We have also introduced three new UI parameters to give more flexibility.

always_show_renewals_amount (true | false, default false)

Always shown renewal amount in Freemius Checkout

When set to true, a small line mentioning the total renewal price per billing cycle will shown below the total. By default, it only shows up when there is a renewal discount involved. We introduced this option because it can help provide more context with different discounts already shown in the UI. For example, one can see that there is a 30% annual discount and wonder if the discount is only for the first payment. There could also be a coupon that is applicable for the first payment only. With a clear line mentioning the renewal amount, the confusion goes away.

show_inline_currency_selector (true | false, default true)

Freemius checkout - Inline currency selector

We recently introduced an inline currency selector in the total line. Now you can hide it if you want by setting the value to false. We gave this option, because in some cases, the seller may not want to show an UI to change currencies for various reasons.

refund_policy_position (below_form | below_breakdown | dynamic, default dynamic)

Dynamic refund policy badge position in Freemius Checkout

Many partners asked us to give the option to specify where to place the refund policy badge. For some partners, there were no reviews, so placing it below the breakdown instead of the form was the natural choice. For some products, the breakdown area can be slim (without discounts or upsells). So by placing the UI below the breakdown optimizes the real-estate.

We realized we cannot decide the best positioning because it depends. So we are giving full control over where you want to place the refund policy UI in the horizontal dual-column layout. Depending on your preference you can place it below the form or the breakdown. We recommend using the default value dynamic. Depending on the width and height of the page the UI will be placed optimally either below the form or below the breakdown.

Please note when there are no reviews, the badge will always be positioned below the breakdown. Also this settings has no effect for mobile or single column view.

Other noteworthy updates

  • We have fixed and enhanced various responsiveness issues, layout, spacing, etc.
  • The VAT disclaimer line will now expand to the empty space.
  • We identified and fixed a glitch in the form validation mechanism in mobile devices.

Kickstart LiteSDK Project – Two new endpoints to activate and deactivate licenses

We are super stoked to announce that we have kickstarted the LiteSDK project. The LiteSDK is meant to be a lightweight alternative to our classic WordPress SDK. It will have minimal features, for example, license activation, software updates, etc. We aim to make the project as modular as possible, to gradually add features that can optionally be included in a WordPress product.

To ease the communication layer of the LiteSDK, we have introduced two new endpoints in our API.

License Activation endpoint

/v1/plugins/:plugin_id/activate.json (public)

Use this endpoint to activate a license on a new or existing site. It expects the following required parameters:

  • license_key – The license key
  • uid – A unique identifier of the site

UID: The generation of the UID must be done by the client. More on it later.

Optionally it also accepts the following parameters:

  • url – The URL of the site
  • title – The title of the site
  • version – The version of the WordPress plugin/theme.
  • install_id – The ID of an existing install/site (must belong to the same user and must have the same UID when it was created).

On a POST request, with the above parameters the endpoint can

  • Create an Install and/or activate the license on the existing install.
  • Create a user if the license does not have a user already (ghosted licenses that partners can create from the Developer Dashboard).
    • In such case, the endpoint will expect first_name, last_name and user_email parameters.
  • If the install already had an activation of the plugin for a different license, it will be deactivated.

Upon success, it returns the id, public_key and secret_key of the user and the install entities.

License deactivation endpoint

/v1/plugins/:plugin_id/deactivate.json (public)

Use this endpoint to deactivate the previously activated licenses on an installation. It expects the following required parameters:

  • uid – The same UID used when activating the license
  • install_id – The ID of the install from where you want to deactivate the license
  • license_key – The key of the license you want to deactivate

On a POST request, the endpoint will deactivate the license from the install entity. It will return the properties of the install entity on success.

Usage POC

We have created a POC (Proof-of-Concept) of a WordPress project demonstrating the new endpoints. This POC is still under heavy development and we are yet to write documentation. But if you want to take a look, you can visit our GitHub project.

The project has the following features at the moment:

  • Provides abstraction for the API communication.
  • Generation and storage of the uid parameter.
  • Storing license activation status and providing methods to check for updates, sync license status with the server etc.

Call for Testers

Over time, we aim to turn it into a proper LiteSDK that can be used in production. At this stage, please help us identify more use cases by trying out the POC in your projects. We are always listening to understand how we can make our products better. If you need help trying out the POC, please get in touch with our support. You can also “watch” the project under GitHub to subscribe to updates.