ghost 6.0.10 → 6.1.0

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 (50) hide show
  1. package/components/tryghost-i18n-6.1.0.tgz +0 -0
  2. package/core/built/admin/assets/admin-x-activitypub/admin-x-activitypub.js +1 -1
  3. package/core/built/admin/assets/admin-x-activitypub/{index-wBqnq7A5.mjs → index-DmCoswaX.mjs} +2 -2
  4. package/core/built/admin/assets/admin-x-activitypub/{index-XhNX0QuF.mjs → index-lT95Q15h.mjs} +8212 -8183
  5. package/core/built/admin/assets/admin-x-settings/{CodeEditorView-BDBDWpWl.mjs → CodeEditorView-Bu9qXr9c.mjs} +2 -2
  6. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
  7. package/core/built/admin/assets/admin-x-settings/{index-BB7hgOf0.mjs → index-BEpRBH9g.mjs} +2 -2
  8. package/core/built/admin/assets/admin-x-settings/{index-DsbJfrQ7.mjs → index-qEdfz2hd.mjs} +94 -94
  9. package/core/built/admin/assets/admin-x-settings/{modals-CCpr5VWU.mjs → modals-BtQORnS4.mjs} +6 -6
  10. package/core/built/admin/assets/{chunk.524.695215c994f8cbf547d3.js → chunk.524.2aa0847042f20c9a2a00.js} +7 -7
  11. package/core/built/admin/assets/{chunk.582.a949b80543caba37906c.js → chunk.582.9182c19afab95991771e.js} +8 -8
  12. package/core/built/admin/assets/ghost-791574a9e2efe65c88412947d2e80170.css +1 -0
  13. package/core/built/admin/assets/{ghost-9c608430440a10746540adb7d2cd0f31.js → ghost-9c47d152972b304cab0fb982dc3fccc1.js} +38 -34
  14. package/core/built/admin/assets/ghost-dark-1a7d101d525c0fdcf406ac0abd98540f.css +1 -0
  15. package/core/built/admin/assets/posts/posts.js +27345 -27315
  16. package/core/built/admin/assets/stats/stats.js +28699 -28672
  17. package/core/built/admin/index.html +4 -4
  18. package/core/frontend/public/member-attribution.min.js +1 -1
  19. package/core/server/api/endpoints/search-index.js +2 -2
  20. package/core/server/api/endpoints/stats.js +10 -4
  21. package/core/server/data/migrations/versions/6.1/2025-09-11-00-38-13-add-uuid-column-to-tokens.js +8 -0
  22. package/core/server/data/migrations/versions/6.1/2025-09-11-00-39-08-backfill-tokens-uuid.js +19 -0
  23. package/core/server/data/migrations/versions/6.1/2025-09-11-00-39-36-tokens-drop-nullable-uuid.js +4 -0
  24. package/core/server/data/schema/schema.js +1 -0
  25. package/core/server/data/tinybird/datasources/_mv_hits.datasource +7 -4
  26. package/core/server/data/tinybird/endpoints/api_top_utm_campaigns.pipe +2 -8
  27. package/core/server/data/tinybird/endpoints/api_top_utm_contents.pipe +2 -8
  28. package/core/server/data/tinybird/endpoints/api_top_utm_mediums.pipe +2 -8
  29. package/core/server/data/tinybird/endpoints/api_top_utm_sources.pipe +2 -8
  30. package/core/server/data/tinybird/endpoints/api_top_utm_terms.pipe +2 -8
  31. package/core/server/data/tinybird/fixtures/analytics_events.ndjson +11 -11
  32. package/core/server/data/tinybird/pipes/mv_hits.pipe +12 -2
  33. package/core/server/data/tinybird/pipes/mv_session_data.pipe +16 -6
  34. package/core/server/data/tinybird/tests/api_top_utm_campaigns.yaml +35 -34
  35. package/core/server/data/tinybird/tests/api_top_utm_contents.yaml +57 -48
  36. package/core/server/data/tinybird/tests/api_top_utm_mediums.yaml +40 -38
  37. package/core/server/data/tinybird/tests/api_top_utm_sources.yaml +59 -39
  38. package/core/server/data/tinybird/tests/api_top_utm_terms.yaml +55 -48
  39. package/core/server/models/single-use-token.js +1 -0
  40. package/core/server/services/email-service/EmailRenderer.js +1 -0
  41. package/core/server/services/email-service/email-templates/template.hbs +6 -0
  42. package/core/server/services/members/emails/signin.js +4 -4
  43. package/core/server/services/stats/MrrStatsService.js +10 -5
  44. package/core/server/services/stats/StatsService.js +2 -2
  45. package/package.json +6 -6
  46. package/tsconfig.tsbuildinfo +1 -1
  47. package/yarn.lock +1002 -419
  48. package/components/tryghost-i18n-6.0.10.tgz +0 -0
  49. package/core/built/admin/assets/ghost-a7a53bf80dc45c37ae9c174a0d02a882.css +0 -1
  50. package/core/built/admin/assets/ghost-dark-6e0062029f988d8676e87f22d8e7f4a3.css +0 -1
@@ -6,7 +6,7 @@
6
6
  <title>Ghost</title>
7
7
 
8
8
 
9
- <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.0%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%2237bd1e3e4d%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%22b272efcbc4%22%2C%22adminXActivitypubFilename%22%3A%22admin-x-activitypub.js%22%2C%22adminXActivitypubHash%22%3A%2258c4bfa71b%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%22336ecd7f7c%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%22a2e0991d78%22%2C%22adminXActivitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D" />
9
+ <meta name="ghost-admin/config/environment" content="%7B%22modulePrefix%22%3A%22ghost-admin%22%2C%22environment%22%3A%22production%22%2C%22cdnUrl%22%3A%22%22%2C%22editorUrl%22%3A%22%22%2C%22rootURL%22%3A%22%22%2C%22locationType%22%3A%22trailing-hash%22%2C%22EmberENV%22%3A%7B%22FEATURES%22%3A%7B%7D%2C%22EXTEND_PROTOTYPES%22%3A%7B%22Date%22%3Afalse%2C%22Array%22%3Atrue%2C%22String%22%3Atrue%2C%22Function%22%3Afalse%7D%2C%22_APPLICATION_TEMPLATE_WRAPPER%22%3Afalse%2C%22_JQUERY_INTEGRATION%22%3Atrue%2C%22_TEMPLATE_ONLY_GLIMMER_COMPONENTS%22%3Atrue%7D%2C%22APP%22%3A%7B%22version%22%3A%226.1%22%2C%22name%22%3A%22ghost-admin%22%7D%2C%22ember-simple-auth%22%3A%7B%7D%2C%22%40sentry%2Fember%22%3A%7B%22disablePerformance%22%3Atrue%2C%22sentry%22%3A%7B%7D%7D%2C%22ember-cli-mirage%22%3A%7B%22usingProxy%22%3Afalse%2C%22useDefaultPassthroughs%22%3Atrue%7D%2C%22exportApplicationGlobal%22%3Afalse%2C%22ember-load%22%3A%7B%22loadingIndicatorClass%22%3A%22ember-load-indicator%22%7D%2C%22editorFilename%22%3A%22koenig-lexical.umd.js%22%2C%22editorHash%22%3A%2237bd1e3e4d%22%2C%22adminXSettingsFilename%22%3A%22admin-x-settings.js%22%2C%22adminXSettingsHash%22%3A%229c120d864e%22%2C%22adminXActivitypubFilename%22%3A%22admin-x-activitypub.js%22%2C%22adminXActivitypubHash%22%3A%22d668621a75%22%2C%22postsFilename%22%3A%22posts.js%22%2C%22postsHash%22%3A%2285275dce41%22%2C%22statsFilename%22%3A%22stats.js%22%2C%22statsHash%22%3A%2231e7d6e61e%22%2C%22adminXActivitypubRemoteConfigUrl%22%3A%22%2F.ghost%2Factivitypub%2Fstable%2Fclient-config%22%7D" />
10
10
 
11
11
  <meta name="viewport" content="user-scalable=no, width=device-width, initial-scale=1, maximum-scale=1, minimal-ui, viewport-fit=cover" />
12
12
  <meta name="pinterest" content="nopin" />
@@ -28,7 +28,7 @@
28
28
  </style>
29
29
 
30
30
  <link integrity="" rel="stylesheet" href="assets/vendor-0ede59da8efb5e28fa929557f7ff7154.css">
31
- <link integrity="" rel="stylesheet" href="assets/ghost-a7a53bf80dc45c37ae9c174a0d02a882.css" title="light">
31
+ <link integrity="" rel="stylesheet" href="assets/ghost-791574a9e2efe65c88412947d2e80170.css" title="light">
32
32
 
33
33
 
34
34
  </head>
@@ -49,7 +49,7 @@
49
49
 
50
50
  <script src="assets/vendor-aed0068cf9b67d042dd23a6343545b7b.js"></script>
51
51
  <script src="assets/chunk.397.e5d027e53a68dff31d76.js"></script>
52
- <script src="assets/chunk.524.695215c994f8cbf547d3.js"></script>
53
- <script src="assets/ghost-9c608430440a10746540adb7d2cd0f31.js"></script>
52
+ <script src="assets/chunk.524.2aa0847042f20c9a2a00.js"></script>
53
+ <script src="assets/ghost-9c47d152972b304cab0fb982dc3fccc1.js"></script>
54
54
  </body>
55
55
  </html>
@@ -1 +1 @@
1
- "use strict";(()=>{var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var M=(e,r)=>()=>(e&&(r=e(e=0)),r);var _=(e,r)=>{for(var u in r)m(e,u,{get:r[u],enumerable:!0})},P=(e,r,u,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of S(r))!R.call(e,o)&&o!==u&&m(e,o,{get:()=>r[o],enumerable:!(t=y(r,o))||t.enumerable});return e};var T=e=>P(m({},"__esModule",{value:!0}),e);var g={};_(g,{getReferrer:()=>A,parseReferrerData:()=>h});function U(e){let r=e.get("ref"),u=e.get("source"),t=e.get("utm_source"),o=e.get("utm_medium"),i=e.get("utm_term"),s=e.get("utm_campaign"),c=e.get("utm_content");return{source:r||u||t||null,medium:o||null,url:window.document.referrer||null,utmSource:t||null,utmMedium:o||null,utmTerm:i||null,utmCampaign:s||null,utmContent:c||null}}function h(e){let r=new URL(e||window.location.href),u=r.searchParams;return r.hash&&r.hash.includes("#/portal")&&(u=new URL(r.href.replace("/#/portal","")).searchParams),U(u)}function C(e){let{source:r,medium:u,url:t}=e,o=r||u||t||null;if(o)try{let i=new URL(o).hostname,s=window.location.hostname;if(i===s)return null}catch{return o}return o}function A(e){let r=h(e);return C(r)}var d=M(()=>{"use strict"});var b=(d(),T(g)),D=b.parseReferrerData,E=b.getReferrer,p="ghost-history",I=24*60*60*1e3,w=15;(async function(){try{let e=window.sessionStorage,r=e.getItem(p),u=new Date().getTime(),t=[];if(r)try{t=JSON.parse(r)}catch(n){console.warn("[Member Attribution] Error while parsing history",n)}let o=t.findIndex(n=>{if(!n.time||typeof n.time!="number")return!1;let a=u-n.time;return!(isNaN(n.time)||a>I)});o>0?t.splice(0,o):o===-1&&(t=[]);let i;try{i=D(window.location.href)}catch(n){console.error("[Member Attribution] Parsing referrer failed",n),i={source:null,medium:null,url:null}}let s={referrerSource:i.source,referrerMedium:i.medium,utmSource:i.utmSource,utmMedium:i.utmMedium,utmCampaign:i.utmCampaign,utmTerm:i.utmTerm,utmContent:i.utmContent},c;try{c=E(window.location.href),!c&&i.url&&(c=i.url)}catch(n){console.error("[Member Attribution] Getting final referrer failed",n),c=i.url}try{let n=new URL(window.location.href),a=n.searchParams;a.get("attribution_id")&&a.get("attribution_type")&&(t.push({time:u,id:a.get("attribution_id"),type:a.get("attribution_type"),...s,referrerUrl:c}),a.delete("attribution_id"),a.delete("attribution_type"),n.search="?"+a.toString(),window.history.replaceState({},"",`${n.pathname}${n.search}${n.hash}`))}catch(n){console.error("[Member Attribution] Parsing attribution from querystring failed",n)}let l=window.location.pathname;if(t.length===0||t[t.length-1].path!==l)t.push({path:l,time:u,...s,referrerUrl:c});else if(t.length>0){let n=t[t.length-1];n.time=u,Object.entries(s).forEach(([a,f])=>{f&&(n[a]=f)}),c&&(n.referrerUrl=c)}t.length>w&&(t=t.slice(-w)),e.setItem(p,JSON.stringify(t))}catch(e){console.error("[Member Attribution] Failed with error",e)}})();})();
1
+ "use strict";(()=>{var m=Object.defineProperty;var y=Object.getOwnPropertyDescriptor;var S=Object.getOwnPropertyNames;var R=Object.prototype.hasOwnProperty;var M=(e,r)=>()=>(e&&(r=e(e=0)),r);var _=(e,r)=>{for(var u in r)m(e,u,{get:r[u],enumerable:!0})},P=(e,r,u,t)=>{if(r&&typeof r=="object"||typeof r=="function")for(let o of S(r))!R.call(e,o)&&o!==u&&m(e,o,{get:()=>r[o],enumerable:!(t=y(r,o))||t.enumerable});return e};var T=e=>P(m({},"__esModule",{value:!0}),e);var g={};_(g,{getReferrer:()=>A,parseReferrerData:()=>h});function U(e){let r=e.get("ref"),u=e.get("source"),t=e.get("utm_source"),o=e.get("utm_medium"),i=e.get("utm_term"),s=e.get("utm_campaign"),c=e.get("utm_content");return{source:r||u||t||null,medium:o||null,url:window.document.referrer||null,utmSource:t||null,utmMedium:o||null,utmTerm:i||null,utmCampaign:s||null,utmContent:c||null}}function h(e){let r=new URL(e||window.location.href),u=r.searchParams;return r.hash&&r.hash.includes("#/portal")&&(u=new URL(r.href.replace("/#/portal","")).searchParams),U(u)}function C(e){let{source:r,medium:u,url:t}=e,o=r||u||t||null;if(o)try{let i=new URL(o).hostname,s=window.location.hostname;if(i===s)return null}catch{return o}return o}function A(e){let r=h(e);return C(r)}var d=M(()=>{"use strict"});var b=(d(),T(g)),D=b.parseReferrerData,E=b.getReferrer,p="ghost-history",I=1440*60*1e3,w=15;(async function(){try{let e=window.sessionStorage,r=e.getItem(p),u=new Date().getTime(),t=[];if(r)try{t=JSON.parse(r)}catch(n){console.warn("[Member Attribution] Error while parsing history",n)}let o=t.findIndex(n=>{if(!n.time||typeof n.time!="number")return!1;let a=u-n.time;return!(isNaN(n.time)||a>I)});o>0?t.splice(0,o):o===-1&&(t=[]);let i;try{i=D(window.location.href)}catch(n){console.error("[Member Attribution] Parsing referrer failed",n),i={source:null,medium:null,url:null}}let s={referrerSource:i.source,referrerMedium:i.medium,utmSource:i.utmSource,utmMedium:i.utmMedium,utmCampaign:i.utmCampaign,utmTerm:i.utmTerm,utmContent:i.utmContent},c;try{c=E(window.location.href),!c&&i.url&&(c=i.url)}catch(n){console.error("[Member Attribution] Getting final referrer failed",n),c=i.url}try{let n=new URL(window.location.href),a=n.searchParams;a.get("attribution_id")&&a.get("attribution_type")&&(t.push({time:u,id:a.get("attribution_id"),type:a.get("attribution_type"),...s,referrerUrl:c}),a.delete("attribution_id"),a.delete("attribution_type"),n.search="?"+a.toString(),window.history.replaceState({},"",`${n.pathname}${n.search}${n.hash}`))}catch(n){console.error("[Member Attribution] Parsing attribution from querystring failed",n)}let l=window.location.pathname;if(t.length===0||t[t.length-1].path!==l)t.push({path:l,time:u,...s,referrerUrl:c});else if(t.length>0){let n=t[t.length-1];n.time=u,Object.entries(s).forEach(([a,f])=>{f&&(n[a]=f)}),c&&(n.referrerUrl=c)}t.length>w&&(t=t.slice(-w)),e.setItem(p,JSON.stringify(t))}catch(e){console.error("[Member Attribution] Failed with error",e)}})();})();
@@ -15,7 +15,7 @@ const controller = {
15
15
  },
16
16
  query() {
17
17
  const options = {
18
- filter: 'type:post',
18
+ filter: 'type:post+status:[draft,published,scheduled,sent]',
19
19
  limit: '10000',
20
20
  order: 'updated_at DESC',
21
21
  columns: ['id', 'url', 'title', 'status', 'published_at', 'visibility']
@@ -34,7 +34,7 @@ const controller = {
34
34
  },
35
35
  query() {
36
36
  const options = {
37
- filter: 'type:page',
37
+ filter: 'type:page+status:[draft,published,scheduled]',
38
38
  limit: '10000',
39
39
  order: 'updated_at DESC',
40
40
  columns: ['id', 'url', 'title', 'status', 'published_at', 'visibility']
@@ -35,14 +35,20 @@ const controller = {
35
35
  docName: 'members',
36
36
  method: 'browse'
37
37
  },
38
+ options: [
39
+ 'date_from'
40
+ ],
38
41
  cache: statsService.cache,
39
- generateCacheKeyData() {
42
+ generateCacheKeyData(frame) {
40
43
  return {
41
- method: 'mrr'
44
+ method: 'mrr',
45
+ options: frame.options
42
46
  };
43
47
  },
44
- async query() {
45
- return await statsService.api.getMRRHistory();
48
+ async query(frame) {
49
+ return await statsService.api.getMRRHistory({
50
+ dateFrom: frame?.options?.date_from
51
+ });
46
52
  }
47
53
  },
48
54
  subscriptions: {
@@ -0,0 +1,8 @@
1
+ const {createAddColumnMigration} = require('../../utils');
2
+
3
+ module.exports = createAddColumnMigration('tokens', 'uuid', {
4
+ type: 'string',
5
+ maxlength: 36,
6
+ nullable: true,
7
+ unique: true
8
+ });
@@ -0,0 +1,19 @@
1
+ const logging = require('@tryghost/logging');
2
+ const crypto = require('crypto');
3
+
4
+ const {createTransactionalMigration} = require('../../utils');
5
+
6
+ module.exports = createTransactionalMigration(
7
+ async function up(knex) {
8
+ const tokensWithoutUUID = await knex.select('id').from('tokens').whereNull('uuid');
9
+
10
+ logging.info(`Adding uuid field value to ${tokensWithoutUUID.length} tokens.`);
11
+
12
+ // eslint-disable-next-line no-restricted-syntax
13
+ for (const token of tokensWithoutUUID) {
14
+ await knex('tokens').update('uuid', crypto.randomUUID()).where('id', token.id);
15
+ }
16
+ },
17
+ // down is a no-op
18
+ async function down() {}
19
+ );
@@ -0,0 +1,4 @@
1
+ const {createDropNullableMigration} = require('../../utils');
2
+
3
+ module.exports = createDropNullableMigration('tokens', 'uuid');
4
+
@@ -896,6 +896,7 @@ module.exports = {
896
896
  tokens: {
897
897
  id: {type: 'string', maxlength: 24, nullable: false, primary: true},
898
898
  token: {type: 'string', maxlength: 32, nullable: false, index: true},
899
+ uuid: {type: 'string', maxlength: 36, nullable: false, unique: true, validations: {isUUID: true}},
899
900
  data: {type: 'string', maxlength: 2000, nullable: true},
900
901
  created_at: {type: 'dateTime', nullable: false},
901
902
  updated_at: {type: 'dateTime', nullable: true},
@@ -1,5 +1,3 @@
1
-
2
-
3
1
  SCHEMA >
4
2
  `site_uuid` LowCardinality(String),
5
3
  `timestamp` DateTime,
@@ -16,8 +14,13 @@ SCHEMA >
16
14
  `href` String,
17
15
  `device` String,
18
16
  `os` String,
19
- `browser` String
17
+ `browser` String,
18
+ `utm_source` String,
19
+ `utm_medium` String,
20
+ `utm_campaign` String,
21
+ `utm_term` String,
22
+ `utm_content` String
20
23
 
21
24
  ENGINE "MergeTree"
22
25
  ENGINE_PARTITION_KEY "toYYYYMM(timestamp)"
23
- ENGINE_SORTING_KEY "site_uuid, timestamp, session_id"
26
+ ENGINE_SORTING_KEY "site_uuid, timestamp, session_id"
@@ -4,20 +4,14 @@ NODE top_utm_campaigns
4
4
  SQL >
5
5
  %
6
6
  select
7
- case
8
- when length(source) % 6 = 0 then 'summer_sale_2024'
9
- when length(source) % 6 = 1 then 'newsletter_weekly'
10
- when length(source) % 6 = 2 then 'product_launch'
11
- when length(source) % 6 = 3 then 'holiday_promo'
12
- when length(source) % 6 = 4 then 'brand_awareness'
13
- when length(source) % 6 = 5 then 'retention_q4'
14
- end as utm_campaign,
7
+ utm_campaign,
15
8
  count() as visits
16
9
  from mv_session_data sd
17
10
  inner join filtered_sessions fs
18
11
  on fs.session_id = sd.session_id
19
12
  where
20
13
  site_uuid = {{ String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True) }}
14
+ and utm_campaign != ''
21
15
  {% if defined(date_from) and day_diff(date_from, date_to) == 0 %}
22
16
  and toDate(toTimezone(first_pageview, {{String(timezone, 'Etc/UTC', description="Site timezone", required=True)}})) = {{ Date(date_from) }}
23
17
  {% else %}
@@ -4,20 +4,14 @@ NODE top_utm_content
4
4
  SQL >
5
5
  %
6
6
  select
7
- case
8
- when length(source) % 6 = 0 then 'hero-banner'
9
- when length(source) % 6 = 1 then 'sidebar-cta'
10
- when length(source) % 6 = 2 then 'footer-link'
11
- when length(source) % 6 = 3 then 'button-primary'
12
- when length(source) % 6 = 4 then 'text-link'
13
- when length(source) % 6 = 5 then 'nav-menu'
14
- end as utm_content,
7
+ utm_content,
15
8
  count() as visits
16
9
  from mv_session_data sd
17
10
  inner join filtered_sessions fs
18
11
  on fs.session_id = sd.session_id
19
12
  where
20
13
  site_uuid = {{ String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True) }}
14
+ and utm_content != ''
21
15
  {% if defined(date_from) and day_diff(date_from, date_to) == 0 %}
22
16
  and toDate(toTimezone(first_pageview, {{String(timezone, 'Etc/UTC', description="Site timezone", required=True)}})) = {{ Date(date_from) }}
23
17
  {% else %}
@@ -4,20 +4,14 @@ NODE top_utm_mediums
4
4
  SQL >
5
5
  %
6
6
  select
7
- case
8
- when length(source) % 6 = 0 then 'email'
9
- when length(source) % 6 = 1 then 'social'
10
- when length(source) % 6 = 2 then 'cpc'
11
- when length(source) % 6 = 3 then 'organic'
12
- when length(source) % 6 = 4 then 'referral'
13
- when length(source) % 6 = 5 then 'display'
14
- end as utm_medium,
7
+ utm_medium,
15
8
  count() as visits
16
9
  from mv_session_data sd
17
10
  inner join filtered_sessions fs
18
11
  on fs.session_id = sd.session_id
19
12
  where
20
13
  site_uuid = {{ String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True) }}
14
+ and utm_medium != ''
21
15
  {% if defined(date_from) and day_diff(date_from, date_to) == 0 %}
22
16
  and toDate(toTimezone(first_pageview, {{String(timezone, 'Etc/UTC', description="Site timezone", required=True)}})) = {{ Date(date_from) }}
23
17
  {% else %}
@@ -4,20 +4,14 @@ NODE top_utm_sources
4
4
  SQL >
5
5
  %
6
6
  select
7
- case
8
- when length(source) % 6 = 0 then 'google'
9
- when length(source) % 6 = 1 then 'facebook'
10
- when length(source) % 6 = 2 then 'twitter'
11
- when length(source) % 6 = 3 then 'linkedin'
12
- when length(source) % 6 = 4 then 'newsletter'
13
- when length(source) % 6 = 5 then 'instagram'
14
- end as utm_source,
7
+ utm_source,
15
8
  count() as visits
16
9
  from mv_session_data sd
17
10
  inner join filtered_sessions fs
18
11
  on fs.session_id = sd.session_id
19
12
  where
20
13
  site_uuid = {{ String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True) }}
14
+ and utm_source != ''
21
15
  {% if defined(date_from) and day_diff(date_from, date_to) == 0 %}
22
16
  and toDate(toTimezone(first_pageview, {{String(timezone, 'Etc/UTC', description="Site timezone", required=True)}})) = {{ Date(date_from) }}
23
17
  {% else %}
@@ -4,20 +4,14 @@ NODE top_utm_terms
4
4
  SQL >
5
5
  %
6
6
  select
7
- case
8
- when length(source) % 6 = 0 then 'ghost cms'
9
- when length(source) % 6 = 1 then 'headless publishing'
10
- when length(source) % 6 = 2 then 'content management'
11
- when length(source) % 6 = 3 then 'newsletter platform'
12
- when length(source) % 6 = 4 then 'blog software'
13
- when length(source) % 6 = 5 then 'membership site'
14
- end as utm_term,
7
+ utm_term,
15
8
  count() as visits
16
9
  from mv_session_data sd
17
10
  inner join filtered_sessions fs
18
11
  on fs.session_id = sd.session_id
19
12
  where
20
13
  site_uuid = {{ String(site_uuid, 'mock_site_uuid', description="Tenant ID", required=True) }}
14
+ and utm_term != ''
21
15
  {% if defined(date_from) and day_diff(date_from, date_to) == 0 %}
22
16
  and toDate(toTimezone(first_pageview, {{String(timezone, 'Etc/UTC', description="Site timezone", required=True)}})) = {{ Date(date_from) }}
23
17
  {% else %}
@@ -1,23 +1,23 @@
1
- {"timestamp":"2100-01-01 00:06:15","session_id":"e5c37e25-ed9e-4940-a2be-bc49149d991a","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"AhrefsBot/7.0; +http://ahrefs.com/robot/","locale":"en-GB","location":"GB","referrer":"https://petty-queen.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":"https://petty-queen.com"}}}
2
- {"timestamp":"2100-01-01 01:21:17","session_id":"1267b782-e5a1-4334-8cf6-771d72bbc28e","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"d4678fdf-824c-4d5f-a5fe-c713d409faac","member_status":"free","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.2.1 (KHTML, like Gecko) Chrome/13.0.868.0 Safari/533.2.1","locale":"es-ES","location":"ES","referrer":"","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":""}}}
1
+ {"timestamp":"2100-01-01 00:06:15","session_id":"e5c37e25-ed9e-4940-a2be-bc49149d991a","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"AhrefsBot/7.0; +http://ahrefs.com/robot/","locale":"en-GB","location":"GB","referrer":"https://petty-queen.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/?utm_source=google&utm_medium=cpc&utm_campaign=summer_sale_2024","utm_source":"google","utm_medium":"cpc","utm_campaign":"summer_sale_2024","utm_term":null,"utm_content":null,"meta":{"referrerSource":"https://petty-queen.com"}}}
2
+ {"timestamp":"2100-01-01 01:21:17","session_id":"1267b782-e5a1-4334-8cf6-771d72bbc28e","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"d4678fdf-824c-4d5f-a5fe-c713d409faac","member_status":"free","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.2.1 (KHTML, like Gecko) Chrome/13.0.868.0 Safari/533.2.1","locale":"es-ES","location":"ES","referrer":"","pathname":"/","href":"https://my-ghost-site.com/?utm_source=facebook&utm_medium=social&utm_campaign=brand_awareness","utm_source":"facebook","utm_medium":"social","utm_campaign":"brand_awareness","utm_term":null,"utm_content":"post_123","meta":{"referrerSource":""}}}
3
3
  {"timestamp":"2100-01-01 01:39:48","session_id":"1267b782-e5a1-4334-8cf6-771d72bbc28e","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"d4678fdf-824c-4d5f-a5fe-c713d409faac","member_status":"free","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.2.1 (KHTML, like Gecko) Chrome/13.0.868.0 Safari/533.2.1","locale":"es-ES","location":"ES","referrer":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
4
- {"timestamp":"2100-01-01 02:21:13","session_id":"2a31286e-53b4-41da-a7fd-89d966072af5","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"df8343d2-e89d-45b7-ba12-988734efcc56","member_status":"free","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0)","locale":"en-GB","location":"GB","referrer":"https://www.bing.com/","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://www.bing.com/"}}}
4
+ {"timestamp":"2100-01-01 02:21:13","session_id":"2a31286e-53b4-41da-a7fd-89d966072af5","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"df8343d2-e89d-45b7-ba12-988734efcc56","member_status":"free","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0)","locale":"en-GB","location":"GB","referrer":"https://www.bing.com/","pathname":"/about/","href":"https://my-ghost-site.com/about/?utm_source=newsletter&utm_medium=email&utm_campaign=newsletter_weekly","utm_source":"newsletter","utm_medium":"email","utm_campaign":"newsletter_weekly","utm_term":"subscribers","utm_content":"header_link","meta":{"referrerSource":"https://www.bing.com/"}}}
5
5
  {"timestamp":"2100-01-01 02:31:43","session_id":"2a31286e-53b4-41da-a7fd-89d966072af5","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"df8343d2-e89d-45b7-ba12-988734efcc56","member_status":"free","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.0; Trident/4.0)","locale":"en-GB","location":"GB","referrer":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
6
- {"timestamp":"2100-01-02 00:59:45","session_id":"f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"65bacac2-8122-4ed0-a11f-ac52aa82beb0","member_status":"paid","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows NT 5.3; Win64; x64; rv:11.6) Gecko/20100101 Firefox/11.6.2","locale":"en-GB","location":"GB","referrer":"https://www.google.com/","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://www.google.com/"}}}
6
+ {"timestamp":"2100-01-02 00:59:45","session_id":"f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"65bacac2-8122-4ed0-a11f-ac52aa82beb0","member_status":"paid","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows NT 5.3; Win64; x64; rv:11.6) Gecko/20100101 Firefox/11.6.2","locale":"en-GB","location":"GB","referrer":"https://www.google.com/","pathname":"/about/","href":"https://my-ghost-site.com/about/?utm_source=twitter&utm_medium=social&utm_campaign=product_launch","utm_source":"twitter","utm_medium":"social","utm_campaign":"product_launch","utm_term":"new_feature","utm_content":"tweet_456","meta":{"referrerSource":"https://www.google.com/"}}}
7
7
  {"timestamp":"2100-01-02 01:12:56","session_id":"f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"65bacac2-8122-4ed0-a11f-ac52aa82beb0","member_status":"paid","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows NT 5.3; Win64; x64; rv:11.6) Gecko/20100101 Firefox/11.6.2","locale":"en-GB","location":"GB","referrer":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
8
8
  {"timestamp":"2100-01-02 01:16:52","session_id":"f253b9b7-0a1a-4168-8fcf-b20a1668ce4d","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"65bacac2-8122-4ed0-a11f-ac52aa82beb0","member_status":"paid","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows NT 5.3; Win64; x64; rv:11.6) Gecko/20100101 Firefox/11.6.2","locale":"en-GB","location":"GB","referrer":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
9
- {"timestamp":"2100-01-03 00:01:24","session_id":"9c15f99e-c8b1-4145-a073-e7f8649d2fa4","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"4c14393f-d792-403e-bbdc-aa5af3abbdd9","member_status":"free","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows NT 5.0; rv:10.7) Gecko/20100101 Firefox/10.7.1","locale":"en-US","location":"US","referrer":"https://duckduckgo.com/","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://duckduckgo.com/"}}}
9
+ {"timestamp":"2100-01-03 00:01:24","session_id":"9c15f99e-c8b1-4145-a073-e7f8649d2fa4","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"4c14393f-d792-403e-bbdc-aa5af3abbdd9","member_status":"free","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows NT 5.0; rv:10.7) Gecko/20100101 Firefox/10.7.1","locale":"en-US","location":"US","referrer":"https://duckduckgo.com/","pathname":"/","href":"https://my-ghost-site.com/?utm_source=linkedin&utm_medium=social&utm_campaign=holiday_promo","utm_source":"linkedin","utm_medium":"social","utm_campaign":"holiday_promo","utm_term":null,"utm_content":"sponsored_post","meta":{"referrerSource":"https://duckduckgo.com/"}}}
10
10
  {"timestamp":"2100-01-03 01:28:09","session_id":"9c15f99e-c8b1-4145-a073-e7f8649d2fa4","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"4c14393f-d792-403e-bbdc-aa5af3abbdd9","member_status":"free","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows NT 5.0; rv:10.7) Gecko/20100101 Firefox/10.7.1","locale":"en-US","location":"US","referrer":"https://my-ghost-site.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
11
- {"timestamp":"2100-01-03 01:41:44","session_id":"8a2461a8-91cd-4f01-b066-3de6dc946995","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"f4c738bc-7327-440c-8007-6a0b306c05e3","member_status":"comped","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.0) AppleWebKit/533.2.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/533.2.0","locale":"de-DE","location":"DE","referrer":"https://www.bing.com/","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://www.bing.com/"}}}
11
+ {"timestamp":"2100-01-03 01:41:44","session_id":"8a2461a8-91cd-4f01-b066-3de6dc946995","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"f4c738bc-7327-440c-8007-6a0b306c05e3","member_status":"comped","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.0) AppleWebKit/533.2.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/533.2.0","locale":"de-DE","location":"DE","referrer":"https://www.bing.com/","pathname":"/about/","href":"https://my-ghost-site.com/about/?utm_source=instagram&utm_medium=social&utm_campaign=retention_q4","utm_source":"instagram","utm_medium":"social","utm_campaign":"retention_q4","utm_term":"loyal_customers","utm_content":"story_789","meta":{"referrerSource":"https://www.bing.com/"}}}
12
12
  {"timestamp":"2100-01-03 01:53:31","session_id":"8a2461a8-91cd-4f01-b066-3de6dc946995","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"f4c738bc-7327-440c-8007-6a0b306c05e3","member_status":"comped","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.0) AppleWebKit/533.2.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/533.2.0","locale":"de-DE","location":"DE","referrer":"https://my-ghost-site.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
13
13
  {"timestamp":"2100-01-03 02:00:19","session_id":"8a2461a8-91cd-4f01-b066-3de6dc946995","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"f4c738bc-7327-440c-8007-6a0b306c05e3","member_status":"comped","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.0) AppleWebKit/533.2.0 (KHTML, like Gecko) Chrome/39.0.887.0 Safari/533.2.0","locale":"de-DE","location":"DE","referrer":"https://my-ghost-site.com","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
14
14
  {"timestamp":"2100-01-03 02:51:20","session_id":"50785df1-3232-4ff7-8495-d93e06d63f5c","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"3675e750-09bf-44c9-bc3f-b9aebac37c5d","member_status":"paid","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows NT 6.3; rv:14.7) Gecko/20100101 Firefox/14.7.1","locale":"fr-FR","location":"FR","referrerSource":"https://search.yahoo.com/","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://search.yahoo.com/"}}}
15
15
  {"timestamp":"2100-01-03 03:52:39","session_id":"50785df1-3232-4ff7-8495-d93e06d63f5c","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"3675e750-09bf-44c9-bc3f-b9aebac37c5d","member_status":"paid","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows NT 6.3; rv:14.7) Gecko/20100101 Firefox/14.7.1","locale":"fr-FR","location":"FR","referrerSource":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
16
- {"timestamp":"2100-01-04 00:25:39","session_id":"59478d87-ce95-40fd-a081-65d1e497bcfc","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"97c79891-2ae9-4eb2-ada8-89d2a998747d","member_status":"paid","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 6.3) AppleWebKit/531.2.2 (KHTML, like Gecko) Chrome/31.0.808.0 Safari/531.2.2","locale":"en-GB","location":"GB","referrerSource":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":""}}}
17
- {"timestamp":"2100-01-04 01:10:48","session_id":"a6b6c4e6-19e3-47a9-afc6-d9870592652e","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.0.1 (KHTML, like Gecko) Chrome/32.0.856.0 Safari/533.0.1","locale":"en-GB","location":"GB","referrerSource":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":""}}}
16
+ {"timestamp":"2100-01-04 00:25:39","session_id":"59478d87-ce95-40fd-a081-65d1e497bcfc","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"97c79891-2ae9-4eb2-ada8-89d2a998747d","member_status":"paid","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 6.3) AppleWebKit/531.2.2 (KHTML, like Gecko) Chrome/31.0.808.0 Safari/531.2.2","locale":"en-GB","location":"GB","referrerSource":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/?utm_source=google&utm_medium=organic","utm_source":"google","utm_medium":"organic","utm_campaign":null,"utm_term":"ghost_blog","utm_content":null,"meta":{"referrerSource":""}}}
17
+ {"timestamp":"2100-01-04 01:10:48","session_id":"a6b6c4e6-19e3-47a9-afc6-d9870592652e","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.0.1 (KHTML, like Gecko) Chrome/32.0.856.0 Safari/533.0.1","locale":"en-GB","location":"GB","referrerSource":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/?utm_source=partner_site&utm_medium=referral&utm_campaign=summer_sale_2024","utm_source":"partner_site","utm_medium":"referral","utm_campaign":"summer_sale_2024","utm_term":"discount","utm_content":"banner_ad","meta":{"referrerSource":""}}}
18
18
  {"timestamp":"2100-01-04 01:16:10","session_id":"a6b6c4e6-19e3-47a9-afc6-d9870592652e","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.0.1 (KHTML, like Gecko) Chrome/32.0.856.0 Safari/533.0.1","locale":"en-GB","location":"GB","referrerSource":"https://my-ghost-site.com","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
19
19
  {"timestamp":"2100-01-04 01:20:15","session_id":"a6b6c4e6-19e3-47a9-afc6-d9870592652e","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.2) AppleWebKit/533.0.1 (KHTML, like Gecko) Chrome/32.0.856.0 Safari/533.0.1","locale":"en-GB","location":"GB","referrer":"https://my-ghost-site.com","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
20
- {"timestamp":"2100-01-04 01:35:41","session_id":"e22a7f6f-28da-4715-a199-6f0338b593d4","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"5369031a-a5cd-4176-83d8-d6ffcb3bcfb8","member_status":"free","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/538.0.1 (KHTML, like Gecko) Chrome/16.0.814.0 Safari/538.0.1","locale":"en-GB","location":"GB","referrer":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":""}}}
20
+ {"timestamp":"2100-01-04 01:35:41","session_id":"e22a7f6f-28da-4715-a199-6f0338b593d4","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"5369031a-a5cd-4176-83d8-d6ffcb3bcfb8","member_status":"free","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/538.0.1 (KHTML, like Gecko) Chrome/16.0.814.0 Safari/538.0.1","locale":"en-GB","location":"GB","referrer":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/?utm_source=bing&utm_medium=display&utm_campaign=brand_awareness","utm_source":"bing","utm_medium":"display","utm_campaign":"brand_awareness","utm_term":null,"utm_content":"video_ad","meta":{"referrerSource":""}}}
21
21
  {"timestamp":"2100-01-04 01:36:33","session_id":"e22a7f6f-28da-4715-a199-6f0338b593d4","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"5369031a-a5cd-4176-83d8-d6ffcb3bcfb8","member_status":"free","post_uuid":"undefined","post_type":"","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/538.0.1 (KHTML, like Gecko) Chrome/16.0.814.0 Safari/538.0.1","locale":"en-GB","location":"GB","referrer":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
22
22
  {"timestamp":"2100-01-04 01:54:50","session_id":"e22a7f6f-28da-4715-a199-6f0338b593d4","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"5369031a-a5cd-4176-83d8-d6ffcb3bcfb8","member_status":"free","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 6.1) AppleWebKit/538.0.1 (KHTML, like Gecko) Chrome/16.0.814.0 Safari/538.0.1","locale":"en-GB","location":"GB","referrer":"https://my-ghost-site.com","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
23
23
  {"timestamp":"2100-01-05 01:51:00","session_id":"d8e4622f-95cc-4fba-b31b-f38ff72e0975","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"75a190eb-62da-46d2-972d-a9763c954f42","member_status":"paid","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/3.0)","locale":"es-ES","location":"ES","referrerSource":"","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":""}}}
@@ -27,5 +27,5 @@
27
27
  {"timestamp":"2100-01-05 00:38:12","session_id":"490475f1-1fb7-4672-9edd-daa1b411b5f9","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.1) AppleWebKit/532.2.0 (KHTML, like Gecko) Chrome/20.0.898.0 Safari/532.2.0","locale":"en-GB","location":"GB","referrerSource":"https://my-ghost-site.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
28
28
  {"timestamp":"2100-01-06 00:51:26","session_id":"8d975128-2027-40c6-834a-972cc0293d21","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"b7e0fca6-27ce-46c0-af57-c591f20dcd51","member_status":"free","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Macintosh; Intel Mac OS X 10_7_7 rv:2.0; KW) AppleWebKit/537.0.1 (KHTML, like Gecko) Version/5.0.10 Safari/537.0.1","locale":"fr-FR","location":"FR","referrerSource":"","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":""}}}
29
29
  {"timestamp":"2100-01-06 01:28:38","session_id":"61a2896b-7cf8-4853-86a6-a0e4f87c1e21","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (Windows; U; Windows NT 5.1) AppleWebKit/533.1.0 (KHTML, like Gecko) Chrome/18.0.852.0 Safari/533.1.0","locale":"en-GB","location":"GB","referrer":"https://search.yahoo.com/","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":"https://search.yahoo.com/"}}}
30
- {"timestamp":"2100-01-07 01:44:10","session_id":"7f1e88e1-da8e-46df-bc69-d04fb29d603d","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows NT 5.0; WOW64; rv:13.9) Gecko/20100101 Firefox/13.9.7","locale":"en-US","location":"US","referrer":"http://wilted-tick.com","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"http://wilted-tick.com"}}}
31
- {"timestamp":"2100-01-07 02:23:19","session_id":"98159299-8111-4dc8-9156-bb339fe9508c","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1dd","post_type":"post","user-agent":"Mozilla/5.0 (Windows NT 5.0; WOW64; rv:13.9) Gecko/20100101 Firefox/13.9.7","locale":"en-US","location":"US","referrer":"https://my-ghost-site.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
30
+ {"timestamp":"2100-01-07 01:44:10","session_id":"7f1e88e1-da8e-46df-bc69-d04fb29d603d","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","post_type":"page","user-agent":"Mozilla/5.0 (Windows NT 5.0; WOW64; rv:13.9) Gecko/20100101 Firefox/13.9.7","locale":"en-US","location":"US","referrer":"http://wilted-tick.com","pathname":"/about/","href":"https://my-ghost-site.com/about/?utm_source=reddit&utm_medium=social&utm_campaign=product_launch&utm_term=announcement","utm_source":"reddit","utm_medium":"social","utm_campaign":"product_launch","utm_term":"announcement","utm_content":null,"meta":{"referrerSource":"http://wilted-tick.com"}}}
31
+ {"timestamp":"2100-01-07 02:23:19","session_id":"98159299-8111-4dc8-9156-bb339fe9508c","action":"page_hit","version":"1","payload":{"site_uuid":"mock_site_uuid","member_uuid":"undefined","member_status":"undefined","post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1dd","post_type":"post","user-agent":"Mozilla/5.0 (Windows NT 5.0; WOW64; rv:13.9) Gecko/20100101 Firefox/13.9.7","locale":"en-US","location":"US","referrer":"https://my-ghost-site.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/?utm_source=google&utm_medium=cpc&utm_campaign=holiday_promo&utm_term=black_friday&utm_content=search_ad","utm_source":"google","utm_medium":"cpc","utm_campaign":"holiday_promo","utm_term":"black_friday","utm_content":"search_ad","meta":{"referrerSource":"https://my-ghost-site.com"}}}
@@ -18,7 +18,12 @@ SQL >
18
18
  JSONExtractString(payload, 'member_status') as member_status,
19
19
  JSONExtractString(payload, 'post_uuid') as post_uuid,
20
20
  JSONExtractString(payload, 'post_type') as post_type,
21
- lower(JSONExtractString(payload, 'user-agent')) as user_agent
21
+ lower(JSONExtractString(payload, 'user-agent')) as user_agent,
22
+ JSONExtractString(payload, 'utm_source') as utm_source,
23
+ JSONExtractString(payload, 'utm_medium') as utm_medium,
24
+ JSONExtractString(payload, 'utm_campaign') as utm_campaign,
25
+ JSONExtractString(payload, 'utm_term') as utm_term,
26
+ JSONExtractString(payload, 'utm_content') as utm_content
22
27
  FROM analytics_events
23
28
  where action = 'page_hit'
24
29
 
@@ -121,7 +126,12 @@ SQL >
121
126
  when match(user_agent, 'iphone|ipad|safari')
122
127
  then 'safari'
123
128
  else 'Unknown'
124
- END as browser
129
+ END as browser,
130
+ utm_source,
131
+ utm_medium,
132
+ utm_campaign,
133
+ utm_term,
134
+ utm_content
125
135
  FROM mv_hits_0
126
136
 
127
137
  TYPE materialized
@@ -4,10 +4,15 @@ SQL >
4
4
  SELECT
5
5
  site_uuid,
6
6
  session_id,
7
- finalizeAggregation(countState()) as pageviews,
8
- finalizeAggregation(minState(timestamp)) as first_pageview,
9
- finalizeAggregation(maxState(timestamp)) as last_pageview,
10
- argMin(source, timestamp) as source
7
+ count() as pageviews,
8
+ min(timestamp) as first_pageview,
9
+ max(timestamp) as last_pageview,
10
+ argMin(source, timestamp) as source,
11
+ argMin(utm_source, timestamp) as utm_source,
12
+ argMin(utm_medium, timestamp) as utm_medium,
13
+ argMin(utm_campaign, timestamp) as utm_campaign,
14
+ argMin(utm_term, timestamp) as utm_term,
15
+ argMin(utm_content, timestamp) as utm_content
11
16
  FROM _mv_hits
12
17
  GROUP BY site_uuid, session_id
13
18
 
@@ -24,5 +29,10 @@ SQL >
24
29
  last_pageview,
25
30
  last_pageview - first_pageview AS duration,
26
31
  pageviews = 1 AS is_bounce,
27
- source
28
- FROM mv_hits_0
32
+ source,
33
+ utm_source,
34
+ utm_medium,
35
+ utm_campaign,
36
+ utm_term,
37
+ utm_content
38
+ FROM mv_hits_0
@@ -3,106 +3,107 @@
3
3
  description: All fixture data
4
4
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC
5
5
  expected_result: |
6
- {"utm_campaign":"summer_sale_2024","visits":6}
7
- {"utm_campaign":"brand_awareness","visits":3}
8
- {"utm_campaign":"holiday_promo","visits":3}
9
- {"utm_campaign":"product_launch","visits":3}
6
+ {"utm_campaign":"brand_awareness","visits":2}
7
+ {"utm_campaign":"summer_sale_2024","visits":2}
8
+ {"utm_campaign":"holiday_promo","visits":2}
9
+ {"utm_campaign":"product_launch","visits":2}
10
10
  {"utm_campaign":"retention_q4","visits":1}
11
+ {"utm_campaign":"newsletter_weekly","visits":1}
11
12
 
12
13
  - name: Filtered by browser - Chrome
13
14
  description: Filtered by browser - Chrome
14
15
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&browser=chrome
15
16
  expected_result: |
16
- {"utm_campaign":"summer_sale_2024","visits":4}
17
- {"utm_campaign":"brand_awareness","visits":1}
18
- {"utm_campaign":"holiday_promo","visits":1}
19
- {"utm_campaign":"product_launch","visits":1}
17
+ {"utm_campaign":"brand_awareness","visits":2}
18
+ {"utm_campaign":"summer_sale_2024","visits":1}
19
+ {"utm_campaign":"retention_q4","visits":1}
20
20
 
21
21
  - name: Filtered by device - desktop
22
22
  description: Filtered by device - desktop
23
23
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&device=desktop
24
24
  expected_result: |
25
- {"utm_campaign":"summer_sale_2024","visits":6}
26
- {"utm_campaign":"brand_awareness","visits":3}
27
- {"utm_campaign":"product_launch","visits":3}
25
+ {"utm_campaign":"brand_awareness","visits":2}
28
26
  {"utm_campaign":"holiday_promo","visits":2}
27
+ {"utm_campaign":"product_launch","visits":2}
28
+ {"utm_campaign":"summer_sale_2024","visits":1}
29
29
  {"utm_campaign":"retention_q4","visits":1}
30
+ {"utm_campaign":"newsletter_weekly","visits":1}
30
31
 
31
32
  - name: Filtered by location - UK
32
33
  description: Filtered by location - UK
33
34
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&location=GB
34
35
  expected_result: |
35
- {"utm_campaign":"summer_sale_2024","visits":3}
36
- {"utm_campaign":"brand_awareness","visits":2}
37
- {"utm_campaign":"holiday_promo","visits":2}
36
+ {"utm_campaign":"summer_sale_2024","visits":2}
37
+ {"utm_campaign":"brand_awareness","visits":1}
38
38
  {"utm_campaign":"product_launch","visits":1}
39
+ {"utm_campaign":"newsletter_weekly","visits":1}
39
40
 
40
41
  - name: Filtered by OS - Windows
41
42
  description: Filtered by OS - Windows
42
43
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&os=windows
43
44
  expected_result: |
44
- {"utm_campaign":"summer_sale_2024","visits":5}
45
- {"utm_campaign":"brand_awareness","visits":3}
46
- {"utm_campaign":"product_launch","visits":3}
45
+ {"utm_campaign":"brand_awareness","visits":2}
47
46
  {"utm_campaign":"holiday_promo","visits":2}
47
+ {"utm_campaign":"product_launch","visits":2}
48
+ {"utm_campaign":"summer_sale_2024","visits":1}
48
49
  {"utm_campaign":"retention_q4","visits":1}
50
+ {"utm_campaign":"newsletter_weekly","visits":1}
49
51
 
50
52
  - name: Filtered by pathname - /about/
51
53
  description: Filtered by pathname - /about/
52
54
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&pathname=%2Fabout%2F
53
55
  expected_result: |
54
- {"utm_campaign":"summer_sale_2024","visits":4}
55
56
  {"utm_campaign":"product_launch","visits":2}
56
57
  {"utm_campaign":"brand_awareness","visits":1}
57
- {"utm_campaign":"holiday_promo","visits":1}
58
+ {"utm_campaign":"summer_sale_2024","visits":1}
59
+ {"utm_campaign":"retention_q4","visits":1}
60
+ {"utm_campaign":"newsletter_weekly","visits":1}
58
61
 
59
62
  - name: Filtered by post_uuid - 06b1b0c9-fb53-4a15-a060-3db3fde7b1fc (/about/)
60
63
  description: Filtered by post_uuid - 06b1b0c9-fb53-4a15-a060-3db3fde7b1fc (/about/)
61
64
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&post_uuid=06b1b0c9-fb53-4a15-a060-3db3fde7b1fc
62
65
  expected_result: |
63
- {"utm_campaign":"summer_sale_2024","visits":4}
64
66
  {"utm_campaign":"product_launch","visits":2}
65
67
  {"utm_campaign":"brand_awareness","visits":1}
66
- {"utm_campaign":"holiday_promo","visits":1}
68
+ {"utm_campaign":"summer_sale_2024","visits":1}
69
+ {"utm_campaign":"retention_q4","visits":1}
70
+ {"utm_campaign":"newsletter_weekly","visits":1}
67
71
 
68
72
  - name: Filtered by source - bing.com
69
73
  description: Filtered by source - bing.com
70
74
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&source=bing.com
71
75
  expected_result: |
72
- {"utm_campaign":"product_launch","visits":2}
76
+ {"utm_campaign":"retention_q4","visits":1}
77
+ {"utm_campaign":"newsletter_weekly","visits":1}
73
78
 
74
79
  - name: Filtered by member status - paid
75
80
  description: Filtered by member status - paid
76
81
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&member_status=paid
77
82
  expected_result: |
78
- {"utm_campaign":"brand_awareness","visits":2}
79
- {"utm_campaign":"summer_sale_2024","visits":2}
83
+ {"utm_campaign":"retention_q4","visits":1}
80
84
  {"utm_campaign":"product_launch","visits":1}
81
85
 
82
86
  - name: Filtered by member status - undefined
83
87
  description: Filtered by member status - undefined
84
88
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&member_status=undefined
85
89
  expected_result: |
86
- {"utm_campaign":"holiday_promo","visits":3}
87
- {"utm_campaign":"brand_awareness","visits":1}
88
- {"utm_campaign":"summer_sale_2024","visits":1}
89
- {"utm_campaign":"retention_q4","visits":1}
90
+ {"utm_campaign":"summer_sale_2024","visits":2}
91
+ {"utm_campaign":"holiday_promo","visits":1}
92
+ {"utm_campaign":"product_launch","visits":1}
90
93
 
91
94
  - name: Filtered by timezone - America/Los_Angeles
92
95
  description: Filtered by timezone - America/Los_Angeles
93
96
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=America/Los_Angeles
94
97
  expected_result: |
95
- {"utm_campaign":"summer_sale_2024","visits":5}
96
- {"utm_campaign":"brand_awareness","visits":3}
97
98
  {"utm_campaign":"holiday_promo","visits":2}
98
99
  {"utm_campaign":"product_launch","visits":2}
100
+ {"utm_campaign":"brand_awareness","visits":1}
101
+ {"utm_campaign":"summer_sale_2024","visits":1}
99
102
  {"utm_campaign":"retention_q4","visits":1}
100
103
 
101
104
  - name: Test with multiple filters combined
102
105
  description: Test with multiple filters combined
103
106
  parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&device=desktop&browser=firefox
104
107
  expected_result: |
105
- {"utm_campaign":"brand_awareness","visits":2}
106
- {"utm_campaign":"retention_q4","visits":1}
107
- {"utm_campaign":"holiday_promo","visits":1}
108
- {"utm_campaign":"product_launch","visits":1}
108
+ {"utm_campaign":"holiday_promo","visits":2}
109
+ {"utm_campaign":"product_launch","visits":2}