Upsell strategy: gated access → paid plan
Product context: Estym8 is built from scratch as an AI-first construction preconstruction platform—not a legacy takeoff stack with AI bolted on. AI runs across the product: bid-package ingestion and classification, multi-model takeoff and vision, plan intelligence, cross-file synthesis, Estee, estimate-to-submittal draft review, and optimization recommendations. Canonical framing: AI-first positioning.
Open
[ ]checklist items from an earlier draft are tracked in the engineering backlog (repo-only). The body below is the canonical messaging guide.
Goal: Convert accounts that are signed up and engaged but cannot run takeoffs (no active plan) into paying subscribers (Solo or Studio), and reinforce upgrade after they see value.
Product reality (code): New users register with freeEstimatesRemaining: 0. Takeoffs run only when checkTrialStatus allows: verified email plus one of admin, demo user, approved tester, beta lifetime access, or paidAccessAt (manual / billing grant). Otherwise jobs and estimate-generate return 403 with trialCheck.message (e.g. “Takeoffs require an active plan. See pricing or contact us to get access.”). The legacy per-signup estimate grant path is removed (initializeFreeTrial / useFreeEstimate are deprecated no-ops).
Pricing reference: Pricing one-pager · Full strategy: Pricing strategy
Note: In closed beta (ESTYM8_TESTING_MODE=true), most signups are request-access / waitlist; grant approvedForTestingAt (or use the demo account) so testers can run plan sets without paying. The same messaging applies when you open signup: clear path to “get access” (pricing, contact, checkout when live).
1. User journey and conversion moments
| Stage | User state | Best upsell / activation moment |
|---|---|---|
| Signed up, email not verified | Cannot run takeoffs | Resend / inbox copy: verify to continue (inform, not sell). |
| Verified, no plan / approval | freeEstimatesRemaining === 0 in API; upgrade banners | Gate moment: project creation, PDF upload, or API 403 — point to /pricing and contact / request access. |
| First estimate completes (they have access) | Can run more while access holds | Value moment: reinforce time saved; optional line about staying on a plan or upgrading tier. |
| Returning, still no plan | Same gate | Every blocked action: one primary CTA (See plans / Contact us) plus short reason. |
Principle: Do not rely only on “you used your freebie.” Lead with “You need an active plan to run takeoffs” and, when they have seen an output, pair value (“hours saved”) with next step (plan / contact).
2. Touchpoints (current and recommended)
Already in place (align copy with messages, not “free trial ended” unless UI still says that)
- Dashboard / project: When the client sees
freeEstimatesRemaining === 0, upgrade CTAs replace primary actions; keep copy consistent withtrialCheck.message(active plan / pricing / contact). - API: Jobs and estimate-generate return 403 with
messagefromcheckTrialStatusandfreeEstimatesRemaining: 0when blocked. Toasts should showmessagewhen present. - Pricing page:
/pricing— tiers, ROI, Contact / early access until self-serve checkout exists.
Recommended additions
-
Value-moment CTA (after first estimate completes, for paying or approved users)
Reinforce outcome: “That’s 1–3 days of takeoff in 15–45 minutes.” Optional: “Stay on Solo/Studio to keep this cadence every month.” -
Pricing hero for gated visitors
Headline/supporting copy should assume plan required, not “your included run is used,” unless product marketing explicitly reintroduces a signup grant. -
Email (optional)
In “Your estimate is ready,” add one line for opted-in users: unlock ongoing takeoffs / see plans →https://estym8.ai/pricing. -
Operator workflow
Document that granting access = setpaidAccessAtand/orapprovedForTestingAtin admin or DB;/api/auth/meexposesfreeEstimatesRemaining: 1to the client when those flags apply so upgrade chrome stays off for entitled users.
3. Messaging guidelines
- Value-first when they have a result; clarity-first when they are blocked (why + one CTA).
- Concrete next step: “See plans,” “Contact us,” “Request access” →
/pricingor your testing-mode flow. - Price anchor when relevant: “From $179/mo (Solo),” “One saved day pays for the month.”
- Single primary CTA per surface.
4. Copy reference (in-app and sales)
Gate: no active plan (dashboard / project / upload)
| Element | Copy direction |
|---|---|
| Headline | Run takeoffs on your plan |
| Subcopy | Takeoffs need an active plan—or approved access in beta. See pricing or contact us to get started. |
| Primary CTA | See plans / Contact us |
Value moment (after a successful estimate)
| Element | Copy direction |
|---|---|
| Headline | That’s 1–3 days of work in 15–45 minutes. |
| Subcopy | Keep this workflow on Solo or Studio—from $179/mo (1 seat). |
| Primary CTA | See plans |
Pricing page
| Element | Copy direction |
|---|---|
| Hero | Turn 3 days into 15 minutes—every time. |
| Subcopy | Plans built for MEP estimators; contact us for early access if checkout is not live yet. |
| Solo / Studio CTAs | Match live purchase or “Contact us” state. |
API / toast
| Location | Copy direction |
|---|---|
| 403 | Surface server message first; fall back to short “You need an active plan to run takeoffs.” + link to pricing. |
4b–4c. Follow-up email and SMS (opt-in only)
Same structure as before: only for users with notifyEmail / notifySMS. Compliance suffix on SMS is unchanged.
- Estimate ready email: Optional line linking to pricing / plan value (keep aligned with whatever gating exists in product).
- SMS: Short “See plans: estym8.ai/pricing” before compliance suffix if appropriate.
5. Implementation checklist
- Pricing page: Tiers and contact/early-access CTA.
- Gate UX: Upgrade or blocked states when
freeEstimatesRemaining === 0for non-entitled users. - Copy audit: Replace leftover signup-grant / trial wording in UI with plan / access language where gating is paid-first.
- 403 handling: Client shows
messagefrom API everywhere jobs or generate can return 403. - Email: Optional upgrade line in “estimate ready” for opted-in users.
- Checkout (later): Self-serve purchase sets
paidAccessAt(or subscription) automatically.
6. Success metrics
- Activation: % of verified signups who get
paidAccessAtor approval and complete ≥1 takeoff. - Conversion: % of gated users (403 or upgrade surface) who visit
/pricingor contact within 7 days. - Revenue: Time from signup to paid grant or checkout.
Track in analytics; tune placement of value moment vs. gate-only messaging.