---
title: Users in admin
description: 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:

```ts
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).

```ts
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:

```dart
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:

```ts
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

```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"
}
```

```http
PATCH /v1/applications/{app_code}/users/me
Authorization: Bearer YOUR_ACCESS_TOKEN

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

Next: [Checklist](/en/guides/checklist) · [API reference](/en/sdk/api-reference)
