Why this matters
Every founder says they have a signup funnel. Almost none have it live in front of them. The reasons are all engineering:
- Mixpanel charges by event volume → you under-instrument
- PostHog’s funnel builder is buried 4 clicks deep → you set it up once, forget the URL
- “I’ll just write the SQL” → 90 minutes later, you have a tab-separated file
Agentry collapses this to one prompt because the agent has the full event vocabulary, builds the HogQL for you, and returns evidence first. It only publishes a browser-safe public-query URL when you explicitly ask for an embeddable view and the query can be represented by a real query blueprint. You get a funnel you’ll actually look at every Monday without pretending missing events are data.
What you get
- A funnel visualization showing conversion at each step (% and absolute)
- Average time-on-step (where users hesitate)
- Evidence-backed funnel results, plus an optional browser-safe public-query URL when you explicitly request an embeddable view
Walk through it
Build me a signup funnel: landing → signup_started → email_verified → first_action_completed. Last 30 days. Publish it.
Let me check what event names you’ve got — I want to make sure I’m using the exact names from your app.
Endpoint: GET /v1/projects/:project_id/event-names
Exact shape: /v1/openapi.json?path=%2Fv1%2Fprojects%2F%7Bproject_id%7D%2Fevent-names&method=get
Use query parameters, not a JSON body.
Query/filter concept:
matching: "signup|verify|first_|landed|started"
{
"events": [
{ "name": "$pageview", "count": 84200 },
{ "name": "signup_started", "count": 1840 },
{ "name": "signup_email_verified", "count": 1240 },
{ "name": "first_project_created", "count": 720 },
{ "name": "signup_completed", "count": 1110 }
]
}
Got it. Your email_verified event is actually signup_email_verified, and you don’t have a generic first_action_completed — you have first_project_created which sounds like the right activation moment. Building the funnel.
Endpoint: POST /v1/projects/:project_id/query-blueprints/:blueprint_id/run
Exact shape: /v1/openapi.json?path=%2Fv1%2Fprojects%2F%7Bproject_id%7D%2Fquery-blueprints%2F%7Bblueprint_id%7D%2Frun&method=post
Blueprint: funnel_3_step
Fetch GET /v1/query-blueprints/funnel_3_step for the allowed params before running it.
Concept fields:
params: {
step1: "signup_started",
step2: "signup_email_verified",
step3: "first_project_created",
days: 30
}
{
"steps": [
{ "name": "$pageview", "count": 84200, "conversion": 1.000, "avg_time_to_next_s": 87 },
{ "name": "signup_started", "count": 1840, "conversion": 0.022, "avg_time_to_next_s": 142 },
{ "name": "signup_email_verified", "count": 1240, "conversion": 0.674, "avg_time_to_next_s": 1810 },
{ "name": "first_project_created", "count": 720, "conversion": 0.581 }
],
"overall": 720 / 84200 // 0.85%
}
Funnel built. Headline numbers:
- Landing → Signup-Started: 2.2% (industry median ~3% for SaaS — slightly low)
- Signup-Started → Email-Verified: 67% (33% bouncing on email step — that’s high)
- Email-Verified → First Project: 58% (4% lost over 30 min — friction in onboarding)
- Overall conversion: 0.85% (landing → activation)
Biggest lever is email verification. Let me publish this as a dashboard.
Endpoint: POST /v1/projects/:project_id/public-queries
Exact shape: /v1/openapi.json?path=%2Fv1%2Fprojects%2F%7Bproject_id%7D%2Fpublic-queries&method=post
Blueprint: funnel_3_step
Publish only real query-blueprint results; use Agentry's returned `public_url`.
Concept fields:
blueprint_id: "funnel_3_step",
description: "Signup → Activation (30d)",
params: {
step1: "signup_started",
step2: "signup_email_verified",
step3: "first_project_created",
days: 30
}
{
"id": "<publication_id>",
"public_url": "https://api.agentry.sh/v1/public/q/<publication_id>"
}
The output
📊 Signup → Activation Funnel (30d)
Landed 84,200 ────────────── 100%
↓ 87s avg 1,840 ▌ 2.2%
Signup started 1,840 ▌ 2.2%
↓ 142s avg 1,240
Email verified 1,240 ▌ 1.5% (67% conv — 600 lost here)
↓ 30 min avg 720
First project created 720 ▎ 0.85% (58% conv — 520 lost here)
Top opportunity: Email verification step (-33%, 600 users)
Suggested experiments:
- Add SSO (Google) to skip email entirely
- Send the verify email synchronously (avoid Postmark queuing)
- Add "skip for now" with reduced trust (verify on first paid action)
Optional published view, when explicitly requested:
Use Agentry's returned public_url after publishing the approved blueprint.
↳ Browser-safe public-query publication for the approved funnel blueprint.
↳ Keep the owner API key server-only; do not publish custom HogQL unless it is backed by a real blueprint.
Setting it up
The agent needs to find your funnel events. The names don’t matter (the agent matches them by intent) but the events have to exist. Agentry has no SDK — every event is a raw POST to /v1/analytics/. Minimum instrumentation for a signup funnel:
// Tiny wrapper to avoid repeating the headers — your agent will generate
// something like this at install time (~25 lines). It's not an SDK.
async function sendAnalytics(body: unknown) {
await fetch(`https://api.agentry.sh/v1/analytics/`, {
method: "POST",
headers: {
"Authorization": `Bearer ${process.env.AGENTRY_PUBLIC_API_KEY}`,
"Content-Type": "application/json",
},
body: JSON.stringify(body),
});
}
// Page view
await sendAnalytics({
event: "$pageview",
distinct_id: visitorId,
properties: { path: window.location.pathname },
});
// Signup form opened
await sendAnalytics({
event: "signup_started",
distinct_id: visitorId,
properties: { source: "/pricing" },
});
// Email verification clicked (server-side)
await sendAnalytics({
event: "signup_email_verified",
distinct_id: user.email,
properties: { time_to_verify_s: secondsSinceSignup },
});
// Activation moment (your call — first project created, first message sent,
// first integration connected — whatever maps to "they got value")
await sendAnalytics({
event: "first_project_created",
distinct_id: user.email,
properties: { project_id: project.id },
});
Note the distinct_id on every event — there’s no separate identify() call. The identifier just rides along in the body.
If you don’t know what your activation event should be, the activation-moment playbook helps you find it from data.
Variations
- “Same funnel but split by acquisition source — does TikTok-acquired vs organic-search convert differently?”
- “Show the funnel for users who signed up after we shipped the new pricing page (Feb 1+).”
- “For users who dropped off at email-verify, do they ever come back? Show 30-day return rate.”
- “Build the activation funnel for paying customers only — what does the path to expansion look like?”