ghost 5.121.0 → 5.123.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 (49) hide show
  1. package/components/tryghost-i18n-5.123.0.tgz +0 -0
  2. package/core/built/admin/assets/admin-x-activitypub/admin-x-activitypub.js +14017 -14035
  3. package/core/built/admin/assets/admin-x-settings/{CodeEditorView-03f7aa4d.mjs → CodeEditorView-aba69ca9.mjs} +2 -2
  4. package/core/built/admin/assets/admin-x-settings/admin-x-settings.js +1 -1
  5. package/core/built/admin/assets/admin-x-settings/{index-eea9098a.mjs → index-87586072.mjs} +4 -4
  6. package/core/built/admin/assets/admin-x-settings/{index-b0484a21.mjs → index-b3cfde97.mjs} +2 -2
  7. package/core/built/admin/assets/admin-x-settings/{modals-85a92c66.mjs → modals-890d62ee.mjs} +1669 -1618
  8. package/core/built/admin/assets/{chunk.383.77dd3c8cbac5f464c6da.js → chunk.383.3dcd1102188f9d5e0467.js} +7 -7
  9. package/core/built/admin/assets/{chunk.524.22c1abc09947848be03d.js → chunk.524.f1c003b0bae2aa6a9805.js} +7 -7
  10. package/core/built/admin/assets/{chunk.582.a7cbc2ce76922c8870bc.js → chunk.582.4d677cde396354a18509.js} +9 -9
  11. package/core/built/admin/assets/{ghost-1c91950af9d6f9cee826820f056e0025.js → ghost-4dac0876cd7426ba504e4143b9772689.js} +141 -132
  12. package/core/built/admin/assets/posts/posts.js +71680 -41896
  13. package/core/built/admin/assets/stats/stats.js +35194 -35499
  14. package/core/built/admin/index.html +4 -4
  15. package/core/frontend/public/ghost-stats.min.js +3 -3
  16. package/core/frontend/src/ghost-stats/ghost-stats.js +0 -12
  17. package/core/server/api/endpoints/previews.js +25 -4
  18. package/core/server/api/endpoints/stats.js +50 -0
  19. package/core/server/data/migrations/versions/5.122/2025-06-03-19-32-57-change-default-for-newsletters-button-color.js +37 -0
  20. package/core/server/data/schema/schema.js +1 -1
  21. package/core/server/data/tinybird/endpoints/api_top_pages.pipe +1 -0
  22. package/core/server/data/tinybird/fixtures/analytics_events.ndjson +31 -31
  23. package/core/server/data/tinybird/pipes/mv_hits.pipe +51 -11
  24. package/core/server/data/tinybird/tests/api_top_pages.yaml +7 -0
  25. package/core/server/models/newsletter.js +1 -0
  26. package/core/server/services/adapter-manager/AdapterManager.js +5 -1
  27. package/core/server/services/comments/CommentsServiceEmails.js +8 -6
  28. package/core/server/services/email-service/EmailRenderer.js +80 -23
  29. package/core/server/services/email-service/email-templates/partials/paywall.hbs +56 -33
  30. package/core/server/services/email-service/email-templates/partials/styles.hbs +129 -4
  31. package/core/server/services/email-service/email-templates/template.hbs +1 -1
  32. package/core/server/services/koenig/node-renderers/button-renderer.js +1 -21
  33. package/core/server/services/koenig/node-renderers/call-to-action-renderer.js +10 -44
  34. package/core/server/services/koenig/node-renderers/header-v2-renderer.js +15 -31
  35. package/core/server/services/koenig/node-renderers/horizontalrule-renderer.js +43 -2
  36. package/core/server/services/koenig/node-renderers/product-renderer.js +0 -1
  37. package/core/server/services/koenig/render-partials/email-button.js +127 -21
  38. package/core/server/services/koenig/render-utils/stylex.js +104 -0
  39. package/core/server/services/stats/MembersStatsService.js +129 -5
  40. package/core/server/services/stats/PostsStatsService.js +281 -1
  41. package/core/server/services/stats/StatsService.js +23 -1
  42. package/core/server/services/stats/utils/tinybird.js +25 -5
  43. package/core/server/web/api/endpoints/admin/routes.js +2 -0
  44. package/package.json +13 -13
  45. package/tsconfig.tsbuildinfo +1 -1
  46. package/yarn.lock +851 -310
  47. package/components/tryghost-i18n-5.121.0.tgz +0 -0
  48. package/core/frontend/src/utils/session-storage.js +0 -68
  49. /package/core/built/admin/assets/{chunk.383.77dd3c8cbac5f464c6da.js.LICENSE.txt → chunk.383.3dcd1102188f9d5e0467.js.LICENSE.txt} +0 -0
@@ -1,31 +1,31 @@
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","user-agent":"Mozilla/5.0 (Windows NT 6.3; rv:14.7) Gecko/20100101 Firefox/14.7.1","locale":"fr-FR","location":"FR","referrer":"https://search.yahoo.com/","pathname":"/","href":"https://my-ghost-site.com/"}}
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","user-agent":"Mozilla/5.0 (Windows NT 6.3; rv:14.7) Gecko/20100101 Firefox/14.7.1","locale":"fr-FR","location":"FR","referrer":"https://my-ghost-site.com","pathname":"/","href":"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","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","referrer":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/"}}
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","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":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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","user-agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/3.0)","locale":"es-ES","location":"ES","referrer":"","pathname":"/about/","href":"https://my-ghost-site.com/about/"}}
24
- {"timestamp":"2100-01-05 01:53:03","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":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","user-agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/3.0)","locale":"es-ES","location":"ES","referrer":"https://my-ghost-site.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/"}}
25
- {"timestamp":"2100-01-05 00:29:59","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","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","referrer":"https://www.baidu.com/","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/"}}
26
- {"timestamp":"2100-01-05 00:37:42","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":"undefined","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","referrer":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/"}}
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","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","referrer":"https://my-ghost-site.com","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/"}}
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","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","referrer":"","pathname":"/about/","href":"https://my-ghost-site.com/about/"}}
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","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/"}}
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","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/"}}
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","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/"}}
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":""}}}
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/"}}}
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/"}}}
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
+ {"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/"}}}
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/"}}}
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
+ {"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
+ {"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","referrer":"https://search.yahoo.com/","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://search.yahoo.com/"}}}
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","referrer":"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","referrer":"","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","referrer":"","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":""}}}
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","referrer":"https://my-ghost-site.com","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
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":""}}}
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
+ {"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
+ {"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","referrer":"","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":""}}}
24
+ {"timestamp":"2100-01-05 01:53:03","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":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","post_type":"post","user-agent":"Mozilla/5.0 (compatible; MSIE 10.0; Windows NT 6.1; Trident/3.0)","locale":"es-ES","location":"ES","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"}}}
25
+ {"timestamp":"2100-01-05 00:29:59","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","referrer":"https://www.baidu.com/","pathname":"/blog/hello-world/","href":"https://my-ghost-site.com/blog/hello-world/","meta":{"referrerSource":"https://www.baidu.com/"}}}
26
+ {"timestamp":"2100-01-05 00:37:42","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":"undefined","post_type":"","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","referrer":"https://my-ghost-site.com","pathname":"/","href":"https://my-ghost-site.com/","meta":{"referrerSource":"https://my-ghost-site.com"}}}
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","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"}}}
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","referrer":"","pathname":"/about/","href":"https://my-ghost-site.com/about/","meta":{"referrerSource":""}}}
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"}}}
@@ -7,10 +7,11 @@ SQL >
7
7
  coalesce(session_id, '0') as session_id,
8
8
  toString(payload.locale) as locale,
9
9
  toString(payload.location) as location,
10
- case -- this avoids really crappy null handling by the JSON type and downstream fns
11
- when isNull(payload.referrer) then ''
12
- else toString(payload.referrer)
13
- end as referrer,
10
+ # case -- this avoids really crappy null handling by the JSON type and downstream fns
11
+ # when isNull(payload.referrer) then ''
12
+ # else toString(payload.referrer)
13
+ # end as referrer,
14
+ toString(payload.meta.referrerSource) as referrer,
14
15
  toString(payload.pathname) as pathname,
15
16
  toString(payload.href) as href,
16
17
  site_uuid,
@@ -39,10 +40,51 @@ SQL >
39
40
  post_type,
40
41
  location,
41
42
  case
42
- -- domainWithoutWWW returns '' if the referrer is not a valid domain
43
- -- we want to maintain refs like 'ghost-newsletter'
44
- when domainWithoutWWW(referrer) = '' then coalesce(referrer, '')
45
- else domainWithoutWWW(referrer)
43
+ when referrer = '' then ''
44
+ -- Social Media Consolidation
45
+ when referrer IN ('Facebook', 'www.facebook.com', 'l.facebook.com', 'lm.facebook.com', 'm.facebook.com', 'facebook') then 'Facebook'
46
+ when referrer IN ('Twitter', 'x.com', 'com.twitter.android') then 'Twitter'
47
+ when referrer IN ('go.bsky.app', 'bsky', 'bsky.app') then 'Bluesky'
48
+ when referrer IN ('Instagram', 'www.instagram.com') then 'Instagram'
49
+ when referrer IN ('LinkedIn', 'LINKEDIN_COMPANY') then 'LinkedIn'
50
+ when referrer IN ('l.threads.com') then 'Threads'
51
+
52
+ -- Reddit Ecosystem
53
+ when referrer IN ('www.reddit.com', 'out.reddit.com', 'old.reddit.com', 'com.reddit.frontpage') then 'Reddit'
54
+
55
+ -- Search Engines (keep distinctions)
56
+ when referrer IN ('search.brave.com') then 'Brave Search'
57
+ when referrer IN ('www.ecosia.org') then 'Ecosia'
58
+
59
+ -- Email Services
60
+ when referrer IN ('Gmail', 'com.google.android.gm', 'mail.google.com') then 'Gmail'
61
+ when referrer IN ('Outlook.com') then 'Outlook'
62
+ when referrer IN ('Yahoo!', 'www.yahoo.com', 'Yahoo! Mail', 'r.search.yahoo.com') then 'Yahoo!'
63
+ when referrer IN ('AOL Mail') then 'AOL Mail'
64
+
65
+ -- Content Platforms
66
+ when referrer IN ('flipboard', 'flipboard.com', 'flipboard.app') then 'Flipboard'
67
+ when referrer IN ('substack', 'substack.com') then 'Substack'
68
+ when referrer IN ('Ghost.org', 'ghost.org') then 'Ghost'
69
+ when referrer IN ('buffer') then 'Buffer'
70
+ when referrer IN ('Taboola') then 'Taboola'
71
+ when referrer IN ('AppNexus') then 'AppNexus'
72
+
73
+ -- Wikipedia
74
+ when referrer IN ('en.wikipedia.org', 'en.m.wikipedia.org') then 'Wikipedia'
75
+
76
+ -- Mastodon Network
77
+ when referrer IN ('mastodon.social', 'mastodon.online', 'org.joinmastodon.android', 'phanpy.social', 'dev.phanpy.social') then 'Mastodon'
78
+
79
+ -- News Aggregators
80
+ when referrer IN ('www.memeorandum.com', 'memeorandum.com') then 'Memeorandum'
81
+ when referrer IN ('ground.news') then 'Ground News'
82
+ when referrer IN ('apple.news') then 'Apple News'
83
+ when referrer IN ('www.smartnews.com') then 'SmartNews'
84
+
85
+ -- Keep other sources as-is
86
+ when domainWithoutWWW(referrer) != '' then domainWithoutWWW(referrer)
87
+ else referrer
46
88
  end as source,
47
89
  pathname,
48
90
  href,
@@ -84,6 +126,4 @@ SQL >
84
126
  FROM mv_hits_0
85
127
 
86
128
  TYPE materialized
87
- DATASOURCE _mv_hits
88
-
89
-
129
+ DATASOURCE _mv_hits
@@ -96,3 +96,10 @@
96
96
  {"post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1fc","pathname":"\/about\/","visits":2}
97
97
  {"post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","pathname":"\/blog\/hello-world\/","visits":1}
98
98
  {"post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1dd","pathname":"\/blog\/hello-world\/","visits":1}
99
+
100
+ - name: Test with post_type - post
101
+ description: Test with post_type - post
102
+ parameters: site_uuid=mock_site_uuid&date_from=2100-01-01&date_to=2100-01-07&timezone=Etc/UTC&post_type=post
103
+ expected_result: |
104
+ {"post_uuid":"6b8635fb-292f-4422-9fe4-d76cfab2ba31","pathname":"\/blog\/hello-world\/","visits":9}
105
+ {"post_uuid":"06b1b0c9-fb53-4a15-a060-3db3fde7b1dd","pathname":"\/blog\/hello-world\/","visits":1}
@@ -31,6 +31,7 @@ const Newsletter = ghostBookshelf.Model.extend({
31
31
  show_excerpt: false,
32
32
  button_corners: 'rounded',
33
33
  button_style: 'fill',
34
+ button_color: 'accent',
34
35
  title_font_weight: 'bold',
35
36
  link_style: 'underline',
36
37
  image_corners: 'square',
@@ -102,7 +102,11 @@ module.exports = class AdapterManager {
102
102
  /** @type AdapterConstructor */
103
103
  let Adapter;
104
104
  for (const pathToAdapters of this.pathsToAdapters) {
105
- const pathToAdapter = path.join(pathToAdapters, adapterType, adapterClassName);
105
+ let pathToAdapter = path.join(pathToAdapters, adapterType, adapterClassName);
106
+ if (pathToAdapters === '') {
107
+ // We are loading from node_modules, we can remove the `adapterType` prefix
108
+ pathToAdapter = path.join(pathToAdapters, adapterClassName);
109
+ }
106
110
  try {
107
111
  Adapter = this.loadAdapterFromPath(pathToAdapter);
108
112
  if (Adapter) {
@@ -73,16 +73,18 @@ class CommentsServiceEmails {
73
73
  return;
74
74
  }
75
75
 
76
+ const memberId = reply.get('member_id');
77
+
76
78
  // Don't send a notification if you reply to your own comment
77
- if (parentMember.id === reply.get('member_id')) {
79
+ if (parentMember.id === memberId) {
78
80
  return;
79
81
  }
80
82
 
81
- const to = parentMember.get('email');
83
+ const parentMemberEmail = parentMember.get('email');
82
84
  const subject = '↪️ New reply to your comment on ' + this.settingsCache.get('title');
83
85
 
84
86
  const post = await this.models.Post.findOne({id: reply.get('post_id')});
85
- const member = await this.models.Member.findOne({id: reply.get('member_id')});
87
+ const member = await this.models.Member.findOne({id: memberId});
86
88
 
87
89
  const memberName = member.get('name') || 'Anonymous';
88
90
 
@@ -99,14 +101,14 @@ class CommentsServiceEmails {
99
101
  memberInitials: this.extractInitials(memberName),
100
102
  accentColor: this.settingsCache.get('accent_color'),
101
103
  fromEmail: this.notificationFromAddress,
102
- toEmail: to,
103
- profileUrl: emailService.renderer.createUnsubscribeUrl(member.get('uuid'), {comments: true})
104
+ toEmail: parentMemberEmail,
105
+ profileUrl: emailService.renderer.createUnsubscribeUrl(parentMember.get('uuid'), {comments: true})
104
106
  };
105
107
 
106
108
  const {html, text} = await this.renderEmailTemplate('new-comment-reply', templateData);
107
109
 
108
110
  return this.sendMail({
109
- to,
111
+ to: parentMemberEmail,
110
112
  subject,
111
113
  html,
112
114
  text
@@ -13,6 +13,8 @@ const {registerHelpers} = require('./helpers/register-helpers');
13
13
  const crypto = require('crypto');
14
14
 
15
15
  const DEFAULT_LOCALE = 'en-gb';
16
+ const DEFAULT_ACCENT_COLOR = '#15212A';
17
+ const VALID_HEX_REGEX = /#([0-9a-f]{3}){1,2}$/i;
16
18
 
17
19
  // Wrapper function so that i18next-parser can find these strings
18
20
  const t = (x) => {
@@ -324,8 +326,15 @@ class EmailRenderer {
324
326
 
325
327
  const labs = this.getLabs();
326
328
 
329
+ let accentColor = this.#settingsCache?.get('accent_color') || DEFAULT_ACCENT_COLOR;
330
+ if (!VALID_HEX_REGEX.test(accentColor)) {
331
+ accentColor = DEFAULT_ACCENT_COLOR;
332
+ }
333
+
327
334
  if (labs?.isSet('emailCustomization') || labs?.isSet('emailCustomizationAlpha')) {
328
- renderOptions.design = {};
335
+ renderOptions.design = {
336
+ accentColor
337
+ };
329
338
  }
330
339
 
331
340
  const betaDesignOptions = {
@@ -335,7 +344,15 @@ class EmailRenderer {
335
344
  linkStyle: newsletter?.get('link_style'),
336
345
  imageCorners: newsletter?.get('image_corners'),
337
346
  postTitleColor: newsletter?.get('post_title_color'),
338
- sectionTitleColor: newsletter?.get('section_title_color')
347
+ sectionTitleColor: newsletter?.get('section_title_color'),
348
+ linkColor: newsletter?.get('link_color'),
349
+ // TODO:
350
+ // if the other options above have default or calculated values we
351
+ // should follow the same pattern as the options below to avoid
352
+ //duplicating magic values or logic in renderers
353
+ dividerColor: this.#getDividerColor(newsletter),
354
+ buttonColor: this.#getButtonColor(newsletter, accentColor),
355
+ buttonTextColor: this.#getButtonTextColor(newsletter, accentColor)
339
356
  };
340
357
 
341
358
  if (labs?.isSet('emailCustomization')) {
@@ -348,11 +365,7 @@ class EmailRenderer {
348
365
  if (labs?.isSet('emailCustomizationAlpha')) {
349
366
  renderOptions.design = {
350
367
  ...renderOptions.design,
351
- ...betaDesignOptions,
352
- // TODO:
353
- // if the other options have default values we should follow the same pattern
354
- // as the divider color to avoid duplicating magic values in renderers
355
- dividerColor: this.#getDividerColor(newsletter)
368
+ ...betaDesignOptions
356
369
  };
357
370
  }
358
371
 
@@ -932,14 +945,12 @@ class EmailRenderer {
932
945
  /** @type {'light' | 'dark' | string | null} */
933
946
  const value = newsletter.get('background_color');
934
947
 
935
- const validHex = /#([0-9a-f]{3}){1,2}$/i;
936
-
937
- if (validHex.test(value)) {
948
+ if (VALID_HEX_REGEX.test(value)) {
938
949
  return value;
939
950
  }
940
951
 
941
952
  if (value === 'dark') {
942
- return '#15212a';
953
+ return DEFAULT_ACCENT_COLOR;
943
954
  }
944
955
 
945
956
  // value === dark, value === null, value is not valid hex
@@ -950,9 +961,7 @@ class EmailRenderer {
950
961
  /** @type {'accent' | 'auto' | string | null} */
951
962
  const value = newsletter.get('post_title_color');
952
963
 
953
- const validHex = /#([0-9a-f]{3}){1,2}$/i;
954
-
955
- if (validHex.test(value)) {
964
+ if (VALID_HEX_REGEX.test(value)) {
956
965
  return value;
957
966
  }
958
967
 
@@ -973,9 +982,8 @@ class EmailRenderer {
973
982
 
974
983
  /** @type {'accent' | 'auto' | string | null} */
975
984
  const value = newsletter.get('section_title_color');
976
- const validHex = /#([0-9a-f]{3}){1,2}$/i;
977
985
 
978
- if (validHex.test(value)) {
986
+ if (VALID_HEX_REGEX.test(value)) {
979
987
  return value;
980
988
  }
981
989
 
@@ -1032,13 +1040,13 @@ class EmailRenderer {
1032
1040
  #getDividerColor(newsletter) {
1033
1041
  const labs = this.getLabs();
1034
1042
 
1035
- if (labs?.isSet('emailCustomizationAlpha')) {
1043
+ if (labs?.isSet('emailCustomization') || labs?.isSet('emailCustomizationAlpha')) {
1036
1044
  const value = newsletter?.get('divider_color');
1037
- const validHex = /#([0-9a-f]{3}){1,2}$/i;
1038
1045
 
1039
1046
  if (value === 'accent') {
1040
- return this.#settingsCache.get('accent_color');
1041
- } else if (validHex.test(value)) {
1047
+ const accentColor = this.#settingsCache?.get('accent_color') || DEFAULT_ACCENT_COLOR;
1048
+ return VALID_HEX_REGEX.test(accentColor) ? accentColor : DEFAULT_ACCENT_COLOR;
1049
+ } else if (VALID_HEX_REGEX.test(value)) {
1042
1050
  return value;
1043
1051
  }
1044
1052
  }
@@ -1047,13 +1055,58 @@ class EmailRenderer {
1047
1055
  return '#e0e7eb';
1048
1056
  }
1049
1057
 
1058
+ #getLinkColor(newsletter, accentColor) {
1059
+ const value = newsletter.get('link_color');
1060
+
1061
+ if (value === 'accent') {
1062
+ return accentColor;
1063
+ }
1064
+
1065
+ if (VALID_HEX_REGEX.test(value)) {
1066
+ return value;
1067
+ }
1068
+
1069
+ return accentColor; // default to accent color
1070
+ }
1071
+
1072
+ #getButtonColor(newsletter, accentColor) {
1073
+ /** @type {'accent' | 'auto' | string | null} */
1074
+ const buttonColor = newsletter?.get('button_color') || 'accent';
1075
+
1076
+ if (buttonColor === 'accent') {
1077
+ return accentColor;
1078
+ }
1079
+
1080
+ if (buttonColor === 'auto') {
1081
+ const backgroundColor = this.#getBackgroundColor(newsletter);
1082
+ return textColorForBackgroundColor(backgroundColor).hex();
1083
+ }
1084
+
1085
+ if (VALID_HEX_REGEX.test(buttonColor)) {
1086
+ return buttonColor;
1087
+ }
1088
+
1089
+ return accentColor; // default to accent color
1090
+ }
1091
+
1092
+ // white/black for dark/light button colors
1093
+ // outline buttons use button color as text color but that's handled in styles
1094
+ #getButtonTextColor(newsletter, accentColor) {
1095
+ const buttonColor = this.#getButtonColor(newsletter, accentColor);
1096
+ return textColorForBackgroundColor(buttonColor).hex();
1097
+ }
1098
+
1050
1099
  /**
1051
1100
  * @private
1052
1101
  */
1053
1102
  async getTemplateData({post, newsletter, html, addPaywall, segment}) {
1054
1103
  const labs = this.getLabs();
1055
1104
 
1056
- let accentColor = this.#settingsCache.get('accent_color') || '#15212A';
1105
+ let accentColor = this.#settingsCache.get('accent_color') || DEFAULT_ACCENT_COLOR;
1106
+ if (!VALID_HEX_REGEX.test(accentColor)) {
1107
+ accentColor = DEFAULT_ACCENT_COLOR;
1108
+ }
1109
+
1057
1110
  let adjustedAccentColor;
1058
1111
  let adjustedAccentContrastColor;
1059
1112
  try {
@@ -1061,7 +1114,7 @@ class EmailRenderer {
1061
1114
  adjustedAccentContrastColor = accentColor && textColorForBackgroundColor(adjustedAccentColor).hex();
1062
1115
  } catch (e) {
1063
1116
  logging.error(e);
1064
- accentColor = '#15212A';
1117
+ adjustedAccentColor = accentColor;
1065
1118
  }
1066
1119
 
1067
1120
  const hasAnyEmailCustomization = labs.isSet('emailCustomization') || labs.isSet('emailCustomizationAlpha');
@@ -1073,10 +1126,12 @@ class EmailRenderer {
1073
1126
  const titleStrongWeight = this.#getTitleStrongWeight(titleWeight);
1074
1127
  const textColor = textColorForBackgroundColor(backgroundColor).hex();
1075
1128
  const secondaryTextColor = textColorForBackgroundColor(backgroundColor).alpha(0.5).toString();
1076
- const linkColor = backgroundIsDark ? '#ffffff' : accentColor;
1129
+ const linkColor = hasAnyEmailCustomization ? this.#getLinkColor(newsletter, accentColor) : backgroundIsDark ? '#ffffff' : accentColor;
1077
1130
  const hasRoundedImageCorners = hasAnyEmailCustomization ? this.#getImageCorners(newsletter) : false;
1078
1131
  const sectionTitleColor = hasAnyEmailCustomization ? this.#getSectionTitleColor(newsletter, accentColor) : null;
1079
1132
  const dividerColor = this.#getDividerColor(newsletter);
1133
+ const buttonColor = this.#getButtonColor(newsletter, adjustedAccentColor);
1134
+ const buttonTextColor = this.#getButtonTextColor(newsletter, adjustedAccentColor);
1080
1135
 
1081
1136
  let buttonBorderRadius = '6px';
1082
1137
  if (hasAnyEmailCustomization) {
@@ -1240,6 +1295,8 @@ class EmailRenderer {
1240
1295
  headerImageWidth,
1241
1296
  showHeaderIcon: newsletter.get('show_header_icon') && this.#settingsCache.get('icon'),
1242
1297
  dividerColor,
1298
+ buttonColor,
1299
+ buttonTextColor,
1243
1300
 
1244
1301
  // TODO: consider moving these to newsletter property
1245
1302
  showHeaderTitle: newsletter.get('show_header_title'),