@antelopejs/dms-marketing 0.2.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.
Files changed (308) hide show
  1. package/LICENSE +190 -0
  2. package/README.md +143 -0
  3. package/dist/config.d.ts +13 -0
  4. package/dist/config.js +35 -0
  5. package/dist/config.js.map +1 -0
  6. package/dist/data-api/body.d.ts +1 -0
  7. package/dist/data-api/body.js +15 -0
  8. package/dist/data-api/body.js.map +1 -0
  9. package/dist/data-api/funnels.d.ts +32 -0
  10. package/dist/data-api/funnels.js +302 -0
  11. package/dist/data-api/funnels.js.map +1 -0
  12. package/dist/data-api/hidden-filter.d.ts +1 -0
  13. package/dist/data-api/hidden-filter.js +11 -0
  14. package/dist/data-api/hidden-filter.js.map +1 -0
  15. package/dist/data-api/index.d.ts +4 -0
  16. package/dist/data-api/index.js +21 -0
  17. package/dist/data-api/index.js.map +1 -0
  18. package/dist/data-api/tenant-scope.d.ts +15 -0
  19. package/dist/data-api/tenant-scope.js +43 -0
  20. package/dist/data-api/tenant-scope.js.map +1 -0
  21. package/dist/data-api/websites.d.ts +25 -0
  22. package/dist/data-api/websites.js +73 -0
  23. package/dist/data-api/websites.js.map +1 -0
  24. package/dist/db/index.d.ts +2 -0
  25. package/dist/db/index.js +19 -0
  26. package/dist/db/index.js.map +1 -0
  27. package/dist/db/models/funnels.model.d.ts +25 -0
  28. package/dist/db/models/funnels.model.js +39 -0
  29. package/dist/db/models/funnels.model.js.map +1 -0
  30. package/dist/db/models/index.d.ts +7 -0
  31. package/dist/db/models/index.js +24 -0
  32. package/dist/db/models/index.js.map +1 -0
  33. package/dist/db/models/marketing_events.model.d.ts +49 -0
  34. package/dist/db/models/marketing_events.model.js +85 -0
  35. package/dist/db/models/marketing_events.model.js.map +1 -0
  36. package/dist/db/models/marketing_sessions.model.d.ts +33 -0
  37. package/dist/db/models/marketing_sessions.model.js +50 -0
  38. package/dist/db/models/marketing_sessions.model.js.map +1 -0
  39. package/dist/db/models/marketing_settings.model.d.ts +23 -0
  40. package/dist/db/models/marketing_settings.model.js +13 -0
  41. package/dist/db/models/marketing_settings.model.js.map +1 -0
  42. package/dist/db/models/page_snapshots.model.d.ts +27 -0
  43. package/dist/db/models/page_snapshots.model.js +32 -0
  44. package/dist/db/models/page_snapshots.model.js.map +1 -0
  45. package/dist/db/models/retention.d.ts +6 -0
  46. package/dist/db/models/retention.js +26 -0
  47. package/dist/db/models/retention.js.map +1 -0
  48. package/dist/db/models/website_statistics.model.d.ts +31 -0
  49. package/dist/db/models/website_statistics.model.js +63 -0
  50. package/dist/db/models/website_statistics.model.js.map +1 -0
  51. package/dist/db/models/websites.model.d.ts +26 -0
  52. package/dist/db/models/websites.model.js +27 -0
  53. package/dist/db/models/websites.model.js.map +1 -0
  54. package/dist/db/tables/funnels.table.d.ts +31 -0
  55. package/dist/db/tables/funnels.table.js +54 -0
  56. package/dist/db/tables/funnels.table.js.map +1 -0
  57. package/dist/db/tables/index.d.ts +7 -0
  58. package/dist/db/tables/index.js +24 -0
  59. package/dist/db/tables/index.js.map +1 -0
  60. package/dist/db/tables/marketing_events.table.d.ts +15 -0
  61. package/dist/db/tables/marketing_events.table.js +66 -0
  62. package/dist/db/tables/marketing_events.table.js.map +1 -0
  63. package/dist/db/tables/marketing_sessions.table.d.ts +26 -0
  64. package/dist/db/tables/marketing_sessions.table.js +115 -0
  65. package/dist/db/tables/marketing_sessions.table.js.map +1 -0
  66. package/dist/db/tables/marketing_settings.table.d.ts +11 -0
  67. package/dist/db/tables/marketing_settings.table.js +51 -0
  68. package/dist/db/tables/marketing_settings.table.js.map +1 -0
  69. package/dist/db/tables/page_snapshots.table.d.ts +17 -0
  70. package/dist/db/tables/page_snapshots.table.js +72 -0
  71. package/dist/db/tables/page_snapshots.table.js.map +1 -0
  72. package/dist/db/tables/website_statistics.table.d.ts +14 -0
  73. package/dist/db/tables/website_statistics.table.js +60 -0
  74. package/dist/db/tables/website_statistics.table.js.map +1 -0
  75. package/dist/db/tables/websites.table.d.ts +13 -0
  76. package/dist/db/tables/websites.table.js +60 -0
  77. package/dist/db/tables/websites.table.js.map +1 -0
  78. package/dist/hooks/index.d.ts +1 -0
  79. package/dist/hooks/index.js +39 -0
  80. package/dist/hooks/index.js.map +1 -0
  81. package/dist/implementations/dms-marketing/index.d.ts +2 -0
  82. package/dist/implementations/dms-marketing/index.js +8 -0
  83. package/dist/implementations/dms-marketing/index.js.map +1 -0
  84. package/dist/index.d.ts +7 -0
  85. package/dist/index.js +89 -0
  86. package/dist/index.js.map +1 -0
  87. package/dist/pages/all.d.ts +5 -0
  88. package/dist/pages/all.js +22 -0
  89. package/dist/pages/all.js.map +1 -0
  90. package/dist/pages/campaigns/page.d.ts +9 -0
  91. package/dist/pages/campaigns/page.js +27 -0
  92. package/dist/pages/campaigns/page.js.map +1 -0
  93. package/dist/pages/funnels/page.d.ts +9 -0
  94. package/dist/pages/funnels/page.js +27 -0
  95. package/dist/pages/funnels/page.js.map +1 -0
  96. package/dist/pages/index.d.ts +4 -0
  97. package/dist/pages/index.js +21 -0
  98. package/dist/pages/index.js.map +1 -0
  99. package/dist/pages/module.d.ts +1 -0
  100. package/dist/pages/module.js +13 -0
  101. package/dist/pages/module.js.map +1 -0
  102. package/dist/pages/overview/page.d.ts +9 -0
  103. package/dist/pages/overview/page.js +27 -0
  104. package/dist/pages/overview/page.js.map +1 -0
  105. package/dist/pages/pages/page.d.ts +9 -0
  106. package/dist/pages/pages/page.js +27 -0
  107. package/dist/pages/pages/page.js.map +1 -0
  108. package/dist/pages/settings/form.d.ts +3 -0
  109. package/dist/pages/settings/form.js +35 -0
  110. package/dist/pages/settings/form.js.map +1 -0
  111. package/dist/pages/settings/page.d.ts +9 -0
  112. package/dist/pages/settings/page.js +27 -0
  113. package/dist/pages/settings/page.js.map +1 -0
  114. package/dist/routes/collect.d.ts +7 -0
  115. package/dist/routes/collect.js +62 -0
  116. package/dist/routes/collect.js.map +1 -0
  117. package/dist/routes/experiments.d.ts +6 -0
  118. package/dist/routes/experiments.js +63 -0
  119. package/dist/routes/experiments.js.map +1 -0
  120. package/dist/routes/funnels.d.ts +16 -0
  121. package/dist/routes/funnels.js +44 -0
  122. package/dist/routes/funnels.js.map +1 -0
  123. package/dist/routes/index.d.ts +8 -0
  124. package/dist/routes/index.js +25 -0
  125. package/dist/routes/index.js.map +1 -0
  126. package/dist/routes/settings.d.ts +8 -0
  127. package/dist/routes/settings.js +50 -0
  128. package/dist/routes/settings.js.map +1 -0
  129. package/dist/routes/snapshot.d.ts +10 -0
  130. package/dist/routes/snapshot.js +147 -0
  131. package/dist/routes/snapshot.js.map +1 -0
  132. package/dist/routes/stats.d.ts +44 -0
  133. package/dist/routes/stats.js +278 -0
  134. package/dist/routes/stats.js.map +1 -0
  135. package/dist/routes/tracker.d.ts +6 -0
  136. package/dist/routes/tracker.js +57 -0
  137. package/dist/routes/tracker.js.map +1 -0
  138. package/dist/routes/websites.d.ts +13 -0
  139. package/dist/routes/websites.js +144 -0
  140. package/dist/routes/websites.js.map +1 -0
  141. package/dist/services/acquisition.d.ts +15 -0
  142. package/dist/services/acquisition.js +153 -0
  143. package/dist/services/acquisition.js.map +1 -0
  144. package/dist/services/bounded-cache.d.ts +14 -0
  145. package/dist/services/bounded-cache.js +45 -0
  146. package/dist/services/bounded-cache.js.map +1 -0
  147. package/dist/services/collect.d.ts +11 -0
  148. package/dist/services/collect.js +193 -0
  149. package/dist/services/collect.js.map +1 -0
  150. package/dist/services/experiment-definitions.d.ts +4 -0
  151. package/dist/services/experiment-definitions.js +36 -0
  152. package/dist/services/experiment-definitions.js.map +1 -0
  153. package/dist/services/experiments/assign.d.ts +5 -0
  154. package/dist/services/experiments/assign.js +52 -0
  155. package/dist/services/experiments/assign.js.map +1 -0
  156. package/dist/services/experiments/index.d.ts +3 -0
  157. package/dist/services/experiments/index.js +20 -0
  158. package/dist/services/experiments/index.js.map +1 -0
  159. package/dist/services/experiments/results.d.ts +20 -0
  160. package/dist/services/experiments/results.js +91 -0
  161. package/dist/services/experiments/results.js.map +1 -0
  162. package/dist/services/experiments/stats.d.ts +12 -0
  163. package/dist/services/experiments/stats.js +62 -0
  164. package/dist/services/experiments/stats.js.map +1 -0
  165. package/dist/services/funnels/compute.d.ts +15 -0
  166. package/dist/services/funnels/compute.js +68 -0
  167. package/dist/services/funnels/compute.js.map +1 -0
  168. package/dist/services/funnels/index.d.ts +2 -0
  169. package/dist/services/funnels/index.js +19 -0
  170. package/dist/services/funnels/index.js.map +1 -0
  171. package/dist/services/funnels/results.d.ts +14 -0
  172. package/dist/services/funnels/results.js +72 -0
  173. package/dist/services/funnels/results.js.map +1 -0
  174. package/dist/services/geoip.d.ts +3 -0
  175. package/dist/services/geoip.js +38 -0
  176. package/dist/services/geoip.js.map +1 -0
  177. package/dist/services/heatmap.d.ts +10 -0
  178. package/dist/services/heatmap.js +180 -0
  179. package/dist/services/heatmap.js.map +1 -0
  180. package/dist/services/index.d.ts +26 -0
  181. package/dist/services/index.js +43 -0
  182. package/dist/services/index.js.map +1 -0
  183. package/dist/services/ingest-guard.d.ts +11 -0
  184. package/dist/services/ingest-guard.js +44 -0
  185. package/dist/services/ingest-guard.js.map +1 -0
  186. package/dist/services/keyed-queue.d.ts +4 -0
  187. package/dist/services/keyed-queue.js +19 -0
  188. package/dist/services/keyed-queue.js.map +1 -0
  189. package/dist/services/origin-guard.d.ts +5 -0
  190. package/dist/services/origin-guard.js +43 -0
  191. package/dist/services/origin-guard.js.map +1 -0
  192. package/dist/services/period.d.ts +2 -0
  193. package/dist/services/period.js +19 -0
  194. package/dist/services/period.js.map +1 -0
  195. package/dist/services/prune.d.ts +7 -0
  196. package/dist/services/prune.js +49 -0
  197. package/dist/services/prune.js.map +1 -0
  198. package/dist/services/query-param.d.ts +1 -0
  199. package/dist/services/query-param.js +11 -0
  200. package/dist/services/query-param.js.map +1 -0
  201. package/dist/services/request-body.d.ts +2 -0
  202. package/dist/services/request-body.js +41 -0
  203. package/dist/services/request-body.js.map +1 -0
  204. package/dist/services/request-meta.d.ts +3 -0
  205. package/dist/services/request-meta.js +19 -0
  206. package/dist/services/request-meta.js.map +1 -0
  207. package/dist/services/rollup-write.d.ts +4 -0
  208. package/dist/services/rollup-write.js +84 -0
  209. package/dist/services/rollup-write.js.map +1 -0
  210. package/dist/services/sessionize.d.ts +23 -0
  211. package/dist/services/sessionize.js +78 -0
  212. package/dist/services/sessionize.js.map +1 -0
  213. package/dist/services/settings.d.ts +6 -0
  214. package/dist/services/settings.js +113 -0
  215. package/dist/services/settings.js.map +1 -0
  216. package/dist/services/snapshots.d.ts +24 -0
  217. package/dist/services/snapshots.js +139 -0
  218. package/dist/services/snapshots.js.map +1 -0
  219. package/dist/services/tenant-funnel.d.ts +3 -0
  220. package/dist/services/tenant-funnel.js +17 -0
  221. package/dist/services/tenant-funnel.js.map +1 -0
  222. package/dist/services/tenant-website.d.ts +5 -0
  223. package/dist/services/tenant-website.js +34 -0
  224. package/dist/services/tenant-website.js.map +1 -0
  225. package/dist/services/url.d.ts +10 -0
  226. package/dist/services/url.js +81 -0
  227. package/dist/services/url.js.map +1 -0
  228. package/dist/services/user-agent.d.ts +2 -0
  229. package/dist/services/user-agent.js +17 -0
  230. package/dist/services/user-agent.js.map +1 -0
  231. package/dist/services/visitor-id.d.ts +1 -0
  232. package/dist/services/visitor-id.js +19 -0
  233. package/dist/services/visitor-id.js.map +1 -0
  234. package/dist/services/website-cache.d.ts +3 -0
  235. package/dist/services/website-cache.js +22 -0
  236. package/dist/services/website-cache.js.map +1 -0
  237. package/dist/types/constants.d.ts +74 -0
  238. package/dist/types/constants.js +79 -0
  239. package/dist/types/constants.js.map +1 -0
  240. package/dist/types/events.d.ts +114 -0
  241. package/dist/types/events.js +29 -0
  242. package/dist/types/events.js.map +1 -0
  243. package/dist/types/index.d.ts +5 -0
  244. package/dist/types/index.js +22 -0
  245. package/dist/types/index.js.map +1 -0
  246. package/dist/types/settings.d.ts +67 -0
  247. package/dist/types/settings.js +58 -0
  248. package/dist/types/settings.js.map +1 -0
  249. package/dist/types/snapshots.d.ts +95 -0
  250. package/dist/types/snapshots.js +41 -0
  251. package/dist/types/snapshots.js.map +1 -0
  252. package/dist/types/statistics.d.ts +38 -0
  253. package/dist/types/statistics.js +33 -0
  254. package/dist/types/statistics.js.map +1 -0
  255. package/dist/utils/experiment-type.d.ts +52 -0
  256. package/dist/utils/experiment-type.js +94 -0
  257. package/dist/utils/experiment-type.js.map +1 -0
  258. package/dist/utils/funnel-steps-type.d.ts +42 -0
  259. package/dist/utils/funnel-steps-type.js +62 -0
  260. package/dist/utils/funnel-steps-type.js.map +1 -0
  261. package/frontend-vue/.editorconfig +12 -0
  262. package/frontend-vue/.prettierrc +7 -0
  263. package/frontend-vue/app/components/CampaignsView.vue +330 -0
  264. package/frontend-vue/app/components/ExperimentInput.vue +128 -0
  265. package/frontend-vue/app/components/FunnelDetail.vue +1026 -0
  266. package/frontend-vue/app/components/FunnelStepsInput.vue +154 -0
  267. package/frontend-vue/app/components/FunnelsView.vue +493 -0
  268. package/frontend-vue/app/components/HeatmapCanvas.vue +116 -0
  269. package/frontend-vue/app/components/NoWebsiteState.vue +18 -0
  270. package/frontend-vue/app/components/OverviewView.vue +493 -0
  271. package/frontend-vue/app/components/PagePreview.vue +915 -0
  272. package/frontend-vue/app/components/PagesView.vue +378 -0
  273. package/frontend-vue/app/components/ScrollDepthOverlay.vue +158 -0
  274. package/frontend-vue/app/components/TextKpiCard.vue +28 -0
  275. package/frontend-vue/app/components/TopListTabsCard.vue +162 -0
  276. package/frontend-vue/app/components/TrackerSnippet.vue +31 -0
  277. package/frontend-vue/app/components/VariationsInput.vue +164 -0
  278. package/frontend-vue/app/composables/useChildId.ts +13 -0
  279. package/frontend-vue/app/composables/useExperiment.ts +59 -0
  280. package/frontend-vue/app/composables/useFunnelSteps.ts +25 -0
  281. package/frontend-vue/app/composables/useLatestRequest.ts +90 -0
  282. package/frontend-vue/app/composables/useMarketingApi.ts +420 -0
  283. package/frontend-vue/app/composables/useMarketingPeriod.ts +66 -0
  284. package/frontend-vue/app/composables/useMarketingRoutes.ts +51 -0
  285. package/frontend-vue/app/composables/useMarketingWebsiteForm.ts +69 -0
  286. package/frontend-vue/app/composables/useMarketingWebsites.ts +80 -0
  287. package/frontend-vue/app/composables/useSnapshotFrame.ts +183 -0
  288. package/frontend-vue/app/plugins/funnel-steps-data-type.client.ts +46 -0
  289. package/frontend-vue/app/utils/dmsComponent.ts +18 -0
  290. package/frontend-vue/app/utils/heatmapPalette.ts +41 -0
  291. package/frontend-vue/app/utils/snapshotViewportUnits.ts +63 -0
  292. package/frontend-vue/dms.frontend.ts +35 -0
  293. package/frontend-vue/eslint.config.mjs +16 -0
  294. package/frontend-vue/i18n/locales/marketing-en-GB.json +382 -0
  295. package/frontend-vue/i18n/locales/marketing-fr-FR.json +382 -0
  296. package/frontend-vue/package.json +30 -0
  297. package/frontend-vue/pnpm-lock.yaml +5226 -0
  298. package/frontend-vue/pnpm-workspace.yaml +2 -0
  299. package/frontend-vue/tests/drafts.test.ts +54 -0
  300. package/frontend-vue/tests/i18n.test.ts +86 -0
  301. package/frontend-vue/tests/period.test.ts +35 -0
  302. package/frontend-vue/tests/registration.test.ts +63 -0
  303. package/frontend-vue/tests/routes.test.ts +31 -0
  304. package/frontend-vue/tests/stubs/frontend-module.ts +56 -0
  305. package/frontend-vue/vitest.config.ts +20 -0
  306. package/package.json +91 -0
  307. package/static/snapshot.js +497 -0
  308. package/static/tracker.js +503 -0
@@ -0,0 +1,382 @@
1
+ {
2
+ "page": {
3
+ "marketing": {
4
+ "category_name": "Marketing",
5
+ "errors": {
6
+ "invalid_body": "The request body is not valid JSON.",
7
+ "invalid_steps": "Invalid funnel steps: check each step's kind and value — 1 to 10 steps.",
8
+ "invalid_website": "Invalid website details: check the name, the domain and the extra domains.",
9
+ "invalid_settings": "Invalid settings: check that every value is within its allowed range.",
10
+ "website_not_found": "This website does not exist, or belongs to another workspace.",
11
+ "funnel_not_found": "This funnel no longer exists.",
12
+ "missing_path": "A page path is required.",
13
+ "invalid_variations": "Invalid variations: 2 to 8 arms, unique lowercase keys, non-negative weights with a positive total.",
14
+ "invalid_experiment_key": "Invalid experiment key: lowercase letters, digits, hyphens and underscores only.",
15
+ "duplicate_experiment_key": "Another experiment on this website already uses this key.",
16
+ "experiment_locked": "Only the name, the steps, the window and the status can change once the A/B split has left draft.",
17
+ "invalid_status_transition": "This status change is not allowed: draft goes to running, running goes to stopped."
18
+ },
19
+ "overview": {
20
+ "title": "Overview",
21
+ "subtitle": "Traffic, acquisition and engagement across your tracked sites.",
22
+ "description": "Marketing analytics — traffic, funnels and retention.",
23
+ "empty": {
24
+ "title": "No website tracked yet",
25
+ "description": "Add a website, then embed the tracker snippet on the site to start collecting."
26
+ },
27
+ "error": {
28
+ "title": "Overview unavailable",
29
+ "description": "Loading the marketing data failed. The collected data is unaffected."
30
+ },
31
+ "retry": "Retry",
32
+ "kpis": {
33
+ "pageviews": "Pageviews",
34
+ "sessions": "Sessions",
35
+ "new_visitors": "New visitors",
36
+ "custom_events": "Custom events",
37
+ "bounce_rate": "Bounce rate",
38
+ "avg_session_duration": "Avg. session duration",
39
+ "pages_per_session": "Pages / session"
40
+ },
41
+ "traffic": {
42
+ "title": "Traffic",
43
+ "subtitle": "Pageviews and sessions per day",
44
+ "pageviews": "Pageviews",
45
+ "sessions": "Sessions",
46
+ "empty": "No traffic recorded in this period."
47
+ },
48
+ "devices": {
49
+ "title": "Devices",
50
+ "empty": "No device data in this period."
51
+ },
52
+ "groups": {
53
+ "empty": "Nothing recorded in this period.",
54
+ "content": {
55
+ "title": "Content",
56
+ "view_all": "View tracked pages",
57
+ "tabs": {
58
+ "pages": "Top pages",
59
+ "entry": "Entries",
60
+ "exit": "Exits"
61
+ }
62
+ },
63
+ "acquisition": {
64
+ "title": "Acquisition",
65
+ "view_all": "View sources",
66
+ "tabs": {
67
+ "channels": "Channels",
68
+ "referrers": "Referrers"
69
+ }
70
+ },
71
+ "audience": {
72
+ "title": "Audience",
73
+ "tabs": {
74
+ "browsers": "Browsers",
75
+ "languages": "Languages",
76
+ "countries": "Countries"
77
+ }
78
+ },
79
+ "events": {
80
+ "title": "Events",
81
+ "view_all": "View funnels"
82
+ }
83
+ }
84
+ },
85
+ "campaigns": {
86
+ "title": "Sources",
87
+ "description": "Acquisition channels and UTM campaigns of your tracked sites.",
88
+ "subtitle": "Where sessions come from: channels and UTM campaigns.",
89
+ "empty": {
90
+ "title": "No website tracked yet",
91
+ "description": "Add a website, then embed the tracker snippet on the site to start collecting."
92
+ },
93
+ "error": {
94
+ "title": "Sources unavailable",
95
+ "description": "Loading the acquisition data failed. The collected data is unaffected."
96
+ },
97
+ "retry": "Retry",
98
+ "channels": {
99
+ "title": "Channels",
100
+ "subtitle": "Sessions by acquisition channel",
101
+ "empty": "No channel data in this period.",
102
+ "direct": "Direct",
103
+ "organic": "Organic search",
104
+ "social": "Social",
105
+ "referral": "Referral",
106
+ "paid": "Paid"
107
+ },
108
+ "table": {
109
+ "title": "UTM campaigns",
110
+ "subtitle": "Sessions by source, medium and campaign",
111
+ "source": "Source",
112
+ "medium": "Medium",
113
+ "campaign": "Campaign",
114
+ "sessions": "Sessions",
115
+ "search_placeholder": "Filter campaigns…",
116
+ "empty": "No UTM-tagged session in this period.",
117
+ "truncated": "Only the top campaigns are shown — narrow the filter to see the rest."
118
+ },
119
+ "top": {
120
+ "referrers": "Top referrers",
121
+ "terms": "Top UTM terms",
122
+ "contents": "Top UTM contents",
123
+ "empty": "Nothing recorded in this period."
124
+ }
125
+ },
126
+ "pages": {
127
+ "title": "Tracked pages",
128
+ "subtitle": "Pages your visitors actually loaded, where they clicked, and how far they scrolled.",
129
+ "description": "Tracked pages — visited paths, clicks and scroll depth of each one.",
130
+ "inventory": "Pages",
131
+ "search_placeholder": "Filter, or type a path…",
132
+ "row_hint": {
133
+ "views": "{count} view | {count} views",
134
+ "sampled": "~{count} sampled | ~{count} sampled"
135
+ },
136
+ "select_hint": "Select a page to see its clicks and scroll depth.",
137
+ "to_funnels": "Funnels",
138
+ "clicks": "{count} click | {count} clicks",
139
+ "pageviews": "{count} view | {count} views",
140
+ "overlay": {
141
+ "clicks": "Clicks",
142
+ "scroll": "Scroll"
143
+ },
144
+ "scroll": {
145
+ "views": "{count} scrolled view | {count} scrolled views",
146
+ "truncated": "Partial scroll depth",
147
+ "truncated_hint": "This page recorded more scrolls than one read walks through. Narrow the period to see them all.",
148
+ "reach_line": "{percent}% of visitors see down to here",
149
+ "fold_line": "Bottom of the first screen"
150
+ },
151
+ "error": "Loading the tracked pages failed.",
152
+ "error_hint": "The collected data is unaffected.",
153
+ "retry": "Retry",
154
+ "truncated": "Partial heatmap",
155
+ "truncated_hint": "This page recorded more clicks than one heatmap reads. Narrow the period to see them all.",
156
+ "list_truncated": "Long inventory",
157
+ "list_truncated_hint": "More pages were visited than this list shows. Filter to reach the rest.",
158
+ "no_website": {
159
+ "title": "No website tracked yet",
160
+ "description": "Add a website, then embed the tracker snippet on the site to start collecting."
161
+ },
162
+ "no_pages": {
163
+ "title": "No page visited in this period",
164
+ "description": "Nothing was recorded for this site over the selected window. You can still type a path to inspect it."
165
+ },
166
+ "tracking_off": {
167
+ "title": "Collection is disabled",
168
+ "description": "The tracker is switched off in the module settings: nothing new is being recorded, no page snapshot either."
169
+ },
170
+ "empty": {
171
+ "title": "No click recorded on this page",
172
+ "no_clicks": "Visitors loaded this page but no click was captured over the selected period.",
173
+ "scroll_title": "No scroll measured on this page",
174
+ "no_scrolls": "Visitors loaded this page but no depth was measured over the selected period — a page that fits the screen never scrolls, so it measures nothing.",
175
+ "sampled_out": "Clicks and scrolls are sampled on {rate}% of page loads, and this page is too quiet for that rate to have caught any. Raise the sampling in the settings, or widen the period.",
176
+ "tracking_off": "Collection is disabled in the module settings, so no click or scroll is being recorded."
177
+ },
178
+ "preview": {
179
+ "snapshots_off": "Page snapshots are off for this site",
180
+ "snapshots_off_hint": "Clicks and scrolls are still counted, but the heatmap is only drawn over a snapshot of the page as visitors see it: its text and images are then stored, every form field masked, for the snapshot retention set in the module settings. Enable it if that fits this site's privacy commitments.",
181
+ "enable_snapshots": "Enable page snapshots",
182
+ "no_snapshot": "No snapshot of this page yet",
183
+ "no_snapshot_hint": "The next sampled visit captures one — snapshots share the {rate}% click sampling — and it is refreshed daily. The heatmap is drawn as soon as it exists; the figures above are already exact.",
184
+ "approximate_layout": "Snapshot from another layout",
185
+ "approximate_layout_hint": "No visitor has been captured at this width yet, so the {layout} snapshot is reflowed here. Anchored clicks still land on their element.",
186
+ "too_heavy": "Page too heavy to capture",
187
+ "too_heavy_hint": "The last sampled visit serialised {size} MiB of HTML and CSS, past the {limit} MiB upload cap, so this page has no backdrop. The click and scroll figures above are unaffected. A visit retries daily: lighter markup — or a heavy section marked data-dms-marketing-block — brings it under the cap.",
188
+ "captured_at": "snapshot from {date}",
189
+ "attempted_at": "capture attempted {date}",
190
+ "options": "Snapshot options",
191
+ "snapshots_enabled": "Page snapshots",
192
+ "snapshots_enabled_hint": "Capture the page as visitors see it, to draw the heatmap over it. Stores page content; changing this discards the site's snapshots.",
193
+ "mask_text": "Mask all text",
194
+ "mask_text_hint": "Replace every character of captured text with a placeholder. Form fields are always masked.",
195
+ "options_error": "Saving the snapshot options failed. Retry in a moment.",
196
+ "overflow": "Page wider than the chosen layout",
197
+ "overflow_hint": "The snapshot lays out at {width}px. The overlay follows the document, so it stays aligned; the backdrop may be cut off.",
198
+ "layout_desktop": "Desktop",
199
+ "layout_tablet": "Tablet (portrait)",
200
+ "layout_phone": "Phone",
201
+ "height_override": "Render height (px)",
202
+ "open_in_tab": "Open",
203
+ "oversized": "Page too tall to preview accurately",
204
+ "oversized_hint": "The document exceeds the largest surface that can be drawn, so the overlay and the backdrop no longer line up. The click figures are unaffected."
205
+ },
206
+ "reset": {
207
+ "page_button": "Reset this page's heatmap",
208
+ "site_button": "Reset heatmaps",
209
+ "page_title": "Reset this page's heatmap?",
210
+ "page_description": "Every click and scroll depth recorded on {path} will be deleted, whatever the period — useful after the page changed. Pageviews, sessions and funnels are unaffected.",
211
+ "site_title": "Reset every heatmap of this site?",
212
+ "site_description": "Every click and scroll depth recorded on {name} will be deleted, on every page and whatever the period. Pageviews, sessions and funnels are unaffected.",
213
+ "confirm": "Delete the data",
214
+ "done": "{count} event deleted | {count} events deleted",
215
+ "error": "Resetting the heatmap failed. Retry in a moment."
216
+ }
217
+ },
218
+ "funnels": {
219
+ "title": "Funnels & A/B",
220
+ "description": "Conversion funnels — where visitors drop off, step by step — and the A/B splits scored against them.",
221
+ "subtitle": "Where visitors drop off, and which variation converts.",
222
+ "list": "Funnels",
223
+ "summary": "{entered} session entered · {rate}% converted | {entered} sessions entered · {rate}% converted",
224
+ "lost": "{count} session lost | {count} sessions lost",
225
+ "retained": "retained",
226
+ "sessions": "sessions",
227
+ "goal_suffix": "goal",
228
+ "select_hint": "Select a funnel to see its figure.",
229
+ "see_heatmap": "See the clicks on this page",
230
+ "results_error": "Loading the funnel results failed.",
231
+ "error": "Loading the funnels failed.",
232
+ "error_hint": "The collected data is not affected.",
233
+ "retry": "Retry",
234
+ "no_website": {
235
+ "title": "No website tracked yet",
236
+ "description": "Add a website, then embed the tracker snippet on the site to start collecting."
237
+ },
238
+ "empty": {
239
+ "title": "No funnel on this site yet",
240
+ "description": "Create your first funnel: each step is a page URL or a custom event, matched in order within a session. Split it into A/B variations whenever you want to test a change against it."
241
+ },
242
+ "no_sessions": {
243
+ "title": "No session entered this funnel",
244
+ "description": "No session matched the first step over the selected period."
245
+ },
246
+ "new": "New funnel",
247
+ "create_title": "Create a funnel",
248
+ "edit_title": "Edit the funnel",
249
+ "edit": "Edit",
250
+ "start": "Start",
251
+ "stop": {
252
+ "button": "Stop",
253
+ "title": "Stop this split?",
254
+ "description": "Every visitor goes back to the control variation within a minute, pages already open at their next reload. Measurement stops and the results stay readable.",
255
+ "confirm": "Stop"
256
+ },
257
+ "resume": {
258
+ "button": "Resume",
259
+ "title": "Resume this split?",
260
+ "description": "The split resumes with the same variations and keeps the sessions already exposed; resuming to get another verdict can increase false positives.",
261
+ "confirm": "Resume"
262
+ },
263
+ "more_actions": "More actions",
264
+ "locked_hint": "Key and variations are frozen outside draft — weights moved mid-run would silently reassign visitors.",
265
+ "status_updated": "Status updated.",
266
+ "status_error": "The status change was refused.",
267
+ "delete": {
268
+ "button": "Delete",
269
+ "title": "Delete this funnel?",
270
+ "description": "“{name}” and its figure will disappear. The collected events and exposures stay until their retention passes.",
271
+ "confirm": "Delete",
272
+ "done": "Funnel deleted.",
273
+ "error": "The deletion failed."
274
+ },
275
+ "steps_count": "{count} step | {count} steps",
276
+ "variations_count": "{count} variation | {count} variations",
277
+ "status": {
278
+ "draft": "Draft",
279
+ "running": "Running",
280
+ "stopped": "Stopped"
281
+ },
282
+ "step_kind": {
283
+ "url": "page view",
284
+ "custom": "event"
285
+ },
286
+ "column": {
287
+ "website": "Website",
288
+ "name": "Name",
289
+ "created": "Created"
290
+ },
291
+ "form": {
292
+ "name": "Funnel name",
293
+ "steps": "Steps",
294
+ "steps_description": "Each step is a page URL or a custom event, matched in order within a session — a single step counts conversions on its own.",
295
+ "url_placeholder": "/pricing",
296
+ "event_placeholder": "signup_submitted",
297
+ "add_step": "Add a step",
298
+ "window": "Conversion window (hours)",
299
+ "experiment": "A/B split",
300
+ "experiment_description": "Serve variations of the page to visitors, assigned server-side, and score each arm against the steps above.",
301
+ "experiment_toggle": "Split traffic between variations",
302
+ "key_label": "Experiment key",
303
+ "key": "hero-cta",
304
+ "key_description": "The identifier page code passes to dmsMarketing.variation(…). Lowercase letters, digits, hyphens and underscores.",
305
+ "variations": "Variations",
306
+ "variations_description": "2 to 8 arms with relative weights; the first arm is the control.",
307
+ "variation_key": "variation-key",
308
+ "add_variation": "Add a variation"
309
+ },
310
+ "results": {
311
+ "control": "control",
312
+ "arm_control": "control {letter}",
313
+ "arm_variation": "variation {letter}",
314
+ "end_to_end": "{value} end to end",
315
+ "exposed": "{count} exposed session | {count} exposed sessions",
316
+ "meta_frozen": "{split} split, frozen",
317
+ "meta_draft": "{split} split · no traffic assigned yet",
318
+ "window_running": "running since {since}",
319
+ "window_stopped": "run {since} – {until}",
320
+ "window_runs": "{count} run | {count} runs",
321
+ "verdict": {
322
+ "lift": "Relative lift",
323
+ "confidence": "Confidence",
324
+ "sessions": "Sessions"
325
+ },
326
+ "reached_goal": "{count} session reached the goal | {count} sessions reached the goal",
327
+ "significant": "Significant at 95%",
328
+ "not_significant": "Not significant",
329
+ "insufficient": "Not enough data",
330
+ "insufficient_data": {
331
+ "title": "Not enough data yet",
332
+ "description": "Too few sessions to compare the arms — rates on a sample this thin would be noise, not signal. Raw counts below; verdicts appear once every arm has enough outcomes."
333
+ },
334
+ "srm_warning": {
335
+ "title": "Sample ratio mismatch",
336
+ "description": "The observed split across arms is far from the configured weights — assignment or exposure reporting may be broken; read these numbers with suspicion."
337
+ },
338
+ "truncated": {
339
+ "title": "Window truncated",
340
+ "description": "The raw-event window hit its cap: numbers cover the oldest part of the period only, and A/B verdicts are withheld."
341
+ },
342
+ "empty": {
343
+ "title": "No exposure yet",
344
+ "description": "No session was exposed to this experiment while it was running. Its numbers are read over its own run, not over the selected period."
345
+ }
346
+ }
347
+ },
348
+ "settings": {
349
+ "title": "Settings",
350
+ "description": "Collection, retention and sampling configuration.",
351
+ "tracker_enabled": "Collection enabled",
352
+ "tracker_enabled_description": "Master switch for the collect endpoint and the served tracker script.",
353
+ "raw_retention": "Raw events retention (days)",
354
+ "raw_retention_description": "How long raw events are kept. Funnels and heatmaps read this window; dashboards use the daily rollups.",
355
+ "stats_retention": "Statistics retention (days)",
356
+ "stats_retention_description": "How long daily rollups and sessions are kept. Capped at 760 days (25 months, the usual audience-measurement ceiling).",
357
+ "heatmap_sample": "Heatmap sampling (%)",
358
+ "heatmap_sample_description": "Share of visits capturing click and scroll positions. Lower it on high-traffic sites.",
359
+ "snapshot_retention": "Page snapshot retention (days)",
360
+ "snapshot_retention_description": "How long a captured page rendering is kept as a heatmap backdrop. Snapshots hold page content; never kept longer than the raw events."
361
+ },
362
+ "websites": {
363
+ "column": {
364
+ "name": "Name",
365
+ "domain": "Domain"
366
+ },
367
+ "create": "Add a website",
368
+ "create_title": "New website",
369
+ "form": {
370
+ "name": "Main site",
371
+ "domain": "example.com",
372
+ "domain_description": "The site's apex domain, without scheme (example.com). Its subdomains are accepted as they are; other hosts — a staging host, another TLD — are added through the API's extraDomains."
373
+ },
374
+ "snippet": {
375
+ "button": "Tracker snippet",
376
+ "title": "Install the tracker",
377
+ "description": "Add this tag to every page of {name}, right before the closing body tag or inside head. It is the same for every page of the site."
378
+ }
379
+ }
380
+ }
381
+ }
382
+ }