# Marketing consent (/docs/concepts/consent)



> [!NOTE] Experimental
> Marketing consent is experimental. Its API can still change in a minor release.

Marketing consent is a member's yes or no to hearing from you on one channel, such as email. Your app asks: it shows the checkbox and its wording. Domino keeps the record.

| Domino records      | Example                                                                                                                                |
| ------------------- | -------------------------------------------------------------------------------------------------------------------------------------- |
| The channel         | Email, the only channel Domino records consent for so far.                                                                             |
| The member's choice | Opted in (granted), or opted out (withdrawn).                                                                                          |
| When                | The time Domino received it, by Domino's clock, never the member's device. For imported consent, the time the old platform recorded.   |
| The wording         | The exact text the member saw beside the checkbox, word for word.                                                                      |
| Where it came from  | The member, choosing in your app, or a [member import](/docs/use/imports), for consent the member gave on the platform they came from. |

## Every change is kept [#every-change-is-kept]

Each time a member opts in or out, Domino adds a new record and keeps the old ones. The member's current choice on a channel is their latest record. Opting out takes one step, the same as opting in.

A member who was never asked has no record. That is different from opting out: show them the checkbox.

Sending the same choice with the same wording again changes nothing and records nothing.

## See a member's consent [#see-a-members-consent]

In Console, open a member. **Marketing consent** shows their current choice on each channel, the words they saw and when they chose, then every earlier change, newest first. A member who was never asked shows **No consent recorded**.

Your team can only look: nobody but the member can opt them in or out, in Console or through the API. A member import can carry over the consent a member gave on the platform they came from; Console marks it **Imported**, and it never replaces a choice the member made in Domino.

> [!DEV]
> With `read` permission, `management.members.consent(member)` lists the member's current entry per channel, and `management.members.consentHistory(member, { cursor })` pages through every change, newest first, as `{ items, nextCursor }`. From a terminal, `domino members consent MEMBER` prints both; add `--json` for scripts. Both reads are experimental. An unknown member is a 404 `not-found`.

## Who it reaches [#who-it-reaches]

Integrations that send member data to your marketing tools read this record: by default they include only members who opted in, and they subscribe a member in the tool when the member opts in and unsubscribe them when they opt out. [Klaviyo](/docs/build/klaviyo) is the first.

Consent belongs to one [environment](/docs/concepts/environments), like the member it belongs to: a test member's consent never reaches a live tool. Resetting a test member deletes their consent records with the rest of the member.

> [!DEV]
> The signed-in member reads their consent with `relay.consent.get()` and changes it with `relay.consent.set({ channel, granted, wording })`, or with the `useConsent()` React hook. See [record consent from a checkbox](/docs/build/consent).
