License

Quotas

What 500,000 events/month actually counts, where that number comes from now that verification is fully offline, and what happens at 90% and 100% usage — which is, deliberately, nothing that affects your running app.

Prerequisites
  • A FLUX_LICENSE_TOKEN already wired into createFlux() — see license/setup if not
  • Useful to read alongside license/webhook_setup, since that is where the numbers on this page actually get reported from
1

What counts as an event

Quota is Flux-native, not HTTP-request-native — a single bootstrap call dispatching ten stores is one event, not ten, and raw HTTP method counts are never part of the picture at all.
typescript
1// Quota is Flux-native, not HTTP-request-native. What counts, and
2// gets rolled into your daily report:
3
4// Bootstrap Dispatch — one per LEADER TAB per session, not per
5// store. Ten registered stores dispatched
6// from one bootstrap call is ONE event,
7// not ten.
8// Hydration Read — IDB reads. Free in the sense that they
9// cost nothing beyond the original fetch,
10// but still counted so you can see
11// cache-hit health in your own numbers.
12// Realtime Update
13// BroadcastChannel Mirror
14// Queue Replay
15// Conflict Detected
16// Conflict Resolved
17// Delta Catch-up
18
19// What is NEVER shown or tracked: raw HTTP method counts. A REST
20// endpoint hit five times by five different Flux subsystems in one
21// page load is not "five requests" in any dashboard you will see —
22// it is whatever Flux-native event type each of those five calls
23// actually was.
2

Where the number actually comes from

Not TsWorldTech watching your traffic — there is no traffic to watch. This entirely comes from your own server's daily report call.
typescript
1// Unlike a traditional ping-based licensing model, quota usage is
2// NOT computed by TsWorldTech watching your traffic in real time.
3// There is no traffic to watch — verification is fully offline,
4// so there is nothing for a server to observe.
5
6// The number comes entirely from YOUR OWN server's daily
7// sendDailyReport() call — specifically the events and users fields
8// you pass in, however you choose to count them server-side:
9
10await sendDailyReport({
11 key_id: process.env.FLUX_KEY_ID!,
12 project_id: process.env.FLUX_PROJECT_ID!,
13 secret: process.env.FLUX_LICENSE_SECRET!,
14 date: new Date().toISOString().split('T')[0],
15 events: await getEventCount(), // this number is yours to define
16 users: await getUserCount(),
17 features: ['lruCache', 'jobTracker'],
18 domains: ['yourapp.com'],
19})
20
21// TsWorldTech's dashboard is a MIRROR of what your own report said —
22// not an independent measurement. If your counting logic overcounts
23// or undercounts, that is what shows up on your Usage tab, because
24// there is no second, independent source of truth to reconcile
25// against.
The dashboard mirrors your own numbers

There is no independent measurement to reconcile against. Whatever your events and users counting logic reports is exactly what shows up on your Usage tab.

3

Quota by tier

Same numbers as pricing, restated here for whoever lands directly on this page.
typescript
1// Quota by tier — same numbers as pricing, restated here since this
2// is the page someone reads when the number itself is in question:
3
4// free 10,000 events/month
5// starter 100,000 events/month
6// pro 500,000 events/month
7// enterprise unlimited
4

What happens at 90% and 100%

Nothing breaks at either threshold. Quota enforcement here means dashboard visibility, not a kill switch — worth reading in full since this is a meaningfully different model than most licensing systems.
typescript
1// What happens at 90%+ and 100%+ usage — nothing breaks either way,
2// at any percentage:
3
4// 90%+
5// The portal's Usage tab shows an amber callout. This is a
6// PORTAL-SIDE VISUAL ONLY — your running app never sees this,
7// never reacts to it, has no code path that even checks for it.
8
9// 100%+
10// Still nothing breaks. Flux never degrades, disables, or
11// rate-limits a key mid-subscription for quota reasons.
12// Enforcement here is dashboard visibility for an informed
13// upgrade decision — not a kill switch.
14
15// The ONE place a number from your daily report can change client
16// behavior at all:
17//
18// a signed token's own "quota" field (LicensePayload.quota,
19// set by the license issuer at signing time) feeds
20// emitQuotaWarning() — a console-only message, never a block,
21// never a feature disable. This is the ceiling check inside
22// enforce.ts, unrelated to the portal's Usage tab entirely.
5

If you never set up reporting

The Usage tab simply stays empty. Your app does not know or care whether reporting is wired up at all.
typescript
1// If you never wire up sendDailyReport() at all — see
2// license/webhook_setup for the full setup:
3
4// - The Usage tab shows "Set up usage reporting to see data here"
5// indefinitely. It never resolves on its own.
6// - Your app is COMPLETELY unaffected. Quota tracking is opt-in
7// visibility, not an enforcement mechanism your app depends on to
8// keep running.
9
10// There is no countdown, no grace period, no eventual lockout for
11// skipping this. The Usage tab simply stays empty until you decide
12// to fill it.
Zero Telemetry Latency

Because Flux eliminates real-time licensing pings, browser execution loops and IndexedDB write cycles incur zero network latency or third-party blocking overhead. Daily usage aggregation remains entirely decoupled on your server.

To wire up sendDailyReport() and start populating the Usage tab, see license/webhook_setup. For domain authorization, see license/domain_binding. For the four credentials referenced throughout, see license/setup.

Powered by Flux