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.
  2. serverMetadata: Readable and writable only from a 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.

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.

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.

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

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