@shware/analytics 10.2.0 → 10.2.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (2) hide show
  1. package/README.md +47 -13
  2. package/package.json +1 -1
package/README.md CHANGED
@@ -137,19 +137,23 @@ views), **the session's own touch included**:
137
137
  | `overridden` | The session had a touch of its own, but an earlier, stronger one won |
138
138
  | `none` | A direct session with no touch in the window |
139
139
 
140
- | # | What happened | The current session is credited to | `touch_kind` | Why |
141
- | --- | ---------------------------------------------------------------------------------- | ---------------------------------- | ------------ | ----------------------------------- |
142
- | 1 | Day 1 a Meta ad click, day 2 a branded Google search | **Meta** | `overridden` | 1 beats 2 |
143
- | 2 | Day 1 a Meta ad click, day 2 typed in | **Meta** | `inherited` | direct inherits |
144
- | 3 | Day 1 an organic search, day 2 a Meta ad click | **Meta** | `own` | its own touch is stronger |
145
- | 4 | Day 1 a Meta ad click, day 3 a Google ad click | **Google** | `own` | both 1, the latest wins |
146
- | 5 | Day 1 a Meta ad click, day 2 a ChatGPT citation with its utm | **Meta** | `overridden` | ChatGPT's organic utm ranks 2 |
147
- | 6 | Day 1 an organic search, day 5 a ChatGPT citation | **ChatGPT** | `own` | both 2, the latest wins |
148
- | 7 | An ad click 45 days ago, an organic search today | **Organic search** | `own` | the ad is out of the window |
149
- | 8 | A Reddit ad tagged `utm_medium=social` with `rdt_cid` | **reddit / cpc** | `own` | the click id proves a paid click |
150
- | 9 | Day 1 a Meta ad click, day 2 a newsletter link (`utm_medium=email`) | **Meta** | `overridden` | email ranks 2 |
151
- | 10 | Day 1 an organic search, day 2 a newsletter link, no ad in the window | **Email** | `own` | both 2, the latest wins |
152
- | 11 | A survey answer "a podcast" (backdated to the first visit), then an organic search | **Organic search** | `own` | 2 beats 3; a claim only fills a gap |
140
+ | # | What happened | The current session is credited to | `touch_kind` | Why |
141
+ | --- | ---------------------------------------------------------------------------------- | ---------------------------------- | -------------------- | ----------------------------------- |
142
+ | 1 | Day 1 a Meta ad click, day 2 a branded Google search | **Meta** | `overridden` | 1 beats 2 |
143
+ | 2 | Day 1 a Meta ad click, day 2 typed in | **Meta** | `inherited` | direct inherits |
144
+ | 3 | Day 1 an organic search, day 2 a Meta ad click | **Meta** | `own` | its own touch is stronger |
145
+ | 4 | Day 1 a Meta ad click, day 3 a Google ad click | **Google** | `own` | both 1, the latest wins |
146
+ | 5 | Day 1 a Meta ad click, day 2 a ChatGPT citation with its utm | **Meta** | `overridden` | ChatGPT's organic utm ranks 2 |
147
+ | 6 | Day 1 an organic search, day 5 a ChatGPT citation | **ChatGPT** | `own` | both 2, the latest wins |
148
+ | 7 | An ad click 45 days ago, an organic search today | **Organic search** | `own` | the ad is out of the window |
149
+ | 8 | A Reddit ad tagged `utm_medium=social` with `rdt_cid` | **reddit / cpc** | `own` | the click id proves a paid click |
150
+ | 9 | Day 1 a Meta ad click, day 2 a newsletter link (`utm_medium=email`) | **Meta** | `overridden` | email ranks 2 |
151
+ | 10 | Day 1 an organic search, day 2 a newsletter link, no ad in the window | **Email** | `own` | both 2, the latest wins |
152
+ | 11 | A survey answer "a podcast" (backdated to the first visit), then an organic search | **Organic search** | `own` | 2 beats 3; a claim only fills a gap |
153
+ | 12 | Day 1 a ChatGPT citation, day 2 a branded Google search | **Organic search** | `own` | both 2, the latest wins |
154
+ | 13 | Day 1 a ChatGPT citation, day 2 a ChatGPT ad click (`oppref`) | **chatgpt / cpc** | `own` | the ad is 1 |
155
+ | 14 | Day 1 a Meta ad click, day 2 a ChatGPT citation, day 3 typed in | **Meta** | `inherited` | 1 beats the citation's 2 |
156
+ | 15 | The ChatGPT app opens a link with neither referrer nor utm | **Direct**, or what came before | `none` / `inherited` | nothing to read |
153
157
 
154
158
  **How this differs from GA4.** GA4's last non-direct click credits the latest touch that is not
155
159
  direct, whatever it was: cases 1, 5 and 9 go to the search, ChatGPT and the email. Here an ad click is not
@@ -185,6 +189,36 @@ report instead of the model:
185
189
  Special cases in the model ("an ad clicked by a paying customer does not override") are not
186
190
  worth it: the rules get harder to explain, and the first two rows remain.
187
191
 
192
+ ### AI assistants (GEO)
193
+
194
+ Visits an AI assistant sends — a citation in ChatGPT, Perplexity, Gemini, Claude, Copilot,
195
+ DeepSeek and the others in `REFERRER_SITES` — are `organic_ai`, read from the referrer or from the
196
+ assistant's own utm (`utm_source=chatgpt.com`). They rank with organic search, priority 2, on
197
+ purpose: both are earned, not bought, and come from a question the user asked.
198
+
199
+ - **Not above SEO**: a citation would otherwise take the credit from the ad clicked before it, and
200
+ from the search that followed it.
201
+ - **Not below SEO**: "ask ChatGPT, then search the brand" would then always go to the search, and
202
+ GEO would read lower than it is.
203
+ - **Apart from ChatGPT's ads**: a click on a ChatGPT ad carries `oppref` and is paid, priority 1
204
+ (`paid_other`); the citations next to it stay `organic_ai`.
205
+
206
+ GA4's default grouping has no AI group and files these visits under Referral; `organic_ai` is an
207
+ addition so GEO and SEO can be compared side by side.
208
+
209
+ What the data cannot show, and how to read around it:
210
+
211
+ 1. **Dark AI traffic.** The assistants' desktop and mobile apps, and links copied into a browser,
212
+ often arrive with neither referrer nor utm, and are counted as direct (case 15). GEO is always
213
+ undercounted.
214
+ 2. **Discovery credited to search.** Someone who learns the brand from an assistant and searches
215
+ it the next day is credited to the search (case 12), as in every last-touch model.
216
+ 3. **Read GEO by first touch** (`user_attribution` in the reference views), where the assistant
217
+ that introduced the brand keeps the credit, and **ask**: a sign-up survey ("where did you hear
218
+ about us?" with the assistants as options) stored as a reported touch (`survey`, priority 3)
219
+ never overrides a tracked touch, but measures how much of the direct traffic the assistants
220
+ brought.
221
+
188
222
  ### Compared with other tools
189
223
 
190
224
  How other tools credit a visit, as far as their documented defaults go (they change often; check
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@shware/analytics",
3
- "version": "10.2.0",
3
+ "version": "10.2.1",
4
4
  "private": false,
5
5
  "repository": {
6
6
  "type": "git",