How to configure your product

Learn everything there is to know on how to configure your product.

Anystack is an all-in-one platform for selling, licensing, and distributing your software. The focus is on ease of use and providing a plug-and-play solution. This means Anystack is tailor-made for specific software types. Anystack now supports NodeJS, PHP, Python, and Electron. If your programming language or software is not listed, please let us know.

To get started, click the "Add Product" button in the top right corner. This will initiate the product configuration wizard to guide you through the process in a few simple steps. Let's take a look at the different parameters.

  • Name
    This is the name displayed throughout Anystack (including public accessible pages if applicable).
  • Identifier
    The identifier is a unique identifier for your product, and this identifier is unique across all products managed via Anystack. Anystack will use your product identifier to generate your product's public-facing URLs. The product identifier cannot be changed.
  • Product Type
    You can choose between NodeJS, PHP, Ruby, Python, Electron, and Other. Please note that you cannot change the product type after creation. Except for 'Other,' if your desired product type becomes available in the future, you can request it to be changed.
  • Product Features
    You can choose to configure licensing and distribution via the wizard. Don't worry; you can always enable these features later.

Licensing & Policies

You can use Anystack's licensing feature to protect your software from unauthorized usage.

Policies

Before creating a new license, you need to create a policy. A policy is a set of rules that applies to a license. For example, the duration a license is valid or how many times a customer can use a license. Let's take a look at the available policy options.

  • Name
    The name of your policy. We recommend picking a name that describes your policy. For example, "1 Year", "Unlimited", "Basic", "Pro", etc.
  • Duration / Expiration
    If you want your licenses to expire, you can set the expiration date. When a license is created, it will inherit the policy's expiration date.
  • Expiration consequence
    You have the option to set a consequence when a license expires. By default, the consequence is to "Revoke access" upon expiration. Alternatively, you can select the consequence "Restrict access":
    • Revoke Access
      Upon expiration, revoke all access.
    • Restrict Access
      Upon expiration, access is restricted to the latest release that was available up until the license expiry date. This is common if you have a product that can always be used, but your customers must renew their license to receive updates.
  • Activations
    By default, it's not required to activate a license before a customer can use it. However, you can enable this option if you want to keep track of your license usage across multiple domains, applications, etc. You can also restrict the number of activations. An everyday use case for this is restricting your customer to use your product on only two computers at a time.
  • Release constraints
    You can use a release constraint to restrict license access to a major, minor and / or specific release. Courtesy of the Composer documentation on constraints:
    • Exact Version Constraint
      You can specify the exact version of your product. This will restrict the license to this version and this version only. Example: 1.0.3
    • Version Range
      By using comparison operators you can specify ranges of valid versions. Valid operators are >, >=, <, <=, !=. You can define multiple ranges. Ranges separated by a space ( ) or comma (,) will be treated as a logical AND. A double pipe (||) will be treated as a logical OR. AND has higher precedence than OR. Examples:
      • >=1.0
      • >=1.0 <2.0
      • >=1.0 <1.1 || >=1.2
    • Hyphenated Version Range (-)
      Inclusive set of versions. Partial versions on the right include are completed with a wildcard. For example 1.0 - 2.0 is equivalent to >=1.0.0 <2.1 as the 2.0 becomes 2.0.*. On the other hand 1.0.0 - 2.1.0 is equivalent to >=1.0.0 <=2.1.0.
    • Wildcard Version Range (.*)
      You can specify a pattern with a * wildcard. 1.0.* is the equivalent of >=1.0 <1.1.
    • Tilde Version Range (~)
      The ~ operator is best explained by example: ~1.2 is equivalent to >=1.2 <2.0.0, while ~1.2.3 is equivalent to >=1.2.3 <1.3.0. As you can see it is mostly useful for projects respecting semantic versioning. A common usage would be to mark the minimum minor version you depend on, like ~1.2 (which allows anything up to, but not including, 2.0). Since in theory there should be no backwards compatibility breaks until 2.0, that works well. Another way of looking at it is that using ~ specifies a minimum version, but allows the last digit specified to go up.
    • Caret Version Range (^)
      The ^ operator behaves very similarly, but it sticks closer to semantic versioning, and will always allow non-breaking updates. For example ^1.2.3 is equivalent to >=1.2.3 <2.0.0 as none of the releases until 2.0 should break backwards compatibility. For pre-1.0 versions it also acts with safety in mind and treats ^0.3 as >=0.3.0 <0.4.0.
  • GitHub Repository Access
    If you enable repository access on your license policy, your customers will be able to join your repository as a collaborator while they have an active license. Anystack will automatically revoke access in the following events:
    • License expiration.
    • License suspension.
    • When disable the option on the license policy.
    • When a customer revokes Anystack's authorization.
    It may take up to five minutes to have customer access revoked in case of the events listed above.

Licensing

Now that your licensing policy is in place, you can create your first license. A license contains a unique key that your customers can use to authenticate themselves. Let's take a look at the available options for your license.

  • Key
    A license must have a unique key across all of your products. By default, a random key is generated for you.
  • Name
    Setting a name for your license is optional, but you could use it to make it easier to identify licenses.
  • Policy
    A license must have a policy. This is the license policy that will be enforced when using this license.
  • Expire date
    The license will expire at the specified date. If you don't specify an expiration date, the license policy will determine the expiration date.
  • Expire date
    The license will expire at the specified date. If you don't specify an expire date, the expire date will be determined by the license policy.
  • Contact
    You can assign a contact to a license to keep your licenses organized. This also adds a layer of security for some distribution methods, given an email is now required to add a license key.

Distribution

Anystack makes distribution a joy by integrating with your existing stack. Connect your GitHub account, create a new release, and that's it. Anystack will automatically import the files from GitHub and make these available for distribution to your customers.

Integrations

For each product type, Anystack provides particular integrations with your existing stack. The following distribution integrations are supported:

  • PHP
    • Composer: A Dependency Manager for PHP
  • NodeJS
    • NPM: The package manager for Node.js
  • Python
    • PyPI: The Python Package Index (PyPI) is the official third-party software repository for Python.
  • Electron
    • Electron Native: The official updater which takes advantage of the built-in Squirrel framework and Electron's autoUpdater module. This includes Electron Forge.
    • Electron Builder: A community-based updater with some additional features compared to the default updater.

Releases

A release marks a specific version of your application like v1.0.0, v2.2.3, etc. Each release consists of one or more assets (depending on your product type). The integrations listed above will use the releases to determine if your customer can update to a new version of your software. A release consists out of the following information:

  • Tag
    The tag of your release is the version number. This must be a valid tag that follows the semantic versioning scheme. For example, 1.0.0, 1.42.12, 65.21.33, etc.
  • Name
    Optionally, you can set a name for your release, which will be shown on the changelog page. You can view a changelog example here.
  • Description
    Optionally, you can set a description for your release; the description will be shown on the changelog page. You can use markdown in this field, including code blocks for syntax highlighting. You can view a changelog examplehere.
  • Published
    Once you mark a release as published, it will be available to your customers. You can either do this manually or set auto-publishing to true to have Anystack publish your releases automatically.

Billing

Anystack creates a secure, payment page that lets you collect payments quickly. Billing can be enabled on a product basis.

Stripe

Anystack partners with Stripe to provide the best customer experience there is. To start selling via Anystack, you simply follow the onboarding process managed by Stripe. Payments by your customers are made directly to your account; you are in complete control.

Pricing Plans

To start selling your software you can create a pricing plans. A pricing plan consists of the following information:

  • Name
    The name of the pricing package. This name will be visible to your customers.
  • Policy
    A pricing package is required to have an active policy. This policy will be used to generate a license once a payment was made successfully.
  • Description
    You can use the description field to explain your customers more about this package. The description is shown on the checkout page.
  • Price
    The price of the package (excluding taxes). This is the amount that will be charged to your customer.
  • Renewal Price
    The renewal price is optional. If you set a renewal price (excluding taxes), the customer will be charged this amount the license is renewed.
  • Currency
    You can set the currency of the package. This is the currency that will be used to display the price. Your customer is also charged in the chosen currency. You can create multiple package and use different currencies.
  • Type
    There are two type of packages:
    • One-time
      A one-time package is a package that is charged once and must be renewed manually if the license expires.
    • Recurring (coming soon)
      A recurring package is a package that is charged automatically and will be renewed automatically.

Tax Collection

Stripe Tax lets you calculate and collect sales tax, VAT, and GST with the click of a button. Know where to register, automatically collect the right amount of tax, and access the reports you need to file returns.

You can enable automatic tax collection for your products. Stripe will automatically collect the correct taxes for your customers. Please verify that Stripe Tax is enabled for your account. If you enable tax collection without having enable taxes for your account your customers will not be able to make any purchases.

License settings

If you sell licenses that require a fingerprint before usage you can allow your customers to activate their license after they completed their purchase. You can also enable the revoke option to allow users to revoke activation of their license. For example, when they want to switch to a new device or domain.

  • Fingerprint label
    Replace the term 'fingerprint' with something more relevant for your users, domain or device for example.
  • Activation permissions
    You can allow users to manage their licenses via Anystack. If you disable this option you will need to implement your own logic which will allow users to activate their licenses or revoke existing activations.
    • Activate
      Allow users to activate their license.
    • Revoke
      Allow users to revoke their license activations.