← All field notes

TinyActivate · Practical guide · September 7, 2026

Build an onboarding checklist that follows backend results

Try a TinyActivate milestone with synthetic data, then connect checklist completion to durable backend events instead of browser clicks.

A “Create your first project” button is useful navigation. Clicking it does not prove that a project was created. TinyActivate by TinyScale completes onboarding milestones when your backend confirms the corresponding action.

You can first test this behavior with a synthetic subject, then connect your own backend. TinyActivate displays one to five milestones and remembers progress across browser sessions. Your application remains responsible for access, billing, and its business actions.

Try one milestone

Use Bun 1.4 and a new project directory. Download and checksum-verify the CLI by following the TinyScale setup guide. Existing projects retain their original product permissions, so explicitly opt in when creating this preview:

bun ./tinyscale-agent-v0.2.0.mjs workspace create --name "Onboarding example" --products tinyactivate --cohort external
bun ./tinyscale-agent-v0.2.0.mjs activate create --configuration-json '{"name":"Getting started","allowedOrigins":["https://your-owned-app.example"],"steps":[{"key":"project_created","label":"Create a project","description":"Start your first project.","actionPath":"/projects/new"}]}'
bun ./tinyscale-agent-v0.2.0.mjs activate list

Replace the origin with your owned HTTPS origin. Keep private .tinyscale state out of source control and model context. Use the checklist ID returned by creation:

bun ./tinyscale-agent-v0.2.0.mjs activate test --checklist CHECKLIST_ID --event project_created
bun ./tinyscale-agent-v0.2.0.mjs activate status --checklist CHECKLIST_ID --revision 1 --cohort test

The test command uses a fixed synthetic subject. Its completion shows that this test event reached the checklist; it is not a customer activation or evidence of conversion lift.

Connect completion to committed work

In your application, save a small durable outbox record in the same transaction that creates the user's project. A background sender delivers the milestone after commit, reusing the outbox record's ID on every retry. A TinyActivate outage must not undo or block the successful project creation.

The backend event body follows this shape; placeholders are illustrative, not runnable values:

{
  "schemaVersion": "2026-09-07",
  "idempotencyKey": "YOUR_STABLE_OUTBOX_EVENT_ID",
  "subjectDigest": "64_LOWERCASE_HEX_CHARACTERS",
  "cohort": "test",
  "eventKey": "project_created"
}

Derive subjectDigest server-side using HMAC-SHA256 with a stable backend secret and your internal user ID. Send no raw IDs, email addresses, form values, or arbitrary metadata. Keep the scoped credential on the backend. The integration reference supplies the versioned endpoint paths, response contract, and retry handling. Its TypeScript client is currently a repository package, not a published npm dependency.

Add the browser view

Implement /api/onboarding/session in your app. It authenticates the current user, derives their digest, and obtains an origin-bound read session from TinyActivate. It must ignore caller-supplied subject identities and return the session with Cache-Control: no-store.

Once that backend route is in place, include:

<div id="onboarding"></div>
<script src="https://ingest.tinyscale.io/v1/activate/widget.v1.js" defer></script>
<script src="/onboarding.js" defer></script>

In your own /onboarding.js:

const widget = TinyActivate.mount(document.getElementById('onboarding'), {
  sessionPath: '/api/onboarding/session'
});

Follow the reference's CSP requirements. Call widget.refresh() after a backend milestone completes and widget.destroy() when removing the view. A browser click alone cannot complete a milestone.

Claim before live use

After verifying synthetic progress, run workspace claim and let the human owner claim in their browser. Use cohort: "live" only after claim and after connecting the authenticated session and backend event paths.

Preview lasts 72 hours and allows two checklists, 25 lifetime enrollments, and 200 accepted events, with synthetic subjects only. Free permits five lifetime checklists, 1,000 lifetime enrollments, and 2,000 events per UTC month. Limits hard-stop; paid expansion is not enabled. The owner console shows aggregate progress and controls. Incomplete milestones identify steps to investigate; they do not establish why a person stopped.