Send your first steps
Create a tracking key, make the call from your backend, and check that the steps arrived.
1. Create a tracking key
- Open Funnels in the sidebar.
- In Send steps from your backend, press Create a tracking key.
- Copy the key now. It starts with
ock_, and it is shown only once.
The key has the funnels.write scope: it can report funnel steps and nothing else in your workspace. Keep it on your server, in the same place as your other secrets, and never in code that runs in a browser or a mobile app. It is listed with your workspace's other API keys under Evidence → Connect, where you can revoke it.
2. Send a step
Call this from your backend when a person reaches a step:
curl -X POST https://api.outcomify.com/api/funnels/track \
-H "Authorization: Bearer ock_…" \
-H "Content-Type: application/json" \
-d '{"events":[{"event":"signed_up","person":"user-123"}]}'
The answer says how many steps were received, and how many were new:
{"received": 1, "recorded": 1}
Send the same step for the same person again and it answers "recorded": 0. That is expected: each person counts once per step.
From Node.js
// Never throws: a funnel step must not break the request your user made.
async function trackStep(event, person, at) {
try {
const res = await fetch('https://api.outcomify.com/api/funnels/track', {
method: 'POST',
headers: {
Authorization: `Bearer ${process.env.OUTCOMIFY_FUNNELS_KEY}`,
'Content-Type': 'application/json',
},
// `person` must be a string: send numeric ids as String(id).
body: JSON.stringify({ events: [{ event, person: String(person), at }] }),
signal: AbortSignal.timeout(5000),
});
if (!res.ok) console.warn('Outcomify funnel step not sent', res.status);
} catch (err) {
console.warn('Outcomify funnel step not sent', err);
}
}
// after the user's project is saved
await trackStep('created_project', user.id);
From C#
var http = new HttpClient();
http.DefaultRequestHeaders.Authorization =
new AuthenticationHeaderValue("Bearer", config["Outcomify:FunnelsKey"]);
await http.PostAsJsonAsync("https://api.outcomify.com/api/funnels/track", new
{
events = new[] { new { @event = "created_project", person = user.Id.ToString() } }
});
A funnel step should never break the request your user made, so send it after your own work is done, and don't fail the request if Outcomify doesn't answer. For a busy app, queue steps and send them in batches: see Busy apps, 429s and backfills.
What a step looks like
| Field | |
|---|---|
event |
The step's name, such as signed_up or invited_teammate. Letters, digits and _ . : -, starting with a letter or a digit, up to 64 characters. It is stored in lower case. |
person |
Your id for the person, as a string (send a numeric id as "42"), up to 200 characters. Outcomify hashes it before storing it. Use an id that stays the same for that person, not an email. |
at |
Optional. When it happened, as an ISO time such as 2026-10-17T10:00:00Z. Leave it out for now. It may be up to 400 days in the past, and at most 5 minutes in the future. |
Up to 500 steps fit in one call, and a workspace can use up to 50 different step names. Pick names for what the person did, in the past tense, and keep them stable: a funnel is built from them.
3. Check that it arrived
The setup card lists Steps received: every step name that has arrived, with how many people reached it. It updates by itself, so you can keep the page open while you wire it up. Once a few names are there, build a funnel from them.
Still stuck? Email info@outcomify.com and a person will answer.