> For the complete documentation index, see [llms.txt](https://docs.birdie.so/birdie-docs/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.birdie.so/birdie-docs/request-screen-recordings/devtools-console-logs-and-network-requests/custom-data.md).

# Custom data

Attach your own data - account id, plan, feature flags - to every recording, so whoever opens one already has the context.

{% hint style="info" %}
Custom metadata requires the Birdie Snippet to be installed on your product pages.
{% endhint %}

### Add it when Birdie starts

If you use the [`@birdie-so/snippet`](https://www.npmjs.com/package/@birdie-so/snippet) package, pass a `metadata` object to `initBirdie()`:

```js
import { initBirdie } from "@birdie-so/snippet";

initBirdie({
  clientId: "YOUR_CLIENT_ID",
  contact: {
    email: "alex@empire.com"
  },
  metadata: {
    account_id: "acct_8123",
    plan: "business",
    workspace: "Empire HQ",
    flags: ["new-editor", "beta-search"]
  }
});
```

Installed Birdie with the plain script tag instead? Add `metadata` to `window.birdieSettings`, before the loader runs:

```html
<script>
window.birdieSettings = {
  app_id: "YOUR_APP_ID",
  contact_name: "Alexander the Great",
  contact_email: "alex@empire.com",
  metadata: {
    account_id: "acct_8123",
    plan: "business"
  }
};
</script>
```

### Update it while your app runs

Most of what is worth attaching is only known after login, or changes as someone moves around your product. Update it whenever it changes:

```js
import { getBirdieInstance } from "@birdie-so/snippet";

getBirdieInstance((birdie) => {
  birdie.update({
    metadata: {
      account_id: "acct_8123",
      plan: "business",
      current_screen: "billing/invoices"
    }
  });
});
```

A recording carries the values Birdie holds at the moment it is sent, so the last update before someone hits record is the one that arrives.

### What you can send

Anything that survives `JSON.stringify`: strings, numbers, booleans, arrays, and nested objects. There is no fixed list of keys - use the names your own team already uses, so a recording reads the way your logs and dashboards do.

Keep it to what helps someone understand the recording. A handful of identifiers and a few pieces of state beat a dump of your whole store, which is slower to send and harder to read.

{% hint style="warning" %}
Metadata is visible to anyone who can open the recording, including people outside your workspace if the recording is shared with **Anyone with the link**. Do not put passwords, tokens, or personal data in it.
{% endhint %}

### Where it shows up

Open the recording and expand **Metadata** in the side panel. Your object appears there as formatted JSON, with a button to copy the whole thing.

Metadata is also searchable: type a value - an account id, a plan name - into the search box on your recordings list, and the recordings carrying it come back.
