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

  1. Open Funnels in the sidebar.
  2. In Send steps from your backend, press Create a tracking key.
  3. 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.