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:
| Field | Source |
|---|---|
country_code, city | Request IP (Cloudflare or GeoIP) |
timezone | IP or SDK timezone |
acquisition_source | only 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