diff options
| author | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
|---|---|---|
| committer | Fuwn <[email protected]> | 2026-01-24 13:09:50 +0000 |
| commit | 396acf3bbbe00a192cb0ea0a9ccf91b1d8d2850b (patch) | |
| tree | b9df4ca6a70db45cfffbae6fdd7252e20fb8e93c /scripts/seed/sites/blog.ts | |
| download | umami-main.tar.xz umami-main.zip | |
Created from https://vercel.com/new
Diffstat (limited to 'scripts/seed/sites/blog.ts')
| -rw-r--r-- | scripts/seed/sites/blog.ts | 108 |
1 files changed, 108 insertions, 0 deletions
diff --git a/scripts/seed/sites/blog.ts b/scripts/seed/sites/blog.ts new file mode 100644 index 0000000..e60b8b9 --- /dev/null +++ b/scripts/seed/sites/blog.ts @@ -0,0 +1,108 @@ +import { weightedRandom, type WeightedOption } from '../utils.js'; +import type { + SiteConfig, + JourneyConfig, + PageConfig, + CustomEventConfig, +} from '../generators/events.js'; + +export const BLOG_WEBSITE_NAME = 'Demo Blog'; +export const BLOG_WEBSITE_DOMAIN = 'blog.example.com'; + +const blogPosts = [ + 'getting-started-with-analytics', + 'privacy-first-tracking', + 'understanding-your-visitors', + 'improving-page-performance', + 'seo-best-practices', + 'content-marketing-guide', + 'building-audience-trust', + 'data-driven-decisions', +]; + +export const blogPages: PageConfig[] = [ + { path: '/', title: 'Demo Blog - Home', weight: 0.25, avgTimeOnPage: 30 }, + { path: '/blog', title: 'Blog Posts', weight: 0.2, avgTimeOnPage: 45 }, + { path: '/about', title: 'About Us', weight: 0.1, avgTimeOnPage: 60 }, + { path: '/contact', title: 'Contact', weight: 0.05, avgTimeOnPage: 45 }, + ...blogPosts.map(slug => ({ + path: `/blog/${slug}`, + title: slug + .split('-') + .map(w => w.charAt(0).toUpperCase() + w.slice(1)) + .join(' '), + weight: 0.05, + avgTimeOnPage: 180, + })), +]; + +export const blogJourneys: JourneyConfig[] = [ + // Direct to blog post (organic search) + { pages: ['/blog/getting-started-with-analytics'], weight: 0.15 }, + { pages: ['/blog/privacy-first-tracking'], weight: 0.12 }, + { pages: ['/blog/understanding-your-visitors'], weight: 0.1 }, + + // Homepage bounces + { pages: ['/'], weight: 0.15 }, + + // Homepage to blog listing + { pages: ['/', '/blog'], weight: 0.1 }, + + // Homepage to blog post + { pages: ['/', '/blog', '/blog/seo-best-practices'], weight: 0.08 }, + { pages: ['/', '/blog', '/blog/content-marketing-guide'], weight: 0.08 }, + + // About page visits + { pages: ['/', '/about'], weight: 0.07 }, + { pages: ['/', '/about', '/contact'], weight: 0.05 }, + + // Blog post to another + { pages: ['/blog/improving-page-performance', '/blog/data-driven-decisions'], weight: 0.05 }, + + // Longer sessions + { pages: ['/', '/blog', '/blog/building-audience-trust', '/about'], weight: 0.05 }, +]; + +export const blogCustomEvents: CustomEventConfig[] = [ + { + name: 'newsletter_signup', + weight: 0.03, + pages: ['/', '/blog'], + }, + { + name: 'share_click', + weight: 0.05, + pages: blogPosts.map(slug => `/blog/${slug}`), + data: { + platform: ['twitter', 'linkedin', 'facebook', 'copy_link'], + }, + }, + { + name: 'scroll_depth', + weight: 0.2, + pages: blogPosts.map(slug => `/blog/${slug}`), + data: { + depth: [25, 50, 75, 100], + }, + }, +]; + +export function getBlogSiteConfig(): SiteConfig { + return { + hostname: BLOG_WEBSITE_DOMAIN, + pages: blogPages, + journeys: blogJourneys, + customEvents: blogCustomEvents, + }; +} + +export function getBlogJourney(): string[] { + const journeyWeights: WeightedOption<string[]>[] = blogJourneys.map(j => ({ + value: j.pages, + weight: j.weight, + })); + + return weightedRandom(journeyWeights); +} + +export const BLOG_SESSIONS_PER_DAY = 3; // ~90 sessions per month |