---
slug: funnel-schritte-einbauen
title: "How do I report a funnel step?"
category: installation
locale: en
updated: 2026-10-14
keywords: ["goal","identify","goal_key","funnel step","funnel","Server Events API","SDK","event ID","test step","SaaS"]
questions: ["How do I send the steps of my funnel from the browser or the backend?","metrunio.goal","How do I send a goal event?","How do I report a funnel step from the backend?","Why do I need identify() before goal()?","Which event ID do I use for a funnel step?","How do I test a funnel step?","How do I set up a SaaS funnel in the assistant?"]
url: https://bench.metrunio.com/en/help/funnel-schritte-einbauen
---

# How do I report a funnel step?

**How do I send the steps of my funnel from the browser or the backend?**

In the browser with `metrunio.identify(userId)` once after sign-in and then `metrunio.goal('key')` per step; from the backend with `POST /v1/server/events` and an event of type `goal` carrying `goal_key` and `user_id`. Both routes are equivalent; a step without a customer identifier is rejected.

A funnel step is an event of type `goal` with the key of the step and a customer identifier. Where it comes from does not matter: the SDK in the browser and the Server Events API produce the same event, with the same “once per customer” rule. Use the route where the step actually happens: sign-up where your backend creates the account; a completed setup dialog where it ends in the browser.

## In the browser

```javascript
// once after sign-in: makes the customer the same across devices
metrunio.identify('customer-4711');

// once per step; a second call for the same customer does not count again
metrunio.goal('shop_created');

// with an amount if the event knows it: counts as revenue.
// Without one, the acquisition value from the portal applies.
metrunio.goal('first_payment', { value: 49, currency: 'EUR' });
```

`identify()` comes before `goal()`, in the same page load or earlier: the SDK attaches the customer identifier to everything sent afterwards. Without identify() the step leaves with the pseudonymous browser ID. It is accepted, but counts per browser instead of per customer. The key is sent in lower case without spaces; an empty key yields `GOAL_KEY_MISSING` in the console.

## From the backend

```bash
curl -X POST "$METRUNIO_COLLECTOR/v1/server/events" \
  -H "authorization: Bearer $METRUNIO_SERVER_KEY" \
  -H "content-type: application/json" \
  -d '{
    "site_id": "site_demo_app",
    "events": [{
      "event_id": "customer-4711-shop_created",
      "event_type": "goal",
      "goal_key": "shop_created",
      "user_id": "customer-4711",
      "occurred_at": "2026-09-14T10:15:00Z",
      "consent_state": "granted",
      "consent_purposes": ["analytics"]
    }]
  }'
```

`$METRUNIO_COLLECTOR` is the address from the ready-made call on the “Server Events API” tab in Setup (see “How do I report conversions server-side?”).

The `user_id` is the same customer number you pass to identify() in the browser; it is pseudonymised on receipt and never stored in clear text. If you already pseudonymise, send `user_id_hash`; it is also combined with your account’s key on receipt. A `goal` without `goal_key` or without a customer identifier is rejected, and the response names the field. Value and currency are optional. If you send them, the amount counts as revenue; if they are missing, the step’s acquisition value applies, separate from revenue. That is the default; the value logic of a step is set in the portal (see “What is a funnel step worth?”).

## The event ID

Build the event ID from customer and step, for example `customer-4711-shop_created`. A repeated call (a job that runs again, a second click) is then harmless on two levels: the same event ID counts only once against the quota, and the same step counts only once per customer in the report. The SDK creates its own event IDs.

## Testing

- In the portal under “Orders & goals”, every step has a “Send test step” button. The event lands in the test data and counts there immediately as a conversion of that step, not in the reports.
- In the setup assistant, the step “Define a conversion” with the choice “Steps in an application (SaaS)” creates three funnel steps: `registriert`, `eingerichtet`, `erste_zahlung`. You can rename, add or retire them.
- From your own system: send the step with `environment: "test"`, or in the SDK with `testMode: true`, and check it under “Orders & goals” with the “Test data” switch.

> **Caution:** `goal` is an analytics event. Without analytics consent it does not leave the device in the browser, and server-side it is not stored without matching `consent_purposes`. Every step sent counts against the event quota.

## Also asked

- metrunio.goal
- How do I send a goal event?
- How do I report a funnel step from the backend?
- Why do I need identify() before goal()?
- Which event ID do I use for a funnel step?
- How do I test a funnel step?
- How do I set up a SaaS funnel in the assistant?

## Related

- https://bench.metrunio.com/en/help/funnel-schritte-messen
- https://bench.metrunio.com/en/help/funnel-bericht-lesen
- https://bench.metrunio.com/en/help/sdk-api
- https://bench.metrunio.com/en/help/server-events-api
- https://bench.metrunio.com/en/help/single-page-app
- https://bench.metrunio.com/en/help/erste-conversion-testen
- https://bench.metrunio.com/en/help/consent-serverseitig
