# Source: https://neon.com/llms/neon-auth-concepts-custom-user-data.txt

# Custom User Data

> The "Custom User Data" documentation explains how Neon users can manage and implement custom user data within their authentication processes, detailing the structure and integration methods specific to Neon's platform.

## Source

- [Custom User Data HTML](https://neon.com/docs/neon-auth/concepts/custom-user-data): The original HTML version of this documentation

> How to store custom user metadata in Neon Auth

Neon Auth allows storing additional user information through three types of metadata fields:

1. **clientMetadata**: Readable and writable from a [client](https://neon.com/docs/neon-auth/concepts/stack-app#client-vs-server).
2. **serverMetadata**: Readable and writable only from a [server](https://neon.com/docs/neon-auth/concepts/stack-app#client-vs-server).
3. **clientReadOnlyMetadata**: Readable from a client, writable only from a server.

## Client metadata

You can use the `clientMetadata` field to store non-sensitive information that both the client and server can read and write.

```tsx
await user.update({
  clientMetadata: {
    mailingAddress: '123 Main St',
  },
});

// On the client:
const user = useUser();
console.log(user.clientMetadata);
```

## Server-side metadata

For sensitive information, use the `serverMetadata` field. This ensures the data is only accessible and modifiable by the server.

```tsx
const user = await stackServerApp.getUser();
await user.update({
  serverMetadata: {
    secretInfo: 'This is a secret',
  },
});

// To read:
const user = await stackServerApp.getUser();
console.log(user.serverMetadata);
```

## Client read-only metadata

Use `clientReadOnlyMetadata` for data that clients need to read but never modify, such as subscription status.

```tsx
// On the server:
const user = await stackServerApp.getUser();
await user.update({
  clientReadOnlyMetadata: {
    subscriptionPlan: 'premium',
  },
});

// On the client:
const user = useUser();
console.log(user.clientReadOnlyMetadata);
```