@metarouter/ajs-starter-kit 1.0.176 → 1.0.178

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.
@@ -0,0 +1 @@
1
+ "a757d6e0a9ca764abf154aa49b60ba34 -"
@@ -0,0 +1,75 @@
1
+ {
2
+ "params": [
3
+ {
4
+ "name": "PROJECT_NUMBER",
5
+ "exampleValue": "my-project-number"
6
+ },
7
+ {
8
+ "name": "LOCATION",
9
+ "defaultValue": "global"
10
+ },
11
+ {
12
+ "name": "COLLECTION_ID",
13
+ "defaultValue": "my-collection-id"
14
+ },
15
+ {
16
+ "name": "DATA_STORE_ID",
17
+ "exampleValue": "my-data-store-id"
18
+ },
19
+ {
20
+ "name": "SERVICE_ACCOUNT_EMAIL",
21
+ "exampleValue": "my-service-account-email"
22
+ },
23
+ {
24
+ "name": "PRIVATE_KEY",
25
+ "exampleValue": "my-private-key"
26
+ }
27
+ ],
28
+ "default": {
29
+ "endpoint": "https://discoveryengine.googleapis.com/v1/projects/$$PROJECT_NUMBER$$/locations/$$LOCATION$$/collections/$$COLLECTION_ID$$/dataStores/$$DATA_STORE_ID$$/userEvents:write",
30
+ "method": "POST",
31
+ "headers": [
32
+ {
33
+ "key": "Accept-Encoding",
34
+ "value": "application/json"
35
+ },
36
+ {
37
+ "key": "Content-Type",
38
+ "value": "application/json"
39
+ }
40
+ ],
41
+ "oauth2Auth": {
42
+ "request": {
43
+ "url": "https://oauth2.googleapis.com/token",
44
+ "contentType": "application/x-www-form-urlencoded",
45
+ "method": "POST",
46
+ "body": [
47
+ {
48
+ "key": "grant_type",
49
+ "value": "urn:ietf:params:oauth:grant-type:jwt-bearer"
50
+ }
51
+ ]
52
+ },
53
+ "responseAccessTokenKey": "access_token",
54
+ "jwt": {
55
+ "claims": [
56
+ {
57
+ "key": "aud",
58
+ "value": "https://oauth2.googleapis.com/token"
59
+ },
60
+ {
61
+ "key": "scope",
62
+ "value": "https://www.googleapis.com/auth/discoveryengine.readwrite"
63
+ },
64
+ {
65
+ "key": "iss",
66
+ "value": "$$SERVICE_ACCOUNT_EMAIL$$"
67
+ }
68
+ ],
69
+ "signingMethod": "SIGNING_METHOD_RS256",
70
+ "rsaPemKey": "$$PRIVATE_KEY$$",
71
+ "requestKey": "assertion"
72
+ }
73
+ }
74
+ }
75
+ }
@@ -0,0 +1 @@
1
+ "245901342e78b9c79d93f208175ad35d -"
@@ -0,0 +1,21 @@
1
+ {
2
+ "isDraft": false,
3
+ "isDeprecated": false,
4
+ "isBeta": true,
5
+ "friendlyName": "Agent Search",
6
+ "description": "Server-side delivery of user events to Google Agent Search to power AI search ranking and recommendations.",
7
+ "logo": "https://cdn.metarouter.io/google-agent-search.png",
8
+ "color": "#4285F4",
9
+ "eventSource": {
10
+ "isAndroidApp": false,
11
+ "isIosApp": false,
12
+ "isWebApp": true
13
+ },
14
+ "inputSchema": "analytics_js",
15
+ "releaseNotes": [
16
+ {
17
+ "date": "2026-07-22T00:00:00.000Z",
18
+ "note": "Version: 0.1.0\nBeta Version\nAgent Search initial release"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1 @@
1
+ "9101ebd2e9ebf91d135760e3752cde12 -"
@@ -0,0 +1,143 @@
1
+ {
2
+ "version": "0.1.0",
3
+ "global": {
4
+ "mappings": [
5
+ {
6
+ "inputKey": "anonymousId",
7
+ "outputKey": "userPseudoId"
8
+ },
9
+ {
10
+ "inputKey": "timestamp",
11
+ "outputKey": "eventTime"
12
+ },
13
+ {
14
+ "inputKey": "context.userAgent",
15
+ "outputKey": "userInfo.userAgent"
16
+ },
17
+ {
18
+ "inputKey": "context.page.url",
19
+ "outputKey": "pageInfo.uri"
20
+ },
21
+ {
22
+ "inputKey": "context.page.referrer",
23
+ "outputKey": "pageInfo.referrerUri"
24
+ }
25
+ ]
26
+ },
27
+ "default": {
28
+ "filters": [
29
+ {
30
+ "byEventNames": {
31
+ "action": "allow",
32
+ "events": [
33
+ ""
34
+ ]
35
+ }
36
+ }
37
+ ]
38
+ },
39
+ "eventSpecific": {
40
+ "products_searched": {
41
+ "enrichments": [
42
+ {
43
+ "staticString": "search",
44
+ "outputKey": "eventType"
45
+ }
46
+ ],
47
+ "mappings": [
48
+ {
49
+ "inputKey": "properties.query",
50
+ "outputKey": "searchInfo.searchQuery"
51
+ }
52
+ ]
53
+ },
54
+ "product_list_viewed": {
55
+ "enrichments": [
56
+ {
57
+ "staticString": "view-item-list",
58
+ "outputKey": "eventType"
59
+ }
60
+ ],
61
+ "mappings": [
62
+ {
63
+ "inputKey": "input",
64
+ "outputKey": "documents",
65
+ "transforms": [
66
+ {
67
+ "expression": {
68
+ "lang": "lua",
69
+ "body": "return MAP(input.properties.products, function(p)\n return { id = p.product_id }\nend)"
70
+ }
71
+ }
72
+ ]
73
+ }
74
+ ]
75
+ },
76
+ "product_viewed": {
77
+ "enrichments": [
78
+ {
79
+ "staticString": "view-item",
80
+ "outputKey": "eventType"
81
+ }
82
+ ],
83
+ "mappings": [
84
+ {
85
+ "inputKey": "input",
86
+ "outputKey": "documents",
87
+ "transforms": [
88
+ {
89
+ "expression": {
90
+ "lang": "lua",
91
+ "body": "return {{ id = input.properties.product_id }}"
92
+ }
93
+ }
94
+ ]
95
+ }
96
+ ]
97
+ },
98
+ "page": {
99
+ "filters": [
100
+ {
101
+ "byConditions": {
102
+ "action": "allow",
103
+ "when": {
104
+ "matchesAny": {
105
+ "conditions": [
106
+ {
107
+ "stringEqual": {
108
+ "inputPath": "context.page.path",
109
+ "value": "/"
110
+ }
111
+ },
112
+ {
113
+ "inputPathExists": {
114
+ "inputPath": "properties.category"
115
+ }
116
+ }
117
+ ]
118
+ }
119
+ }
120
+ }
121
+ }
122
+ ],
123
+ "mappings": [
124
+ {
125
+ "inputKey": "input",
126
+ "outputKey": "eventType",
127
+ "transforms": [
128
+ {
129
+ "expression": {
130
+ "lang": "lua",
131
+ "body": "local p = input.properties or {}\nif p.category and p.category ~= \"\" then\n return \"view-category-page\"\nend\nreturn \"view-home-page\""
132
+ }
133
+ }
134
+ ]
135
+ },
136
+ {
137
+ "inputKey": "properties.category",
138
+ "outputKey": "pageInfo.pageCategory"
139
+ }
140
+ ]
141
+ }
142
+ }
143
+ }
@@ -0,0 +1 @@
1
+ "32f144a3ea8a6b57a4625ac956a7b162 -"
@@ -0,0 +1,77 @@
1
+ {
2
+ "params": [
3
+ {
4
+ "name": "API_VERSION",
5
+ "defaultValue": "v1"
6
+ },
7
+ {
8
+ "name": "SERVICE_ACCOUNT_EMAIL",
9
+ "exampleValue": "my-service-account-email"
10
+ },
11
+ {
12
+ "name": "PRIVATE_KEY",
13
+ "exampleValue": "my-private-key"
14
+ },
15
+ {
16
+ "name": "OPERATION_TYPE",
17
+ "exampleValue": "my-operation-type",
18
+ "defaultValue": "ingest"
19
+ }
20
+ ],
21
+ "default": {
22
+ "endpoint": "https://datamanager.googleapis.com/$$API_VERSION$$/audienceMembers:$$OPERATION_TYPE$$",
23
+ "batchSize": 500,
24
+ "method": "POST",
25
+ "headers": [
26
+ {
27
+ "key": "Content-Type",
28
+ "value": "application/json"
29
+ },
30
+ {
31
+ "key": "Accept",
32
+ "value": "application/json"
33
+ },
34
+ {
35
+ "key": "Accept-Encoding",
36
+ "value": "identity"
37
+ }
38
+ ],
39
+ "oauth2Auth": {
40
+ "request": {
41
+ "url": "https://oauth2.googleapis.com/token",
42
+ "contentType": "application/x-www-form-urlencoded",
43
+ "method": "POST",
44
+ "body": [
45
+ {
46
+ "key": "grant_type",
47
+ "value": "urn:ietf:params:oauth:grant-type:jwt-bearer"
48
+ }
49
+ ]
50
+ },
51
+ "responseAccessTokenKey": "access_token",
52
+ "jwt": {
53
+ "claims": [
54
+ {
55
+ "key": "aud",
56
+ "value": "https://oauth2.googleapis.com/token"
57
+ },
58
+ {
59
+ "key": "scope",
60
+ "value": "https://www.googleapis.com/auth/datamanager"
61
+ },
62
+ {
63
+ "key": "iss",
64
+ "value": "$$SERVICE_ACCOUNT_EMAIL$$"
65
+ }
66
+ ],
67
+ "signingMethod": "SIGNING_METHOD_RS256",
68
+ "rsaPemKey": "$$PRIVATE_KEY$$",
69
+ "requestKey": "assertion"
70
+ }
71
+ },
72
+ "transform": {
73
+ "lang": "lua",
74
+ "body": "local members = {}\nlocal destinations = {}\nlocal seen = {}\nfor _, item in ipairs(batch) do\n local member = item.audienceMembers\n local references = {}\n for _, d in ipairs(item.destinations or {}) do\n local acc = d.operatingAccount or {}\n local key = d.reference or ((acc.accountType or \"\") .. \"|\" .. (acc.accountId or \"\") .. \"|\" .. (d.productDestinationId or \"\"))\n if not seen[key] then\n seen[key] = true\n table.insert(destinations, d)\n end\n if d.reference then\n table.insert(references, d.reference)\n end\n end\n if member then\n if #references > 0 then\n member.destinationReferences = references\n end\n table.insert(members, member)\n end\nend\nrequest.body = {\n destinations = destinations,\n audienceMembers = members,\n consent = batch[1].consent,\n encoding = batch[1].encoding,\n termsOfService = batch[1].termsOfService,\n validateOnly = batch[1].validateOnly,\n}\nreturn request"
75
+ }
76
+ }
77
+ }
@@ -0,0 +1 @@
1
+ "a220c8a6cd7d685860c7a73c4ae661c6 -"
@@ -0,0 +1,21 @@
1
+ {
2
+ "isDraft": false,
3
+ "isDeprecated": false,
4
+ "isBeta": true,
5
+ "friendlyName": "Google Data Manager – Audiences",
6
+ "description": "Server-side audience membership delivery to Google Ads Customer Match via the Data Manager API.",
7
+ "logo": "https://cdn.metarouter.io/google-dm-audiences.png",
8
+ "color": "#4285F4",
9
+ "eventSource": {
10
+ "isAndroidApp": true,
11
+ "isIosApp": true,
12
+ "isWebApp": true
13
+ },
14
+ "inputSchema": "analytics_js",
15
+ "releaseNotes": [
16
+ {
17
+ "date": "2026-07-22T21:00:00.000Z",
18
+ "note": "Version: 0.1.0\nBeta Version\nGoogle Data Manager – Audiences initial release"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1 @@
1
+ "0bf8bbf6393c68b68bdcca79adc0504c -"
@@ -0,0 +1,127 @@
1
+ {
2
+ "version": "0.1.0",
3
+ "params": [
4
+ {
5
+ "name": "OPERATION_TYPE",
6
+ "exampleValue": "my-operation-type"
7
+ }
8
+ ],
9
+ "global": {
10
+ "filters": [
11
+ {
12
+ "byConditions": {
13
+ "action": "allow",
14
+ "when": {
15
+ "matchesAny": {
16
+ "conditions": [
17
+ {
18
+ "inputPathExists": {
19
+ "inputPath": "traits.email"
20
+ }
21
+ },
22
+ {
23
+ "inputPathExists": {
24
+ "inputPath": "traits.phone"
25
+ }
26
+ },
27
+ {
28
+ "inputPathExists": {
29
+ "inputPath": "userId"
30
+ }
31
+ },
32
+ {
33
+ "inputPathExists": {
34
+ "inputPath": "context.device.advertisingId"
35
+ }
36
+ },
37
+ {
38
+ "inputPathExists": {
39
+ "inputPath": "context.ip"
40
+ }
41
+ }
42
+ ]
43
+ }
44
+ }
45
+ }
46
+ }
47
+ ],
48
+ "enrichments": [
49
+ {
50
+ "outputKey": "encoding",
51
+ "staticString": "HEX"
52
+ },
53
+ {
54
+ "outputKey": "validateOnly",
55
+ "staticBool": false
56
+ }
57
+ ],
58
+ "mappings": [
59
+ {
60
+ "inputKey": "input",
61
+ "outputKey": "destinations",
62
+ "transforms": [
63
+ {
64
+ "expression": {
65
+ "lang": "lua",
66
+ "name": "destinations",
67
+ "body": "local function destination(reference, accountType, accountId, productDestinationId)\n return { reference = reference, operatingAccount = { accountType = accountType, accountId = accountId }, productDestinationId = productDestinationId }\nend\nlocal t = input.traits or {}\nlocal a = t.address\n\n-- PICK ONE: keep the block for your data type, delete the other two.\n-- Then delete the matching mappings below and the matching global.filters conditions.\n\nif t.email or t.phone or (t.firstName and t.lastName and a and a.country and a.postalCode) or input.context.ip then\n return {\n destination(\"ads_contact\", \"GOOGLE_ADS\", \"ADD_GOOGLE_ADS_ACCOUNT_ID_HERE\", \"ADD_CONTACT_LIST_ID_HERE\"),\n destination(\"dv_contact\", \"DISPLAY_VIDEO_ADVERTISER\", \"ADD_DISPLAY_VIDEO_ADVERTISER_ID_HERE\", \"ADD_CONTACT_LIST_ID_HERE\"),\n }\nend\n\nif input.context.device and input.context.device.advertisingId then\n return {\n destination(\"ads_mobile\", \"GOOGLE_ADS\", \"ADD_GOOGLE_ADS_ACCOUNT_ID_HERE\", \"ADD_MOBILE_LIST_ID_HERE\"),\n destination(\"dv_mobile\", \"DISPLAY_VIDEO_ADVERTISER\", \"ADD_DISPLAY_VIDEO_ADVERTISER_ID_HERE\", \"ADD_MOBILE_LIST_ID_HERE\"),\n }\nend\n\nif input.userId then\n return {\n destination(\"ads_userid\", \"GOOGLE_ADS\", \"ADD_GOOGLE_ADS_ACCOUNT_ID_HERE\", \"ADD_USERID_LIST_ID_HERE\"),\n destination(\"dv_userid\", \"DISPLAY_VIDEO_ADVERTISER\", \"ADD_DISPLAY_VIDEO_ADVERTISER_ID_HERE\", \"ADD_USERID_LIST_ID_HERE\"),\n }\nend"
68
+ }
69
+ }
70
+ ]
71
+ },
72
+ {
73
+ "inputKey": "input",
74
+ "outputKey": "audienceMembers.compositeData",
75
+ "transforms": [
76
+ {
77
+ "expression": {
78
+ "lang": "lua",
79
+ "name": "compositeData",
80
+ "body": "local userIdentifiers = {}\nlocal t = input.traits or {}\nif t.email then\n local email = LOWER(TRIM(t.email))\n local parts = SPLIT(email, \"@\")\n if parts[2] == \"gmail.com\" or parts[2] == \"googlemail.com\" then\n email = parts[1]:gsub(\"%.\", \"\"):gsub(\"%+.*\", \"\") .. \"@\" .. parts[2]\n end\n table.insert(userIdentifiers, { emailAddress = TO_SHA256_HASH(email) })\nend\nif t.phone then\n local phone = TRIM(t.phone)\n local normalized_phone = phone:gsub(\"[^%d+]\", \"\"):gsub(\"^00\", \"+\"):gsub(\"^(%d)\", \"+1%1\")\n table.insert(userIdentifiers, {\n phoneNumber = TO_SHA256_HASH(normalized_phone)\n })\nend\nif t.firstName and t.lastName and t.address and t.address.country and t.address.postalCode then\n local a = t.address\n table.insert(userIdentifiers, {\n address = {\n givenName = TO_SHA256_HASH(LOWER(TRIM(t.firstName))),\n familyName = TO_SHA256_HASH(LOWER(TRIM(t.lastName))),\n postalCode = a.postalCode,\n regionCode = TO_ISO_COUNTRY(a.country),\n }\n })\nend\n\nlocal hasIp = input.context.ip\nif #userIdentifiers == 0 and not hasIp then\n return nil\nend\n\nlocal composite = {}\nif #userIdentifiers > 0 then\n composite.userData = { userIdentifiers = userIdentifiers }\nend\nif hasIp then\n composite.ipData = { { ipAddress = input.context.ip, observeStartTime = input.timestamp } }\nend\nreturn composite"
81
+ }
82
+ }
83
+ ]
84
+ },
85
+ {
86
+ "inputKey": "input",
87
+ "outputKey": "audienceMembers.mobileData.mobileIds",
88
+ "transforms": [
89
+ {
90
+ "expression": {
91
+ "lang": "lua",
92
+ "body": "if input.context.device and input.context.device.advertisingId then\n return { input.context.device.advertisingId }\nend"
93
+ }
94
+ }
95
+ ]
96
+ },
97
+ {
98
+ "inputKey": "userId",
99
+ "outputKey": "audienceMembers.userIdData.userId"
100
+ },
101
+ {
102
+ "inputKey": "input",
103
+ "outputKey": "consent",
104
+ "transforms": [
105
+ {
106
+ "expression": {
107
+ "lang": "lua",
108
+ "body": "if \"$$OPERATION_TYPE$$\" == \"ingest\" then\n return {\n adUserData = \"CONSENT_GRANTED\",\n adPersonalization = \"CONSENT_GRANTED\",\n }\nend"
109
+ }
110
+ }
111
+ ]
112
+ },
113
+ {
114
+ "inputKey": "input",
115
+ "outputKey": "termsOfService.customerMatchTermsOfServiceStatus",
116
+ "transforms": [
117
+ {
118
+ "expression": {
119
+ "lang": "lua",
120
+ "body": "if \"$$OPERATION_TYPE$$\" == \"ingest\" then\n return \"ACCEPTED\"\nend"
121
+ }
122
+ }
123
+ ]
124
+ }
125
+ ]
126
+ }
127
+ }
@@ -0,0 +1 @@
1
+ "153b4e04b26116f8c14ceccb3cb9af46 -"
@@ -0,0 +1,33 @@
1
+ {
2
+ "params": [
3
+ {
4
+ "name": "DOMAIN_URL",
5
+ "exampleValue": "my-domain-url"
6
+ },
7
+ {
8
+ "name": "TOKEN_AUTH",
9
+ "exampleValue": "my-token-auth",
10
+ "isOptional": true,
11
+ "isSensitive": true
12
+ }
13
+ ],
14
+ "default": {
15
+ "endpoint": "$$DOMAIN_URL$$/matomo.php",
16
+ "method": "POST",
17
+ "batchSize": 500,
18
+ "headers": [
19
+ {
20
+ "key": "Content-Type",
21
+ "value": "application/json"
22
+ },
23
+ {
24
+ "key": "Accept-Encoding",
25
+ "value": "application/json"
26
+ }
27
+ ],
28
+ "transform": {
29
+ "lang": "lua",
30
+ "body": "local function to_request(event)\n local parts = {}\n for key, value in pairs(event) do\n parts[#parts + 1] = key .. \"=\" .. QUERY_ESCAPE(TO_STRING(value))\n end\n return \"?\" .. JOIN(parts, \"&\")\nend\nlocal body = { requests = MAP(batch, to_request) }\n\nlocal token_auth = \"$$TOKEN_AUTH$$\"\nif token_auth ~= \"\" and token_auth ~= \"my-token-auth\" and REPLACE(token_auth, \"$$\", \"\") == token_auth then\n body.token_auth = token_auth\nend\n\nrequest.body = body\nreturn request"
31
+ }
32
+ }
33
+ }
@@ -0,0 +1 @@
1
+ "89aa710cee0fde359180e234e0a1c83e -"
@@ -0,0 +1,21 @@
1
+ {
2
+ "isDraft": false,
3
+ "isDeprecated": false,
4
+ "isBeta": true,
5
+ "friendlyName": "Matomo",
6
+ "description": "Matomo is an open-source web analytics platform that provides page view, event, visit, ecommerce, and campaign attribution tracking.",
7
+ "logo": "https://cdn.metarouter.io/matomo.png",
8
+ "color": "#d4291f",
9
+ "eventSource": {
10
+ "isAndroidApp": false,
11
+ "isIosApp": false,
12
+ "isWebApp": true
13
+ },
14
+ "inputSchema": "analytics_js",
15
+ "releaseNotes": [
16
+ {
17
+ "date": "2026-07-15T21:00:00.000Z",
18
+ "note": "Version: 0.1.0\nBeta Version\nMatomo initial release"
19
+ }
20
+ ]
21
+ }
@@ -0,0 +1 @@
1
+ "e342de08780aaeb05311cc16e674184e -"
@@ -0,0 +1,320 @@
1
+ {
2
+ "version": "0.1.0",
3
+ "params": [
4
+ {
5
+ "name": "SITE_ID",
6
+ "exampleValue": "my-site-id"
7
+ }
8
+ ],
9
+ "global": {
10
+ "enrichments": [
11
+ {
12
+ "staticString": "1",
13
+ "outputKey": "rec"
14
+ },
15
+ {
16
+ "staticString": "1",
17
+ "outputKey": "apiv"
18
+ },
19
+ {
20
+ "staticString": "$$SITE_ID$$",
21
+ "outputKey": "idsite"
22
+ }
23
+ ],
24
+ "mappings": [
25
+ {
26
+ "inputKey": "context.page.url",
27
+ "outputKey": "url"
28
+ },
29
+ {
30
+ "inputKey": "context.page.referrer",
31
+ "outputKey": "urlref"
32
+ },
33
+ {
34
+ "inputKey": "context.userAgent",
35
+ "outputKey": "ua"
36
+ },
37
+ {
38
+ "inputKey": "userId",
39
+ "outputKey": "uid"
40
+ },
41
+ {
42
+ "inputKey": "context.ip",
43
+ "outputKey": "cip"
44
+ },
45
+ {
46
+ "inputKey": "traits.address.city",
47
+ "outputKey": "city"
48
+ },
49
+ {
50
+ "inputKey": "context.locale",
51
+ "outputKey": "lang"
52
+ },
53
+ {
54
+ "inputKey": "messageId",
55
+ "outputKey": "rand"
56
+ },
57
+ {
58
+ "inputKey": "input",
59
+ "outputKey": "_id",
60
+ "transforms": [
61
+ {
62
+ "expression": {
63
+ "lang": "lua",
64
+ "body": "return SUBSTRING(REPLACE(input.anonymousId, \"-\", \"\"), 0, 16)"
65
+ }
66
+ }
67
+ ]
68
+ },
69
+ {
70
+ "inputKey": "input",
71
+ "outputKey": "cdt",
72
+ "transforms": [
73
+ {
74
+ "expression": {
75
+ "lang": "lua",
76
+ "body": "return SECONDS_SINCE_EPOCH_FROM_RFC3999(TO_DATE_TIME(input.timestamp or input.originalTimestamp or input.sentAt))"
77
+ }
78
+ }
79
+ ]
80
+ }
81
+ ]
82
+ },
83
+ "default": {
84
+ "filters": [
85
+ {
86
+ "byEventNames": {
87
+ "action": "allow",
88
+ "events": [
89
+ ""
90
+ ]
91
+ }
92
+ }
93
+ ]
94
+ },
95
+ "eventSpecific": {
96
+ "page": {
97
+ "mappings": [
98
+ {
99
+ "inputKey": "context.page.title",
100
+ "outputKey": "action_name"
101
+ }
102
+ ]
103
+ },
104
+ "products_searched": {
105
+ "mappings": [
106
+ {
107
+ "inputKey": "properties.query",
108
+ "outputKey": "search"
109
+ }
110
+ ]
111
+ },
112
+ "product_list_viewed": {
113
+ "mappings": [
114
+ {
115
+ "inputKey": "properties.category",
116
+ "outputKey": "_pkc"
117
+ }
118
+ ]
119
+ },
120
+ "product_viewed": {
121
+ "mappings": [
122
+ {
123
+ "inputKey": "input",
124
+ "outputKey": "_pks",
125
+ "transforms": [
126
+ {
127
+ "expression": {
128
+ "lang": "lua",
129
+ "body": "return input.properties.sku or input.properties.product_id"
130
+ }
131
+ }
132
+ ]
133
+ },
134
+ {
135
+ "inputKey": "properties.name",
136
+ "outputKey": "_pkn"
137
+ },
138
+ {
139
+ "inputKey": "properties.category",
140
+ "outputKey": "_pkc"
141
+ },
142
+ {
143
+ "inputKey": "properties.price",
144
+ "outputKey": "_pkp",
145
+ "transforms": [
146
+ {
147
+ "toScalar": "float"
148
+ }
149
+ ]
150
+ }
151
+ ]
152
+ },
153
+ "cart_viewed": {
154
+ "enrichments": [
155
+ {
156
+ "staticString": "0",
157
+ "outputKey": "idgoal"
158
+ }
159
+ ],
160
+ "mappings": [
161
+ {
162
+ "inputKey": "input",
163
+ "outputKey": "ec_items",
164
+ "transforms": [
165
+ {
166
+ "expression": {
167
+ "lang": "lua",
168
+ "body": "local function item(p)\n return {\n p.sku or p.product_id,\n p.name or \"\",\n p.category or \"\",\n TO_FLOAT(p.price or 0),\n TO_TRUNCATED_INT(p.quantity or 1),\n }\nend\nreturn MAP(input.properties.products, item)"
169
+ }
170
+ }
171
+ ]
172
+ },
173
+ {
174
+ "inputKey": "input",
175
+ "outputKey": "revenue",
176
+ "transforms": [
177
+ {
178
+ "expression": {
179
+ "lang": "lua",
180
+ "body": "return TOTAL_VALUE(input.properties.products)"
181
+ }
182
+ }
183
+ ]
184
+ }
185
+ ]
186
+ },
187
+ "checkout_started": {
188
+ "enrichments": [
189
+ {
190
+ "staticString": "0",
191
+ "outputKey": "idgoal"
192
+ }
193
+ ],
194
+ "mappings": [
195
+ {
196
+ "inputKey": "properties.revenue",
197
+ "outputKey": "revenue",
198
+ "transforms": [
199
+ {
200
+ "toScalar": "float"
201
+ }
202
+ ]
203
+ },
204
+ {
205
+ "inputKey": "input",
206
+ "outputKey": "ec_items",
207
+ "transforms": [
208
+ {
209
+ "expression": {
210
+ "lang": "lua",
211
+ "body": "local function item(p)\n return {\n p.sku or p.product_id,\n p.name or \"\",\n p.category or \"\",\n TO_FLOAT(p.price or 0),\n TO_TRUNCATED_INT(p.quantity or 1),\n }\nend\nreturn MAP(input.properties.products, item)"
212
+ }
213
+ }
214
+ ]
215
+ }
216
+ ]
217
+ },
218
+ "order_completed": {
219
+ "enrichments": [
220
+ {
221
+ "staticString": "0",
222
+ "outputKey": "idgoal"
223
+ }
224
+ ],
225
+ "mappings": [
226
+ {
227
+ "inputKey": "properties.order_id",
228
+ "outputKey": "ec_id"
229
+ },
230
+ {
231
+ "inputKey": "properties.total",
232
+ "outputKey": "revenue",
233
+ "transforms": [
234
+ {
235
+ "toScalar": "float"
236
+ }
237
+ ]
238
+ },
239
+ {
240
+ "inputKey": "properties.revenue",
241
+ "outputKey": "ec_st",
242
+ "transforms": [
243
+ {
244
+ "toScalar": "float"
245
+ }
246
+ ]
247
+ },
248
+ {
249
+ "inputKey": "properties.tax",
250
+ "outputKey": "ec_tx",
251
+ "transforms": [
252
+ {
253
+ "toScalar": "float"
254
+ }
255
+ ]
256
+ },
257
+ {
258
+ "inputKey": "properties.shipping",
259
+ "outputKey": "ec_sh",
260
+ "transforms": [
261
+ {
262
+ "toScalar": "float"
263
+ }
264
+ ]
265
+ },
266
+ {
267
+ "inputKey": "properties.discount",
268
+ "outputKey": "ec_dt",
269
+ "transforms": [
270
+ {
271
+ "toScalar": "float"
272
+ }
273
+ ]
274
+ },
275
+ {
276
+ "inputKey": "input",
277
+ "outputKey": "ec_items",
278
+ "transforms": [
279
+ {
280
+ "expression": {
281
+ "lang": "lua",
282
+ "body": "local function item(p)\n return {\n p.sku or p.product_id,\n p.name or \"\",\n p.category or \"\",\n TO_FLOAT(p.price or 0),\n TO_TRUNCATED_INT(p.quantity or 1),\n }\nend\nreturn MAP(input.properties.products, item)"
283
+ }
284
+ }
285
+ ]
286
+ }
287
+ ]
288
+ },
289
+ "promotion_viewed": {
290
+ "mappings": [
291
+ {
292
+ "inputKey": "properties.name",
293
+ "outputKey": "c_n"
294
+ },
295
+ {
296
+ "inputKey": "properties.creative",
297
+ "outputKey": "c_p"
298
+ }
299
+ ]
300
+ },
301
+ "promotion_clicked": {
302
+ "enrichments": [
303
+ {
304
+ "staticString": "click",
305
+ "outputKey": "c_i"
306
+ }
307
+ ],
308
+ "mappings": [
309
+ {
310
+ "inputKey": "properties.name",
311
+ "outputKey": "c_n"
312
+ },
313
+ {
314
+ "inputKey": "properties.creative",
315
+ "outputKey": "c_p"
316
+ }
317
+ ]
318
+ }
319
+ }
320
+ }
@@ -1 +1 @@
1
- "34c07475d7243f14704d39b62fd6af05 -"
1
+ "85cc29d030eb6e62931b5a7de4d9772b -"
@@ -2,7 +2,7 @@
2
2
  "isDraft": false,
3
3
  "isDeprecated": false,
4
4
  "isBeta": true,
5
- "friendlyName": "Yahoo Conversions API",
5
+ "friendlyName": "Yahoo CAPI",
6
6
  "description": "Yahoo Conversion API allows advertisers to send conversion events server-to-server to Yahoo DSP, enabling accurate tracking of user actions like purchases or signups.",
7
7
  "logo": "https://cdn.metarouter.io/yahoo-conversions-api.png",
8
8
  "color": "#6001D2",
@@ -20,6 +20,10 @@
20
20
  {
21
21
  "date": "2026-06-24T21:00:00.000Z",
22
22
  "note": "Version: 0.2.0\nUpdate userData.ip_address field in lua."
23
+ },
24
+ {
25
+ "date": "2026-07-22T21:00:00.000Z",
26
+ "note": "Version: 0.3.0\nAdd page event, update friendlyName."
23
27
  }
24
28
  ]
25
29
  }
@@ -1 +1 @@
1
- "8a329130be582bffbb310fc3d4844530 -"
1
+ "32d2848b7e2fd995247cb0957add5de3 -"
@@ -1,5 +1,5 @@
1
1
  {
2
- "version": "0.2.0",
2
+ "version": "0.3.0",
3
3
  "default": {
4
4
  "filters": [
5
5
  {
@@ -137,6 +137,14 @@
137
137
  ]
138
138
  },
139
139
  "eventSpecific": {
140
+ "page": {
141
+ "mappings": [
142
+ {
143
+ "inputKey": "properties.url",
144
+ "outputKey": "actionSourceUrl"
145
+ }
146
+ ]
147
+ },
140
148
  "product_list_viewed": {
141
149
  "mappings": [
142
150
  {
package/README.md CHANGED
@@ -1,17 +1,12 @@
1
1
  # MetaRouter Starter Kits
2
2
 
3
- ### 2026-06
4
- - Braze
5
- - CM360 - Floodlights
6
- - Google Ads - Conversions
7
- - Google Analytics 4
8
- - Google Analytics 4 (Collect)
9
- - Heap
10
- - Podscribe
11
- - Teads CAPI (New)
12
- - Teads Postback
13
- - Wirtualna Polska
14
- - Yahoo Conversions API
3
+ ### 2026-07
4
+ - Agent Search (New)
5
+ - Google Data Manager – Audiences (New)
6
+ - Matomo (New)
7
+ - Meta CAPI
8
+ - OpenAI CAPI
9
+ - Yahoo CAPI
15
10
 
16
11
  | Kit Name | Initial Release Date | Stable Release Date | Latest Release Date | Current Version | Latest Note |
17
12
  |----------|----------------------|---------------------|---------------------|-----------------|-------------|
@@ -21,6 +16,7 @@
21
16
  | Adobe Analytics | 2025-10-08 | 2026-01-07 | 2026-01-07 | Version: 1.0.0 | Stable Release |
22
17
  | Adobe Experience Platform | 2023-03-21 | 2025-08-20 | 2025-11-19 | Version: 1.1.0 | Added ECID support Updated identityMap mappings |
23
18
  | Adobe ID | 2023-03-07 | N/A | 2024-10-23 | Version: 0.2.0 | Added header `Accept-Encoding: application/json` |
19
+ | Agent Search (New) | 2026-07-22 | N/A | 2026-07-22 | Version: 0.1.0 | Beta Version Agent Search initial release |
24
20
  | Amazon DSP - Events | 2025-12-03 | 2026-02-18 | 2026-02-18 | Version: 1.0.0 | Stable Release |
25
21
  | Amazon DSP CAPI | 2025-05-21 | 2025-08-13 | 2026-02-04 | Version: 1.1.0 | Deprecated |
26
22
  | Amazon Data Firehose | 2025-02-05 | 2025-04-02 | 2025-10-15 | Version: 1.0.1 | Added friendly names to expressions |
@@ -55,6 +51,7 @@
55
51
  | Google Analytics 4 (Collect) | 2024-04-24 | 2025-08-20 | 2026-06-10 | Version: 1.1.0 | Added support for reading gclid, dclid, clientID, sessionID and sessionCount from the googleAnalytics4 child sync provider with fallback to the googleGtag provider |
56
52
  | Google BigQuery | 2021-06-24 | 2023-12-13 | 2025-01-16 | Version: 1.1.0 | Adding support for table overrides |
57
53
  | Google Cloud Storage | 2021-06-24 | 2026-03-18 | 2026-03-18 | Version: 1.0.0 | Stable Release |
54
+ | Google Data Manager – Audiences (New) | 2026-07-22 | N/A | 2026-07-22 | Version: 0.1.0 | Beta Version Google Data Manager – Audiences initial release |
58
55
  | Google Pub/Sub | 2021-06-24 | 2023-12-13 | 2025-10-15 | Version: 1.1.1 | Added friendly names to expressions |
59
56
  | Heap | 2024-03-26 | N/A | 2026-06-10 | Version: 0.3.0 | EU endpoint support Removed unused parameter |
60
57
  | Hightouch | 2026-01-14 | 2026-04-08 | 2026-04-08 | Version: 1.0.0 | Stable Release |
@@ -71,6 +68,7 @@
71
68
  | Lytics | 2021-06-24 | N/A | 2024-10-23 | Version: 1.1.0 | Added header `Accept-Encoding: application/json` |
72
69
  | MIQ (Xandr) | 2023-03-07 | N/A | 2024-10-23 | Version: 0.2.0 | Added header `Accept-Encoding: application/json` |
73
70
  | Magellan AI | 2024-07-24 | 2024-08-07 | 2025-07-30 | Version: 1.2.0 | Replaced context.traits with traits. |
71
+ | Matomo (New) | 2026-07-15 | N/A | 2026-07-15 | Version: 0.1.0 | Beta Version Matomo initial release |
74
72
  | Merkle | 2021-06-24 | N/A | 2025-07-30 | Version: 1.3.0 | Replaced context.traits with traits. |
75
73
  | Meta CAPI | 2021-06-24 | N/A | 2026-07-01 | Version: 1.12.0 | Relocate partner_agent field. |
76
74
  | Microsoft Ads | 2025-01-22 | 2025-04-02 | 2025-12-17 | Version: 1.2.0 | Deprecating this in favor of the released Microsoft Ads CAPI kit |
@@ -82,7 +80,7 @@
82
80
  | Movable Ink - Customer Data | 2024-02-07 | 2024-04-24 | 2025-07-16 | Version: 1.3.0 | TABLE_SLICE custom function usage. |
83
81
  | Nextdoor | 2023-03-07 | 2024-08-07 | 2026-04-15 | Version: 1.1.0 | Deprecating in favor of the released Nextdoor CAPI Kit |
84
82
  | Nextdoor - CAPI | 2024-06-05 | 2024-07-17 | 2025-10-08 | Version: 1.4.0 | Extended Nextdoor CAPI events. |
85
- | OpenAI CAPI (New) | 2026-06-10 | 2026-07-01 | 2026-07-01 | Version: 1.0.0 | Stable Release |
83
+ | OpenAI CAPI | 2026-06-10 | 2026-07-01 | 2026-07-01 | Version: 1.0.0 | Stable Release |
86
84
  | Optimizely | 2026-01-28 | 2026-02-18 | 2026-02-18 | Version: 1.0.0 | Stable Release |
87
85
  | Perion | 2025-05-21 | 2025-07-16 | 2025-10-15 | Version: 1.0.1 | Added friendly names to expressions |
88
86
  | Pinterest Ads | 2021-06-24 | N/A | 2025-10-15 | Version: 1.1.1 | Added friendly names to expressions |
@@ -93,8 +91,8 @@
93
91
  | RTB House | 2024-11-20 | N/A | 2025-12-03 | Version: 0.4.0 | Updated endpoint to be a parameter |
94
92
  | Rakuten Conversions | 2025-07-30 | 2025-09-24 | 2025-09-24 | Version: 1.0.0 | Stable Release |
95
93
  | Reddit Ads | 2023-09-12 | 2026-01-07 | 2026-01-07 | Version: 2.0.0 | Stable Release of Reddit CAPI V3 |
96
- | Ringier Axel Springer Poland | 2025-06-25 | 2026-01-21 | 2026-05-20 | Version: 1.1.0 | Added ord to the playbook |
97
94
  | Ringier Axel Springer Poland | 2025-03-05 | 2025-04-09 | 2026-01-21 | Version: 1.4.0 | Deprecating in favor of the released RASP SDK Kit |
95
+ | Ringier Axel Springer Poland | 2025-06-25 | 2026-01-21 | 2026-05-20 | Version: 1.1.0 | Added ord to the playbook |
98
96
  | Roku | 2023-04-27 | N/A | 2025-07-30 | Version: 1.2.0 | Replaced context.traits with traits. |
99
97
  | Roomvo | 2021-08-10 | N/A | 2026-03-25 | Version: 0.2.2 | Converted some fields to camelCase for schema validation |
100
98
  | Salesforce CDP | 2022-05-31 | N/A | 2025-07-30 | Version: 1.2.0 | Replaced originalTimestamp with timestamp |
@@ -102,7 +100,7 @@
102
100
  | Snapchat Ads | 2021-06-24 | N/A | 2025-10-15 | Version: 1.1.1 | Added friendly names to expressions |
103
101
  | Snowflake | 2021-06-24 | N/A | 2025-10-15 | Version: 0.1.2 | Added friendly names to expressions |
104
102
  | Stdout | 2026-03-18 | N/A | 2026-03-18 | Version: 0.1.0 | Beta Version Stdout initial release |
105
- | Teads CAPI (New) | 2026-06-03 | 2026-06-24 | 2026-06-24 | Version: 1.0.0 | Stable Release |
103
+ | Teads CAPI | 2026-06-03 | 2026-06-24 | 2026-06-24 | Version: 1.0.0 | Stable Release |
106
104
  | Teads Postback | 2025-11-12 | 2026-01-07 | 2026-06-24 | Version: 1.0.1 | Updated friendly name |
107
105
  | The Trade Desk - Conversions | 2025-06-04 | 2025-07-30 | 2025-12-10 | Version: 1.2.0 | Updating identifier mappings |
108
106
  | The Trade Desk - Offline Conversions | 2026-02-25 | 2026-04-08 | 2026-04-08 | Version: 1.0.0 | Stable Release |
@@ -116,7 +114,7 @@
116
114
  | Wirtualna Polska | 2026-03-11 | 2026-04-22 | 2026-06-03 | Version: 1.1.0 | Added content_name parameter for ViewContent events. New product_list_viewed, page, and screen mappings |
117
115
  | X Ads - Web Conversions | 2024-09-04 | 2024-09-25 | 2026-03-25 | Version: 1.1.1 | Converted some fields to camelCase for schema validation |
118
116
  | Xandr | 2021-07-13 | N/A | 2024-10-23 | Version: 1.1.0 | Added header `Accept-Encoding: application/json` |
119
- | Yahoo Conversions API | 2026-05-27 | N/A | 2026-06-24 | Version: 0.2.0 | Update userData.ip_address field in lua. |
117
+ | Yahoo CAPI | 2026-05-27 | N/A | 2026-07-22 | Version: 0.3.0 | Add page event, update friendlyName. |
120
118
  | Yahoo Enhanced Attribution | 2023-03-07 | N/A | 2025-04-09 | Version: 0.4.0 | Deprecated |
121
119
  | Yahoo Pixel API | 2023-03-07 | 2023-12-13 | 2025-04-09 | Version: 1.3.0 | Friendly name updated |
122
120
  | Zeotap | 2024-02-21 | 2025-08-20 | 2025-08-20 | Version: 1.0.0 | Stable Release |
package/index.js CHANGED
@@ -297,6 +297,12 @@ exports['google-ads'] = {
297
297
  metadata: require('./.dist/google-ads/metadata.json')
298
298
  }
299
299
 
300
+ exports['google-agent-search'] = {
301
+ endpointSchema: require('./.dist/google-agent-search/connection.json'),
302
+ playbook: require('./.dist/google-agent-search/playbook.json'),
303
+ metadata: require('./.dist/google-agent-search/metadata.json')
304
+ }
305
+
300
306
  exports['google-analytics'] = {
301
307
  endpointSchema: require('./.dist/google-analytics/connection.json'),
302
308
  playbook: require('./.dist/google-analytics/playbook.json'),
@@ -315,6 +321,12 @@ exports['google-analytics-4-collect'] = {
315
321
  metadata: require('./.dist/google-analytics-4-collect/metadata.json')
316
322
  }
317
323
 
324
+ exports['google-dm-audiences'] = {
325
+ endpointSchema: require('./.dist/google-dm-audiences/connection.json'),
326
+ playbook: require('./.dist/google-dm-audiences/playbook.json'),
327
+ metadata: require('./.dist/google-dm-audiences/metadata.json')
328
+ }
329
+
318
330
  exports['google-firebase'] = {
319
331
  endpointSchema: require('./.dist/google-firebase/connection.json'),
320
332
  playbook: require('./.dist/google-firebase/playbook.json'),
@@ -387,6 +399,12 @@ exports['magellan-ai'] = {
387
399
  metadata: require('./.dist/magellan-ai/metadata.json')
388
400
  }
389
401
 
402
+ exports['matomo'] = {
403
+ endpointSchema: require('./.dist/matomo/connection.json'),
404
+ playbook: require('./.dist/matomo/playbook.json'),
405
+ metadata: require('./.dist/matomo/metadata.json')
406
+ }
407
+
390
408
  exports['media-math'] = {
391
409
  endpointSchema: require('./.dist/media-math/connection.json'),
392
410
  playbook: require('./.dist/media-math/playbook.json'),
@@ -869,12 +887,12 @@ exports.etags = {
869
887
  'engage-front': {
870
888
  endpointSchema: require('./.dist/engage-front/connection.etag.json'),
871
889
  playbook: require('./.dist/engage-front/playbook.etag.json'),
872
- metadata: require('./.dist/engage-front/kit.etag.json')
890
+ kit: require('./.dist/engage-front/kit.etag.json')
873
891
  },
874
892
  'eulerian': {
875
893
  endpointSchema: require('./.dist/eulerian/connection.etag.json'),
876
894
  playbook: require('./.dist/eulerian/playbook.etag.json'),
877
- metadata: require('./.dist/eulerian/kit.etag.json')
895
+ kit: require('./.dist/eulerian/kit.etag.json')
878
896
  },
879
897
  'facebook-pixel': {
880
898
  endpointSchema: require('./.dist/facebook-pixel/connection.etag.json'),
@@ -891,6 +909,11 @@ exports.etags = {
891
909
  playbook: require('./.dist/google-ads/playbook.etag.json'),
892
910
  kit: require('./.dist/google-ads/kit.etag.json')
893
911
  },
912
+ 'google-agent-search': {
913
+ endpointSchema: require('./.dist/google-agent-search/connection.etag.json'),
914
+ playbook: require('./.dist/google-agent-search/playbook.etag.json'),
915
+ kit: require('./.dist/google-agent-search/kit.etag.json')
916
+ },
894
917
  'google-analytics': {
895
918
  endpointSchema: require('./.dist/google-analytics/connection.etag.json'),
896
919
  playbook: require('./.dist/google-analytics/playbook.etag.json'),
@@ -906,6 +929,11 @@ exports.etags = {
906
929
  playbook: require('./.dist/google-analytics-4-collect/playbook.etag.json'),
907
930
  kit: require('./.dist/google-analytics-4-collect/kit.etag.json')
908
931
  },
932
+ 'google-dm-audiences': {
933
+ endpointSchema: require('./.dist/google-dm-audiences/connection.etag.json'),
934
+ playbook: require('./.dist/google-dm-audiences/playbook.etag.json'),
935
+ kit: require('./.dist/google-dm-audiences/kit.etag.json')
936
+ },
909
937
  'google-firebase': {
910
938
  playbook: require('./.dist/google-firebase/playbook.etag.json'),
911
939
  kit: require('./.dist/google-firebase/kit.etag.json')
@@ -965,6 +993,11 @@ exports.etags = {
965
993
  playbook: require('./.dist/magellan-ai/playbook.etag.json'),
966
994
  kit: require('./.dist/magellan-ai/kit.etag.json')
967
995
  },
996
+ 'matomo': {
997
+ endpointSchema: require('./.dist/matomo/connection.etag.json'),
998
+ playbook: require('./.dist/matomo/playbook.etag.json'),
999
+ kit: require('./.dist/matomo/kit.etag.json')
1000
+ },
968
1001
  'media-math': {
969
1002
  endpointSchema: require('./.dist/media-math/connection.etag.json'),
970
1003
  playbook: require('./.dist/media-math/playbook.etag.json'),
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@metarouter/ajs-starter-kit",
3
- "version": "1.0.176",
3
+ "version": "1.0.178",
4
4
  "description": "MetaRouter analytics.js starter kit",
5
5
  "main": "index.js",
6
6
  "scripts": {