registerUser, profile, avatar, geo — what Platform admin shows.

Users in admin

After Auth, the user appears in Platform admin via an application_users membership (not a raw Auth dump).

Required

After signup/signin call:

await platform.registerUser({
  platform: "web", // or android / ios / …
});

Without this (and without other JWT calls like registerDevice / getMyEntitlements) the user will not show up under Users.

Profile: name and avatar

Pass a public avatar URL and display name — they show in admin (list + detail).

await platform.registerUser({
  platform: "android",
  display_name: "Ivan",
  avatar_url: "https://cdn.example.com/avatars/u1.jpg",
  timezone: Intl.DateTimeFormat().resolvedOptions().timeZone,
  acquisition_source: "google_play",
});

// when the user changes avatar / name in your app
await platform.updateUserProfile({
  display_name: "Ivan P.",
  avatar_url: "https://cdn.example.com/avatars/u1-new.jpg",
});

Flutter:

await platform.registerUser(
  platform: 'android',
  displayName: 'Ivan',
  avatarUrl: 'https://cdn.example.com/avatars/u1.jpg',
  timezone: 'Europe/Moscow',
);

await platform.updateUserProfile(
  displayName: 'Ivan P.',
  avatarUrl: 'https://cdn.example.com/avatars/u1-new.jpg',
);

Auth metadata

If you store the avatar in Supabase Auth:

await supabase.auth.updateUser({
  data: { avatar_url: "https://…", full_name: "Ivan" },
});
await platform.updateUserProfile({}); // pulls metadata into application_users

Metadata keys: avatar_url / picture / avatar; name — full_name / name / display_name.

avatar_url must be a public https://… URL (or data:image/…), not a local device path.

Geo (country / city / timezone)

On first contact with the Platform API:

FieldSource
country_code, cityRequest IP (Cloudflare or GeoIP)
timezoneIP or SDK timezone
acquisition_sourceonly if passed to registerUser

Admin shows a country flag. First-seen geo is not overwritten on every trip/VPN change.

VPN: GeoIP sees the VPN exit country, not the user’s home country. Home country cannot be recovered reliably from IP alone.

HTTP

POST /v1/applications/{app_code}/users/register
Authorization: Bearer YOUR_ACCESS_TOKEN

{
  "platform": "web",
  "display_name": "Ivan",
  "avatar_url": "https://…",
  "timezone": "Europe/Moscow",
  "acquisition_source": "organic"
}
PATCH /v1/applications/{app_code}/users/me
Authorization: Bearer YOUR_ACCESS_TOKEN

{
  "display_name": "Ivan P.",
  "avatar_url": "https://…"
}

Next: Checklist · API reference