all questions

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.

Avo is legit. I like the licensing scheme. Open-source community or paid for power users. Very accessible. I love the quick release cycle. Very active! Docs and videos are helpful and very easy to read. Adrian and his group have done a superb job getting the word out in the Rails community. I look forward to seeing its success in the future. Excellent product!!!
Graham Schmidt
Graham Schmidt
Software Engineer

TL;DR;

  • 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.

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 once a day to see if the license is still valid and used within the terms of the subscription, and if a check fails the app keeps running for three more days and retries hourly, after which the admin pauses until a check succeeds. 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 shared with third parties.
The only third 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.