Skip to content

Funnel users ​

A funnel user is one person's record in one funnel: who they are, what they answered, where they came from and their subscription status. Subscriptions themselves are listed separately in Subscriptions.

json
{
  "id": "<funnel-user-id>",
  "userId": "u_123",
  "funnelId": "<funnel-id>",
  "email": "person@example.com",
  "fullName": "Ann Lee",
  "subscriptionStatus": "active",
  "test": false,
  "answers": { "goal": "sleep-better" },
  "metadata": { "plan": "yearly" },
  "attribution": {
    "firstTouch": { "utm_source": "facebook", "utm_campaign": "spring" },
    "lastTouch": { "utm_source": "tiktok" },
    "lastNonOrganicTouch": { "utm_source": "tiktok" }
  },
  "geo": { "country": "US", "city": "Austin" },
  "createdAt": "2026-10-01T10:00:00+00:00",
  "updatedAt": "2026-10-05T12:00:00.123456+00:00",
  "lastSeenAt": "2026-10-05T12:00:00+00:00"
}
FieldMeaning
idThe funnel user record ID.
userIdThe funnelsgrove user ID your app saves after sign-in.
subscriptionStatusThe latest known subscription status, or null.
testtrue for users created in test mode.
answersThe user's quiz answers, keyed by question.
metadataCustom metadata your funnel stored on the user.
attributionFirst, last and last non-organic touch, with the UTM parameters the funnel recorded.

To keep a copy of a project's users up to date, follow the sync guide.

Project secret keys

Requests with a project secret key still return the earlier, larger response (with payments and events). New integrations use API keys and the format on this page.

Get funnel user ​

Looks one user up by funnelsgrove user_id, by email, or by funnelUserId.

Scope: funnel_users:read

Request ​

http
GET /funnel-users?projectId=<project-id>&funnelId=<funnel-id>&user_id=<user-id>

Parameters ​

QueryRequiredPurpose
projectIdYesThe project that owns the funnel.
funnelIdUnless funnelUserId is sentThe funnel to search.
user_idOne of the threeThe funnelsgrove user ID returned to your app.
emailOne of the threeThe user's email address.
funnelUserIdOne of the threeThe funnel user id. Needs no funnelId.

Example ​

sh
curl "https://sdk-api.funnelsgrove.com/integration/v1/funnel-users?projectId=<project-id>&funnelId=<funnel-id>&user_id=<user-id>" \
  -H "Authorization: Bearer <api-key>"

Response ​

json
{ "user": { "id": "<funnel-user-id>", "userId": "u_123", "…": "…" } }

Errors ​

StatusMeaning
400No lookup key, or funnelId is missing.
404No funnel user matches, or the funnel belongs to another project.

List funnel users ​

Pages through the project's users in updatedAt order, oldest first.

Scope: funnel_users:read

Request ​

http
GET /funnel-users/list?projectId=<project-id>&updatedSince=<iso-timestamp>

Parameters ​

QueryRequiredPurpose
projectIdYesThe project to list.
funnelIdNoLimit the list to one funnel.
updatedSinceNoISO 8601 timestamp. Returns users whose updatedAt is at or after it.
cursorUpdatedAt, cursorIdNoThe nextCursor values of the previous page. Both are required together.
limitNoPage size, up to 100 (default 50).

Timestamps must be canonical ISO 8601 (2026-10-20T00:00:00Z or …T00:00:00.123456+00:00). Encode + as %2B.

Example ​

sh
curl "https://sdk-api.funnelsgrove.com/integration/v1/funnel-users/list?projectId=<project-id>&updatedSince=2026-10-20T00:00:00Z&limit=100" \
  -H "Authorization: Bearer <api-key>"

Response ​

json
{
  "project": { "id": "<project-id>" },
  "items": [{ "id": "<funnel-user-id>", "userId": "u_123", "updatedAt": "…", "…": "…" }],
  "nextCursor": { "updatedAt": "2026-10-20T10:00:00.123456+00:00", "id": "<funnel-user-id>" }
}
  • nextCursor is null on the last page.
  • A user's updatedAt changes when their profile, answers, email or login change, and after every payment, refund and subscription change. Chargebacks do not change it. Background maintenance can also change it, so expect some users to repeat.

Errors ​

StatusMeaning
400A timestamp is not ISO 8601, or cursorUpdatedAt was sent without a UUID cursorId.
404funnelId does not belong to the project.

Build. Launch. Grow.