B2B software/Upgrade timing

Ask for the upgrade when the workspace hits the limit.

Signals tells your product which plan limit a trial workspace just hit, how often it keeps hitting it and what the trial has used so far, so the prompt appears at that moment and names the limit.

Higher trial to paid conversion

Convert more trials by asking for the upgrade when the workspace hits the limit.

Trial to paid conversion moves when the upgrade prompt follows what the workspace is doing rather than the day of the trial. Signals gives your product the plan limit this workspace just hit, how many times it has hit each limit this week, how many exports a user has run today and which paid features the trial has used. The product decides when the prompt appears, where it sits and which limit it names.

Show the prompt the moment a limit is hit, and name the limit

A trial admin has just invited a fourth teammate to a workspace whose plan allows three. The upgrade prompt runs on the trial calendar, so the next one is due on the last day of the trial, and the one before it went out on a day when nothing was blocked. The moment to ask is now, in the invite dialog, with the seat limit named, because seats are the limit this workspace has just run into.

What Signals knows
last_limit_hit
The plan limit this workspace hit most recently
minutes_since_limit_hit
Minutes since a limit was last hit in this workspace
What your product does

Shows the upgrade prompt in the dialog where the limit was hit, within minutes of the hit, and names that limit and the plan that lifts it. The plan table comes from your billing system. Signals supplies which limit was hit and when.

workspace.tsx · 15 lines
// In the code that renders the workspace after a blocked action
const workspace = await signals.getServiceAttributes({
  name: "saas_upgrade_limit",
  attribute_key: "workspace",
  identifier: workspaceId,
});
// { last_limit_hit: "seats", minutes_since_limit_hit: 0.4 }

if (workspace.minutes_since_limit_hit < 5) {
  upgradePrompt.show({
    placement: "inline",
    limit: workspace.last_limit_hit,
    plan: plans.liftsLimit(workspace.last_limit_hit),
  });
}

Try it on your own site.

Add the SDK, define one thing you want to know about a visitor, and watch it update while you click around. The free tier runs on the real engine: no card, no sales call.