Toolaby Wall

Access and features

Who may use a tool, what they get before paying, and which features each plan unlocks.

Two questions, in the Access card at the top of the tool's Pricing page: whether using it needs an account at all — the Require an account switch — and what a person gets before paying: Everything free, Free uses or Nothing free. Everything a tool can be is the two composed, so there is no list of shapes to pick from. The card writes back the sentence your buyers meet — Only people signed in can use Tab Tidy. It is free for 5 uses per device, then a plan.

Installed copies see a change within seconds on Test. On Live, a copy asks the Wall at most once in five minutes when the Wall popup opens, and every hour otherwise: a change shows within an hour, and within 6 minutes where the Wall popup opens. The card says so once saved.

Preview, at the top of the Pricing page, opens the popup beside the page: the panel a buyer meets in each of its states, in your brand, as saved.

An account

Require an accountThe extension
OffAnyone can use it. Signing in brings what they bought, on any device.
OnNothing works until they sign in: gate() refuses with sign_in, the Wall popup asks for an account and your own popup is not opened. A licence key is a purchase, not an account, so it does not stand in for one — the device is asked to sign in with the address that bought, and the purchase is waiting there. Signing out from the account bar returns them to it. A device running a build from before this switch existed is given the policy that means the same to it, so it keeps asking; a build from before that (when everything was free) asks once you rebuild with the current toolaby.js — npx -y toolaby@latest upgrade <tool-id>.

With nothing free, the two account choices look the same to a stranger — the plans, either way, because the price should not be a screen away and buying asks for an account anyway. They differ afterwards: a pasted licence key unlocks on its own where an account is optional, and is asked to sign in where it is required; and signing out returns to the sign-in panel there.

Before paying

ChoiceaccessThe extension
Everything freeopenNothing is counted; only the version is checked. A feature a plan sells is still refused until bought: open is the tool's use.
Free usesfree_usesWorks until the device has spent the uses you set, counted on the Wall per device. Then the paywall offers a plan.
Nothing freepaidA paid extension: shows the paywall until the person holds a plan, a trial or a grant. There is no Free plan: it is not a card on your Pricing page and not a column on your buyer page.

The six combinations, and what each is for:

Require an accountBefore payingWhat it is
OffEverything freeA free tool; paid plans add features.
OffFree usesThe classic freemium extension: try it, then pay.
OffNothing freePaid up front; a licence can be bought without an account and claimed later.
OnEverything freeFree, but you know your users.
OnFree usesAn account first, then a trial run of the tool.
OnNothing freeSign in and subscribe, as a web app. The popup shows the plans first — the price should not be a screen away — with Already bought it? Sign in under them. Someone who bought and has not signed in is shown the way in, not the price again.

Both are enforced in two places with one rule:

  • The Wall popup, at every open: it opens your popup when the device may continue and shows the paywall when it may not.
  • gate(), wherever you call it: it answers { allowed: false, reason } with reason one of sign_in, paid, limit or feature.

The account and open are decided on the device from the policy the Wall signed. Only metered uses (free_uses) make a request, to count the use.

Signing out

The account bar's Sign out (and signOut()) clears the device's credential and revokes its link on the account, so the account page's Devices stop listing it. What the person is left with follows the account switch: optional, they drop to the Free plan and keep using the tool — the meter resumes where it was, since signing out is not a way to refill it; required, the tool stops and the popup returns to the Wall's, asking for an account. Someone who holds a paid plan is asked to confirm first.

Features

Without features, a paid plan unlocks the whole tool: user.paid is the only question.

Under the tool's Pricing, the Features card lists what the tool can do — Export, Sync — and which tiers hold each one, and whether the Free plan does. The card takes entries once the tool has a paid plan.

Each feature has a name, which buyers read on the paywall and the buyer page, and a key, which your code asks for. Add feature makes the key from the name — Export becomes export — unless you type one under Key: name it Export to Excel, key export. The grid shows each key under its name.

if (await toolaby.has('export')) showExportButton();          // no request

const permit = await toolaby.gate({ feature: 'export' });      // one use of the feature
if (!permit.allowed) return permit; // reason 'feature', feature 'export', needs ['team']
  • has(feature) answers from the device: true for a Free plan feature, or when the last token lists it. A tool with no features holds everything.
  • gate({ feature }) refuses with reason: 'feature' and needs, the ids of the plans that hold it. The paywall then offers only those plans.
  • getUser().features lists the keys the device holds; null means everything.

Tokens issued before a tool had features, and grants with no features named, unlock everything.

Writing the checks early

A has() or gate({ feature }) written while the Free plan holds everything answers yes. When you later move the feature to a paid plan, the same line starts gating. The Wall popup asks for the policy when it opens, on Live when the last answer is five minutes old; an extension that only calls gate() learns of a change within the hour.

A free allowance of items

A limit that is not a number of uses — two saved sessions, five projects — is yours to count, since only your code knows what is stored. Keep Before paying on Everything free, sell a feature such as unlimited-sessions, and ask for it only past the allowance:

background.js
async saveSession(tabs) {
  const saved = await sessions.count();
  if (saved >= 2) {
    const permit = await toolaby.gate({ feature: 'unlimited-sessions' });
    if (!permit.allowed) return permit; // the page calls toolaby.showPaywall(permit)
  }
  return sessions.save(tabs);
}

Deleting an item makes room again, which a meter of uses never does. The Wall does not know the allowance, so say it where buyers read: name the feature for what it lifts — Unlimited sessions, which the paywall shows as Unlimited sessions is in Pro — and put the number in the tool's one line under Settings, shown on the buyer page under its name.

Moving from a meter to features

A bare gate() asks for a use of the tool. After you release a version that gates by feature instead, every copy of the older version still installed keeps asking for uses — and Everything free holds the tool's use, so switching to it lets those copies through without counting. Change the dashboard in this order:

  1. Add the features and tick them on the plans that sell them. Leave Before paying on Free uses: the older version is counted as before, and the new one refuses a paid feature to anyone who has not bought it, exactly as it will under Everything free.
  2. Publish the new version.
  3. Once it has reached your users, set Before paying to Everything free. Chrome checks for extension updates every few hours, but only while it is running, so allow a few days after the store publishes.

Until then, the new version's bare gate() calls, and any feature the Free plan holds, still spend uses.

On this page