# Storage and cookies

> What the ShopAssist widget stores in the shopper's browser, which storage needs consent, and how to list it in your cookie policy.

Source: https://shopassist.coec.dk/docs/compliance/storage-and-cookies · Updated 2026-10-01

The widget uses browser storage only as listed below. Storage that needs consent is written only after your consent banner (CMP) reports the matching category; see [consent and CMP](/docs/widget/consent-and-cmp).

| Key | Storage | Written when | Purpose | Category | Before consent | Lifetime |
| --- | --- | --- | --- | --- | --- | --- |
| `shopassist:session` | sessionStorage | After POST /sessions, i.e. when the shopper opens the chat or accepts a proactive prompt | Continuity of the chat the shopper requested | strictly necessary | Yes | Tab session; token 24 h |
| `shopassist:ui` | sessionStorage | After the first open | UI state | strictly necessary | Yes | Tab session |
| `shopassist:lang` | sessionStorage | Only when the shopper explicitly picks a widget language | User-set UI choice for the tab | strictly necessary | Yes | Tab session |
| `shopassist:lang` | localStorage | Only when the shopper explicitly picks a widget language, while preferences consent = true | Keep the chosen widget language beyond the tab | preferences | No | 12 months from set_at |
| `shopassist:vid` | localStorage | Only while analytics consent = true, at session creation | Returning-visitor analytics, cross-session attribution | analytics | No | 13 months from created_at (not renewed) |
| `shopassist:attr` | localStorage | Only while analytics consent = true, once the conversation had a successful bot cart.* client action or a checkout.clicked | assisted_session attribution window | analytics | No | commerce.attribution_window_days (default 7, max 30) |
| `shopassist:trig` | localStorage | Only while preferences consent = true, when a trigger is shown | Frequency caps of proactive messages across pages | preferences | No | 30 days per entry |
| `shopassist:resume` | localStorage | Only while preferences consent = true and the session's identity level is guest, after POST /sessions | Continue the chat in a new tab | preferences | No | ≤ 24 h (session expiry) |
| `shopassist:dismissed` | sessionStorage | Only when the shopper explicitly dismisses a proactive bubble | User-interface customisation for the session (WP29 Opinion 04/2012 §3.6) | strictly necessary | Yes | Tab session |
| `shopassist:test_link` | sessionStorage | Only when the page URL carries a valid shopassist_preview test-link token (written by the loader) | The staff test of a staff_only widget | strictly necessary | Yes | Tab session; token 15 min |

Copy the table into your cookie policy. The widget sets no third-party cookies and loads no third-party scripts.

## Our own site [#our-site]

`shopassist.coec.dk` loads no third-party scripts and writes nothing to your device on marketing and docs pages, except the docs theme when you change it and the widget keys when you open the demo chat. See the [cookie policy](/legal/cookies).
