Runtime license check

"Why do we check the license at runtime?"

The only "per-seat" pricing Avo does if for different apps or URLs. Because of that we need to check, at runtime, how does the parent app use Avo.

After doing more research and comparing to some alternatives I chose Avo because I liked the modern interface and it appeared to be well maintained and active on GitHub
Nathan Kriege
Nathan Kriege
Ruby on Rails developer


  • In order to validate the license we need to check on what URL Avo is used on.

Avo's licensing is rather simple and permissive to customers. For one license you get Avo to use on one production environment, or better yet, one production URL. Please follow those pages to learn more about what that means.

Avo licenses are also Perpetual Fallback Licenses so, very leniant and don't penalize you if you stop renewing the subscription.

Because of these loose terms, the only way for us to scale the business is by implementing one "per-seat" strategy, which is one license per URL, and in order to make that work, we have to check the usage at runtime.

How is the check done?

We run a check on the first request inside the Avo path and then every six hours to see if the license is still valid and used within the terms of the subscription. The timeout of that request is 5 seconds.

What data is being sent?

  • Ruby, Rails, and Avo versions
  • The type of license and license key
  • The environment Rails.environment
  • The server IP, host and port
  • The app name
  • Some Avo metadata that helps us better understand the features you are using. For example:
    • avo_root_path
    • resources_count
    • dashboards_count
    • fields_count
    • fields_per_resource
    • custom_fields_count
    • field_types
    • actions_count
    • actions_per_resource
    • filters_count
    • filters_per_resource
    • main_menu_present
    • profile_menu_present
    • cache_store

None of this information is sold or shared with 3rd parties to use.
The only 3rd party services we share this information with is the ones specified here and it's only for internal use for monitoring, error reporting, and analytics.