Skip to content

B2B SaaS

Grow recurring revenue you can explain.

Find the right accounts, help more teams reach value, and know which work created pipeline and recurring revenue. Apex connects ads, product use, sales, messages, experiments, and partners from the first click to the renewal.

No credit card to start.

Find the right accounts

Know which accounts are worth your team's time.

Apex joins ad clicks, website behavior, product usage, company fit, and account activity before a rep opens the form. Self-serve trials stay self-serve. High-value accounts reach sales while the interest is fresh.

Apexapex / leads / scoring
Dimension Weights
Intent
30%
ICP Fit
28%
Account
22%
Engagement
15%
Risk
5%

What it made of Priya

scored in 40ms
80High-intent
  • IntentLooked at pricing three times in two days+26
  • ICP FitHead of Product Design at a 240-person company+24
  • AccountSigned up with a real company email, not a personal one+19
  • EngagementCame in on a tracked paid ad link+11
  • RiskNothing looks off0

Everyone else, sorted the same way

1,325 people
High-intent
84
Medium-intent
212
Low-intent
388
Minimal-intent
641
Apexapex / leads / segments

Trials with no project yet

418 people

Signed up in the last 14 days and hasn't created a project

Workspaceused in 3 places

Design leads at mid-size companies

Priya is in this one1,264 people

Job title contains Design and the company has 100 to 500 people

Workspaceused in 5 places

Ready to add more people

96 people

Activated, on the Team plan, and invited more than five people

Workspaceused in 2 places

Activate and expand

Give each account the next step that gets the team moving.

Welcome people across email, phone, browser, and your own app. Send self-serve and sales-assisted accounts down different paths. Run experiments on activation and expansion, not opens, then stop messaging the moment the account moves forward.

Apexapex / journeys / trial onboarding
Apexapex / experiments / activation nudge
Draft
Live
3Decision
4Promote
Apexapex / communications / composer

A full email in their inbox. Authored once, with Priya's attributes resolved from your schema.

Prove recurring revenue

Know what caused recurring revenue, not just what got a click.

Apex connects every ad, message, experiment, sales handoff, and partner to the account, contract, expansion, churn, and renewal. You'll see CAC, payback, lifetime value, and retention by source, with the full account story behind every number.

Apexapex / leads / priya-raman

Priya Raman

priya@haldenstudio.com

$18,400

lifetime value

Account
Halden Studio
Role
Head of Product Design
People using it
4 of 6
Plan
Team

How she got here

every event, in the order it happened
  1. Came in from a Facebook ad

    go.sable.example/design-teams-q3 → /for/design-teams

    page_view

  2. Sent the trial form

    Scored 80 (high intent) before anyone read it

    form_submit

  3. Started a trial

    The Halden Studio workspace was created

    user_signed_up

  4. Opened the first-project nudge

    She got the Bring a teammate version

    apex_email_opened

  5. Made her first project

    Her team's first shared project, 14 files

    project_created

  6. Invited six teammates

    Four joined within a day

    user_signed_up

  7. Activated

    Four people working in it together

    activated

  8. Subscribed to Team

    $24,000 a year

    subscription_started

Every experiment she was in

3 experiments
Apexapex / attribution / economics

One trial, end to end

See the whole system work with one account.

Priya starts a trial for Sable. Sable is fictional, but every screen below is Apex. Follow her from the first ad to the renewal. In sixteen steps, you'll see how Apex connects acquisition, product use, sales, messages, experiments, and recurring revenue.

01 · Before anything happens

Apex learns the moments that matter in your product

Most tools ask you to describe your product again in their language. Those descriptions drift. Soon product, marketing, and finance have three answers for how many trials activated.

Apex reads your code and builds one list of moments: someone signed up, invited a teammate, made a project, subscribed, expanded, or churned. You approve the list. After that, every message, experiment, report, and payout uses the same names.

Green means Apex has seen the moment in live traffic. Grey means the name exists but nothing has sent it yet, which is usually a broken signal masquerading as a real number.

Apexapex / schema

Your schema

mapped to Apex Spec v1.4.0

Signed uplive · 310 / daycreateAccount() → user_signed_upsrc/server/auth/register.ts
Onboarding step donelive · 1.1K / daywizard.advance() → onboarding_step_completedsrc/features/onboarding/wizard.tsx
Project createdlive · 420 / dayprojects.create() → project_createdsrc/features/projects/actions.ts
Activatedlive · 96 / daymarkActivated() → activatedsrc/features/activation/rules.ts
Feature usedlive · 22.6K / daytelemetry.feature() → feature_usedsrc/lib/telemetry.ts
Usage milestonenot found in your code → usage_milestone_reacheddeclared, never firedSet up
Subscription startedlive · 31 / daystripe.subscription.created → subscription_startedsrc/server/billing/webhooks.ts
Subscription upgradedlive · 8 / daystripe.subscription.updated → subscription_upgradedsrc/server/billing/webhooks.ts
Trial expiredlive · 74 / daycron/expireTrials.ts → trial_expiredsrc/jobs/expire-trials.ts
Form submittedlive · 180 / dayauto-collected → form_submitthe Apex snippet, no code needed
9 of 10 verified against live traffic
your editor

you Set up Apex in this repo.

apex Scanning 2,418 files for analytics calls and identify traits.

Found 17 events, 22 attributes. 6 names differ from the spec.

cart.addItem() → add_to_cart

firstName → first_name

apex Opened a pull request with the plan. Nothing ships until you merge it.

Point Apex at your code once. The rest of this story uses that same list. You don't set every feature up from scratch.

One integration

02 · Tuesday, 9:14am

Priya clicks an ad, and Apex already knows which campaign paid for it

Priya leads product design at a 240-person company. A Sable ad appears in her feed and she clicks it.

Many teams reconstruct the source later from tags left on the web address. Different tools read those tags differently, so the numbers never match and some of the spend can't be explained.

With Apex, the campaign is attached when the link is made. Every report knows this visit came from paid social before Priya reaches the page. The first touch stays with her through the trial, the contract, and the renewal.

Sable

Sponsored

Your design system shouldn't live in one person's head. Get your whole team into the same file and watch how fast the arguing stops.

Two designers working on the same file

sable.example

Built for design teams, not just designers

Free to start. Invite the whole team.

Sign up
1.2K86 comments34 shares
LikeCommentShare
Apexapex / links

The link in the ad

apex / links
go.sable.example/design-teams-q3

Where it sends them

https://sable.example/for/design-teams?utm_source=facebook&utm_medium=paid_social&utm_campaign=design_teams_q3&utm_content=carousel_b
Reports as Paid Social

Decided now, not guessed later. Every click on this link lands in the Paid Social row of your reports. The campaign it came from stays attached to the person for as long as they exist.

The channel is chosen when you make the link, not guessed months later. That spend won't disappear into direct traffic.

No tagging spreadsheet

03 · 9:16am

Your team can see she's worth a call while she's still trying the product

Apex scores Priya the moment she signs up. The score uses facts you can inspect: company size, job title, source, pricing views, teammate invites, and product usage.

When someone asks why this account is an 80, the answer is on the screen. Reps start with accounts that can actually pay, while self-serve trials keep moving without a sales call they never wanted.

Apexapex / leads / scoring
Dimension Weights
Intent
30%
ICP Fit
28%
Account
22%
Engagement
15%
Risk
5%

What it made of Priya

scored in 40ms
80High-intent
  • IntentLooked at pricing three times in two days+26
  • ICP FitHead of Product Design at a 240-person company+24
  • AccountSigned up with a real company email, not a personal one+19
  • EngagementCame in on a tracked paid ad link+11
  • RiskNothing looks off0

Everyone else, sorted the same way

1,325 people
High-intent
84
Medium-intent
212
Low-intent
388
Minimal-intent
641

She signed up at 9:16 and was scored at 9:16. Nobody waits for an overnight sync.

Scored where the data already is

04 · 9:16am, still

She joins a Segment everyone on your team can understand

In most stacks, a useful group lives inside a query only an analyst can open. Every team rebuilds it a little differently and calls the result the same audience.

Here the rule is a sentence: design leads at companies with 100 to 500 people. Priya joins the second the sentence is true and leaves when it isn't. Messages, experiments, and sales handoffs all use that same definition.

Apexapex / leads / segments

Trials with no project yet

418 people

Signed up in the last 14 days and hasn't created a project

Workspaceused in 3 places

Design leads at mid-size companies

Priya is in this one1,264 people

Job title contains Design and the company has 100 to 500 people

Workspaceused in 5 places

Ready to add more people

96 people

Activated, on the Team plan, and invited more than five people

Workspaceused in 2 places

One Segment can feed a message, an experiment, an Adaptive Journey, and the list you send to an ad platform.

Write it once, use it everywhere

05 · 9:17am

Write the welcome once. Send it wherever she actually is.

You're not maintaining four campaigns. Apex fills one message with the truth from Priya's trial, including her company, active seats, and days left.

The preview uses your logo, colors, footer, and real merge values. What you approve is what lands. Nobody gets a four-days-left note the morning after they paid.

Apexapex / communications / composer

A full email in their inbox. Authored once, with Priya's attributes resolved from your schema.

{{first_name}}Priya
{{company_name}}Halden Studio
{{trial_days_left}}4
{{seats_active}}4 of 6

Email, phone notification, browser notification, and the bell in your product all come from one message.

Four channels, one message

06 · Set up once

Mail comes from your company, and product invites get the same care

Add three DNS records once and messages leave as hello@sable.example. Your domain, your sending history, and no vendor name in the from line.

The teammate invite uses the same editor. Because Priya caused that invite, it still sends when the recipient has opted out of marketing. The message carries no unsubscribe link because it isn't a campaign.

Apexapex / settings / email domains
sable.exampleVerifiedfrom hello@sable.example
DKIM 1CNAME
Nameapex1._domainkey.sable.example
Valueapex1.dkim.apex.inc
DKIM 2CNAME
Nameapex2._domainkey.sable.example
Valueapex2.dkim.apex.inc
SPFTXT
Namesable.example
Valuev=spf1 include:amazonses.com ~all
DMARCTXT
Name_dmarc.sable.example
Valuev=DMARC1; p=quarantine; rua=mailto:dmarc@sable.example
Apexapex / communications / transactional

A full email in their inbox. Authored once, with Priya's attributes resolved from your schema.

Marketing messages and must-send product messages share one composer and one brand.

Same editor, both kinds of mail

07 · Day 0 through day 14

An Adaptive Journey keeps the first two weeks moving after you close the laptop

You rarely know the perfect first week for every trial. An Adaptive Journey turns that week into a visible plan of waits, messages, experiments, and exits.

This one starts when Priya signs up and stops the moment her team activates or subscribes. The whole plan is on one screen, including what happens to accounts that stall.

If a step depends on an event Apex has never seen, it says so before you publish. A broken event can't quietly strand every account in a wait step.

Apexapex / journeys / trial onboarding

Every wait, branch, and message uses an event you already approved or content you already wrote.

Nothing new to set up

08 · Day 3, the fork

A freelancer and a 240-person company shouldn't get the same first week

A small team can keep buying through the product. Priya invited six teammates at a 240-person company, so a human conversation makes sense.

Apex routes each account using company fit and product behavior. Sales doesn't waste a morning on low-value trials, and Priya doesn't begin the call by retelling everything she already did.

Buys on their own

Small team, credit card, one seat. Apex keeps the trial in the product with useful nudges. Nobody on your team spends a minute on it.

Buys with help from a person

Six teammates at a 240-person company. Apex hands sales her score, Segment, and product history before the first call.

Product-led and sales-assisted growth are one branch chosen from what the account actually does.

One journey, not two funnels

09 · Inside the journey

Try two first messages and keep the one that gets more teams moving

Sable didn't know whether the first note should ask Priya to make a project or invite a teammate. Both sounded reasonable, so Apex sent both with a fair split.

Bring a teammate won 42.8% to 31.2%. A team like Priya's buys 6 seats at $220 a year, so one extra activated team is worth $1,320 in first-year revenue.

Apex checks that lift against the control, the previous 90 days, a group left alone on purpose, and an industry benchmark if you opt in. The result has to survive more than a good week.

Apexapex / experiments / activation nudge
Draft
Live
3Decision
4Promote

+$105,600 a year

What it is worth

Bring a teammate

a year

Bring a teammate beat Start a project. 80 extra teams activated, $1,320 each.

Checked against the control and Sable's own last 90 days. The global holdout and opt-in industry benchmark sit in the workspace view.

How we counted

687 teams got the winning version. That's 11.6 more teams activated per 100 than Start a project, so 80 more in total. Each one is worth $1,320, the 6 seats a team like Priya's pays for in a year.

The winning message is the one that activates more teams, not the one that gets more opens.

Measure activation, not attention

10 · Day 6

Write down what activated means once, then use it everywhere

Every software company argues about activation. In Apex, you write it as a rule the whole team can read. Priya hit this one on day six when a second project went up and four teammates were working together.

Active use, time to value, retention, churn, and returning accounts all read the same definition. A canceled account that comes back isn't counted as a brand-new signup just to make growth look better.

Apexapex / engagement / adoption

The milestone, as a sentence

apex / engagement / adoption

When someone hasn'twithinof, send them.

2,140

Tracked

806

Nudged

1,284

Adopted

+14.2%

Better than the holdout by

Pick the event. Green means Apex has really seen it happen.

Project createdchosenproject_created420 / day
Feature usedfeature_used22.6K / day
Usage milestoneusage_milestone_reachednamed, but never sentSet up
Apexapex / engagement
Daily active
1,588
+720.0 pp vs prev
Weekly active
4,984
+410.0 pp vs prev
Monthly active
11,760
+340.0 pp vs prev
Stickiness
13.5%
+110.0 pp vs prev

Bars stack your active users by type — New (first time active), Returning (active again), and Resurrected (back after going quiet). The dashed Dormant line tracks users who lapsed — no qualifying activity within your churn window.

Change the definition and activation, retention, and churn all move with it.

Your definition, not a default

11 · Meanwhile, on the website

The pricing page was an experiment, and the winner can become the real page

The pricing page Priya read was already comparing two approaches. One arrived on monthly billing. The other led with annual billing and showed the savings.

The variant is chosen before the page leaves the server, so the price doesn't jump in front of her. When one wins, Apex can open the pull request that makes it permanent and removes the experiment branch.

Apexapex / experiments / pricing page
Draft
Deploy
3Live
4Decision
5Promote
6Graduate

The two pricing pages visitors are being split between

server-side
Neutral on billingmonthly chosen
sable.example/pricing
Pushes annual hardannual chosen
sable.example/pricing

One page, built once, rendered twice. The version on the right does one thing, which is push annual billing: it arrives on annual, it paints the recommended plan and its button in a savings colour, and it prices the two free months. That is one change with three faces, not three changes, so a lift has one cause you can act on.

No flicker for Priya, and no abandoned experiment code slowing the page down six months later.

Decided before the page is sent

12 · Right now

Watch the minutes after a launch, not yesterday's report

Most analytics tell you what happened yesterday. This screen shows what people are doing now, which is what you need in the twenty minutes after a launch.

When Priya signs in, her anonymous visit and known lead become one record. The first touch, pricing views, signup, and product use stay together instead of starting over at the form.

Apexapex / web / live

Activity

apex / web / live

People here now

3 on site

The ad click that happened before Priya signed in stays attached when Apex learns who she is.

Anonymous and known, one stream

13 · The record

One screen holds the account story from ad click to contract

Every experiment Priya entered, which variant she saw, and the message that variant sent sit on one record. So do the times Apex left her alone on purpose.

Sales can open this before a renewal call instead of rebuilding the story from a CRM, analytics tool, messaging tool, and billing tab. Priya doesn't have to retell her own trial.

Apexapex / leads / priya-raman

Priya Raman

priya@haldenstudio.com

$18,400

lifetime value

Account
Halden Studio
Role
Head of Product Design
People using it
4 of 6
Plan
Team

How she got here

every event, in the order it happened
  1. Came in from a Facebook ad

    go.sable.example/design-teams-q3 → /for/design-teams

    page_view

  2. Sent the trial form

    Scored 80 (high intent) before anyone read it

    form_submit

  3. Started a trial

    The Halden Studio workspace was created

    user_signed_up

  4. Opened the first-project nudge

    She got the Bring a teammate version

    apex_email_opened

  5. Made her first project

    Her team's first shared project, 14 files

    project_created

  6. Invited six teammates

    Four joined within a day

    user_signed_up

  7. Activated

    Four people working in it together

    activated

  8. Subscribed to Team

    $24,000 a year

    subscription_started

Every experiment she was in

3 experiments

Her score, Segment, messages, experiments, product use, and revenue were never separate stories.

Assembled, not stitched together

14 · Multiply by every account

Now Monday's question is where the next dollar goes

Priya is one account. Repeat the same chain across all accounts and you stop asking which channel deserves credit. You ask what to buy more of.

LinkedIn brings fewer leads but more customers who stay. Meta signs up people cheaply but needs 22 months to pay back. The working is on the screen: spend, customers, lifetime value, CAC, churn, and payback.

Apexapex / attribution

Next moves

  • LinkedIn

    Put more money behind LinkedIn

    LinkedIn brings in the accounts that actually stick. Every $1 spent to win a customer comes back as $4.10. It's the only channel that isn't capped by budget.

    Plan more budget
  • Google Ads

    Trim Google Display

    Display signs up plenty of people and almost none of them stick. Each team that activates from Display costs three times what search costs.

    Review campaigns
  • Reconnect Meta

    Meta stopped accepting your conversions six days ago. Until you fix it, Meta is picking who sees your ads using old data.

    Fix connection
Apexapex / attribution / economics

Each row follows real accounts from spend through lifetime value and CAC payback.

Accounts over time, not last click

15 · Back to the ad platforms

Send the valuable outcomes back, so the ads find more accounts like Priya's

If you send ad networks every signup, they'll find more signups, including trials that never activate or pay.

Apex sends back the lead worth calling, the team that activated, the subscription, and the contract value. Marketing, sales, and finance all use the same conversion, so the next account is more likely to look like one you'd want again.

Apexapex / attribution / outbound
NetworkWhat Apex sends back to them
LinkedInTeams that activated, plus the company they work for
Google AdsNew subscriptions, priced at what the contract is really worth
MetaTrials that look qualified, sent from our server to theirs

The network can't learn that a company signed weeks after the click unless you tell it.

Close the loop

16 · Find the next one

Partners can bring the next Priya, paid from the same subscription

Consultants already recommend software to their clients. A partner program gives them a tracked link and a clear share when an account subscribes.

The link, contract, recurring commission, experiment, and channel economics all read the same subscription event. You add a new source of customers without adding a second system to reconcile on payout day.

Apexapex / partner network

Sable Partner Program

Sable

Consultants who set Sable up for their clients get paid on every workspace that subscribes, for as long as it keeps paying. One partner login works across every program they join.

SaaS20.0% of subscription
Apply

The partner's cut comes from the same subscription that scored the experiment and filled the attribution table.

Same subscription event

Keep what worked

The trial ended. What it taught you didn't.

The winning message, pricing page, sales route, and channel decision shouldn't disappear when the quarter ends. Apex keeps every result with the evidence attached, so the next experiment starts from what your company already learned.

Teams that invite a second person in week one activate far more often.

91% confident· 3 tests, 11,400 trials

last moved by First-project nudge

Design leads become customers more often than engineering leads at the same company size.

78% confident· 2 tests, 6,200 trials

last moved by Fit scoring change

Showing annual pricing first doesn't stop trials from paying.

41% confident· 1 test, still running

last moved by Pricing page toggle

In the last week of a trial, deadline reminders beat value reminders.

66% confident· 2 tests, 4,800 trials

last moved by Trial-expiry messages

trial, from first click to renewal
1trial, from first click to renewal
steps in the example below
16steps in the example below
reference points for every result
4reference points for every result
numbers to reconcile between tools
0numbers to reconcile between tools

Your move

Make the next account more valuable.

Find the right accounts. Help more teams reach value. Keep the ones that fit. Prove what increased recurring revenue.