@walkeros/cli 4.7.2-next-1791147139360 → 4.7.2

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.
@@ -241,25 +241,25 @@
241
241
  "bundle": {
242
242
  "packages": {
243
243
  "@walkeros/collector": {
244
- "version": "4.7.2-next-1791147139360"
244
+ "version": "4.7.2"
245
245
  },
246
246
  "@walkeros/web-source-cmp-usercentrics": {
247
- "version": "4.7.2-next-1791147139360"
247
+ "version": "4.7.2"
248
248
  },
249
249
  "@walkeros/web-source-session": {
250
- "version": "4.7.2-next-1791147139360"
250
+ "version": "4.7.2"
251
251
  },
252
252
  "@walkeros/web-source-datalayer": {
253
- "version": "4.7.2-next-1791147139360"
253
+ "version": "4.7.2"
254
254
  },
255
255
  "@walkeros/web-source-browser": {
256
- "version": "4.7.2-next-1791147139360"
256
+ "version": "4.7.2"
257
257
  },
258
258
  "@walkeros/web-destination-gtag": {
259
- "version": "4.7.2-next-1791147139360"
259
+ "version": "4.7.2"
260
260
  },
261
261
  "@walkeros/web-destination-api": {
262
- "version": "4.7.2-next-1791147139360"
262
+ "version": "4.7.2"
263
263
  }
264
264
  },
265
265
  "env": {
@@ -277,7 +277,17 @@
277
277
  "custom": {
278
278
  "environment": "$env.ENVIRONMENT"
279
279
  },
280
- "next": "pageGroup"
280
+ "next": [
281
+ {
282
+ "match": {
283
+ "key": "event.user.optout",
284
+ "operator": "eq",
285
+ "value": "true"
286
+ },
287
+ "stop": true
288
+ },
289
+ "pageGroup"
290
+ ]
281
291
  },
282
292
  "sources": {
283
293
  "usercentrics": {
@@ -991,9 +1001,6 @@
991
1001
  ]
992
1002
  }
993
1003
  }
994
- },
995
- "consent": {
996
- "functional": true
997
1004
  }
998
1005
  }
999
1006
  }
@@ -1041,9 +1048,6 @@
1041
1048
  ]
1042
1049
  }
1043
1050
  }
1044
- },
1045
- "consent": {
1046
- "functional": true
1047
1051
  }
1048
1052
  },
1049
1053
  "in": {
@@ -1181,9 +1185,6 @@
1181
1185
  ]
1182
1186
  }
1183
1187
  }
1184
- },
1185
- "consent": {
1186
- "functional": true
1187
1188
  }
1188
1189
  },
1189
1190
  "in": {
@@ -1764,40 +1765,40 @@
1764
1765
  "bundle": {
1765
1766
  "packages": {
1766
1767
  "@walkeros/collector": {
1767
- "version": "4.7.2-next-1791147139360"
1768
+ "version": "4.7.2"
1768
1769
  },
1769
1770
  "@walkeros/server-source-express": {
1770
- "version": "4.7.2-next-1791147139360"
1771
+ "version": "4.7.2"
1771
1772
  },
1772
1773
  "@walkeros/transformer-ga4": {
1773
- "version": "4.7.2-next-1791147139360"
1774
+ "version": "4.7.2"
1774
1775
  },
1775
1776
  "@walkeros/transformer-validate": {
1776
- "version": "4.7.2-next-1791147139360"
1777
+ "version": "4.7.2"
1777
1778
  },
1778
1779
  "@walkeros/server-transformer-bot": {
1779
- "version": "4.7.2-next-1791147139360"
1780
+ "version": "4.7.2"
1780
1781
  },
1781
1782
  "@walkeros/server-transformer-fingerprint": {
1782
- "version": "4.7.2-next-1791147139360"
1783
+ "version": "4.7.2"
1783
1784
  },
1784
1785
  "@walkeros/server-transformer-file": {
1785
- "version": "4.7.2-next-1791147139360"
1786
+ "version": "4.7.2"
1786
1787
  },
1787
1788
  "@walkeros/server-store-fs": {
1788
- "version": "4.7.2-next-1791147139360"
1789
+ "version": "4.7.2"
1789
1790
  },
1790
1791
  "@walkeros/server-destination-gcp": {
1791
- "version": "4.7.2-next-1791147139360"
1792
+ "version": "4.7.2"
1792
1793
  },
1793
1794
  "@walkeros/server-destination-meta": {
1794
- "version": "4.7.2-next-1791147139360"
1795
+ "version": "4.7.2"
1795
1796
  },
1796
1797
  "@walkeros/server-destination-piwikpro": {
1797
- "version": "4.7.2-next-1791147139360"
1798
+ "version": "4.7.2"
1798
1799
  },
1799
1800
  "@walkeros/server-destination-datamanager": {
1800
- "version": "4.7.2-next-1791147139360"
1801
+ "version": "4.7.2"
1801
1802
  }
1802
1803
  }
1803
1804
  }
@@ -1932,7 +1933,17 @@
1932
1933
  }
1933
1934
  ]
1934
1935
  },
1935
- "next": "dedup",
1936
+ "next": [
1937
+ {
1938
+ "match": {
1939
+ "key": "event.user.optout",
1940
+ "operator": "eq",
1941
+ "value": "true"
1942
+ },
1943
+ "stop": true
1944
+ },
1945
+ "dedup"
1946
+ ],
1936
1947
  "examples": {
1937
1948
  "postCollect": {
1938
1949
  "title": "Event from the web flow",
@@ -4499,7 +4510,10 @@
4499
4510
  "event.user.device",
4500
4511
  "event.user.session",
4501
4512
  "event.user.hash"
4502
- ]
4513
+ ],
4514
+ "customDimensions": {
4515
+ "1": "user.segment"
4516
+ }
4503
4517
  },
4504
4518
  "mapping": {
4505
4519
  "page": {
@@ -4594,7 +4608,7 @@
4594
4608
  "examples": {
4595
4609
  "orderWithGoal": {
4596
4610
  "title": "Order with goal",
4597
- "description": "order complete becomes an ecommerce order plus a goal hit with the order value; the visitor id falls back to the cookieless hash.",
4611
+ "description": "order complete becomes an ecommerce order plus a goal hit with the order value; the visitor id falls back to the cookieless hash, and both hits carry the customer segment as custom dimension 1.",
4598
4612
  "public": true,
4599
4613
  "mapping": {
4600
4614
  "name": "ecommerceOrder",
@@ -4658,7 +4672,8 @@
4658
4672
  "hash": "5f1c0a9e7d3b2c41",
4659
4673
  "botScore": 0,
4660
4674
  "botCategory": "human",
4661
- "ltv": 420
4675
+ "ltv": 420,
4676
+ "segment": "loyal"
4662
4677
  },
4663
4678
  "source": {
4664
4679
  "type": "express",
@@ -4691,7 +4706,7 @@
4691
4706
  [
4692
4707
  "sendServer",
4693
4708
  "https://example.piwik.pro/ppms.php",
4694
- "{\"requests\":[\"?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&e_t=order&ec_id=ORD-100&revenue=149.8&ec_products=%5B%5B%22SKU-1%22%2C%22Trail+Runner%22%2Cnull%2C129.9%2C1%2Cnull%2Cnull%2Cnull%5D%2C%5B%22SKU-2%22%2C%22Running+Socks%22%2Cnull%2C9.95%2C2%2Cnull%2Cnull%2Cnull%5D%5D&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000\",\"?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&idgoal=6a0f4c1e-3b2d-4e8f-a7c9-1d2e3f4a5b6c&revenue=149.8&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000\"]}",
4709
+ "{\"requests\":[\"?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&e_t=order&ec_id=ORD-100&revenue=149.8&ec_products=%5B%5B%22SKU-1%22%2C%22Trail+Runner%22%2Cnull%2C129.9%2C1%2Cnull%2Cnull%2Cnull%5D%2C%5B%22SKU-2%22%2C%22Running+Socks%22%2Cnull%2C9.95%2C2%2Cnull%2Cnull%2Cnull%5D%5D&dimension1=loyal&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000\",\"?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&idgoal=6a0f4c1e-3b2d-4e8f-a7c9-1d2e3f4a5b6c&revenue=149.8&dimension1=loyal&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000\"]}",
4695
4710
  {
4696
4711
  "timeout": 5000
4697
4712
  }
@@ -4858,13 +4873,13 @@
4858
4873
  "bundle": {
4859
4874
  "packages": {
4860
4875
  "@walkeros/collector": {
4861
- "version": "4.7.2-next-1791147139360"
4876
+ "version": "4.7.2"
4862
4877
  },
4863
4878
  "@walkeros/server-source-gcp": {
4864
- "version": "4.7.2-next-1791147139360"
4879
+ "version": "4.7.2"
4865
4880
  },
4866
4881
  "@walkeros/server-destination-gcp": {
4867
- "version": "4.7.2-next-1791147139360"
4882
+ "version": "4.7.2"
4868
4883
  }
4869
4884
  }
4870
4885
  }
@@ -36,12 +36,12 @@ export GCP_SA="$(node -e "const { generateKeyPairSync } = require('crypto'); con
36
36
 
37
37
  ```text
38
38
  web usercentrics, session, dataLayer, browser
39
- -> collector.next: pageGroup
39
+ -> collector.next: opt-out stop, pageGroup
40
40
  -> ga4 (to Google, main property) gtm (dataLayer) collect (to server)
41
41
 
42
42
  server express /collect /g/collect /walker.js
43
43
  before: one [ G-SUBSITE hit -> ga4Decode -> ga4Consent | *.js -> file (stop) | other /g/collect (stop) ]
44
- next: dedup
44
+ next: opt-out stop, dedup
45
45
  -> collector.next: fingerprint, bot, not impression -> enrich [ loadUser, sessionSave, sessionLoad, validate ]
46
46
  -> pubsub (every event, email pseudonymized)
47
47
  -> meta, piwikpro, datamanager (each behind eventFilter)
@@ -365,10 +365,10 @@ walkeros push packages/cli/examples/flow-complete.json -f web -e '{"name":"order
365
365
  refused pings stay functional false and fail the contract.
366
366
  - `destination-consent` at `/flows/server/destinations/meta/config/consent`:
367
367
  Destination consent: Meta only gets events with marketing consent.
368
- - `rule-consent` at
369
- `/flows/web/destinations/ga4/config/mapping/order/complete/consent`: Rule
370
- consent on purchases: not enforced yet; the destination's functional consent
371
- gates them. Marketing consent belongs to Meta and Data Manager.
368
+ - `user-optout` at `/flows/server/sources/express/next/0`: An opted-out user
369
+ (user.optout true) is stopped first: on the server before dedup, so no dedup
370
+ entry, hash or delivery; on the web first in collector.next, so the browser
371
+ sends nothing.
372
372
  - `value-consent` at
373
373
  `/flows/web/destinations/collect/config/policy/user.email/consent`: Field
374
374
  consent: the email is only kept with marketing consent.
@@ -397,6 +397,12 @@ walkeros push packages/cli/examples/flow-complete.json -f web -e '{"name":"order
397
397
  - **Consent keys:** there are no collector consent defaults, only granted keys
398
398
  travel. `consent.functional` is set only by Usercentrics with `explicitOnly`,
399
399
  so its presence means the user decided.
400
+ - **Opt-out beats consent:** the site sets the flag before the first event. With
401
+ `elbLayer.push(['walker user', { optout: true }])` before walker.js loads, the
402
+ browser sends nothing. `data-elbuser="optout:true"` holds back the page view
403
+ and every later event, but events queued in `elbLayer` before walker.js loads
404
+ are still sent. An opted-out event that reaches the server from another client
405
+ stops before dedup.
400
406
  - **Meta hashes `user_data` itself:** `em` is the raw email; the Meta package
401
407
  normalizes and hashes it before sending, the flow never builds a hash for
402
408
  Meta.
@@ -514,7 +520,8 @@ runneros start dist/server.mjs -p 8080 --env-file .env
514
520
  per destination (London prompt 3).
515
521
  - **Features:**
516
522
  - `web-collector-next` at `/flows/web/collector/next`: On the web
517
- collector.next runs the inline pageGroup step once per event.
523
+ collector.next stops an opted-out user first, then runs the inline pageGroup
524
+ step once per event.
518
525
  - `ga4-other-dropped` at `/flows/server/sources/express/before/one/2`: GA4
519
526
  hits for any other property stop at the route instead of reaching the
520
527
  collector undecoded.
@@ -533,7 +540,7 @@ runneros start dist/server.mjs -p 8080 --env-file .env
533
540
  - `op-suffix` at `/flows/server/sources/express/before/one/1/match/operator`:
534
541
  suffix matches the end of a value: script requests end in .js.
535
542
  - `source-next` at `/flows/server/sources/express/next`: source.next names the
536
- hop after the source, here dedup.
543
+ hops after the source: the opt-out stop, then dedup.
537
544
  - `collector-next` at `/flows/server/collector/next`: collector.next runs once
538
545
  per event before the fan-out: fingerprint and bot for all, enrich for all
539
546
  but impressions.
@@ -713,6 +720,10 @@ walkeros push packages/cli/examples/flow-complete.json -f server -e '{"name":"pa
713
720
  mapping picks fields from the stored row and merges them into the target.
714
721
  - `load-user` at `/flows/server/transformers/loadUser`: loadUser puts the
715
722
  customer lifetime value and segment on logged-in events.
723
+ - `piwik-segment` at
724
+ `/flows/server/destinations/piwikpro/config/settings/customDimensions`:
725
+ Piwik PRO gets the loaded segment as custom dimension 1; the path is
726
+ relative to the event, so user.segment.
716
727
  - `store-fs` at `/flows/server/stores/assets`: An fs store serves files from a
717
728
  folder.
718
729
  - `store-file` at `/flows/server/stores/assets/config/file`: file: true
@@ -753,13 +753,16 @@ declare const teaching: {
753
753
  note: string;
754
754
  docs: never[];
755
755
  };
756
- 'rule-consent': {
756
+ 'user-optout': {
757
757
  pointer: string;
758
758
  chapter: "consent-privacy";
759
- level: "intermediate";
760
- useCases: "consent"[];
759
+ level: "beginner";
760
+ useCases: ("consent" | "privacy-analytics")[];
761
761
  note: string;
762
- docs: never[];
762
+ docs: {
763
+ page: string;
764
+ anchor: string;
765
+ }[];
763
766
  };
764
767
  'value-consent': {
765
768
  pointer: string;
@@ -1638,6 +1641,18 @@ declare const teaching: {
1638
1641
  name: string;
1639
1642
  };
1640
1643
  };
1644
+ 'piwik-segment': {
1645
+ pointer: string;
1646
+ chapter: "state-stores";
1647
+ level: "intermediate";
1648
+ useCases: "privacy-analytics"[];
1649
+ note: string;
1650
+ docs: never[];
1651
+ example: {
1652
+ step: string;
1653
+ name: string;
1654
+ };
1655
+ };
1641
1656
  'store-fs': {
1642
1657
  pointer: string;
1643
1658
  chapter: "state-stores";
@@ -2204,7 +2219,9 @@ declare const flowCompleteCoverage: {
2204
2219
  mappingRule: {
2205
2220
  batch: "rule-batch";
2206
2221
  condition: "rule-condition";
2207
- consent: "rule-consent";
2222
+ consent: {
2223
+ excluded: string;
2224
+ };
2208
2225
  settings: "rule-settings";
2209
2226
  data: "rule-data";
2210
2227
  include: {
@@ -2284,7 +2301,7 @@ declare const flowCompleteCoverage: {
2284
2301
  excluded: string;
2285
2302
  };
2286
2303
  sequence: "route-sequence";
2287
- id: "source-next";
2304
+ id: "destination-before";
2288
2305
  };
2289
2306
  combinator: {
2290
2307
  and: "match-and";
@@ -2577,7 +2594,9 @@ declare const flowCompleteManifest: {
2577
2594
  mappingRule: {
2578
2595
  batch: "rule-batch";
2579
2596
  condition: "rule-condition";
2580
- consent: "rule-consent";
2597
+ consent: {
2598
+ excluded: string;
2599
+ };
2581
2600
  settings: "rule-settings";
2582
2601
  data: "rule-data";
2583
2602
  include: {
@@ -2657,7 +2676,7 @@ declare const flowCompleteManifest: {
2657
2676
  excluded: string;
2658
2677
  };
2659
2678
  sequence: "route-sequence";
2660
- id: "source-next";
2679
+ id: "destination-before";
2661
2680
  };
2662
2681
  combinator: {
2663
2682
  and: "match-and";
@@ -264,25 +264,25 @@ var flow_complete_default = {
264
264
  bundle: {
265
265
  packages: {
266
266
  "@walkeros/collector": {
267
- version: "4.7.2-next-1791147139360"
267
+ version: "4.7.2"
268
268
  },
269
269
  "@walkeros/web-source-cmp-usercentrics": {
270
- version: "4.7.2-next-1791147139360"
270
+ version: "4.7.2"
271
271
  },
272
272
  "@walkeros/web-source-session": {
273
- version: "4.7.2-next-1791147139360"
273
+ version: "4.7.2"
274
274
  },
275
275
  "@walkeros/web-source-datalayer": {
276
- version: "4.7.2-next-1791147139360"
276
+ version: "4.7.2"
277
277
  },
278
278
  "@walkeros/web-source-browser": {
279
- version: "4.7.2-next-1791147139360"
279
+ version: "4.7.2"
280
280
  },
281
281
  "@walkeros/web-destination-gtag": {
282
- version: "4.7.2-next-1791147139360"
282
+ version: "4.7.2"
283
283
  },
284
284
  "@walkeros/web-destination-api": {
285
- version: "4.7.2-next-1791147139360"
285
+ version: "4.7.2"
286
286
  }
287
287
  },
288
288
  env: {
@@ -300,7 +300,17 @@ var flow_complete_default = {
300
300
  custom: {
301
301
  environment: "$env.ENVIRONMENT"
302
302
  },
303
- next: "pageGroup"
303
+ next: [
304
+ {
305
+ match: {
306
+ key: "event.user.optout",
307
+ operator: "eq",
308
+ value: "true"
309
+ },
310
+ stop: true
311
+ },
312
+ "pageGroup"
313
+ ]
304
314
  },
305
315
  sources: {
306
316
  usercentrics: {
@@ -1014,9 +1024,6 @@ var flow_complete_default = {
1014
1024
  ]
1015
1025
  }
1016
1026
  }
1017
- },
1018
- consent: {
1019
- functional: true
1020
1027
  }
1021
1028
  }
1022
1029
  }
@@ -1064,9 +1071,6 @@ var flow_complete_default = {
1064
1071
  ]
1065
1072
  }
1066
1073
  }
1067
- },
1068
- consent: {
1069
- functional: true
1070
1074
  }
1071
1075
  },
1072
1076
  in: {
@@ -1204,9 +1208,6 @@ var flow_complete_default = {
1204
1208
  ]
1205
1209
  }
1206
1210
  }
1207
- },
1208
- consent: {
1209
- functional: true
1210
1211
  }
1211
1212
  },
1212
1213
  in: {
@@ -1787,40 +1788,40 @@ var flow_complete_default = {
1787
1788
  bundle: {
1788
1789
  packages: {
1789
1790
  "@walkeros/collector": {
1790
- version: "4.7.2-next-1791147139360"
1791
+ version: "4.7.2"
1791
1792
  },
1792
1793
  "@walkeros/server-source-express": {
1793
- version: "4.7.2-next-1791147139360"
1794
+ version: "4.7.2"
1794
1795
  },
1795
1796
  "@walkeros/transformer-ga4": {
1796
- version: "4.7.2-next-1791147139360"
1797
+ version: "4.7.2"
1797
1798
  },
1798
1799
  "@walkeros/transformer-validate": {
1799
- version: "4.7.2-next-1791147139360"
1800
+ version: "4.7.2"
1800
1801
  },
1801
1802
  "@walkeros/server-transformer-bot": {
1802
- version: "4.7.2-next-1791147139360"
1803
+ version: "4.7.2"
1803
1804
  },
1804
1805
  "@walkeros/server-transformer-fingerprint": {
1805
- version: "4.7.2-next-1791147139360"
1806
+ version: "4.7.2"
1806
1807
  },
1807
1808
  "@walkeros/server-transformer-file": {
1808
- version: "4.7.2-next-1791147139360"
1809
+ version: "4.7.2"
1809
1810
  },
1810
1811
  "@walkeros/server-store-fs": {
1811
- version: "4.7.2-next-1791147139360"
1812
+ version: "4.7.2"
1812
1813
  },
1813
1814
  "@walkeros/server-destination-gcp": {
1814
- version: "4.7.2-next-1791147139360"
1815
+ version: "4.7.2"
1815
1816
  },
1816
1817
  "@walkeros/server-destination-meta": {
1817
- version: "4.7.2-next-1791147139360"
1818
+ version: "4.7.2"
1818
1819
  },
1819
1820
  "@walkeros/server-destination-piwikpro": {
1820
- version: "4.7.2-next-1791147139360"
1821
+ version: "4.7.2"
1821
1822
  },
1822
1823
  "@walkeros/server-destination-datamanager": {
1823
- version: "4.7.2-next-1791147139360"
1824
+ version: "4.7.2"
1824
1825
  }
1825
1826
  }
1826
1827
  }
@@ -1955,7 +1956,17 @@ var flow_complete_default = {
1955
1956
  }
1956
1957
  ]
1957
1958
  },
1958
- next: "dedup",
1959
+ next: [
1960
+ {
1961
+ match: {
1962
+ key: "event.user.optout",
1963
+ operator: "eq",
1964
+ value: "true"
1965
+ },
1966
+ stop: true
1967
+ },
1968
+ "dedup"
1969
+ ],
1959
1970
  examples: {
1960
1971
  postCollect: {
1961
1972
  title: "Event from the web flow",
@@ -4522,7 +4533,10 @@ var flow_complete_default = {
4522
4533
  "event.user.device",
4523
4534
  "event.user.session",
4524
4535
  "event.user.hash"
4525
- ]
4536
+ ],
4537
+ customDimensions: {
4538
+ "1": "user.segment"
4539
+ }
4526
4540
  },
4527
4541
  mapping: {
4528
4542
  page: {
@@ -4617,7 +4631,7 @@ var flow_complete_default = {
4617
4631
  examples: {
4618
4632
  orderWithGoal: {
4619
4633
  title: "Order with goal",
4620
- description: "order complete becomes an ecommerce order plus a goal hit with the order value; the visitor id falls back to the cookieless hash.",
4634
+ description: "order complete becomes an ecommerce order plus a goal hit with the order value; the visitor id falls back to the cookieless hash, and both hits carry the customer segment as custom dimension 1.",
4621
4635
  public: true,
4622
4636
  mapping: {
4623
4637
  name: "ecommerceOrder",
@@ -4681,7 +4695,8 @@ var flow_complete_default = {
4681
4695
  hash: "5f1c0a9e7d3b2c41",
4682
4696
  botScore: 0,
4683
4697
  botCategory: "human",
4684
- ltv: 420
4698
+ ltv: 420,
4699
+ segment: "loyal"
4685
4700
  },
4686
4701
  source: {
4687
4702
  type: "express",
@@ -4714,7 +4729,7 @@ var flow_complete_default = {
4714
4729
  [
4715
4730
  "sendServer",
4716
4731
  "https://example.piwik.pro/ppms.php",
4717
- '{"requests":["?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&e_t=order&ec_id=ORD-100&revenue=149.8&ec_products=%5B%5B%22SKU-1%22%2C%22Trail+Runner%22%2Cnull%2C129.9%2C1%2Cnull%2Cnull%2Cnull%5D%2C%5B%22SKU-2%22%2C%22Running+Socks%22%2Cnull%2C9.95%2C2%2Cnull%2Cnull%2Cnull%5D%5D&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000","?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&idgoal=6a0f4c1e-3b2d-4e8f-a7c9-1d2e3f4a5b6c&revenue=149.8&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000"]}',
4732
+ '{"requests":["?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&e_t=order&ec_id=ORD-100&revenue=149.8&ec_products=%5B%5B%22SKU-1%22%2C%22Trail+Runner%22%2Cnull%2C129.9%2C1%2Cnull%2Cnull%2Cnull%5D%2C%5B%22SKU-2%22%2C%22Running+Socks%22%2Cnull%2C9.95%2C2%2Cnull%2Cnull%2Cnull%5D%5D&dimension1=loyal&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000","?idsite=e8f3a1c2-0b4d-4e5f-9a6b-7c8d9e0f1a2b&rec=1&send_image=0&ts_n=walkerOS&ts_v=4.6.1&idgoal=6a0f4c1e-3b2d-4e8f-a7c9-1d2e3f4a5b6c&revenue=149.8&dimension1=loyal&url=https%3A%2F%2Fwww.example.com%2Fcheckout%2Fthanks&cip=203.0.113.42&ua=Mozilla%2F5.0+%28Macintosh%3B+Intel+Mac+OS+X+10_15_7%29+AppleWebKit%2F537.36+%28KHTML%2C+like+Gecko%29+Chrome%2F128.0.0.0+Safari%2F537.36&_id=174c88fbd5a4b357&uid=cust-42&cdt=1700000000"]}',
4718
4733
  {
4719
4734
  timeout: 5e3
4720
4735
  }
@@ -4881,13 +4896,13 @@ var flow_complete_default = {
4881
4896
  bundle: {
4882
4897
  packages: {
4883
4898
  "@walkeros/collector": {
4884
- version: "4.7.2-next-1791147139360"
4899
+ version: "4.7.2"
4885
4900
  },
4886
4901
  "@walkeros/server-source-gcp": {
4887
- version: "4.7.2-next-1791147139360"
4902
+ version: "4.7.2"
4888
4903
  },
4889
4904
  "@walkeros/server-destination-gcp": {
4890
- version: "4.7.2-next-1791147139360"
4905
+ version: "4.7.2"
4891
4906
  }
4892
4907
  }
4893
4908
  }
@@ -5381,7 +5396,7 @@ var teaching = {
5381
5396
  chapter: "chains-routing",
5382
5397
  level: "intermediate",
5383
5398
  useCases: [],
5384
- note: "On the web collector.next runs the inline pageGroup step once per event.",
5399
+ note: "On the web collector.next stops an opted-out user first, then runs the inline pageGroup step once per event.",
5385
5400
  docs: [{ page: "getting-started/flow/routing" }],
5386
5401
  example: { step: "pageGroup", name: "checkout" }
5387
5402
  },
@@ -5788,13 +5803,13 @@ var teaching = {
5788
5803
  note: "Destination consent: Meta only gets events with marketing consent.",
5789
5804
  docs: []
5790
5805
  },
5791
- "rule-consent": {
5792
- pointer: "/flows/web/destinations/ga4/config/mapping/order/complete/consent",
5806
+ "user-optout": {
5807
+ pointer: "/flows/server/sources/express/next/0",
5793
5808
  chapter: "consent-privacy",
5794
- level: "intermediate",
5795
- useCases: ["consent"],
5796
- note: "Rule consent on purchases: not enforced yet; the destination's functional consent gates them. Marketing consent belongs to Meta and Data Manager.",
5797
- docs: []
5809
+ level: "beginner",
5810
+ useCases: ["consent", "privacy-analytics"],
5811
+ note: "An opted-out user (user.optout true) is stopped first: on the server before dedup, so no dedup entry, hash or delivery; on the web first in collector.next, so the browser sends nothing.",
5812
+ docs: [{ page: "guides/consent/index", anchor: "opt-out" }]
5798
5813
  },
5799
5814
  "value-consent": {
5800
5815
  pointer: "/flows/web/destinations/collect/config/policy/user.email/consent",
@@ -6092,7 +6107,7 @@ var teaching = {
6092
6107
  chapter: "chains-routing",
6093
6108
  level: "beginner",
6094
6109
  useCases: [],
6095
- note: "source.next names the hop after the source, here dedup.",
6110
+ note: "source.next names the hops after the source: the opt-out stop, then dedup.",
6096
6111
  docs: [{ page: "getting-started/flow/routing" }]
6097
6112
  },
6098
6113
  "collector-next": {
@@ -6492,6 +6507,15 @@ var teaching = {
6492
6507
  docs: [{ page: "collector/state" }],
6493
6508
  example: { step: "loadUser", name: "knownCustomer" }
6494
6509
  },
6510
+ "piwik-segment": {
6511
+ pointer: "/flows/server/destinations/piwikpro/config/settings/customDimensions",
6512
+ chapter: "state-stores",
6513
+ level: "intermediate",
6514
+ useCases: ["privacy-analytics"],
6515
+ note: "Piwik PRO gets the loaded segment as custom dimension 1; the path is relative to the event, so user.segment.",
6516
+ docs: [],
6517
+ example: { step: "piwikpro", name: "orderWithGoal" }
6518
+ },
6495
6519
  "store-fs": {
6496
6520
  pointer: "/flows/server/stores/assets",
6497
6521
  chapter: "state-stores",
@@ -7031,7 +7055,9 @@ var flowCompleteCoverage = {
7031
7055
  mappingRule: {
7032
7056
  batch: "rule-batch",
7033
7057
  condition: "rule-condition",
7034
- consent: "rule-consent",
7058
+ consent: {
7059
+ excluded: "rule consent is not enforced yet; destination consent is the gate in this file"
7060
+ },
7035
7061
  settings: "rule-settings",
7036
7062
  data: "rule-data",
7037
7063
  include: {
@@ -7101,7 +7127,7 @@ var flowCompleteCoverage = {
7101
7127
  stop: "route-stop",
7102
7128
  gate: { excluded: ROUTE_CASES },
7103
7129
  sequence: "route-sequence",
7104
- id: "source-next"
7130
+ id: "destination-before"
7105
7131
  },
7106
7132
  combinator: {
7107
7133
  and: "match-and",