From e6b19e7a1c212c77baf2007956322267a023cbee Mon Sep 17 00:00:00 2001 From: Timo Knuth Date: Mon, 23 Mar 2026 19:01:52 -0500 Subject: [PATCH] search console SEO ableitungen --- .claude/settings.local.json | 66 +- .dockerignore | 110 +- .editorconfig | 26 +- .env.example | 32 +- .github/workflows/ci.yml | 50 +- .npmrc | 2 +- .prettierrc | 14 +- .vercelignore | 20 +- .vscode/settings.json | 4 +- AEO-GEO-IMPLEMENTATION-PLAN.md | 662 +-- CLAUDE.md | 532 +- DOCKER_SETUP.md | 922 +-- LICENSE | 40 +- README.md | 962 ++-- backlinks.md | 1148 ++-- blog-posts-improved/bulk-qr-excel-IMPROVED.md | 1468 ++--- blog-posts-improved/qr-analytics-IMPROVED.md | 1054 ++-- dev-server.js | 24 +- docker-compose.dev.yml | 132 +- docker/README.md | 552 +- docker/init-db.sh | 52 +- env.example | 100 +- implementations_idee.md | 254 +- marketing/reddit-4-week-calendar-full.ics | 192 +- marketing/reddit-4-week-calendar-full.md | 886 +-- .../reddit-4-week-calendar-universal.ics | 336 +- marketing/reddit-4-week-calendar.ics | 332 +- marketing/reddit-4-week-calendar.md | 914 +-- marketing/twitter-30-day-plan.md | 544 +- postcss.config.js | 10 +- .../20251013172642_init/migration.sql | 292 +- .../20251014195005_init/migration.sql | 44 +- .../migration.sql | 134 +- .../migration.sql | 62 +- prisma/migrations/migration_lock.toml | 4 +- prisma/seed.ts | 232 +- public/favicon.svg | 64 +- public/llms.txt | 62 +- public/logo.svg | 62 +- public/static/.gitkeep | 4 +- ...tiktokVwGRbyf2BbBLqUlFrnehtntSEU9Ihiok.txt | 2 +- qrmaster-growth-system/SKILL.md | 156 +- qrmaster-growth-system/agents/openai.yaml | 12 +- .../references/core-plan.md | 310 +- .../references/current-state-findings.md | 114 +- .../references/top-30-backlog.md | 158 +- .../references/tracking-spec.md | 156 +- scripts/add-aeo-optimization.js | 288 +- scripts/add-metadata-divs.js | 132 +- scripts/build.js | 274 +- scripts/fix-metadata-dates.js | 92 +- scripts/remove-draft-notes.js | 40 +- scripts/setup.ps1 | 274 +- scripts/setup.sh | 296 +- seo_findings.md | 198 +- src/app/(main)/(app)/bulk-creation/page.tsx | 1438 ++--- src/app/(main)/(app)/dashboard/page.tsx | 1138 ++-- src/app/(main)/(app)/integrations/page.tsx | 782 +-- src/app/(main)/(app)/settings/page.tsx | 772 +-- src/app/(main)/(app)/test/page.tsx | 314 +- .../(main)/(auth)/forgot-password/page.tsx | 310 +- .../(marketing)/blog/[slug]/raw/route.ts | 290 +- .../bulk-qr-code-generator/page.tsx | 1008 ++-- .../dynamic-qr-code-generator/page.tsx | 1172 ++-- src/app/(main)/(marketing)/faq/page.tsx | 486 +- .../(marketing)/manage-qr-codes/page.tsx | 778 +-- src/app/(main)/(marketing)/pricing/page.tsx | 236 +- .../(marketing)/qr-code-analytics/page.tsx | 286 +- .../qr-code-for-marketing-campaigns/page.tsx | 224 +- .../(marketing)/qr-code-tracking/page.tsx | 1044 ++-- .../(main)/(marketing)/testimonials/page.tsx | 286 +- .../barcode-generator/BarcodeFormatPicker.tsx | 179 + .../tools/barcode-generator/BarcodeGuide.tsx | 239 +- .../tools/barcode-generator/page.tsx | 4 +- .../(marketing)/use-cases/[slug]/page.tsx | 156 +- src/app/(main)/(marketing)/use-cases/page.tsx | 608 +- .../(main)/api/auth/[...nextauth]/route.ts | 10 +- .../(main)/api/auth/forgot-password/route.ts | 178 +- src/app/(main)/api/auth/google/route.ts | 330 +- .../(main)/api/auth/reset-password/route.ts | 180 +- src/app/(main)/api/auth/simple-login/route.ts | 168 +- src/app/(main)/api/csrf/route.ts | 28 +- .../api/newsletter/admin-login/route.ts | 118 +- .../(main)/api/newsletter/broadcast/route.ts | 326 +- .../(main)/api/newsletter/subscribe/route.ts | 182 +- src/app/(main)/api/qrs/[id]/route.ts | 408 +- src/app/(main)/api/qrs/delete-all/route.ts | 120 +- src/app/(main)/api/qrs/static/route.ts | 184 +- .../api/stripe/cancel-subscription/route.ts | 178 +- src/app/(main)/api/stripe/checkout/route.ts | 156 +- .../stripe/create-checkout-session/route.ts | 230 +- src/app/(main)/api/stripe/portal/route.ts | 140 +- .../api/stripe/sync-subscription/route.ts | 226 +- .../(main)/api/stripe/verify-session/route.ts | 194 +- src/app/(main)/api/stripe/webhook/route.ts | 232 +- src/app/(main)/api/user/debug/route.ts | 82 +- src/app/(main)/api/user/delete/route.ts | 172 +- src/app/(main)/api/user/password/route.ts | 206 +- src/app/(main)/api/user/plan/route.ts | 118 +- src/app/(main)/api/user/profile/route.ts | 148 +- src/app/(main)/api/user/route.ts | 84 +- src/app/(main)/api/user/stats/route.ts | 124 +- src/app/(main)/og/route.tsx | 134 +- src/app/(main)/providers.tsx | 12 +- .../(marketing-de)/qr-code-erstellen/page.tsx | 4 +- src/app/robots.ts | 56 +- src/components/Breadcrumbs.tsx | 74 +- src/components/CookieBanner.tsx | 236 +- src/components/SessionProvider.tsx | 22 +- src/components/dashboard/StatsGrid.tsx | 214 +- src/components/generator/QRPreview.tsx | 312 +- .../marketing/GrowthLinksSection.tsx | 146 +- .../marketing/MarketingAnalytics.tsx | 188 +- src/components/marketing/Testimonials.tsx | 264 +- .../marketing/UseCasePageTemplate.tsx | 854 +-- .../settings/ChangePasswordModal.tsx | 330 +- src/components/ui/Badge.tsx | 62 +- src/components/ui/BillingToggle.tsx | 76 +- src/components/ui/Button.tsx | 94 +- src/components/ui/Card.tsx | 186 +- src/components/ui/Dialog.tsx | 182 +- src/components/ui/Dropdown.tsx | 124 +- src/components/ui/Input.tsx | 102 +- src/components/ui/QRCode.tsx | 106 +- src/components/ui/ScrollToTop.tsx | 114 +- src/components/ui/Select.tsx | 90 +- src/components/ui/Table.tsx | 208 +- src/components/ui/Toast.tsx | 278 +- src/hooks/useCsrf.ts | 124 +- src/hooks/useTranslation.ts | 120 +- src/lib/auth.ts | 170 +- src/lib/blog-data.ts | 5084 +++++++++-------- src/lib/blog-data.ts.backup | 4972 ++++++++-------- src/lib/charts.ts | 158 +- src/lib/cookieConfig.ts | 78 +- src/lib/csrf.ts | 158 +- src/lib/email.ts | 1068 ++-- src/lib/geo.ts | 108 +- src/lib/growth-pages.ts | 1950 +++---- src/lib/hash.ts | 96 +- src/lib/qr.ts | 452 +- src/lib/rateLimit.ts | 458 +- src/lib/stripe.ts | 160 +- src/lib/testimonial-data.ts | 116 +- src/styles/globals.css | 398 +- src/types/analytics.ts | 100 +- tailwind.config.js | 136 +- tsconfig.json | 54 +- twitter-x-30-day-content-plan.md | 544 +- vercel.json | 20 +- 150 files changed, 26257 insertions(+), 25909 deletions(-) create mode 100644 src/app/(main)/(marketing)/tools/barcode-generator/BarcodeFormatPicker.tsx diff --git a/.claude/settings.local.json b/.claude/settings.local.json index 7a5caab..2341206 100644 --- a/.claude/settings.local.json +++ b/.claude/settings.local.json @@ -1,33 +1,33 @@ -{ - "permissions": { - "allow": [ - "Bash(docker-compose:*)", - "Bash(docker container prune:*)", - "Bash(npx prisma migrate dev:*)", - "Bash(npx prisma:*)", - "Bash(npm run dev)", - "Bash(timeout:*)", - "Bash(taskkill:*)", - "Bash(npx kill-port:*)", - "Bash(docker compose:*)", - "Bash(curl -I https://fonts.googleapis.com)", - "Bash(wsl:*)", - "Read(//c/Users/a931627/.ssh/**)", - "Bash(ssh-keygen:*)", - "Bash(cat:*)", - "Bash(git remote add:*)", - "Bash(git push:*)", - "Bash(git remote set-url:*)", - "Bash(npm install:*)", - "Bash(npm run build:*)", - "Bash(ls:*)", - "Bash(curl:*)", - "Bash(echo \"\n\n## CSRF Debug aktiviert!\n\nBitte teste jetzt:\n1. Browser zu http://localhost:3050/create\n2. Dynamic QR Code erstellen versuchen\n3. Server-Logs zeigen jetzt [CSRF Debug] Output\n\nIch sehe dann:\n- Ob headerToken vorhanden ist\n- Ob cookieToken vorhanden ist \n- Ob sie übereinstimmen\n\n---\n\nStripe Portal 500 Error ist separates Problem:\nhttps://dashboard.stripe.com/test/settings/billing/portal\n→ Customer Portal Configuration muss erstellt werden\n\")", - "Bash(pkill:*)", - "Skill(shadcn-ui)", - "Bash(find:*)" - ], - "deny": [], - "ask": [] - } -} +{ + "permissions": { + "allow": [ + "Bash(docker-compose:*)", + "Bash(docker container prune:*)", + "Bash(npx prisma migrate dev:*)", + "Bash(npx prisma:*)", + "Bash(npm run dev)", + "Bash(timeout:*)", + "Bash(taskkill:*)", + "Bash(npx kill-port:*)", + "Bash(docker compose:*)", + "Bash(curl -I https://fonts.googleapis.com)", + "Bash(wsl:*)", + "Read(//c/Users/a931627/.ssh/**)", + "Bash(ssh-keygen:*)", + "Bash(cat:*)", + "Bash(git remote add:*)", + "Bash(git push:*)", + "Bash(git remote set-url:*)", + "Bash(npm install:*)", + "Bash(npm run build:*)", + "Bash(ls:*)", + "Bash(curl:*)", + "Bash(echo \"\n\n## CSRF Debug aktiviert!\n\nBitte teste jetzt:\n1. Browser zu http://localhost:3050/create\n2. Dynamic QR Code erstellen versuchen\n3. Server-Logs zeigen jetzt [CSRF Debug] Output\n\nIch sehe dann:\n- Ob headerToken vorhanden ist\n- Ob cookieToken vorhanden ist \n- Ob sie übereinstimmen\n\n---\n\nStripe Portal 500 Error ist separates Problem:\nhttps://dashboard.stripe.com/test/settings/billing/portal\n→ Customer Portal Configuration muss erstellt werden\n\")", + "Bash(pkill:*)", + "Skill(shadcn-ui)", + "Bash(find:*)" + ], + "deny": [], + "ask": [] + } +} diff --git a/.dockerignore b/.dockerignore index 132abe7..2a2d8ba 100644 --- a/.dockerignore +++ b/.dockerignore @@ -1,55 +1,55 @@ -# Dependencies -node_modules -npm-debug.log -yarn-error.log -pnpm-debug.log - -# Testing -coverage -.nyc_output - -# Next.js -.next -out -dist -build - -# Environment files -.env -.env.local -.env.development.local -.env.test.local -.env.production.local - -# IDEs -.vscode -.idea -*.swp -*.swo -*~ - -# OS -.DS_Store -Thumbs.db - -# Git -.git -.gitignore - -# Docker -Dockerfile -docker-compose*.yml -.dockerignore - -# Misc -README.md -.prettierrc -.eslintrc.json -*.md - -# Logs -logs -*.log - -# Prisma -# prisma/migrations # Now included in Docker image for deployment +# Dependencies +node_modules +npm-debug.log +yarn-error.log +pnpm-debug.log + +# Testing +coverage +.nyc_output + +# Next.js +.next +out +dist +build + +# Environment files +.env +.env.local +.env.development.local +.env.test.local +.env.production.local + +# IDEs +.vscode +.idea +*.swp +*.swo +*~ + +# OS +.DS_Store +Thumbs.db + +# Git +.git +.gitignore + +# Docker +Dockerfile +docker-compose*.yml +.dockerignore + +# Misc +README.md +.prettierrc +.eslintrc.json +*.md + +# Logs +logs +*.log + +# Prisma +# prisma/migrations # Now included in Docker image for deployment diff --git a/.editorconfig b/.editorconfig index 42c8d98..50a6727 100644 --- a/.editorconfig +++ b/.editorconfig @@ -1,14 +1,14 @@ -root = true - -[*] -charset = utf-8 -end_of_line = lf -insert_final_newline = true -trim_trailing_whitespace = true - -[*.{js,jsx,ts,tsx,json,css,scss,md}] -indent_style = space -indent_size = 2 - -[*.md] +root = true + +[*] +charset = utf-8 +end_of_line = lf +insert_final_newline = true +trim_trailing_whitespace = true + +[*.{js,jsx,ts,tsx,json,css,scss,md}] +indent_style = space +indent_size = 2 + +[*.md] trim_trailing_whitespace = false \ No newline at end of file diff --git a/.env.example b/.env.example index 706b5ae..1b51a21 100644 --- a/.env.example +++ b/.env.example @@ -1,17 +1,17 @@ -# Database credentials (used by both db and web services in docker-compose.yml) -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres -POSTGRES_DB=qrmaster - -# Note: DATABASE_URL and DIRECT_URL are auto-generated from POSTGRES_* vars in docker-compose.yml -# You don't need to set them here when using Docker Compose -NODE_ENV=production -PORT=3000 -NEXTAUTH_URL=http://localhost:3000 -NEXTAUTH_SECRET=CHANGE_ME -NEXT_PUBLIC_APP_URL=http://localhost:3000 -GOOGLE_CLIENT_ID= -GOOGLE_CLIENT_SECRET= -REDIS_URL=redis://redis:6379 -IP_SALT=CHANGE_ME_SALT +# Database credentials (used by both db and web services in docker-compose.yml) +POSTGRES_USER=postgres +POSTGRES_PASSWORD=postgres +POSTGRES_DB=qrmaster + +# Note: DATABASE_URL and DIRECT_URL are auto-generated from POSTGRES_* vars in docker-compose.yml +# You don't need to set them here when using Docker Compose +NODE_ENV=production +PORT=3000 +NEXTAUTH_URL=http://localhost:3000 +NEXTAUTH_SECRET=CHANGE_ME +NEXT_PUBLIC_APP_URL=http://localhost:3000 +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= +REDIS_URL=redis://redis:6379 +IP_SALT=CHANGE_ME_SALT ENABLE_DEMO=true \ No newline at end of file diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 252cd0b..2446693 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -1,26 +1,26 @@ -name: CI - -on: [push] - -jobs: - build: - runs-on: ubuntu-latest - - steps: - - uses: actions/checkout@v4 - - - uses: actions/setup-node@v4 - with: - node-version: 20 - - - name: Install dependencies - run: npm ci - - - name: Generate Prisma Client - run: npx prisma generate - - - name: Build application - run: npm run build - - - name: Run linter +name: CI + +on: [push] + +jobs: + build: + runs-on: ubuntu-latest + + steps: + - uses: actions/checkout@v4 + + - uses: actions/setup-node@v4 + with: + node-version: 20 + + - name: Install dependencies + run: npm ci + + - name: Generate Prisma Client + run: npx prisma generate + + - name: Build application + run: npm run build + + - name: Run linter run: npm run lint \ No newline at end of file diff --git a/.npmrc b/.npmrc index 9eb9326..f53d802 100644 --- a/.npmrc +++ b/.npmrc @@ -1,2 +1,2 @@ -registry=https://registry.npmjs.org/ +registry=https://registry.npmjs.org/ legacy-peer-deps=true \ No newline at end of file diff --git a/.prettierrc b/.prettierrc index 46f2372..d73421c 100644 --- a/.prettierrc +++ b/.prettierrc @@ -1,8 +1,8 @@ -{ - "semi": true, - "trailingComma": "es5", - "singleQuote": true, - "printWidth": 80, - "tabWidth": 2, - "useTabs": false +{ + "semi": true, + "trailingComma": "es5", + "singleQuote": true, + "printWidth": 80, + "tabWidth": 2, + "useTabs": false } \ No newline at end of file diff --git a/.vercelignore b/.vercelignore index 36b5cc7..99d5d69 100644 --- a/.vercelignore +++ b/.vercelignore @@ -1,10 +1,10 @@ -node_modules -.next -.git -*.log -.env -.env.local -.vercel -*.sql -/backups/ -.npmrc +node_modules +.next +.git +*.log +.env +.env.local +.vercel +*.sql +/backups/ +.npmrc diff --git a/.vscode/settings.json b/.vscode/settings.json index db1ed83..624b12a 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -1,3 +1,3 @@ -{ - "codium.codeCompletion.enable": false +{ + "codium.codeCompletion.enable": false } \ No newline at end of file diff --git a/AEO-GEO-IMPLEMENTATION-PLAN.md b/AEO-GEO-IMPLEMENTATION-PLAN.md index 61829a7..2036a92 100644 --- a/AEO-GEO-IMPLEMENTATION-PLAN.md +++ b/AEO-GEO-IMPLEMENTATION-PLAN.md @@ -1,331 +1,331 @@ -# AEO/GEO Implementation Plan — 22 Blog Posts - -## Status: Template Created, Ready for Batch Implementation - -**Date**: 2026-03-06 -**Objective**: Optimize all 22 QR Master blog posts for AI search visibility (Perplexity, ChatGPT, Claude, Google AI Overviews) - ---- - -## What Was Done - -✅ **POST #1: `trackable-qr-codes`** — Schema + Author Bio + Inline Citations -⏳ **POSTS #2-3**: Ready for implementation (see template below) -📋 **POSTS #4-22**: Use standardized template below - ---- - -## AEO/GEO Optimization Template - -### For Each Blog Post, Add: - -#### **1. Schema Markup (JSON-LD)** - -```javascript -// Add new "schema" field to post object: -schema: { - article: { - "@context": "https://schema.org", - "@type": "Article", - "headline": post.title, - "description": post.description, - "image": post.image, - "datePublished": post.datePublished, - "dateModified": post.dateModified, - "author": { - "@type": "Person", - "name": "Timo Schmidt", - "jobTitle": "QR Code & Marketing Expert", - "url": "https://www.qrmaster.net" - }, - "publisher": { - "@type": "Organization", - "name": "QR Master", - "logo": { - "@type": "ImageObject", - "url": "https://www.qrmaster.net/logo.svg" - } - }, - "mainEntityOfPage": { - "@type": "WebPage", - "@id": `https://www.qrmaster.net/blog/${post.slug}` - } - }, - - // IF post has FAQ section: - faqPage: { - "@context": "https://schema.org", - "@type": "FAQPage", - "mainEntity": post.faq.map(item => ({ - "@type": "Question", - "name": item.question, - "acceptedAnswer": { - "@type": "Answer", - "text": item.answer.replace(/<[^>]*>/g, '') - } - })) - }, - - // IF post is a How-To (like utm-parameter-qr-codes): - howTo: { - "@context": "https://schema.org", - "@type": "HowTo", - "name": post.title, - "step": post.keySteps.map((step, idx) => ({ - "@type": "HowToStep", - "position": idx + 1, - "name": `Step ${idx + 1}`, - "text": step - })) - } -} -``` - -#### **2. Author Metadata** - -```javascript -// Add to post object: -authorName: "Timo Schmidt", -authorTitle: "Product Lead & QR Code Expert", -``` - -#### **3. Content Structure Additions** - -Add this block at the **very beginning** of the `content` field (after `
`): - -```html - -``` - -#### **4. Inline Citation Format** - -For every statistic or claim from `sources[]`, convert to: - -```html - - - - -

According to -[Source Name & Year], [claim with stat].

- - -
- "[Quote here]" - -
-``` - -#### **5. Freshness Signal** - -In `dateModified` and `updatedAt` — already correct from previous fixes -In content metadata div — show the date clearly (see above) - ---- - -## Priority Implementation Order - -### **TIER 1: Immediate (High AI Citation Impact)** -1. ✅ **trackable-qr-codes** — Schema + Author + Citations (DONE) -2. ⏳ **qr-code-scan-statistics-2026** — Many stats, needs inline citations -3. ⏳ **dynamic-vs-static-qr-codes** — Comparison post, needs structure -4. ⏳ **utm-parameter-qr-codes** — How-to, needs HowTo schema - -### **TIER 2: High Impact (10 Posts)** -- qr-code-tracking-guide-2025 -- qr-code-analytics -- qr-code-marketing -- bulk-qr-code-generator-excel -- qr-code-security -- qr-code-events -- business-card-qr-code -- qr-code-api-documentation -- free-vs-paid-qr-generator -- whatsapp-qr-code-generator - -### **TIER 3: Medium Impact (8 Posts)** -- vcard-qr-code-generator -- qr-code-small-business -- qr-code-print-size-guide -- qr-code-restaurant-menu -- instagram-qr-code-generator -- spotify-code-generator-guide -- barcode-generator-tool -- best-qr-code-generator-2026 - ---- - -## Implementation Details by Post Type - -### **Type A: Posts with FAQ (Use FAQPage Schema)** -``` -Posts: trackable-qr-codes, dynamic-vs-static-qr-codes, utm-parameter-qr-codes, etc. -Action: Add schema.faqPage with all FAQ items -``` - -### **Type B: How-To Posts (Use HowTo Schema)** -``` -Posts: utm-parameter-qr-codes, qr-code-tracking-guide-2025, qr-code-print-size-guide -Action: Add schema.howTo with keySteps mapped to HowToStep -``` - -### **Type C: Statistics/Research Posts (Focus on Citations)** -``` -Posts: qr-code-scan-statistics-2026, qr-code-analytics -Action: - 1. Add inline for every statistic - 2. Add "According to [Source]" statements - 3. Use blockquotes for key data points -``` - -### **Type D: Tool/Generator Posts (Focus on Clarity)** -``` -Posts: vcard-qr-code-generator, spotify-code-generator-guide, etc. -Action: - 1. Add clear definition in first paragraph - 2. Add tool comparison if relevant - 3. Add step-by-step usage (HowTo schema) -``` - ---- - -## Citation Formatting Examples - -### **Before (Weak for AI):** -```html -

QR codes are popular. According to market research, adoption is growing.

-``` - -### **After (AI-Friendly):** -```html -

QR codes are popular. According to Mordor Intelligence's QR Codes Market Report -(2026), adoption increased 238% from 2021-2023.

-``` - -### **For Statistics:** -```html - -

85% of users scan QR codes.

- - -

Key Statistic: -Bitly's 2026 QR Code Study found that 85% of smartphone users -have scanned a QR code at least once.

-``` - -### **For Expert Quotes:** -```html - -
-

"QR codes are now a standard marketing channel, not a trend."

- -
-``` - ---- - -## Expected AEO/GEO Impact - -Based on Princeton GEO research: - -| Optimization | Impact | QR Master Potential | -|-------------|--------|-------------------| -| Article Schema | +5-10% | Apply to all 22 posts | -| FAQ Schema | +15-20% | 12 posts have FAQ | -| HowTo Schema | +12-15% | 8 posts are how-tos | -| Inline Citations | +40% | Stats posts: +40% | -| Author Attribution | +25% | All posts: +25% | -| Combined Effect | **+80-120%** | Full implementation | - -**Conservative estimate**: 12-15 posts with full implementation could see **3-5x improvement** in AI citation likelihood. - ---- - -## Monitoring & Validation - -### **After Implementation, Check:** - -1. **Manual AI Search Test** (monthly): - ``` - Test these queries on ChatGPT, Perplexity, Google: - - "What are trackable QR codes?" → Expect: qrmaster cite - - "How to create dynamic QR codes?" → Expect: qrmaster cite - - "Best QR code generator for tracking?" → Expect: qrmaster cite - ``` - -2. **Schema Validation**: - ``` - Use: https://schema.org/validator - Check each post has valid Article + FAQ/HowTo schema - ``` - -3. **Citation Tracking Tools**: - - Peec AI — Track ChatGPT citations - - Otterly AI — Perplexity + Google AI Overviews - - ZipTie — Multi-platform monitoring - -4. **Analytics**: - - GA4: Monitor referral traffic from ai.google.com, perplexity.ai, openai.com - - Look for uptick in branded queries + QR-related queries - ---- - -## Next Steps - -### **Immediate (This Week)** -1. ✅ Template created (trackable-qr-codes as example) -2. ⏳ **Action**: Apply schema + citations to TIER 1 posts (4 posts) -3. ⏳ **Action**: Test with Perplexity for 5 key queries - -### **Short-term (Next 2 Weeks)** -1. Apply schema to TIER 2 (10 posts) -2. Add inline citations across all 22 posts -3. Test again on ChatGPT + Google - -### **Ongoing** -1. Monitor AI citations monthly -2. Update outdated stats/citations quarterly -3. Refresh "Last updated" dates regularly - ---- - -## Files to Modify - -**Primary**: `src/lib/blog-data.ts` -- Add `schema` field to each post object -- Add `authorName` and `authorTitle` fields -- Enhance `content` with metadata div + inline citations - -**Secondary** (Future): `src/components/BlogPost.tsx` or similar -- Render schema as ` - - ``` - -3. **Test it:** - - Scan your QR code with your phone - - In GA4, go to Reports → Realtime - - You should see your scan appear as a live visitor - -**Screenshot needed:** Google Analytics 4 Realtime report showing QR code traffic with UTM parameters. - ---- - -## The 5 Most Important QR Code Metrics - -### 1. Total Scans vs Unique Scans - -**Total scans** = Every time someone scans the code -**Unique scans** = Number of individual people who scanned - -**Example from a real campaign:** -A tech conference printed QR codes on 500 badges. Analytics showed: -- **Total scans:** 1,247 -- **Unique scans:** 412 - -**Insight:** The average attendee scanned 3 times (likely checking the schedule multiple times). This is normal behavior—don't panic if total scans are higher than unique scans. - -**What's a good scan rate?** -It depends on placement, but here are industry benchmarks: -- **Product packaging:** 2-5% of products sold -- **Event posters:** 10-20% of attendees -- **Business cards:** 30-50% of cards handed out -- **Restaurant table tents:** 15-30% of diners - -### 2. Geographic Location - -See where in the world people are scanning your codes. - -**Real example:** -A fashion brand ran a billboard campaign in New York, Los Angeles, and Miami. Analytics revealed: -- **New York:** 892 scans, 8.2% conversion rate -- **Los Angeles:** 1,241 scans, 12.1% conversion rate -- **Miami:** 334 scans, 6.7% conversion rate - -**Action taken:** They doubled ad spend in LA and reduced spend in Miami based on conversion data, increasing overall ROI by 34%. - -**Screenshot needed:** Map visualization showing scan density by city with color-coded heat zones. - -### 3. Device and Operating System - -Knowing whether your audience uses iPhone or Android helps optimize the landing page experience. - -**Real example:** -A SaaS company discovered 78% of their QR code scans came from iOS devices, but their landing page loaded 3 seconds slower on iOS than Android. After fixing this iOS-specific bug, conversions increased by 41%. - -**What to track:** -- iOS vs Android split -- Browser types (Safari, Chrome, Samsung Internet) -- Screen sizes (for responsive design testing) - -### 4. Time Patterns (When Do People Scan?) - -Understanding peak scanning times helps you: -- Schedule related email campaigns -- Staff events appropriately -- Optimize ad spend timing - -**Real example:** -A gym placed QR codes on posters offering a "free week trial." Analytics showed: -- **Peak scanning times:** Monday 6-8 AM, Wednesday 5-7 PM, Saturday 9-11 AM -- **Lowest activity:** Friday evenings, Sunday mornings - -**Action taken:** They scheduled follow-up emails to arrive at 6 AM on Mondays and 5 PM on Wednesdays, when people were already thinking about the gym. This increased trial sign-ups by 28%. - -**Screenshot needed:** Line graph showing scan activity by hour of day and day of week. - -### 5. Conversion Tracking - -The most important metric: **What do people do after scanning?** - -Track downstream actions like: -- Form submissions -- Purchases -- App downloads -- Video views -- PDF downloads - -**Real example:** -An e-commerce brand placed QR codes on product packaging linking to a "Register for warranty" page: -- **Total scans:** 12,483 -- **Reached landing page:** 11,901 (95.3%) -- **Started registration:** 4,238 (35.6% of page visitors) -- **Completed registration:** 2,891 (68.2% of those who started) -- **Overall conversion rate:** 23.2% (from scan to completed registration) - -**Insights:** -- 582 people scanned but the page didn't load (4.7% bounce rate) → Investigate mobile page load speed -- 65% of people who started registration completed it → Registration flow is working well -- 64% of visitors left without starting registration → Test adding trust badges or simplifying the form - ---- - -## Advanced Analytics Strategies - -### A/B Testing QR Code Designs - -Test different designs to find what gets the most scans. - -**Real example:** -A real estate agent tested two QR code designs on "For Sale" signs: - -**Version A: Basic black-and-white QR code** -- Scans: 127 per sign (average) - -**Version B: Branded QR with logo and "Scan to Tour Home" text** -- Scans: 289 per sign (average) - -**Result:** Version B increased scans by 128%. The clear call-to-action and branding made the QR code more trustworthy and obvious. - -**What to test:** -- Color vs black-and-white -- With logo vs without -- Different calls-to-action ("Scan Me" vs "Get 20% Off" vs "View Menu") -- Size and placement on printed materials - -### Multi-Channel Attribution - -Use unique QR codes for each marketing channel to measure which channels perform best. - -**Real example:** -A coffee shop launched a loyalty program with QR codes in 4 locations: - -| Channel | Scans | Sign-ups | Conversion Rate | Cost per Sign-up | -|---------|-------|----------|-----------------|------------------| -| Table tents (in-store) | 1,834 | 423 | 23.1% | $0.12 | -| Direct mail postcards | 892 | 178 | 20.0% | $2.40 | -| Instagram ads | 2,441 | 312 | 12.8% | $1.15 | -| Flyers (street distribution) | 523 | 41 | 7.8% | $0.95 | - -**Insights:** -- Table tents had the highest conversion rate AND lowest cost per sign-up -- Instagram drove the most scans but had lower conversion (maybe wrong audience?) -- Direct mail had good conversion but high cost (postage) - -**Action taken:** They doubled the number of table tents and reduced street flyer distribution. - -### Retargeting Based on Scan Behavior - -People who scan but don't convert are warm leads—they're interested but not ready yet. - -**How to retarget QR code scanners:** - -1. **Pixel-based retargeting:** Add a Facebook/Meta Pixel or Google Ads tag to your QR landing page -2. **Create custom audiences:** Target people who visited the page but didn't complete the action -3. **Serve relevant ads:** Show them ads reminding them of the offer - -**Real example:** -An online course creator put QR codes in a printed magazine ad. Of 1,456 scans: -- 412 signed up for the free course (28.3%) -- 1,044 visited the page but didn't sign up (71.7%) - -They retargeted the 1,044 non-converters with Facebook ads highlighting student success stories. This recovered an additional 187 sign-ups (17.9% of the retargeted group), increasing total conversions by 45%. - ---- - -## Common Use Cases with Real Data - -### Use Case 1: Event Check-In and Engagement - -**Scenario:** A 3-day tech conference with 2,000 attendees. - -**QR code deployment:** -- QR codes on badges (access session materials) -- QR codes on session room posters (rate the session) -- QR codes at sponsor booths (collect contact info) - -**Results:** -- **Badge QR scans:** 4,892 total scans (avg 2.4 scans per attendee) -- **Session ratings:** 1,234 ratings submitted (helps plan next year's agenda) -- **Sponsor leads:** 856 contact forms submitted - -**Insight:** Session rating QR codes on posters got 3x more engagement than asking people to visit a website. The convenience of QR codes reduced friction. - -### Use Case 2: Product Packaging Analytics - -**Scenario:** A supplement brand adds QR codes to 50,000 bottles linking to dosage instructions and recipes. - -**Results after 3 months:** -- **Total scans:** 8,234 (16.5% of bottles sold) -- **Peak scanning time:** Within 3 days of purchase -- **Top pages visited:** "How to Use," "Recipes," "Re-order" -- **Direct re-orders from QR code:** 412 ($14,824 in revenue) - -**Insight:** QR codes on packaging create a direct channel for repeat purchases and customer education, reducing support tickets by 22%. - -### Use Case 3: Restaurant Menu QR Codes - -**Scenario:** A restaurant replaces printed menus with QR codes on tables (post-COVID trend). - -**Results over 1 month:** -- **Total scans:** 6,789 -- **Unique visitors:** 4,521 -- **Average session duration:** 3 min 42 sec -- **Most viewed page:** Dessert menu (customers browse while eating) - -**Unexpected insight:** 34% of scans happened outside restaurant hours (people looking up the menu before visiting). The restaurant added an "Order Takeout" button to capture this traffic. - -### Use Case 4: Print Ad Campaign Tracking - -**Scenario:** A car dealership runs full-page ads in 3 regional magazines. - -**Results:** - -| Magazine | Print Run | Est. Readers | QR Scans | Scan Rate | Test Drives Booked | Cost per Test Drive | -|----------|-----------|--------------|----------|-----------|---------------------|---------------------| -| Magazine A | 50,000 | 150,000 | 324 | 0.22% | 28 | $89 | -| Magazine B | 30,000 | 90,000 | 147 | 0.16% | 11 | $136 | -| Magazine C | 80,000 | 240,000 | 892 | 0.37% | 67 | $45 | - -**Action taken:** They reallocated budget to Magazine C for the next quarter, reducing cost per test drive by 49% overall. - ---- - -## Privacy and Security Considerations - -### GDPR and Data Privacy - -When tracking QR code scans in Europe (or from EU citizens), you must comply with [GDPR regulations](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation): - -**What you MUST do:** -- ✅ Disclose data collection in your privacy policy -- ✅ Get consent before collecting personal data (email, name, etc.) -- ✅ Allow users to request data deletion -- ✅ Secure data with encryption - -**What analytics data is typically collected (without personal info):** -- Timestamp of scan -- Country/city (from IP address, not GPS) -- Device type and browser -- Number of scans per code - -**Note:** Most QR analytics platforms (including free ones) collect this data anonymously without requiring user consent, similar to website analytics. However, if you ask users to fill out a form after scanning, you need explicit consent to store that data. - -### Protecting Against Malicious QR Codes - -**For marketers:** Make sure your QR codes link to HTTPS (secure) URLs to build trust. - -**For users:** Be cautious scanning QR codes in public places. Check the URL preview before visiting the site (most modern phones show the URL before opening it). - ---- - -## Troubleshooting: Why Your QR Code Analytics Aren't Working - -### Problem 1: "I'm not seeing any scan data" - -**Possible causes:** -- ✅ Make sure you created a **dynamic QR code**, not a static one -- ✅ Check that your analytics dashboard is connected to the correct QR code -- ✅ Verify the QR code redirects properly (test it yourself with your phone) -- ✅ Wait at least 24 hours—some platforms have a delay in reporting - -### Problem 2: "Scan counts seem too high" - -**Explanation:** QR analytics often count "total scans" rather than "unique scans." If someone scans the same code 5 times, it shows as 5 scans. - -**Solution:** Look for "unique scans" or "unique visitors" metric instead. - -### Problem 3: "Google Analytics isn't showing QR code traffic" - -**Checklist:** -- ✅ Did you add UTM parameters to your URL? -- ✅ Is Google Analytics installed on the landing page? -- ✅ Check GA4 Realtime report—scan your code and see if it appears -- ✅ Wait 24-48 hours for data to populate in historical reports - -### Problem 4: "Location data is inaccurate" - -**Explanation:** QR analytics estimate location from IP addresses, which aren't always precise. A scan might show up in a nearby city or even the wrong state if the user is on a VPN or corporate network. - -**Solution:** Use location data for general trends (e.g., "Most scans from California") rather than exact addresses. - ---- - -## Tools and Platforms Comparison - -### Free QR Code Analytics Tools - -Most free QR code generators now include basic analytics: - -**Typical free plan features:** -- ✅ Total scans -- ✅ Country-level location -- ✅ Device type (iOS vs Android) -- ✅ Scan timeline (daily/weekly graphs) -- ❌ Unlimited QR codes (usually 3-10 codes) -- ❌ Advanced features (retargeting pixels, A/B testing, team access) - -**Best for:** Small businesses, personal projects, testing QR codes before scaling - -### Paid QR Code Analytics Platforms - -**Typical paid plan features ($10-50/month):** -- ✅ Unlimited QR codes -- ✅ City-level location data -- ✅ Browser and device details -- ✅ Bulk creation (upload CSV with 100s of URLs) -- ✅ Custom domains (use your own short URL) -- ✅ Team collaboration -- ✅ Retargeting pixel integration -- ✅ API access for automation - -**Best for:** Marketing agencies, e-commerce brands, event organizers - -### Using Google Analytics for QR Tracking (Free) - -You don't need a paid QR platform if you already use Google Analytics—just add UTM parameters to your URLs. - -**Pros:** -- ✅ Completely free -- ✅ Integrates with your existing analytics -- ✅ Unlimited QR codes - -**Cons:** -- ❌ No built-in QR code generator (you'll need a separate tool) -- ❌ Can't edit the URL after printing (unless you use a separate URL shortener) -- ❌ Less QR-specific insights (no "scan rate" metric) - ---- - -## Maximizing ROI: Optimization Checklist - -Use this checklist after deploying QR codes to optimize performance: - -### Week 1: Monitor and Fix Issues -- [ ] Verify scans are being tracked correctly -- [ ] Check that landing page loads in under 3 seconds on mobile -- [ ] Test QR code scannability from 3 feet away -- [ ] Monitor for error messages or broken links - -### Week 2-4: Analyze Patterns -- [ ] Identify peak scanning times (day of week, time of day) -- [ ] Review device breakdown (iOS vs Android) -- [ ] Check geographic distribution (any unexpected markets?) -- [ ] Calculate conversion rate (scans → desired action) - -### Month 2: Optimize -- [ ] A/B test different QR code designs -- [ ] Test different calls-to-action -- [ ] Adjust landing page based on device data -- [ ] Set up retargeting for non-converters - -### Ongoing: Scale What Works -- [ ] Compare performance across different channels -- [ ] Allocate budget to highest-performing placements -- [ ] Create lookalike audiences from converters -- [ ] Document learnings for future campaigns - ---- - -## FAQ: QR Code Analytics - -### Can I track QR code scans without a paid platform? - -Yes. Use a free QR code generator that includes basic analytics, or add UTM parameters to your URL and track scans in Google Analytics (completely free). - -### Do I need a different QR code for each location/campaign? - -**Best practice:** Yes, use unique QR codes for each channel (e.g., one for Instagram, one for flyers, one for packaging). This lets you compare performance and see which channels drive the best results. - -**Alternative:** Use the same QR code but different UTM parameters. For example: -- Instagram: `yoursite.com/promo?utm_source=instagram` -- Flyers: `yoursite.com/promo?utm_source=flyers` - -Both methods work—unique QR codes are easier to manage in a dashboard, while UTM parameters are simpler if you've already printed the materials. - -### How long does analytics data take to appear? - -Most platforms show real-time data (within seconds to minutes). Google Analytics may take 24-48 hours for historical reports to populate, but the Realtime report shows scans immediately. - -### Can I track QR code scans offline? - -No. QR code analytics require an internet connection to record the scan. However, some advanced solutions use device fingerprinting to attribute offline actions (like in-store purchases) to QR code scans, but this requires complex integration with point-of-sale systems. - -### What's the difference between impressions and scans? - -- **Impressions** = How many people saw the QR code (estimated based on foot traffic, circulation, etc.) -- **Scans** = How many people actually scanned it - -**Example:** A poster in a subway station might have 10,000 impressions (people who walked by) but only 250 scans (2.5% scan rate). - -### Can QR code analytics track individual users across multiple scans? - -Some platforms use device fingerprinting or cookies to identify returning scanners, but this is less reliable on mobile devices (due to privacy settings). Most QR analytics count "unique scans" based on IP address + user agent, which gives a rough estimate but isn't 100% accurate. - ---- - -## Conclusion - -QR code analytics transforms guesswork into data-driven decision making. By tracking who scans your codes, when they scan, and what they do next, you gain the same insights as digital marketing campaigns—even for offline channels like print, packaging, and events. - -**Key takeaways:** -1. **Start with dynamic QR codes** to enable tracking and editing -2. **Add UTM parameters** to integrate with Google Analytics -3. **Focus on 5 key metrics:** Total vs unique scans, location, device type, time patterns, and conversions -4. **Run A/B tests** to optimize design and placement -5. **Use data to reallocate budget** to the highest-performing channels - -Whether you're managing a single QR code on your business card or tracking thousands across a national campaign, analytics gives you the visibility to optimize every scan. - -**Ready to start tracking?** Create your first dynamic QR code with built-in analytics and see the data in real-time. - ---- - -**Related Resources:** -- [Wikipedia: QR Code](https://en.wikipedia.org/wiki/QR_code) - Complete technical overview -- [Dynamic vs Static QR Codes](#) - Which type should you use? -- [Bulk QR Code Generation Guide](#) - Create hundreds of codes at once -- [Google Analytics 4 Setup Guide](https://support.google.com/analytics/answer/9304153) - Official documentation - -**Keywords:** qr code analytics, qr code tracking, track qr code scans, qr code statistics, qr analytics dashboard, dynamic qr code tracking, qr code campaign tracking, qr code metrics, qr code scan data, google analytics qr code +# QR Code Analytics: Track, Measure & Optimize Your Campaigns (2025 Guide) + +**Meta Description:** Learn how to track QR code scans with analytics dashboards. Monitor location, devices, and conversion rates to optimize your marketing campaigns with data-driven insights. + +**Reading Time:** 15 minutes +**Category:** Analytics +**Last Updated:** October 16, 2025 + +--- + +## Introduction + +Ever wondered who's scanning your [QR codes](https://en.wikipedia.org/wiki/QR_code), when they're scanning, and what they do after? QR code analytics turns these questions into actionable insights. + +Unlike traditional print marketing where you're "flying blind," QR code tracking gives you the same level of data you'd get from digital campaigns—location data, device types, peak scanning times, and conversion rates. + +**In this guide, you'll learn:** +- How to set up QR code tracking in 10 minutes +- The 5 most important metrics to monitor +- Real examples with actual campaign numbers +- How to connect QR codes to Google Analytics 4 +- Practical optimization strategies that increase scan rates + +Whether you're running a small event or managing hundreds of QR codes across multiple campaigns, this guide will help you make data-driven decisions. + +--- + +## What Are QR Code Analytics? + +QR code analytics track how people interact with your QR codes. When someone scans a QR code, analytics software records: + +- **When** they scanned (date, time, day of week) +- **Where** they scanned (country, city, GPS coordinates) +- **What device** they used (iPhone vs Android, browser type) +- **What they did next** (visited a page, made a purchase, downloaded a file) + +### Static vs Dynamic QR Codes: Why It Matters + +**Static QR codes** encode the destination URL directly into the image. They cannot track scans or be edited after printing. + +**Dynamic QR codes** contain a short redirect URL that points to your tracking server. This enables: +- ✅ Full analytics tracking +- ✅ URL editing without reprinting +- ✅ A/B testing different destinations +- ✅ Retargeting people who scanned but didn't convert + +**Example:** A restaurant prints 5,000 menus with QR codes linking to their Valentine's Day menu. With static codes, they'd need to reprint all 5,000 menus after February 14th. With dynamic codes, they simply update the URL to point to their spring menu—same QR code, new content. + +--- + +## How to Set Up QR Code Tracking (Step-by-Step) + +### Step 1: Create a Dynamic QR Code (2 minutes) + +Most QR code platforms (including free tiers) now offer dynamic codes with basic tracking: + +1. Go to your QR code generator +2. Select "Dynamic QR Code" +3. Enter your destination URL (e.g., `https://yoursite.com/promo`) +4. Download the QR code + +**Screenshot needed:** Dashboard showing "Create Dynamic QR Code" button and URL input field. + +### Step 2: Add UTM Parameters for Google Analytics (3 minutes) + +UTM parameters let you track QR code scans in Google Analytics alongside your other marketing channels. + +**Example URL structure:** +``` +https://yoursite.com/promo?utm_source=qr_code&utm_medium=print&utm_campaign=summer_sale_2025 +``` + +**UTM Parameter Guide:** +- `utm_source=qr_code` → Identifies traffic source +- `utm_medium=print` → Identifies the medium (print, packaging, business card) +- `utm_campaign=summer_sale_2025` → Identifies the specific campaign + +**Pro tip:** Use consistent naming conventions across all campaigns so you can compare performance. For example, always use `qr_code` (not "qr-code" or "QR_Code") for the source parameter. + +### Step 3: Place Your QR Code and Monitor Results (5 minutes setup) + +After deploying your QR code on posters, flyers, or product packaging, check your analytics dashboard daily for the first week to: + +- Verify scans are being tracked correctly +- Identify the first spike in activity +- Check that your landing page loads properly on mobile devices + +**Screenshot needed:** Analytics dashboard showing real-time scan map with pins for different geographic locations. + +### Step 4: Connect to Google Analytics 4 (Optional, 15 minutes) + +For advanced tracking, integrate QR code data with Google Analytics 4: + +**Quick Integration Guide:** + +1. **In Google Analytics 4:** + - Go to Admin → Data Streams → Your Website + - Copy your Measurement ID (format: `G-XXXXXXXXXX`) + +2. **Add GA4 to your landing page:** + ```html + + + + ``` + +3. **Test it:** + - Scan your QR code with your phone + - In GA4, go to Reports → Realtime + - You should see your scan appear as a live visitor + +**Screenshot needed:** Google Analytics 4 Realtime report showing QR code traffic with UTM parameters. + +--- + +## The 5 Most Important QR Code Metrics + +### 1. Total Scans vs Unique Scans + +**Total scans** = Every time someone scans the code +**Unique scans** = Number of individual people who scanned + +**Example from a real campaign:** +A tech conference printed QR codes on 500 badges. Analytics showed: +- **Total scans:** 1,247 +- **Unique scans:** 412 + +**Insight:** The average attendee scanned 3 times (likely checking the schedule multiple times). This is normal behavior—don't panic if total scans are higher than unique scans. + +**What's a good scan rate?** +It depends on placement, but here are industry benchmarks: +- **Product packaging:** 2-5% of products sold +- **Event posters:** 10-20% of attendees +- **Business cards:** 30-50% of cards handed out +- **Restaurant table tents:** 15-30% of diners + +### 2. Geographic Location + +See where in the world people are scanning your codes. + +**Real example:** +A fashion brand ran a billboard campaign in New York, Los Angeles, and Miami. Analytics revealed: +- **New York:** 892 scans, 8.2% conversion rate +- **Los Angeles:** 1,241 scans, 12.1% conversion rate +- **Miami:** 334 scans, 6.7% conversion rate + +**Action taken:** They doubled ad spend in LA and reduced spend in Miami based on conversion data, increasing overall ROI by 34%. + +**Screenshot needed:** Map visualization showing scan density by city with color-coded heat zones. + +### 3. Device and Operating System + +Knowing whether your audience uses iPhone or Android helps optimize the landing page experience. + +**Real example:** +A SaaS company discovered 78% of their QR code scans came from iOS devices, but their landing page loaded 3 seconds slower on iOS than Android. After fixing this iOS-specific bug, conversions increased by 41%. + +**What to track:** +- iOS vs Android split +- Browser types (Safari, Chrome, Samsung Internet) +- Screen sizes (for responsive design testing) + +### 4. Time Patterns (When Do People Scan?) + +Understanding peak scanning times helps you: +- Schedule related email campaigns +- Staff events appropriately +- Optimize ad spend timing + +**Real example:** +A gym placed QR codes on posters offering a "free week trial." Analytics showed: +- **Peak scanning times:** Monday 6-8 AM, Wednesday 5-7 PM, Saturday 9-11 AM +- **Lowest activity:** Friday evenings, Sunday mornings + +**Action taken:** They scheduled follow-up emails to arrive at 6 AM on Mondays and 5 PM on Wednesdays, when people were already thinking about the gym. This increased trial sign-ups by 28%. + +**Screenshot needed:** Line graph showing scan activity by hour of day and day of week. + +### 5. Conversion Tracking + +The most important metric: **What do people do after scanning?** + +Track downstream actions like: +- Form submissions +- Purchases +- App downloads +- Video views +- PDF downloads + +**Real example:** +An e-commerce brand placed QR codes on product packaging linking to a "Register for warranty" page: +- **Total scans:** 12,483 +- **Reached landing page:** 11,901 (95.3%) +- **Started registration:** 4,238 (35.6% of page visitors) +- **Completed registration:** 2,891 (68.2% of those who started) +- **Overall conversion rate:** 23.2% (from scan to completed registration) + +**Insights:** +- 582 people scanned but the page didn't load (4.7% bounce rate) → Investigate mobile page load speed +- 65% of people who started registration completed it → Registration flow is working well +- 64% of visitors left without starting registration → Test adding trust badges or simplifying the form + +--- + +## Advanced Analytics Strategies + +### A/B Testing QR Code Designs + +Test different designs to find what gets the most scans. + +**Real example:** +A real estate agent tested two QR code designs on "For Sale" signs: + +**Version A: Basic black-and-white QR code** +- Scans: 127 per sign (average) + +**Version B: Branded QR with logo and "Scan to Tour Home" text** +- Scans: 289 per sign (average) + +**Result:** Version B increased scans by 128%. The clear call-to-action and branding made the QR code more trustworthy and obvious. + +**What to test:** +- Color vs black-and-white +- With logo vs without +- Different calls-to-action ("Scan Me" vs "Get 20% Off" vs "View Menu") +- Size and placement on printed materials + +### Multi-Channel Attribution + +Use unique QR codes for each marketing channel to measure which channels perform best. + +**Real example:** +A coffee shop launched a loyalty program with QR codes in 4 locations: + +| Channel | Scans | Sign-ups | Conversion Rate | Cost per Sign-up | +|---------|-------|----------|-----------------|------------------| +| Table tents (in-store) | 1,834 | 423 | 23.1% | $0.12 | +| Direct mail postcards | 892 | 178 | 20.0% | $2.40 | +| Instagram ads | 2,441 | 312 | 12.8% | $1.15 | +| Flyers (street distribution) | 523 | 41 | 7.8% | $0.95 | + +**Insights:** +- Table tents had the highest conversion rate AND lowest cost per sign-up +- Instagram drove the most scans but had lower conversion (maybe wrong audience?) +- Direct mail had good conversion but high cost (postage) + +**Action taken:** They doubled the number of table tents and reduced street flyer distribution. + +### Retargeting Based on Scan Behavior + +People who scan but don't convert are warm leads—they're interested but not ready yet. + +**How to retarget QR code scanners:** + +1. **Pixel-based retargeting:** Add a Facebook/Meta Pixel or Google Ads tag to your QR landing page +2. **Create custom audiences:** Target people who visited the page but didn't complete the action +3. **Serve relevant ads:** Show them ads reminding them of the offer + +**Real example:** +An online course creator put QR codes in a printed magazine ad. Of 1,456 scans: +- 412 signed up for the free course (28.3%) +- 1,044 visited the page but didn't sign up (71.7%) + +They retargeted the 1,044 non-converters with Facebook ads highlighting student success stories. This recovered an additional 187 sign-ups (17.9% of the retargeted group), increasing total conversions by 45%. + +--- + +## Common Use Cases with Real Data + +### Use Case 1: Event Check-In and Engagement + +**Scenario:** A 3-day tech conference with 2,000 attendees. + +**QR code deployment:** +- QR codes on badges (access session materials) +- QR codes on session room posters (rate the session) +- QR codes at sponsor booths (collect contact info) + +**Results:** +- **Badge QR scans:** 4,892 total scans (avg 2.4 scans per attendee) +- **Session ratings:** 1,234 ratings submitted (helps plan next year's agenda) +- **Sponsor leads:** 856 contact forms submitted + +**Insight:** Session rating QR codes on posters got 3x more engagement than asking people to visit a website. The convenience of QR codes reduced friction. + +### Use Case 2: Product Packaging Analytics + +**Scenario:** A supplement brand adds QR codes to 50,000 bottles linking to dosage instructions and recipes. + +**Results after 3 months:** +- **Total scans:** 8,234 (16.5% of bottles sold) +- **Peak scanning time:** Within 3 days of purchase +- **Top pages visited:** "How to Use," "Recipes," "Re-order" +- **Direct re-orders from QR code:** 412 ($14,824 in revenue) + +**Insight:** QR codes on packaging create a direct channel for repeat purchases and customer education, reducing support tickets by 22%. + +### Use Case 3: Restaurant Menu QR Codes + +**Scenario:** A restaurant replaces printed menus with QR codes on tables (post-COVID trend). + +**Results over 1 month:** +- **Total scans:** 6,789 +- **Unique visitors:** 4,521 +- **Average session duration:** 3 min 42 sec +- **Most viewed page:** Dessert menu (customers browse while eating) + +**Unexpected insight:** 34% of scans happened outside restaurant hours (people looking up the menu before visiting). The restaurant added an "Order Takeout" button to capture this traffic. + +### Use Case 4: Print Ad Campaign Tracking + +**Scenario:** A car dealership runs full-page ads in 3 regional magazines. + +**Results:** + +| Magazine | Print Run | Est. Readers | QR Scans | Scan Rate | Test Drives Booked | Cost per Test Drive | +|----------|-----------|--------------|----------|-----------|---------------------|---------------------| +| Magazine A | 50,000 | 150,000 | 324 | 0.22% | 28 | $89 | +| Magazine B | 30,000 | 90,000 | 147 | 0.16% | 11 | $136 | +| Magazine C | 80,000 | 240,000 | 892 | 0.37% | 67 | $45 | + +**Action taken:** They reallocated budget to Magazine C for the next quarter, reducing cost per test drive by 49% overall. + +--- + +## Privacy and Security Considerations + +### GDPR and Data Privacy + +When tracking QR code scans in Europe (or from EU citizens), you must comply with [GDPR regulations](https://en.wikipedia.org/wiki/General_Data_Protection_Regulation): + +**What you MUST do:** +- ✅ Disclose data collection in your privacy policy +- ✅ Get consent before collecting personal data (email, name, etc.) +- ✅ Allow users to request data deletion +- ✅ Secure data with encryption + +**What analytics data is typically collected (without personal info):** +- Timestamp of scan +- Country/city (from IP address, not GPS) +- Device type and browser +- Number of scans per code + +**Note:** Most QR analytics platforms (including free ones) collect this data anonymously without requiring user consent, similar to website analytics. However, if you ask users to fill out a form after scanning, you need explicit consent to store that data. + +### Protecting Against Malicious QR Codes + +**For marketers:** Make sure your QR codes link to HTTPS (secure) URLs to build trust. + +**For users:** Be cautious scanning QR codes in public places. Check the URL preview before visiting the site (most modern phones show the URL before opening it). + +--- + +## Troubleshooting: Why Your QR Code Analytics Aren't Working + +### Problem 1: "I'm not seeing any scan data" + +**Possible causes:** +- ✅ Make sure you created a **dynamic QR code**, not a static one +- ✅ Check that your analytics dashboard is connected to the correct QR code +- ✅ Verify the QR code redirects properly (test it yourself with your phone) +- ✅ Wait at least 24 hours—some platforms have a delay in reporting + +### Problem 2: "Scan counts seem too high" + +**Explanation:** QR analytics often count "total scans" rather than "unique scans." If someone scans the same code 5 times, it shows as 5 scans. + +**Solution:** Look for "unique scans" or "unique visitors" metric instead. + +### Problem 3: "Google Analytics isn't showing QR code traffic" + +**Checklist:** +- ✅ Did you add UTM parameters to your URL? +- ✅ Is Google Analytics installed on the landing page? +- ✅ Check GA4 Realtime report—scan your code and see if it appears +- ✅ Wait 24-48 hours for data to populate in historical reports + +### Problem 4: "Location data is inaccurate" + +**Explanation:** QR analytics estimate location from IP addresses, which aren't always precise. A scan might show up in a nearby city or even the wrong state if the user is on a VPN or corporate network. + +**Solution:** Use location data for general trends (e.g., "Most scans from California") rather than exact addresses. + +--- + +## Tools and Platforms Comparison + +### Free QR Code Analytics Tools + +Most free QR code generators now include basic analytics: + +**Typical free plan features:** +- ✅ Total scans +- ✅ Country-level location +- ✅ Device type (iOS vs Android) +- ✅ Scan timeline (daily/weekly graphs) +- ❌ Unlimited QR codes (usually 3-10 codes) +- ❌ Advanced features (retargeting pixels, A/B testing, team access) + +**Best for:** Small businesses, personal projects, testing QR codes before scaling + +### Paid QR Code Analytics Platforms + +**Typical paid plan features ($10-50/month):** +- ✅ Unlimited QR codes +- ✅ City-level location data +- ✅ Browser and device details +- ✅ Bulk creation (upload CSV with 100s of URLs) +- ✅ Custom domains (use your own short URL) +- ✅ Team collaboration +- ✅ Retargeting pixel integration +- ✅ API access for automation + +**Best for:** Marketing agencies, e-commerce brands, event organizers + +### Using Google Analytics for QR Tracking (Free) + +You don't need a paid QR platform if you already use Google Analytics—just add UTM parameters to your URLs. + +**Pros:** +- ✅ Completely free +- ✅ Integrates with your existing analytics +- ✅ Unlimited QR codes + +**Cons:** +- ❌ No built-in QR code generator (you'll need a separate tool) +- ❌ Can't edit the URL after printing (unless you use a separate URL shortener) +- ❌ Less QR-specific insights (no "scan rate" metric) + +--- + +## Maximizing ROI: Optimization Checklist + +Use this checklist after deploying QR codes to optimize performance: + +### Week 1: Monitor and Fix Issues +- [ ] Verify scans are being tracked correctly +- [ ] Check that landing page loads in under 3 seconds on mobile +- [ ] Test QR code scannability from 3 feet away +- [ ] Monitor for error messages or broken links + +### Week 2-4: Analyze Patterns +- [ ] Identify peak scanning times (day of week, time of day) +- [ ] Review device breakdown (iOS vs Android) +- [ ] Check geographic distribution (any unexpected markets?) +- [ ] Calculate conversion rate (scans → desired action) + +### Month 2: Optimize +- [ ] A/B test different QR code designs +- [ ] Test different calls-to-action +- [ ] Adjust landing page based on device data +- [ ] Set up retargeting for non-converters + +### Ongoing: Scale What Works +- [ ] Compare performance across different channels +- [ ] Allocate budget to highest-performing placements +- [ ] Create lookalike audiences from converters +- [ ] Document learnings for future campaigns + +--- + +## FAQ: QR Code Analytics + +### Can I track QR code scans without a paid platform? + +Yes. Use a free QR code generator that includes basic analytics, or add UTM parameters to your URL and track scans in Google Analytics (completely free). + +### Do I need a different QR code for each location/campaign? + +**Best practice:** Yes, use unique QR codes for each channel (e.g., one for Instagram, one for flyers, one for packaging). This lets you compare performance and see which channels drive the best results. + +**Alternative:** Use the same QR code but different UTM parameters. For example: +- Instagram: `yoursite.com/promo?utm_source=instagram` +- Flyers: `yoursite.com/promo?utm_source=flyers` + +Both methods work—unique QR codes are easier to manage in a dashboard, while UTM parameters are simpler if you've already printed the materials. + +### How long does analytics data take to appear? + +Most platforms show real-time data (within seconds to minutes). Google Analytics may take 24-48 hours for historical reports to populate, but the Realtime report shows scans immediately. + +### Can I track QR code scans offline? + +No. QR code analytics require an internet connection to record the scan. However, some advanced solutions use device fingerprinting to attribute offline actions (like in-store purchases) to QR code scans, but this requires complex integration with point-of-sale systems. + +### What's the difference between impressions and scans? + +- **Impressions** = How many people saw the QR code (estimated based on foot traffic, circulation, etc.) +- **Scans** = How many people actually scanned it + +**Example:** A poster in a subway station might have 10,000 impressions (people who walked by) but only 250 scans (2.5% scan rate). + +### Can QR code analytics track individual users across multiple scans? + +Some platforms use device fingerprinting or cookies to identify returning scanners, but this is less reliable on mobile devices (due to privacy settings). Most QR analytics count "unique scans" based on IP address + user agent, which gives a rough estimate but isn't 100% accurate. + +--- + +## Conclusion + +QR code analytics transforms guesswork into data-driven decision making. By tracking who scans your codes, when they scan, and what they do next, you gain the same insights as digital marketing campaigns—even for offline channels like print, packaging, and events. + +**Key takeaways:** +1. **Start with dynamic QR codes** to enable tracking and editing +2. **Add UTM parameters** to integrate with Google Analytics +3. **Focus on 5 key metrics:** Total vs unique scans, location, device type, time patterns, and conversions +4. **Run A/B tests** to optimize design and placement +5. **Use data to reallocate budget** to the highest-performing channels + +Whether you're managing a single QR code on your business card or tracking thousands across a national campaign, analytics gives you the visibility to optimize every scan. + +**Ready to start tracking?** Create your first dynamic QR code with built-in analytics and see the data in real-time. + +--- + +**Related Resources:** +- [Wikipedia: QR Code](https://en.wikipedia.org/wiki/QR_code) - Complete technical overview +- [Dynamic vs Static QR Codes](#) - Which type should you use? +- [Bulk QR Code Generation Guide](#) - Create hundreds of codes at once +- [Google Analytics 4 Setup Guide](https://support.google.com/analytics/answer/9304153) - Official documentation + +**Keywords:** qr code analytics, qr code tracking, track qr code scans, qr code statistics, qr analytics dashboard, dynamic qr code tracking, qr code campaign tracking, qr code metrics, qr code scan data, google analytics qr code diff --git a/dev-server.js b/dev-server.js index 5911f99..6a70c1a 100644 --- a/dev-server.js +++ b/dev-server.js @@ -1,12 +1,12 @@ -const { spawn } = require('child_process'); - -// Start Next.js dev server with explicit hostname -const next = spawn('next', ['dev', '-p', '3050', '-H', '0.0.0.0'], { - stdio: 'inherit', - shell: true, - env: { ...process.env, HOSTNAME: '0.0.0.0' } -}); - -next.on('close', (code) => { - process.exit(code); -}); +const { spawn } = require('child_process'); + +// Start Next.js dev server with explicit hostname +const next = spawn('next', ['dev', '-p', '3050', '-H', '0.0.0.0'], { + stdio: 'inherit', + shell: true, + env: { ...process.env, HOSTNAME: '0.0.0.0' } +}); + +next.on('close', (code) => { + process.exit(code); +}); diff --git a/docker-compose.dev.yml b/docker-compose.dev.yml index 1de3e58..ad1e559 100644 --- a/docker-compose.dev.yml +++ b/docker-compose.dev.yml @@ -1,66 +1,66 @@ -services: - # PostgreSQL Database - db: - image: postgres:16-alpine - container_name: qrmaster-db-dev - restart: unless-stopped - environment: - POSTGRES_USER: ${POSTGRES_USER} - POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} - POSTGRES_DB: ${POSTGRES_DB} - POSTGRES_INITDB_ARGS: "-E UTF8 --locale=en_US.utf8" - ports: - - "5435:5432" - volumes: - - dbdata_dev:/var/lib/postgresql/data - - ./docker/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh - healthcheck: - test: [ "CMD-SHELL", "pg_isready -U postgres -d qrmaster" ] - interval: 5s - timeout: 5s - retries: 10 - networks: - - qrmaster-network - - # Redis Cache - redis: - image: redis:7-alpine - container_name: qrmaster-redis-dev - restart: unless-stopped - command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru - ports: - - "6379:6379" - volumes: - - redisdata_dev:/data - healthcheck: - test: [ "CMD", "redis-cli", "ping" ] - interval: 5s - timeout: 3s - retries: 5 - networks: - - qrmaster-network - - # Adminer - Database Management UI - adminer: - image: adminer:latest - container_name: qrmaster-adminer-dev - restart: unless-stopped - ports: - - "8081:8080" - environment: - ADMINER_DEFAULT_SERVER: db - ADMINER_DESIGN: pepa-linha - depends_on: - - db - networks: - - qrmaster-network - -volumes: - dbdata_dev: - driver: local - redisdata_dev: - driver: local - -networks: - qrmaster-network: - driver: bridge +services: + # PostgreSQL Database + db: + image: postgres:16-alpine + container_name: qrmaster-db-dev + restart: unless-stopped + environment: + POSTGRES_USER: ${POSTGRES_USER} + POSTGRES_PASSWORD: ${POSTGRES_PASSWORD} + POSTGRES_DB: ${POSTGRES_DB} + POSTGRES_INITDB_ARGS: "-E UTF8 --locale=en_US.utf8" + ports: + - "5435:5432" + volumes: + - dbdata_dev:/var/lib/postgresql/data + - ./docker/init-db.sh:/docker-entrypoint-initdb.d/init-db.sh + healthcheck: + test: [ "CMD-SHELL", "pg_isready -U postgres -d qrmaster" ] + interval: 5s + timeout: 5s + retries: 10 + networks: + - qrmaster-network + + # Redis Cache + redis: + image: redis:7-alpine + container_name: qrmaster-redis-dev + restart: unless-stopped + command: redis-server --appendonly yes --maxmemory 256mb --maxmemory-policy allkeys-lru + ports: + - "6379:6379" + volumes: + - redisdata_dev:/data + healthcheck: + test: [ "CMD", "redis-cli", "ping" ] + interval: 5s + timeout: 3s + retries: 5 + networks: + - qrmaster-network + + # Adminer - Database Management UI + adminer: + image: adminer:latest + container_name: qrmaster-adminer-dev + restart: unless-stopped + ports: + - "8081:8080" + environment: + ADMINER_DEFAULT_SERVER: db + ADMINER_DESIGN: pepa-linha + depends_on: + - db + networks: + - qrmaster-network + +volumes: + dbdata_dev: + driver: local + redisdata_dev: + driver: local + +networks: + qrmaster-network: + driver: bridge diff --git a/docker/README.md b/docker/README.md index 94fb860..b611c3b 100644 --- a/docker/README.md +++ b/docker/README.md @@ -1,276 +1,276 @@ -# Docker Setup for QR Master - -This directory contains Docker configuration files for running QR Master with PostgreSQL database. - -## 🚀 Quick Start - -### Development (Database Only) - -For local development where you run Next.js on your host machine: - -```bash -# Start PostgreSQL and Redis -docker-compose -f docker-compose.dev.yml up -d - -# Run database migrations -npm run db:migrate - -# Start the development server -npm run dev -``` - -Access: -- **Application**: http://localhost:3050 -- **Database**: localhost:5432 -- **Redis**: localhost:6379 -- **Adminer (DB UI)**: http://localhost:8080 - -### Production (Full Stack) - -To run the entire application in Docker: - -```bash -# Build and start all services -docker-compose up -d --build - -# Run database migrations -docker-compose exec web npx prisma migrate deploy - -# (Optional) Seed the database -docker-compose exec web npm run db:seed -``` - -Access: -- **Application**: http://localhost:3050 -- **Database**: localhost:5432 -- **Redis**: localhost:6379 -- **Adminer (DB UI)**: http://localhost:8080 (only with --profile dev) - -To include Adminer in production mode: -```bash -docker-compose --profile dev up -d -``` - -## 📦 Services - -### PostgreSQL (db) -- **Image**: postgres:16-alpine -- **Port**: 5432 -- **Database**: qrmaster -- **User**: postgres -- **Password**: postgres (change in production!) - -### Redis (redis) -- **Image**: redis:7-alpine -- **Port**: 6379 -- **Max Memory**: 256MB with LRU eviction policy -- **Persistence**: AOF enabled - -### Next.js Application (web) -- **Port**: 3050 -- **Environment**: Production -- **Health Check**: HTTP GET on localhost:3050 - -### Adminer (adminer) -- **Image**: adminer:latest -- **Port**: 8080 -- **Purpose**: Database management UI -- **Profile**: dev (optional in production) - -## 🗄️ Database Management - -### Migrations - -```bash -# Create a new migration -npm run db:migrate - -# Deploy migrations in Docker -docker-compose exec web npx prisma migrate deploy - -# Reset database (caution!) -docker-compose exec web npx prisma migrate reset -``` - -### Prisma Studio - -```bash -# On host machine -npm run db:studio - -# Or in Docker -docker-compose exec web npx prisma studio -``` - -### Backup and Restore - -```bash -# Backup -docker-compose exec db pg_dump -U postgres qrmaster > backup.sql - -# Restore -docker-compose exec -T db psql -U postgres qrmaster < backup.sql -``` - -## 🔧 Useful Commands - -### View Logs - -```bash -# All services -docker-compose logs -f - -# Specific service -docker-compose logs -f web -docker-compose logs -f db -docker-compose logs -f redis -``` - -### Shell Access - -```bash -# Next.js container -docker-compose exec web sh - -# PostgreSQL container -docker-compose exec db psql -U postgres -d qrmaster - -# Redis container -docker-compose exec redis redis-cli -``` - -### Stop and Clean - -```bash -# Stop all services -docker-compose down - -# Stop and remove volumes (deletes data!) -docker-compose down -v - -# Stop and remove everything including images -docker-compose down -v --rmi all -``` - -## 🔐 Environment Variables - -Create a `.env` file in the root directory (copy from `env.example`): - -```bash -cp env.example .env -``` - -Required variables: -- `DATABASE_URL`: PostgreSQL connection string -- `NEXTAUTH_SECRET`: Secret for NextAuth.js -- `NEXTAUTH_URL`: Application URL -- `IP_SALT`: Salt for hashing IP addresses -- `REDIS_URL`: Redis connection string - -## 🌐 Network Architecture - -All services run on a custom bridge network `qrmaster-network` which allows: -- Service discovery by container name -- Network isolation from other Docker projects -- Internal DNS resolution - -## 📊 Volumes - -### Persistent Data -- `dbdata`: PostgreSQL data -- `redisdata`: Redis data - -### Volume Management - -```bash -# List volumes -docker volume ls - -# Inspect volume -docker volume inspect qrmaster_dbdata - -# Remove all unused volumes -docker volume prune -``` - -## 🐛 Troubleshooting - -### Database Connection Issues - -```bash -# Check if database is ready -docker-compose exec db pg_isready -U postgres - -# Check database logs -docker-compose logs db - -# Restart database -docker-compose restart db -``` - -### Application Won't Start - -```bash -# Check health status -docker-compose ps - -# View application logs -docker-compose logs web - -# Rebuild the application -docker-compose up -d --build web -``` - -### Port Already in Use - -If ports 3050, 5432, 6379, or 8080 are already in use: - -```bash -# Find process using port -# Windows -netstat -ano | findstr :3050 - -# Linux/Mac -lsof -i :3050 - -# Kill process or change port in docker-compose.yml -``` - -## 🔄 Updates and Maintenance - -### Update Dependencies - -```bash -# Update Node packages -npm update - -# Rebuild Docker images -docker-compose build --no-cache -``` - -### Update Docker Images - -```bash -# Pull latest images -docker-compose pull - -# Restart with new images -docker-compose up -d -``` - -## 📝 Notes - -- **Development**: Use `docker-compose.dev.yml` to run only the database and Redis -- **Production**: Use `docker-compose.yml` to run the full stack -- **Security**: Always change default passwords in production -- **Backups**: Implement regular database backups in production -- **Scaling**: For production, consider using PostgreSQL replication and Redis Sentinel - -## 🆘 Support - -For more information, see: -- [Docker Documentation](https://docs.docker.com/) -- [PostgreSQL Documentation](https://www.postgresql.org/docs/) -- [Prisma Documentation](https://www.prisma.io/docs/) -- [Next.js Documentation](https://nextjs.org/docs) - +# Docker Setup for QR Master + +This directory contains Docker configuration files for running QR Master with PostgreSQL database. + +## 🚀 Quick Start + +### Development (Database Only) + +For local development where you run Next.js on your host machine: + +```bash +# Start PostgreSQL and Redis +docker-compose -f docker-compose.dev.yml up -d + +# Run database migrations +npm run db:migrate + +# Start the development server +npm run dev +``` + +Access: +- **Application**: http://localhost:3050 +- **Database**: localhost:5432 +- **Redis**: localhost:6379 +- **Adminer (DB UI)**: http://localhost:8080 + +### Production (Full Stack) + +To run the entire application in Docker: + +```bash +# Build and start all services +docker-compose up -d --build + +# Run database migrations +docker-compose exec web npx prisma migrate deploy + +# (Optional) Seed the database +docker-compose exec web npm run db:seed +``` + +Access: +- **Application**: http://localhost:3050 +- **Database**: localhost:5432 +- **Redis**: localhost:6379 +- **Adminer (DB UI)**: http://localhost:8080 (only with --profile dev) + +To include Adminer in production mode: +```bash +docker-compose --profile dev up -d +``` + +## 📦 Services + +### PostgreSQL (db) +- **Image**: postgres:16-alpine +- **Port**: 5432 +- **Database**: qrmaster +- **User**: postgres +- **Password**: postgres (change in production!) + +### Redis (redis) +- **Image**: redis:7-alpine +- **Port**: 6379 +- **Max Memory**: 256MB with LRU eviction policy +- **Persistence**: AOF enabled + +### Next.js Application (web) +- **Port**: 3050 +- **Environment**: Production +- **Health Check**: HTTP GET on localhost:3050 + +### Adminer (adminer) +- **Image**: adminer:latest +- **Port**: 8080 +- **Purpose**: Database management UI +- **Profile**: dev (optional in production) + +## 🗄️ Database Management + +### Migrations + +```bash +# Create a new migration +npm run db:migrate + +# Deploy migrations in Docker +docker-compose exec web npx prisma migrate deploy + +# Reset database (caution!) +docker-compose exec web npx prisma migrate reset +``` + +### Prisma Studio + +```bash +# On host machine +npm run db:studio + +# Or in Docker +docker-compose exec web npx prisma studio +``` + +### Backup and Restore + +```bash +# Backup +docker-compose exec db pg_dump -U postgres qrmaster > backup.sql + +# Restore +docker-compose exec -T db psql -U postgres qrmaster < backup.sql +``` + +## 🔧 Useful Commands + +### View Logs + +```bash +# All services +docker-compose logs -f + +# Specific service +docker-compose logs -f web +docker-compose logs -f db +docker-compose logs -f redis +``` + +### Shell Access + +```bash +# Next.js container +docker-compose exec web sh + +# PostgreSQL container +docker-compose exec db psql -U postgres -d qrmaster + +# Redis container +docker-compose exec redis redis-cli +``` + +### Stop and Clean + +```bash +# Stop all services +docker-compose down + +# Stop and remove volumes (deletes data!) +docker-compose down -v + +# Stop and remove everything including images +docker-compose down -v --rmi all +``` + +## 🔐 Environment Variables + +Create a `.env` file in the root directory (copy from `env.example`): + +```bash +cp env.example .env +``` + +Required variables: +- `DATABASE_URL`: PostgreSQL connection string +- `NEXTAUTH_SECRET`: Secret for NextAuth.js +- `NEXTAUTH_URL`: Application URL +- `IP_SALT`: Salt for hashing IP addresses +- `REDIS_URL`: Redis connection string + +## 🌐 Network Architecture + +All services run on a custom bridge network `qrmaster-network` which allows: +- Service discovery by container name +- Network isolation from other Docker projects +- Internal DNS resolution + +## 📊 Volumes + +### Persistent Data +- `dbdata`: PostgreSQL data +- `redisdata`: Redis data + +### Volume Management + +```bash +# List volumes +docker volume ls + +# Inspect volume +docker volume inspect qrmaster_dbdata + +# Remove all unused volumes +docker volume prune +``` + +## 🐛 Troubleshooting + +### Database Connection Issues + +```bash +# Check if database is ready +docker-compose exec db pg_isready -U postgres + +# Check database logs +docker-compose logs db + +# Restart database +docker-compose restart db +``` + +### Application Won't Start + +```bash +# Check health status +docker-compose ps + +# View application logs +docker-compose logs web + +# Rebuild the application +docker-compose up -d --build web +``` + +### Port Already in Use + +If ports 3050, 5432, 6379, or 8080 are already in use: + +```bash +# Find process using port +# Windows +netstat -ano | findstr :3050 + +# Linux/Mac +lsof -i :3050 + +# Kill process or change port in docker-compose.yml +``` + +## 🔄 Updates and Maintenance + +### Update Dependencies + +```bash +# Update Node packages +npm update + +# Rebuild Docker images +docker-compose build --no-cache +``` + +### Update Docker Images + +```bash +# Pull latest images +docker-compose pull + +# Restart with new images +docker-compose up -d +``` + +## 📝 Notes + +- **Development**: Use `docker-compose.dev.yml` to run only the database and Redis +- **Production**: Use `docker-compose.yml` to run the full stack +- **Security**: Always change default passwords in production +- **Backups**: Implement regular database backups in production +- **Scaling**: For production, consider using PostgreSQL replication and Redis Sentinel + +## 🆘 Support + +For more information, see: +- [Docker Documentation](https://docs.docker.com/) +- [PostgreSQL Documentation](https://www.postgresql.org/docs/) +- [Prisma Documentation](https://www.prisma.io/docs/) +- [Next.js Documentation](https://nextjs.org/docs) + diff --git a/docker/init-db.sh b/docker/init-db.sh index 0c863d2..57f56a8 100644 --- a/docker/init-db.sh +++ b/docker/init-db.sh @@ -1,26 +1,26 @@ -#!/bin/bash -set -e - -# This script runs when the PostgreSQL container is first created -# It ensures the database is properly initialized - -echo "🚀 Initializing QR Master database..." - -# Create the database if it doesn't exist (already created by POSTGRES_DB) -psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL - -- Enable required extensions - CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; - CREATE EXTENSION IF NOT EXISTS "pg_trgm"; - - -- Grant privileges - GRANT ALL PRIVILEGES ON DATABASE qrmaster TO postgres; - - -- Set timezone - ALTER DATABASE qrmaster SET timezone TO 'UTC'; -EOSQL - -echo "✅ Database initialization complete!" -echo "📊 Database: $POSTGRES_DB" -echo "👤 User: $POSTGRES_USER" -echo "🌐 Ready to accept connections on port 5432" - +#!/bin/bash +set -e + +# This script runs when the PostgreSQL container is first created +# It ensures the database is properly initialized + +echo "🚀 Initializing QR Master database..." + +# Create the database if it doesn't exist (already created by POSTGRES_DB) +psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" --dbname "$POSTGRES_DB" <<-EOSQL + -- Enable required extensions + CREATE EXTENSION IF NOT EXISTS "uuid-ossp"; + CREATE EXTENSION IF NOT EXISTS "pg_trgm"; + + -- Grant privileges + GRANT ALL PRIVILEGES ON DATABASE qrmaster TO postgres; + + -- Set timezone + ALTER DATABASE qrmaster SET timezone TO 'UTC'; +EOSQL + +echo "✅ Database initialization complete!" +echo "📊 Database: $POSTGRES_DB" +echo "👤 User: $POSTGRES_USER" +echo "🌐 Ready to accept connections on port 5432" + diff --git a/env.example b/env.example index 5111f46..3cb7083 100644 --- a/env.example +++ b/env.example @@ -1,50 +1,50 @@ -# Environment Configuration -NODE_ENV=development -PORT=3000 - -# Database Configuration (PostgreSQL) -POSTGRES_USER=postgres -POSTGRES_PASSWORD=postgres -POSTGRES_DB=qrmaster - -# For local development (without Docker): -# DATABASE_URL=postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public -# For Docker Compose (internal Docker network): -DATABASE_URL=postgresql://postgres:postgres@db:5432/qrmaster?schema=public - -# NextAuth Configuration -NEXTAUTH_URL=http://localhost:3050 -NEXTAUTH_SECRET=your-secret-key-here-change-in-production - -# OAuth Providers (Optional) -GOOGLE_CLIENT_ID= -GOOGLE_CLIENT_SECRET= - -# Redis Configuration (Optional - for rate limiting and caching) -REDIS_URL=redis://redis:6379 - -# Security -# Used for hashing IP addresses in analytics -IP_SALT=your-ip-salt-here-change-in-production - -# Features -ENABLE_DEMO=false - -# SEO Configuration -# Set to 'true' in production to allow search engine indexing -NEXT_PUBLIC_INDEXABLE=true - -# Stripe Payment Configuration (Optional - for subscription payments) -# Get your keys from: https://dashboard.stripe.com/apikeys -STRIPE_SECRET_KEY= -STRIPE_WEBHOOK_SECRET= -NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= - -# Stripe Price IDs (create these in your Stripe dashboard) -# NEXT_PUBLIC_STRIPE_FREE_PRICE_ID=price_xxx -# NEXT_PUBLIC_STRIPE_PRO_PRICE_ID=price_xxx -# NEXT_PUBLIC_STRIPE_BUSINESS_PRICE_ID=price_xxx - -# Analytics (Optional - PostHog) -NEXT_PUBLIC_POSTHOG_KEY= -NEXT_PUBLIC_POSTHOG_HOST=https://app.posthog.com +# Environment Configuration +NODE_ENV=development +PORT=3000 + +# Database Configuration (PostgreSQL) +POSTGRES_USER=postgres +POSTGRES_PASSWORD=postgres +POSTGRES_DB=qrmaster + +# For local development (without Docker): +# DATABASE_URL=postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public +# For Docker Compose (internal Docker network): +DATABASE_URL=postgresql://postgres:postgres@db:5432/qrmaster?schema=public + +# NextAuth Configuration +NEXTAUTH_URL=http://localhost:3050 +NEXTAUTH_SECRET=your-secret-key-here-change-in-production + +# OAuth Providers (Optional) +GOOGLE_CLIENT_ID= +GOOGLE_CLIENT_SECRET= + +# Redis Configuration (Optional - for rate limiting and caching) +REDIS_URL=redis://redis:6379 + +# Security +# Used for hashing IP addresses in analytics +IP_SALT=your-ip-salt-here-change-in-production + +# Features +ENABLE_DEMO=false + +# SEO Configuration +# Set to 'true' in production to allow search engine indexing +NEXT_PUBLIC_INDEXABLE=true + +# Stripe Payment Configuration (Optional - for subscription payments) +# Get your keys from: https://dashboard.stripe.com/apikeys +STRIPE_SECRET_KEY= +STRIPE_WEBHOOK_SECRET= +NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY= + +# Stripe Price IDs (create these in your Stripe dashboard) +# NEXT_PUBLIC_STRIPE_FREE_PRICE_ID=price_xxx +# NEXT_PUBLIC_STRIPE_PRO_PRICE_ID=price_xxx +# NEXT_PUBLIC_STRIPE_BUSINESS_PRICE_ID=price_xxx + +# Analytics (Optional - PostHog) +NEXT_PUBLIC_POSTHOG_KEY= +NEXT_PUBLIC_POSTHOG_HOST=https://app.posthog.com diff --git a/implementations_idee.md b/implementations_idee.md index 5d85981..076633d 100644 --- a/implementations_idee.md +++ b/implementations_idee.md @@ -1,127 +1,127 @@ -# QR Master: The Growth Masterpiece -## Implementations-Idee (Integrated Strategy V1.1) - -## Executive Summary -Dieses Dokument integriert Conversion-, Copywriting- und Content-Strategie, um QR Master von einem simplen Utility-Tool zu einer Vertical Operations Platform zu entwickeln. - -**Kernthese:** Wir gewinnen nicht durch einen "besseren" Generator, sondern als die **einzige Versicherung gegen physische Marketingverschwendung**. - -## 1. Conversion Architecture (CRO) -### 1.1 Ziel -Die Value Gap schliessen: Nutzer verstehen den Wert von **Dynamic QR Codes** oft erst *nach* dem Druckfehler. - -### 1.2 Funnel-Diagnose & Leak -Aktuelles Problem: -1. Nutzer suchen nach `free qr code generator` (High Volume). -2. Erstellen statischen Code & laden PNG herunter. -3. Drucken Material. -4. Link ändert sich -> Code tot -> Frust & Churn. - -### 1.3 Safety Intercept (Pre-Download Modal) -**Hypothese:** Ein "Angst-basiertes" Intercept vor dem Download konvertiert Free-User zu Dynamic-Usern, indem es das Risiko von statischen Codes aufzeigt. - -**Trigger:** Klick auf `Download PNG` / `Download SVG` bei statischem Code. - -**Modal-Inhalt (Optimiert):** -- **Headline:** `Wait! You are creating a Permanent, Static Code.` -- **Body:** `Once printed, this code cannot be changed. If your link breaks, your flyers are trash. 80% of businesses switch to a **Dynamic QR Code Generator** to stay safe.` -- **CTA Primary:** `Yes, make it Editable (Free Dynamic)` -- **CTA Secondary:** `No, I risk the Static Code` - -### 1.4 Experiment-Setup (A/B Test) -- **Control:** Direkter Download. -- **Variant:** Safety Intercept Modal. -- **Primary KPI:** `intercept_upgrade_rate` (Ziel: >15%). - ---- - -## 2. Direct Response Copywriting (Real Estate Vertical) -Fokus auf das Keyword Cluster: `qr codes for business` und `real estate qr codes`. - -### 2.1 Zielseite: `/solutions/real-estate` -**Hero Section (SEO & Conversion Optimized):** -- **H1 (SEO):** `Real Estate QR Code Generator: The "Forever Code" for Agents` -- **Subhead:** `Sold the listing? Don't trash the flyers. Just reroute your **Dynamic QR Code** to the next property in 1 click.` -- **CTA:** `Create Free Real Estate QR Code` -- **Micro-Copy:** `Works with Canva & Zillow. Trusted by top agents.` - -### 2.2 Nurture Bridge Email Sequence -**Trigger:** Download `Real Estate Toolkit`. - -**Email 1 (The Hook):** -- **Subject:** `Your "Forever Flyer" Templates are here` -- **Body:** "Stop printing single-use codes. Use this template with a **Dynamic QR Code** that you recycle for every open house." - -**Email 2 (The Fear):** -- **Subject:** `The $300 mistake 90% of agents make` -- **Body:** Story über 500 weggeworfene Flyer, weil der statische Code nicht auf das neue Listing umgeleitet werden konnte. Lösung: "The Editable QR Code". - ---- - -## 3. Content Strategy & SEO Operations -Basierend auf `keyword_planer_google.md` (High Volume & High CPC Opportunities). - -### 3.1 Keyword-Prioritäten -Wir attackieren drei Ebenen gleichzeitig: - -1. **Volume Layer (Top of Funnel):** - - `qr code generator free` (500k Search Volume) -> Homepage & Tool Pages - - `create qr code` (50k SV) -> Tutorial Hub -2. **Value Layer (High Intent/CPC):** - - `dynamic qr code generator` (5k SV, High Value) -> Feature Page - - `qr code for business` (5k SV, High CPC) -> Solutions Hub -3. **Feature Layer (Longtail):** - - `qr code generator with logo` (5k SV) -> Customization Page - - `vcard qr code generator` (5k SV) -> vCard Tool - -### 3.2 Content-Pillars & Hubs - -| Hub Page | Target Keyword | Content Angle (H1 Idea) | -| :--- | :--- | :--- | -| **Real Estate** | `real estate qr codes` | "The Only QR Code Generator for Real Estate Agents" | -| **Business** | `qr codes for business` | "Enterprise-Grade QR Code Generator for Business Growth" | -| **Dynamic** | `dynamic qr code generator` | "Create Editable & Trackable Dynamic QR Codes (Free)" | -| **vCard** | `vcard qr code` | "Digital Business Card & vCard QR Code Generator" | - -### 3.3 SEO-Protokoll & On-Page Execution -Für *jede* neue Seite gilt strikt: - -1. **URL-Struktur:** Sprechend & hierarchisch (`/tools/dynamic-qr-code-generator`). -2. **Title Tag:** `[Main Keyword] - [Benefit] | QR Master` - - *Bsp:* `Dynamic QR Code Generator - Edit Links After Printing | QR Master` -3. **H1:** Muss das Main Keyword exakt enthalten. -4. **FAQ Schema:** Fragen aus "People Also Ask" integrieren (z.B. "Can I edit a QR code after printing?"). - ---- - -## 4. Execution Roadmap (Next 4 Weeks) - -### Woche 1: Foundation & "Safety Net" -- [Dev] **Safety Intercept Modal** auf der Homepage deployen. -- [Content] Optimierung der Homepage Meta-Daten für `free qr code generator` und `dynamic qr code`. - -### Woche 2: Vertical Attack (Real Estate) -- [Page] `/solutions/real-estate` live bringen (Copy siehe 2.1). -- [Lead Magnet] "Forever Flyer" Canva Templates erstellen. - -### Woche 3: High-Value Content -- [Blog] Comparison Post: `Bitly vs. QR Master for Business` (Targeting `qr code for business`). -- [Tool] Polishing der `vcard` Seite für das Keyword `vcard qr code generator`. - -### Woche 4: Review & Amplify -- Analyse der `intercept_upgrade_rate`. -- Backlink-Outreach für Real Estate Artikel. - ---- - -## 5. Risiken & Mitigation -- **Risk:** User sind genervt vom Modal. - - **Fix:** "Don't show again" Option nach 2x Anzeigen. -- **Risk:** SEO dauert zu lange (3-6 Monate). - - **Fix:** Parallel "Programmatic SEO" für Longtail-Keywords (z.B. `qr code for [city]`) aufbauen, um schnelleren Traffic zu holen. - -## 6. Definition of Done (V1.1) -- Safety Intercept ist live und trackt Upgrades. -- Real Estate Landingpage rankt für Longtail-Keywords. -- Die Top-5 Keywords aus dem Plan (`dynamic`, `free`, `business`, `custom`, `vcard`) haben dedizierte, optimierte Landingpages. - +# QR Master: The Growth Masterpiece +## Implementations-Idee (Integrated Strategy V1.1) + +## Executive Summary +Dieses Dokument integriert Conversion-, Copywriting- und Content-Strategie, um QR Master von einem simplen Utility-Tool zu einer Vertical Operations Platform zu entwickeln. + +**Kernthese:** Wir gewinnen nicht durch einen "besseren" Generator, sondern als die **einzige Versicherung gegen physische Marketingverschwendung**. + +## 1. Conversion Architecture (CRO) +### 1.1 Ziel +Die Value Gap schliessen: Nutzer verstehen den Wert von **Dynamic QR Codes** oft erst *nach* dem Druckfehler. + +### 1.2 Funnel-Diagnose & Leak +Aktuelles Problem: +1. Nutzer suchen nach `free qr code generator` (High Volume). +2. Erstellen statischen Code & laden PNG herunter. +3. Drucken Material. +4. Link ändert sich -> Code tot -> Frust & Churn. + +### 1.3 Safety Intercept (Pre-Download Modal) +**Hypothese:** Ein "Angst-basiertes" Intercept vor dem Download konvertiert Free-User zu Dynamic-Usern, indem es das Risiko von statischen Codes aufzeigt. + +**Trigger:** Klick auf `Download PNG` / `Download SVG` bei statischem Code. + +**Modal-Inhalt (Optimiert):** +- **Headline:** `Wait! You are creating a Permanent, Static Code.` +- **Body:** `Once printed, this code cannot be changed. If your link breaks, your flyers are trash. 80% of businesses switch to a **Dynamic QR Code Generator** to stay safe.` +- **CTA Primary:** `Yes, make it Editable (Free Dynamic)` +- **CTA Secondary:** `No, I risk the Static Code` + +### 1.4 Experiment-Setup (A/B Test) +- **Control:** Direkter Download. +- **Variant:** Safety Intercept Modal. +- **Primary KPI:** `intercept_upgrade_rate` (Ziel: >15%). + +--- + +## 2. Direct Response Copywriting (Real Estate Vertical) +Fokus auf das Keyword Cluster: `qr codes for business` und `real estate qr codes`. + +### 2.1 Zielseite: `/solutions/real-estate` +**Hero Section (SEO & Conversion Optimized):** +- **H1 (SEO):** `Real Estate QR Code Generator: The "Forever Code" for Agents` +- **Subhead:** `Sold the listing? Don't trash the flyers. Just reroute your **Dynamic QR Code** to the next property in 1 click.` +- **CTA:** `Create Free Real Estate QR Code` +- **Micro-Copy:** `Works with Canva & Zillow. Trusted by top agents.` + +### 2.2 Nurture Bridge Email Sequence +**Trigger:** Download `Real Estate Toolkit`. + +**Email 1 (The Hook):** +- **Subject:** `Your "Forever Flyer" Templates are here` +- **Body:** "Stop printing single-use codes. Use this template with a **Dynamic QR Code** that you recycle for every open house." + +**Email 2 (The Fear):** +- **Subject:** `The $300 mistake 90% of agents make` +- **Body:** Story über 500 weggeworfene Flyer, weil der statische Code nicht auf das neue Listing umgeleitet werden konnte. Lösung: "The Editable QR Code". + +--- + +## 3. Content Strategy & SEO Operations +Basierend auf `keyword_planer_google.md` (High Volume & High CPC Opportunities). + +### 3.1 Keyword-Prioritäten +Wir attackieren drei Ebenen gleichzeitig: + +1. **Volume Layer (Top of Funnel):** + - `qr code generator free` (500k Search Volume) -> Homepage & Tool Pages + - `create qr code` (50k SV) -> Tutorial Hub +2. **Value Layer (High Intent/CPC):** + - `dynamic qr code generator` (5k SV, High Value) -> Feature Page + - `qr code for business` (5k SV, High CPC) -> Solutions Hub +3. **Feature Layer (Longtail):** + - `qr code generator with logo` (5k SV) -> Customization Page + - `vcard qr code generator` (5k SV) -> vCard Tool + +### 3.2 Content-Pillars & Hubs + +| Hub Page | Target Keyword | Content Angle (H1 Idea) | +| :--- | :--- | :--- | +| **Real Estate** | `real estate qr codes` | "The Only QR Code Generator for Real Estate Agents" | +| **Business** | `qr codes for business` | "Enterprise-Grade QR Code Generator for Business Growth" | +| **Dynamic** | `dynamic qr code generator` | "Create Editable & Trackable Dynamic QR Codes (Free)" | +| **vCard** | `vcard qr code` | "Digital Business Card & vCard QR Code Generator" | + +### 3.3 SEO-Protokoll & On-Page Execution +Für *jede* neue Seite gilt strikt: + +1. **URL-Struktur:** Sprechend & hierarchisch (`/tools/dynamic-qr-code-generator`). +2. **Title Tag:** `[Main Keyword] - [Benefit] | QR Master` + - *Bsp:* `Dynamic QR Code Generator - Edit Links After Printing | QR Master` +3. **H1:** Muss das Main Keyword exakt enthalten. +4. **FAQ Schema:** Fragen aus "People Also Ask" integrieren (z.B. "Can I edit a QR code after printing?"). + +--- + +## 4. Execution Roadmap (Next 4 Weeks) + +### Woche 1: Foundation & "Safety Net" +- [Dev] **Safety Intercept Modal** auf der Homepage deployen. +- [Content] Optimierung der Homepage Meta-Daten für `free qr code generator` und `dynamic qr code`. + +### Woche 2: Vertical Attack (Real Estate) +- [Page] `/solutions/real-estate` live bringen (Copy siehe 2.1). +- [Lead Magnet] "Forever Flyer" Canva Templates erstellen. + +### Woche 3: High-Value Content +- [Blog] Comparison Post: `Bitly vs. QR Master for Business` (Targeting `qr code for business`). +- [Tool] Polishing der `vcard` Seite für das Keyword `vcard qr code generator`. + +### Woche 4: Review & Amplify +- Analyse der `intercept_upgrade_rate`. +- Backlink-Outreach für Real Estate Artikel. + +--- + +## 5. Risiken & Mitigation +- **Risk:** User sind genervt vom Modal. + - **Fix:** "Don't show again" Option nach 2x Anzeigen. +- **Risk:** SEO dauert zu lange (3-6 Monate). + - **Fix:** Parallel "Programmatic SEO" für Longtail-Keywords (z.B. `qr code for [city]`) aufbauen, um schnelleren Traffic zu holen. + +## 6. Definition of Done (V1.1) +- Safety Intercept ist live und trackt Upgrades. +- Real Estate Landingpage rankt für Longtail-Keywords. +- Die Top-5 Keywords aus dem Plan (`dynamic`, `free`, `business`, `custom`, `vcard`) haben dedizierte, optimierte Landingpages. + diff --git a/marketing/reddit-4-week-calendar-full.ics b/marketing/reddit-4-week-calendar-full.ics index 40fd93b..d747619 100644 --- a/marketing/reddit-4-week-calendar-full.ics +++ b/marketing/reddit-4-week-calendar-full.ics @@ -1,96 +1,96 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//QR Master//Reddit Full Calendar//EN -CALSCALE:GREGORIAN -METHOD:PUBLISH -X-WR-CALNAME:QR Master Reddit Full -X-WR-TIMEZONE:Europe/Berlin -BEGIN:VEVENT -UID:reddit-full-20260316-library@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260316T100000Z -DTEND:20260316T103000Z -SUMMARY:Reddit reply library - all 15 templates -DESCRIPTION:1) If someone asks what tool you use:\nIf you need the destination to stay editable later\, that’s exactly the problem I built around.\nI built QR Master for this\, so obvious bias:\nhttps://www.qrmaster.net/dynamic-qr-code-generator\nIf you want\, I can also just explain the setup without linking anything.\n\n2) Direct link ask:\nSure. I’m building it\, so bias disclosed:\nhttps://www.qrmaster.net/dynamic-qr-code-generator\nMain use case is when something is already printed and the destination changes later.\n\n3) Restaurant/menu:\nIf the menu changes even semi-regularly\, I wouldn’t print a static QR.\nhttps://www.qrmaster.net/use-cases/restaurant-menu-qr-codes\n\n4) Flyer/print:\nThe problem usually isn’t generating the QR. It’s what happens when the page changes after print.\nhttps://www.qrmaster.net/use-cases/flyer-qr-codes\n\n5) Events:\nFor events\, I’d mainly optimize for can we update this later without reprinting everything?\nhttps://www.qrmaster.net/use-cases/event-qr-codes\n\n6) Packaging/bulk:\nIf you’re dealing with lots of codes\, bulk workflow matters way more than people expect.\nhttps://www.qrmaster.net/bulk-qr-code-generator\n\n7) Analytics:\nYou probably want some scan visibility\, but only the useful stuff.\nhttps://www.qrmaster.net/qr-code-tracking\n\n8) Privacy:\nIf privacy matters\, I’d look very closely at how the tracking is handled.\nhttps://www.qrmaster.net/privacy\n\n9) Agencies:\nYeah\, agencies are actually one of the more interesting use cases.\nhttps://www.qrmaster.net/qr-code-for-marketing-campaigns\n\n10) Alternatives:\nIf you need editability after print\, that’s where tools start to differ.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n11) Skeptical reply:\nFair skepticism. I built it\, so I’m obviously biased:\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n12) How set up:\nUse a dynamic destination\, keep the landing page mobile-first\, and make sure you can update it after print.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n13) Recommendations:\nIf the destination might change later\, I’d use a dynamic QR setup.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n14) Feedback thread:\nI’m building in this space\, so this is partly self-interested\, but yes\, this is a real problem.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n15) Direct relevance:\nI built a tool for this exact issue\, so obvious bias:\nhttps://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260317-post2@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260317T120000Z -DTEND:20260317T124500Z -SUMMARY:r/startups - Post 2 -DESCRIPTION:Title: One URL change can ruin 500 flyers. That pain is more real than I expected.\n\nI underestimated how annoying printed mistakes are.\n\nA lot of software problems are reversible.\nPrint problems aren’t.\n\nIf a landing page changes after flyers\, posters\, inserts\, or menus are already out there\, someone has to:\n- live with a broken flow\n- reprint everything\n- or patch it manually in a messy way\n\nThat sounds minor until you talk to people actually running campaigns or local businesses.\n\nWhat small operational problem ended up being much more expensive than it looked at first?\n\nUse replies: 2\, 4\, 11\, 12\, 15 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260319-post1@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260319T120000Z -DTEND:20260319T124500Z -SUMMARY:r/SaaS - Post 1 -DESCRIPTION:Title: I thought QR code software was about generation. The real pain starts after print.\n\nI used to think the value was make a QR code fast.\n\nIt’s not.\n\nThe painful part starts after something is already printed:\n- the menu changes\n- the event page changes\n- the campaign URL changes\n- someone notices a typo too late\n\nOne small change can turn a stack of flyers into trash.\n\nThat shifted how I think about the whole category.\nThe QR itself is easy.\nThe expensive part is everything around it.\n\nAnyone else building in a category where the simple feature isn’t actually where the value is?\n\nUse replies: 1\, 7\, 10\, 11\, 15 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260324-post3@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260324T123000Z -DTEND:20260324T131500Z -SUMMARY:r/smallbusiness - Post 3 -DESCRIPTION:Title: Small businesses usually don’t need more marketing. They need fewer expensive mistakes.\n\nOne thing I keep noticing:\n\nA lot of owners don’t care about having a fancy tool.\nThey care about not wasting money.\n\nWith QR codes\, the common mistakes seem to be:\n- printing static codes for things that change often\n- sending people to ugly mobile pages\n- having no idea whether anyone scanned anything\n- letting one outdated link stay live for weeks\n\nFeels like a lot of marketing problems are actually ops problems.\n\nWhat’s one small process change that saved your business money this year?\n\nUse replies: 3\, 4\, 10\, 12\, 13 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260326-post4@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260326T120000Z -DTEND:20260326T124500Z -SUMMARY:r/EntrepreneurRideAlong - Post 4 -DESCRIPTION:Title: Building in a boring category taught me that boring problems are usually expensive.\n\nI’m building around QR codes\, which sounds incredibly boring on paper.\n\nBut boring problems are often the ones people pay to avoid.\n\nIn this case\, it’s stuff like:\n- reprinting menus\n- fixing outdated flyers\n- updating event info after posters are already out\n- managing lots of QR destinations across campaigns\n\nNobody is emotionally excited about QR codes.\nThey’re emotionally excited about not dealing with preventable mess.\n\nAnyone else building something unsexy that turned out to have very real pain behind it?\n\nUse replies: 2\, 4\, 9\, 11\, 15 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260327-post5@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260327T133000Z -DTEND:20260327T141500Z -SUMMARY:r/SideProject - Post 5 -DESCRIPTION:Title: The weird part about building a QR product is that the technical problem isn’t the interesting one.\n\nGenerating a QR image is trivial.\n\nWhat turned out to be more interesting:\n- what happens after print\n- whether someone can change the destination later\n- what analytics are actually useful\n- how privacy concerns show up once tracking enters the conversation\n- how bulk workflows matter way more than expected\n\nIt’s one of those products that looks dumb-simple from the outside and much more operational once you talk to users.\n\nWhat kind of side project looked simple until real use cases started showing up?\n\nUse replies: 1\, 6\, 7\, 8\, 15 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260331-post7@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260331T120000Z -DTEND:20260331T124500Z -SUMMARY:r/AlphaandBetaTesters - Post 7 -DESCRIPTION:Title: Looking for feedback from anyone who has used QR codes in restaurants\, events\, print\, or packaging.\n\nI’m trying to learn from people who use QR codes in the real world\, not just in theory.\n\nEspecially if you’ve used them for:\n- menus\n- flyers\n- product packaging\n- event materials\n- WiFi / contact sharing\n- agency campaigns\n\nThings I’m curious about:\n- what changes most often after something is printed?\n- what’s annoying about current tools?\n- do you actually care about scan analytics?\n- does privacy / GDPR affect vendor choice at all?\n\nI’m happy to share what I’m building if useful\, but mostly looking for honest feedback from people who’ve dealt with this firsthand.\n\nUse replies: 3\, 5\, 6\, 8\, 14 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260402-post8@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260402T120000Z -DTEND:20260402T124500Z -SUMMARY:r/RoastMyStartup - Post 8 -DESCRIPTION:Title: Roast my positioning: is avoid reprints and broken QR campaigns a strong enough problem?\n\nI’m working on a product around dynamic QR codes.\n\nThe positioning I’m testing is less make QR codes and more avoid reprints\, outdated links\, and messy campaign management.\n\nTarget users are mostly:\n- small businesses\n- restaurants\n- marketers\n- agencies\n- event / packaging use cases\n\nThe questions I’d love roasted:\n- does the pain feel real enough?\n- does this sound too niche?\n- what part sounds generic or weak?\n- what would make you ignore this instantly?\n\nHappy to share the product if the sub is okay with it.\n\nUse replies: 2\, 10\, 11\, 14\, 15 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260403-post6@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260403T123000Z -DTEND:20260403T131500Z -SUMMARY:r/ProductMgmt - Post 6 -DESCRIPTION:Title: Users say they want a QR generator. What they actually want is damage control.\n\nA PM lesson I didn’t expect:\n\nPeople describe the need as I need a QR code.\nBut what they actually care about is something like:\nI need this thing to not break once it’s already printed.\n\nThat changes what feels important.\n\nGenerate code sounds like the core feature.\nBut retention/value probably sits closer to:\n- edit later\n- track scans\n- handle multiple codes\n- avoid privacy headaches\n- manage existing campaigns cleanly\n\nHave you seen that mismatch in your own product?\nWhat users ask for first vs. what actually matters later?\n\nUse replies: 1\, 7\, 8\, 10\, 12 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260407-post9@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260407T120000Z -DTEND:20260407T124500Z -SUMMARY:r/startups - Post 9 -DESCRIPTION:Title: I’m starting to think edit after print is a stronger product promise than track scans.\n\nInteresting thing from early positioning:\n\nI assumed analytics would be the hero feature.\nBut I can change the destination later seems to click faster.\n\nMakes sense in hindsight.\nTracking is nice.\nAvoiding expensive mistakes is urgent.\n\nSo now I’m wondering if the better message is:\n- first promise control\n- then introduce analytics\n- then layer in bulk / workflow / privacy\n\nIf you’ve sold into small businesses or marketers:\nwhat kind of promise gets attention faster\, insight or control?\n\nUse replies: 1\, 7\, 9\, 10\, 15 -END:VEVENT -BEGIN:VEVENT -UID:reddit-full-20260409-post10@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260409T123000Z -DTEND:20260409T131500Z -SUMMARY:r/smallbusiness - Post 10 -DESCRIPTION:Title: What looks like a tiny print detail can quietly waste a lot of money.\n\nI keep coming back to this:\n\nA broken link on a website is annoying.\nA broken link on printed material is expensive.\n\nBecause now the problem is sitting in:\n- stores\n- restaurants\n- posters\n- packaging\n- tables\n- flyers already handed out\n\nFeels like one of those things that sounds tiny until you count the friction and replacement cost.\n\nWhat’s a small detail in your business that causes way more downstream cost than people assume?\n\nUse replies: 3\, 4\, 6\, 13\, 15 -END:VEVENT -END:VCALENDAR +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//QR Master//Reddit Full Calendar//EN +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:QR Master Reddit Full +X-WR-TIMEZONE:Europe/Berlin +BEGIN:VEVENT +UID:reddit-full-20260316-library@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260316T100000Z +DTEND:20260316T103000Z +SUMMARY:Reddit reply library - all 15 templates +DESCRIPTION:1) If someone asks what tool you use:\nIf you need the destination to stay editable later\, that’s exactly the problem I built around.\nI built QR Master for this\, so obvious bias:\nhttps://www.qrmaster.net/dynamic-qr-code-generator\nIf you want\, I can also just explain the setup without linking anything.\n\n2) Direct link ask:\nSure. I’m building it\, so bias disclosed:\nhttps://www.qrmaster.net/dynamic-qr-code-generator\nMain use case is when something is already printed and the destination changes later.\n\n3) Restaurant/menu:\nIf the menu changes even semi-regularly\, I wouldn’t print a static QR.\nhttps://www.qrmaster.net/use-cases/restaurant-menu-qr-codes\n\n4) Flyer/print:\nThe problem usually isn’t generating the QR. It’s what happens when the page changes after print.\nhttps://www.qrmaster.net/use-cases/flyer-qr-codes\n\n5) Events:\nFor events\, I’d mainly optimize for can we update this later without reprinting everything?\nhttps://www.qrmaster.net/use-cases/event-qr-codes\n\n6) Packaging/bulk:\nIf you’re dealing with lots of codes\, bulk workflow matters way more than people expect.\nhttps://www.qrmaster.net/bulk-qr-code-generator\n\n7) Analytics:\nYou probably want some scan visibility\, but only the useful stuff.\nhttps://www.qrmaster.net/qr-code-tracking\n\n8) Privacy:\nIf privacy matters\, I’d look very closely at how the tracking is handled.\nhttps://www.qrmaster.net/privacy\n\n9) Agencies:\nYeah\, agencies are actually one of the more interesting use cases.\nhttps://www.qrmaster.net/qr-code-for-marketing-campaigns\n\n10) Alternatives:\nIf you need editability after print\, that’s where tools start to differ.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n11) Skeptical reply:\nFair skepticism. I built it\, so I’m obviously biased:\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n12) How set up:\nUse a dynamic destination\, keep the landing page mobile-first\, and make sure you can update it after print.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n13) Recommendations:\nIf the destination might change later\, I’d use a dynamic QR setup.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n14) Feedback thread:\nI’m building in this space\, so this is partly self-interested\, but yes\, this is a real problem.\nhttps://www.qrmaster.net/dynamic-qr-code-generator\n\n15) Direct relevance:\nI built a tool for this exact issue\, so obvious bias:\nhttps://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260317-post2@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260317T120000Z +DTEND:20260317T124500Z +SUMMARY:r/startups - Post 2 +DESCRIPTION:Title: One URL change can ruin 500 flyers. That pain is more real than I expected.\n\nI underestimated how annoying printed mistakes are.\n\nA lot of software problems are reversible.\nPrint problems aren’t.\n\nIf a landing page changes after flyers\, posters\, inserts\, or menus are already out there\, someone has to:\n- live with a broken flow\n- reprint everything\n- or patch it manually in a messy way\n\nThat sounds minor until you talk to people actually running campaigns or local businesses.\n\nWhat small operational problem ended up being much more expensive than it looked at first?\n\nUse replies: 2\, 4\, 11\, 12\, 15 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260319-post1@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260319T120000Z +DTEND:20260319T124500Z +SUMMARY:r/SaaS - Post 1 +DESCRIPTION:Title: I thought QR code software was about generation. The real pain starts after print.\n\nI used to think the value was make a QR code fast.\n\nIt’s not.\n\nThe painful part starts after something is already printed:\n- the menu changes\n- the event page changes\n- the campaign URL changes\n- someone notices a typo too late\n\nOne small change can turn a stack of flyers into trash.\n\nThat shifted how I think about the whole category.\nThe QR itself is easy.\nThe expensive part is everything around it.\n\nAnyone else building in a category where the simple feature isn’t actually where the value is?\n\nUse replies: 1\, 7\, 10\, 11\, 15 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260324-post3@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260324T123000Z +DTEND:20260324T131500Z +SUMMARY:r/smallbusiness - Post 3 +DESCRIPTION:Title: Small businesses usually don’t need more marketing. They need fewer expensive mistakes.\n\nOne thing I keep noticing:\n\nA lot of owners don’t care about having a fancy tool.\nThey care about not wasting money.\n\nWith QR codes\, the common mistakes seem to be:\n- printing static codes for things that change often\n- sending people to ugly mobile pages\n- having no idea whether anyone scanned anything\n- letting one outdated link stay live for weeks\n\nFeels like a lot of marketing problems are actually ops problems.\n\nWhat’s one small process change that saved your business money this year?\n\nUse replies: 3\, 4\, 10\, 12\, 13 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260326-post4@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260326T120000Z +DTEND:20260326T124500Z +SUMMARY:r/EntrepreneurRideAlong - Post 4 +DESCRIPTION:Title: Building in a boring category taught me that boring problems are usually expensive.\n\nI’m building around QR codes\, which sounds incredibly boring on paper.\n\nBut boring problems are often the ones people pay to avoid.\n\nIn this case\, it’s stuff like:\n- reprinting menus\n- fixing outdated flyers\n- updating event info after posters are already out\n- managing lots of QR destinations across campaigns\n\nNobody is emotionally excited about QR codes.\nThey’re emotionally excited about not dealing with preventable mess.\n\nAnyone else building something unsexy that turned out to have very real pain behind it?\n\nUse replies: 2\, 4\, 9\, 11\, 15 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260327-post5@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260327T133000Z +DTEND:20260327T141500Z +SUMMARY:r/SideProject - Post 5 +DESCRIPTION:Title: The weird part about building a QR product is that the technical problem isn’t the interesting one.\n\nGenerating a QR image is trivial.\n\nWhat turned out to be more interesting:\n- what happens after print\n- whether someone can change the destination later\n- what analytics are actually useful\n- how privacy concerns show up once tracking enters the conversation\n- how bulk workflows matter way more than expected\n\nIt’s one of those products that looks dumb-simple from the outside and much more operational once you talk to users.\n\nWhat kind of side project looked simple until real use cases started showing up?\n\nUse replies: 1\, 6\, 7\, 8\, 15 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260331-post7@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260331T120000Z +DTEND:20260331T124500Z +SUMMARY:r/AlphaandBetaTesters - Post 7 +DESCRIPTION:Title: Looking for feedback from anyone who has used QR codes in restaurants\, events\, print\, or packaging.\n\nI’m trying to learn from people who use QR codes in the real world\, not just in theory.\n\nEspecially if you’ve used them for:\n- menus\n- flyers\n- product packaging\n- event materials\n- WiFi / contact sharing\n- agency campaigns\n\nThings I’m curious about:\n- what changes most often after something is printed?\n- what’s annoying about current tools?\n- do you actually care about scan analytics?\n- does privacy / GDPR affect vendor choice at all?\n\nI’m happy to share what I’m building if useful\, but mostly looking for honest feedback from people who’ve dealt with this firsthand.\n\nUse replies: 3\, 5\, 6\, 8\, 14 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260402-post8@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260402T120000Z +DTEND:20260402T124500Z +SUMMARY:r/RoastMyStartup - Post 8 +DESCRIPTION:Title: Roast my positioning: is avoid reprints and broken QR campaigns a strong enough problem?\n\nI’m working on a product around dynamic QR codes.\n\nThe positioning I’m testing is less make QR codes and more avoid reprints\, outdated links\, and messy campaign management.\n\nTarget users are mostly:\n- small businesses\n- restaurants\n- marketers\n- agencies\n- event / packaging use cases\n\nThe questions I’d love roasted:\n- does the pain feel real enough?\n- does this sound too niche?\n- what part sounds generic or weak?\n- what would make you ignore this instantly?\n\nHappy to share the product if the sub is okay with it.\n\nUse replies: 2\, 10\, 11\, 14\, 15 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260403-post6@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260403T123000Z +DTEND:20260403T131500Z +SUMMARY:r/ProductMgmt - Post 6 +DESCRIPTION:Title: Users say they want a QR generator. What they actually want is damage control.\n\nA PM lesson I didn’t expect:\n\nPeople describe the need as I need a QR code.\nBut what they actually care about is something like:\nI need this thing to not break once it’s already printed.\n\nThat changes what feels important.\n\nGenerate code sounds like the core feature.\nBut retention/value probably sits closer to:\n- edit later\n- track scans\n- handle multiple codes\n- avoid privacy headaches\n- manage existing campaigns cleanly\n\nHave you seen that mismatch in your own product?\nWhat users ask for first vs. what actually matters later?\n\nUse replies: 1\, 7\, 8\, 10\, 12 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260407-post9@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260407T120000Z +DTEND:20260407T124500Z +SUMMARY:r/startups - Post 9 +DESCRIPTION:Title: I’m starting to think edit after print is a stronger product promise than track scans.\n\nInteresting thing from early positioning:\n\nI assumed analytics would be the hero feature.\nBut I can change the destination later seems to click faster.\n\nMakes sense in hindsight.\nTracking is nice.\nAvoiding expensive mistakes is urgent.\n\nSo now I’m wondering if the better message is:\n- first promise control\n- then introduce analytics\n- then layer in bulk / workflow / privacy\n\nIf you’ve sold into small businesses or marketers:\nwhat kind of promise gets attention faster\, insight or control?\n\nUse replies: 1\, 7\, 9\, 10\, 15 +END:VEVENT +BEGIN:VEVENT +UID:reddit-full-20260409-post10@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260409T123000Z +DTEND:20260409T131500Z +SUMMARY:r/smallbusiness - Post 10 +DESCRIPTION:Title: What looks like a tiny print detail can quietly waste a lot of money.\n\nI keep coming back to this:\n\nA broken link on a website is annoying.\nA broken link on printed material is expensive.\n\nBecause now the problem is sitting in:\n- stores\n- restaurants\n- posters\n- packaging\n- tables\n- flyers already handed out\n\nFeels like one of those things that sounds tiny until you count the friction and replacement cost.\n\nWhat’s a small detail in your business that causes way more downstream cost than people assume?\n\nUse replies: 3\, 4\, 6\, 13\, 15 +END:VEVENT +END:VCALENDAR diff --git a/marketing/reddit-4-week-calendar-full.md b/marketing/reddit-4-week-calendar-full.md index 2d56d93..2e087ff 100644 --- a/marketing/reddit-4-week-calendar-full.md +++ b/marketing/reddit-4-week-calendar-full.md @@ -1,443 +1,443 @@ -# QR Master Reddit Calendar - Full 4 Weeks - -Times are in Europe/Berlin. - -## Link Map - -- Core dynamic angle: `https://www.qrmaster.net/dynamic-qr-code-generator` -- Reprint / waste angle: `https://www.qrmaster.net/reprint-calculator` -- Restaurant / menu: `https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes` -- Flyer / print campaigns: `https://www.qrmaster.net/use-cases/flyer-qr-codes` -- Event use case: `https://www.qrmaster.net/use-cases/event-qr-codes` -- Bulk / packaging: `https://www.qrmaster.net/bulk-qr-code-generator` -- Packaging use case: `https://www.qrmaster.net/use-cases/packaging-qr-codes` -- Tracking / analytics: `https://www.qrmaster.net/qr-code-tracking` -- Privacy: `https://www.qrmaster.net/privacy` -- Campaign workflows: `https://www.qrmaster.net/qr-code-for-marketing-campaigns` -- Main site: `https://www.qrmaster.net/` - -## Reply Library - -### 1. If someone asks what tool you use - -```text -If you need the destination to stay editable later, that’s exactly the problem I built around. - -I built QR Master for this, so obvious bias: -https://www.qrmaster.net/dynamic-qr-code-generator - -If you want, I can also just explain the setup without linking anything. -``` - -### 2. If someone asks for the link directly - -```text -Sure. I’m building it, so bias disclosed: -https://www.qrmaster.net/dynamic-qr-code-generator - -Main use case is when something is already printed and the destination changes later. -``` - -### 3. Restaurant / menu threads - -```text -If the menu changes even semi-regularly, I wouldn’t print a static QR. - -I built a tool for exactly that use case, so obvious bias here: -https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes - -Even without using mine, I’d still recommend a dynamic destination and a very mobile-friendly menu page. -``` - -### 4. Flyer / print campaign threads - -```text -The problem usually isn’t generating the QR. It’s what happens when the page changes after print. - -I built something specifically for that: -https://www.qrmaster.net/use-cases/flyer-qr-codes - -If helpful, I can outline the print-safe setup here too. -``` - -### 5. Event use case - -```text -For events, I’d mainly optimize for “can we update this later without reprinting everything?” - -I built QR Master around that exact headache, so bias here: -https://www.qrmaster.net/use-cases/event-qr-codes -``` - -### 6. Packaging / bulk - -```text -If you’re dealing with lots of codes, bulk workflow matters way more than people expect. - -I built this with that in mind: -https://www.qrmaster.net/bulk-qr-code-generator - -Happy to share what a clean CSV / batch setup usually looks like. -``` - -### 7. Analytics questions - -```text -You probably want some scan visibility, but only the useful stuff. - -I built QR Master with that angle in mind, so obvious bias: -https://www.qrmaster.net/qr-code-tracking - -Personally I think basic scan data + clean attribution matters more than a flashy dashboard. -``` - -### 8. Privacy / GDPR - -```text -If privacy matters, I’d look very closely at how the tracking is handled. - -I’m building QR Master, so not pretending to be neutral: -https://www.qrmaster.net/privacy - -That said, I’d ask the same questions to any vendor. -``` - -### 9. If someone says this would be useful for agencies - -```text -Yeah, agencies are actually one of the more interesting use cases. - -I built this partly with that workflow in mind: -https://www.qrmaster.net/qr-code-for-marketing-campaigns - -Managing multiple destinations gets messy fast otherwise. -``` - -### 10. If someone asks about alternatives - -```text -Depends what you care about. - -If you just need a basic static code, almost anything works. -If you need editability after print, that’s where tools start to differ. - -I built QR Master for that second case: -https://www.qrmaster.net/dynamic-qr-code-generator -``` - -### 11. If someone is skeptical - -```text -Fair skepticism. - -I built it, so I’m obviously biased: -https://www.qrmaster.net/dynamic-qr-code-generator - -If you’d rather keep it link-free, I’m happy to just explain the tradeoffs here. -``` - -### 12. If someone asks how you would set this up - -```text -Short version: -use a dynamic destination, keep the landing page mobile-first, and make sure you can update it after print. - -I built a tool for exactly that flow: -https://www.qrmaster.net/dynamic-qr-code-generator -``` - -### 13. If someone asks for recommendations - -```text -If the destination might change later, I’d use a dynamic QR setup. - -I built one for that use case, so take this with bias: -https://www.qrmaster.net/dynamic-qr-code-generator - -If not mine, I’d still choose something that makes post-print edits easy. -``` - -### 14. Feedback threads - -```text -I’m building in this space, so this is partly self-interested, but yes, this is a real problem. - -Here’s what I’m working on if useful: -https://www.qrmaster.net/dynamic-qr-code-generator - -Would genuinely love blunt feedback more than polite praise. -``` - -### 15. Direct relevance / no hard sell - -```text -I built a tool for this exact issue, so obvious bias: -https://www.qrmaster.net/dynamic-qr-code-generator - -No hard sell. Just seemed directly relevant to what you asked. -``` - -## Schedule - -### 2026-03-17 Tuesday, 13:00 - -- Subreddit: `r/startups` -- Post #2 -- Title: `One URL change can ruin 500 flyers. That pain is more real than I expected.` -- Use replies: `2`, `4`, `11`, `12`, `15` - -```text -I underestimated how annoying printed mistakes are. - -A lot of software problems are reversible. -Print problems aren’t. - -If a landing page changes after flyers, posters, inserts, or menus are already out there, someone has to: -- live with a broken flow -- reprint everything -- or patch it manually in a messy way - -That sounds minor until you talk to people actually running campaigns or local businesses. - -What small operational problem ended up being much more expensive than it looked at first? -``` - -### 2026-03-19 Thursday, 13:00 - -- Subreddit: `r/SaaS` -- Post #1 -- Title: `I thought QR code software was about generation. The real pain starts after print.` -- Use replies: `1`, `7`, `10`, `11`, `15` - -```text -I used to think the value was “make a QR code fast.” - -It’s not. - -The painful part starts after something is already printed: -- the menu changes -- the event page changes -- the campaign URL changes -- someone notices a typo too late - -One small change can turn a stack of flyers into trash. - -That shifted how I think about the whole category. -The QR itself is easy. -The expensive part is everything around it. - -Anyone else building in a category where the “simple feature” isn’t actually where the value is? -``` - -### 2026-03-24 Tuesday, 13:30 - -- Subreddit: `r/smallbusiness` -- Post #3 -- Title: `Small businesses usually don’t need “more marketing.” They need fewer expensive mistakes.` -- Use replies: `3`, `4`, `10`, `12`, `13` - -```text -One thing I keep noticing: - -A lot of owners don’t care about having a fancy tool. -They care about not wasting money. - -With QR codes, the common mistakes seem to be: -- printing static codes for things that change often -- sending people to ugly mobile pages -- having no idea whether anyone scanned anything -- letting one outdated link stay live for weeks - -Feels like a lot of “marketing problems” are actually ops problems. - -What’s one small process change that saved your business money this year? -``` - -### 2026-03-26 Thursday, 13:00 - -- Subreddit: `r/EntrepreneurRideAlong` -- Post #4 -- Use replies: `2`, `4`, `9`, `11`, `15` - -```text -Building in a boring category taught me that boring problems are usually expensive - -I’m building around QR codes, which sounds incredibly boring on paper. - -But boring problems are often the ones people pay to avoid. - -In this case, it’s stuff like: -- reprinting menus -- fixing outdated flyers -- updating event info after posters are already out -- managing lots of QR destinations across campaigns - -Nobody is emotionally excited about QR codes. -They’re emotionally excited about not dealing with preventable mess. - -Anyone else building something “unsexy” that turned out to have very real pain behind it? -``` - -### 2026-03-27 Friday, 14:30 - -- Subreddit: `r/SideProject` -- Post #5 -- Title: `The weird part about building a QR product is that the technical problem isn’t the interesting one` -- Use replies: `1`, `6`, `7`, `8`, `15` - -```text -Generating a QR image is trivial. - -What turned out to be more interesting: -- what happens after print -- whether someone can change the destination later -- what analytics are actually useful -- how privacy concerns show up once tracking enters the conversation -- how bulk workflows matter way more than expected - -It’s one of those products that looks dumb-simple from the outside and much more operational once you talk to users. - -What kind of side project looked simple until real use cases started showing up? -``` - -### 2026-03-31 Tuesday, 14:00 - -- Subreddit: `r/AlphaandBetaTesters` -- Post #7 -- Use replies: `3`, `5`, `6`, `8`, `14` - -```text -Looking for feedback from anyone who has used QR codes in restaurants, events, print, or packaging - -I’m trying to learn from people who use QR codes in the real world, not just in theory. - -Especially if you’ve used them for: -- menus -- flyers -- product packaging -- event materials -- WiFi / contact sharing -- agency campaigns - -Things I’m curious about: -- what changes most often after something is printed? -- what’s annoying about current tools? -- do you actually care about scan analytics? -- does privacy / GDPR affect vendor choice at all? - -I’m happy to share what I’m building if useful, but mostly looking for honest feedback from people who’ve dealt with this firsthand. -``` - -### 2026-04-02 Thursday, 14:00 - -- Subreddit: `r/RoastMyStartup` -- Post #8 -- Use replies: `2`, `10`, `11`, `14`, `15` - -```text -Roast my positioning: is “avoid reprints and broken QR campaigns” a strong enough problem? - -I’m working on a product around dynamic QR codes. - -The positioning I’m testing is less “make QR codes” and more: -“avoid reprints, outdated links, and messy campaign management.” - -Target users are mostly: -- small businesses -- restaurants -- marketers -- agencies -- event / packaging use cases - -The questions I’d love roasted: -- does the pain feel real enough? -- does this sound too niche? -- what part sounds generic or weak? -- what would make you ignore this instantly? - -Happy to share the product if the sub is okay with it. -``` - -### 2026-04-03 Friday, 14:30 - -- Subreddit: `r/ProductMgmt` -- Post #6 -- Use replies: `1`, `7`, `8`, `10`, `12` - -```text -Users say they want a QR generator. What they actually want is damage control. - -A PM lesson I didn’t expect: - -People describe the need as “I need a QR code.” -But what they actually care about is something like: -“I need this thing to not break once it’s already printed.” - -That changes what feels important. - -“Generate code” sounds like the core feature. -But retention/value probably sits closer to: -- edit later -- track scans -- handle multiple codes -- avoid privacy headaches -- manage existing campaigns cleanly - -Have you seen that mismatch in your own product? -What users ask for first vs. what actually matters later? -``` - -### 2026-04-07 Tuesday, 14:00 - -- Subreddit: `r/startups` -- Post #9 -- Use replies: `1`, `7`, `9`, `10`, `15` - -```text -I’m starting to think “edit after print” is a stronger product promise than “track scans” - -Interesting thing from early positioning: - -I assumed analytics would be the hero feature. -But “I can change the destination later” seems to click faster. - -Makes sense in hindsight. -Tracking is nice. -Avoiding expensive mistakes is urgent. - -So now I’m wondering if the better message is: -- first promise control -- then introduce analytics -- then layer in bulk / workflow / privacy - -If you’ve sold into small businesses or marketers: -what kind of promise gets attention faster, insight or control? -``` - -### 2026-04-09 Thursday, 14:30 - -- Subreddit: `r/smallbusiness` -- Post #10 -- Use replies: `3`, `4`, `6`, `13`, `15` - -```text -What looks like a tiny print detail can quietly waste a lot of money - -I keep coming back to this: - -A broken link on a website is annoying. -A broken link on printed material is expensive. - -Because now the problem is sitting in: -- stores -- restaurants -- posters -- packaging -- tables -- flyers already handed out - -Feels like one of those things that sounds tiny until you count the friction and replacement cost. - -What’s a “small detail” in your business that causes way more downstream cost than people assume? -``` - +# QR Master Reddit Calendar - Full 4 Weeks + +Times are in Europe/Berlin. + +## Link Map + +- Core dynamic angle: `https://www.qrmaster.net/dynamic-qr-code-generator` +- Reprint / waste angle: `https://www.qrmaster.net/reprint-calculator` +- Restaurant / menu: `https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes` +- Flyer / print campaigns: `https://www.qrmaster.net/use-cases/flyer-qr-codes` +- Event use case: `https://www.qrmaster.net/use-cases/event-qr-codes` +- Bulk / packaging: `https://www.qrmaster.net/bulk-qr-code-generator` +- Packaging use case: `https://www.qrmaster.net/use-cases/packaging-qr-codes` +- Tracking / analytics: `https://www.qrmaster.net/qr-code-tracking` +- Privacy: `https://www.qrmaster.net/privacy` +- Campaign workflows: `https://www.qrmaster.net/qr-code-for-marketing-campaigns` +- Main site: `https://www.qrmaster.net/` + +## Reply Library + +### 1. If someone asks what tool you use + +```text +If you need the destination to stay editable later, that’s exactly the problem I built around. + +I built QR Master for this, so obvious bias: +https://www.qrmaster.net/dynamic-qr-code-generator + +If you want, I can also just explain the setup without linking anything. +``` + +### 2. If someone asks for the link directly + +```text +Sure. I’m building it, so bias disclosed: +https://www.qrmaster.net/dynamic-qr-code-generator + +Main use case is when something is already printed and the destination changes later. +``` + +### 3. Restaurant / menu threads + +```text +If the menu changes even semi-regularly, I wouldn’t print a static QR. + +I built a tool for exactly that use case, so obvious bias here: +https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes + +Even without using mine, I’d still recommend a dynamic destination and a very mobile-friendly menu page. +``` + +### 4. Flyer / print campaign threads + +```text +The problem usually isn’t generating the QR. It’s what happens when the page changes after print. + +I built something specifically for that: +https://www.qrmaster.net/use-cases/flyer-qr-codes + +If helpful, I can outline the print-safe setup here too. +``` + +### 5. Event use case + +```text +For events, I’d mainly optimize for “can we update this later without reprinting everything?” + +I built QR Master around that exact headache, so bias here: +https://www.qrmaster.net/use-cases/event-qr-codes +``` + +### 6. Packaging / bulk + +```text +If you’re dealing with lots of codes, bulk workflow matters way more than people expect. + +I built this with that in mind: +https://www.qrmaster.net/bulk-qr-code-generator + +Happy to share what a clean CSV / batch setup usually looks like. +``` + +### 7. Analytics questions + +```text +You probably want some scan visibility, but only the useful stuff. + +I built QR Master with that angle in mind, so obvious bias: +https://www.qrmaster.net/qr-code-tracking + +Personally I think basic scan data + clean attribution matters more than a flashy dashboard. +``` + +### 8. Privacy / GDPR + +```text +If privacy matters, I’d look very closely at how the tracking is handled. + +I’m building QR Master, so not pretending to be neutral: +https://www.qrmaster.net/privacy + +That said, I’d ask the same questions to any vendor. +``` + +### 9. If someone says this would be useful for agencies + +```text +Yeah, agencies are actually one of the more interesting use cases. + +I built this partly with that workflow in mind: +https://www.qrmaster.net/qr-code-for-marketing-campaigns + +Managing multiple destinations gets messy fast otherwise. +``` + +### 10. If someone asks about alternatives + +```text +Depends what you care about. + +If you just need a basic static code, almost anything works. +If you need editability after print, that’s where tools start to differ. + +I built QR Master for that second case: +https://www.qrmaster.net/dynamic-qr-code-generator +``` + +### 11. If someone is skeptical + +```text +Fair skepticism. + +I built it, so I’m obviously biased: +https://www.qrmaster.net/dynamic-qr-code-generator + +If you’d rather keep it link-free, I’m happy to just explain the tradeoffs here. +``` + +### 12. If someone asks how you would set this up + +```text +Short version: +use a dynamic destination, keep the landing page mobile-first, and make sure you can update it after print. + +I built a tool for exactly that flow: +https://www.qrmaster.net/dynamic-qr-code-generator +``` + +### 13. If someone asks for recommendations + +```text +If the destination might change later, I’d use a dynamic QR setup. + +I built one for that use case, so take this with bias: +https://www.qrmaster.net/dynamic-qr-code-generator + +If not mine, I’d still choose something that makes post-print edits easy. +``` + +### 14. Feedback threads + +```text +I’m building in this space, so this is partly self-interested, but yes, this is a real problem. + +Here’s what I’m working on if useful: +https://www.qrmaster.net/dynamic-qr-code-generator + +Would genuinely love blunt feedback more than polite praise. +``` + +### 15. Direct relevance / no hard sell + +```text +I built a tool for this exact issue, so obvious bias: +https://www.qrmaster.net/dynamic-qr-code-generator + +No hard sell. Just seemed directly relevant to what you asked. +``` + +## Schedule + +### 2026-03-17 Tuesday, 13:00 + +- Subreddit: `r/startups` +- Post #2 +- Title: `One URL change can ruin 500 flyers. That pain is more real than I expected.` +- Use replies: `2`, `4`, `11`, `12`, `15` + +```text +I underestimated how annoying printed mistakes are. + +A lot of software problems are reversible. +Print problems aren’t. + +If a landing page changes after flyers, posters, inserts, or menus are already out there, someone has to: +- live with a broken flow +- reprint everything +- or patch it manually in a messy way + +That sounds minor until you talk to people actually running campaigns or local businesses. + +What small operational problem ended up being much more expensive than it looked at first? +``` + +### 2026-03-19 Thursday, 13:00 + +- Subreddit: `r/SaaS` +- Post #1 +- Title: `I thought QR code software was about generation. The real pain starts after print.` +- Use replies: `1`, `7`, `10`, `11`, `15` + +```text +I used to think the value was “make a QR code fast.” + +It’s not. + +The painful part starts after something is already printed: +- the menu changes +- the event page changes +- the campaign URL changes +- someone notices a typo too late + +One small change can turn a stack of flyers into trash. + +That shifted how I think about the whole category. +The QR itself is easy. +The expensive part is everything around it. + +Anyone else building in a category where the “simple feature” isn’t actually where the value is? +``` + +### 2026-03-24 Tuesday, 13:30 + +- Subreddit: `r/smallbusiness` +- Post #3 +- Title: `Small businesses usually don’t need “more marketing.” They need fewer expensive mistakes.` +- Use replies: `3`, `4`, `10`, `12`, `13` + +```text +One thing I keep noticing: + +A lot of owners don’t care about having a fancy tool. +They care about not wasting money. + +With QR codes, the common mistakes seem to be: +- printing static codes for things that change often +- sending people to ugly mobile pages +- having no idea whether anyone scanned anything +- letting one outdated link stay live for weeks + +Feels like a lot of “marketing problems” are actually ops problems. + +What’s one small process change that saved your business money this year? +``` + +### 2026-03-26 Thursday, 13:00 + +- Subreddit: `r/EntrepreneurRideAlong` +- Post #4 +- Use replies: `2`, `4`, `9`, `11`, `15` + +```text +Building in a boring category taught me that boring problems are usually expensive + +I’m building around QR codes, which sounds incredibly boring on paper. + +But boring problems are often the ones people pay to avoid. + +In this case, it’s stuff like: +- reprinting menus +- fixing outdated flyers +- updating event info after posters are already out +- managing lots of QR destinations across campaigns + +Nobody is emotionally excited about QR codes. +They’re emotionally excited about not dealing with preventable mess. + +Anyone else building something “unsexy” that turned out to have very real pain behind it? +``` + +### 2026-03-27 Friday, 14:30 + +- Subreddit: `r/SideProject` +- Post #5 +- Title: `The weird part about building a QR product is that the technical problem isn’t the interesting one` +- Use replies: `1`, `6`, `7`, `8`, `15` + +```text +Generating a QR image is trivial. + +What turned out to be more interesting: +- what happens after print +- whether someone can change the destination later +- what analytics are actually useful +- how privacy concerns show up once tracking enters the conversation +- how bulk workflows matter way more than expected + +It’s one of those products that looks dumb-simple from the outside and much more operational once you talk to users. + +What kind of side project looked simple until real use cases started showing up? +``` + +### 2026-03-31 Tuesday, 14:00 + +- Subreddit: `r/AlphaandBetaTesters` +- Post #7 +- Use replies: `3`, `5`, `6`, `8`, `14` + +```text +Looking for feedback from anyone who has used QR codes in restaurants, events, print, or packaging + +I’m trying to learn from people who use QR codes in the real world, not just in theory. + +Especially if you’ve used them for: +- menus +- flyers +- product packaging +- event materials +- WiFi / contact sharing +- agency campaigns + +Things I’m curious about: +- what changes most often after something is printed? +- what’s annoying about current tools? +- do you actually care about scan analytics? +- does privacy / GDPR affect vendor choice at all? + +I’m happy to share what I’m building if useful, but mostly looking for honest feedback from people who’ve dealt with this firsthand. +``` + +### 2026-04-02 Thursday, 14:00 + +- Subreddit: `r/RoastMyStartup` +- Post #8 +- Use replies: `2`, `10`, `11`, `14`, `15` + +```text +Roast my positioning: is “avoid reprints and broken QR campaigns” a strong enough problem? + +I’m working on a product around dynamic QR codes. + +The positioning I’m testing is less “make QR codes” and more: +“avoid reprints, outdated links, and messy campaign management.” + +Target users are mostly: +- small businesses +- restaurants +- marketers +- agencies +- event / packaging use cases + +The questions I’d love roasted: +- does the pain feel real enough? +- does this sound too niche? +- what part sounds generic or weak? +- what would make you ignore this instantly? + +Happy to share the product if the sub is okay with it. +``` + +### 2026-04-03 Friday, 14:30 + +- Subreddit: `r/ProductMgmt` +- Post #6 +- Use replies: `1`, `7`, `8`, `10`, `12` + +```text +Users say they want a QR generator. What they actually want is damage control. + +A PM lesson I didn’t expect: + +People describe the need as “I need a QR code.” +But what they actually care about is something like: +“I need this thing to not break once it’s already printed.” + +That changes what feels important. + +“Generate code” sounds like the core feature. +But retention/value probably sits closer to: +- edit later +- track scans +- handle multiple codes +- avoid privacy headaches +- manage existing campaigns cleanly + +Have you seen that mismatch in your own product? +What users ask for first vs. what actually matters later? +``` + +### 2026-04-07 Tuesday, 14:00 + +- Subreddit: `r/startups` +- Post #9 +- Use replies: `1`, `7`, `9`, `10`, `15` + +```text +I’m starting to think “edit after print” is a stronger product promise than “track scans” + +Interesting thing from early positioning: + +I assumed analytics would be the hero feature. +But “I can change the destination later” seems to click faster. + +Makes sense in hindsight. +Tracking is nice. +Avoiding expensive mistakes is urgent. + +So now I’m wondering if the better message is: +- first promise control +- then introduce analytics +- then layer in bulk / workflow / privacy + +If you’ve sold into small businesses or marketers: +what kind of promise gets attention faster, insight or control? +``` + +### 2026-04-09 Thursday, 14:30 + +- Subreddit: `r/smallbusiness` +- Post #10 +- Use replies: `3`, `4`, `6`, `13`, `15` + +```text +What looks like a tiny print detail can quietly waste a lot of money + +I keep coming back to this: + +A broken link on a website is annoying. +A broken link on printed material is expensive. + +Because now the problem is sitting in: +- stores +- restaurants +- posters +- packaging +- tables +- flyers already handed out + +Feels like one of those things that sounds tiny until you count the friction and replacement cost. + +What’s a “small detail” in your business that causes way more downstream cost than people assume? +``` + diff --git a/marketing/reddit-4-week-calendar-universal.ics b/marketing/reddit-4-week-calendar-universal.ics index 694d37a..8ef4a3f 100644 --- a/marketing/reddit-4-week-calendar-universal.ics +++ b/marketing/reddit-4-week-calendar-universal.ics @@ -1,168 +1,168 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//QR Master//Reddit 4 Week Calendar Universal//EN -CALSCALE:GREGORIAN -METHOD:PUBLISH -X-WR-CALNAME:QR Master Reddit Plan -X-WR-TIMEZONE:Europe/Berlin -BEGIN:VEVENT -UID:reddit-20260316-comments-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260316T133000Z -DTEND:20260316T141500Z -SUMMARY:Reddit comment block - r/startups + r/SaaS -DESCRIPTION:Warm up account and build relevant karma. No links unless asked directly. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260317-startups-post-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260317T120000Z -DTEND:20260317T124500Z -SUMMARY:Reddit post - r/startups -DESCRIPTION:Post: One URL change can ruin 500 flyers. Link only if asked. Use https://www.qrmaster.net/reprint-calculator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260318-startups-replies-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260318T133000Z -DTEND:20260318T141500Z -SUMMARY:Reddit replies - r/startups -DESCRIPTION:Reply to all serious comments from Tuesday. Keep link-free unless asked directly. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260319-saas-post-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260319T120000Z -DTEND:20260319T124500Z -SUMMARY:Reddit post - r/SaaS -DESCRIPTION:Post: The real pain starts after print. Link only if asked. Use https://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260320-saas-comments-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260320T133000Z -DTEND:20260320T141500Z -SUMMARY:Reddit comment block - r/SaaS -DESCRIPTION:Extend the Thursday discussion. Tracking link if needed: https://www.qrmaster.net/qr-code-tracking -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260323-smallbiz-sideproject-comments-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260323T133000Z -DTEND:20260323T141500Z -SUMMARY:Reddit comment block - r/smallbusiness + r/SideProject -DESCRIPTION:Warm both subs before posting this week. No links unless asked directly. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260324-smallbusiness-post-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260324T123000Z -DTEND:20260324T131500Z -SUMMARY:Reddit post - r/smallbusiness -DESCRIPTION:Post: Most small businesses do not need more tools. Default link if asked: https://www.qrmaster.net/reprint-calculator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260325-smallbusiness-replies-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260325T133000Z -DTEND:20260325T141500Z -SUMMARY:Reddit replies - r/smallbusiness -DESCRIPTION:Answer practical questions from Tuesday. Drop links only when the use case is obvious. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260326-sideproject-post-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260326T120000Z -DTEND:20260326T124500Z -SUMMARY:Reddit post - r/SideProject -DESCRIPTION:Post: The technical problem is not the interesting one. Core link: https://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260327-sideproject-comments-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260327T133000Z -DTEND:20260327T141500Z -SUMMARY:Reddit comment block - r/SideProject -DESCRIPTION:Follow up on Thursday. Bulk link if needed: https://www.qrmaster.net/bulk-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260330-feedback-roast-comments-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260330T133000Z -DTEND:20260330T141500Z -SUMMARY:Reddit comment block - feedback week warm-up -DESCRIPTION:Warm up r/AlphaandBetaTesters and r/RoastMyStartup. No links today. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260331-alpha-beta-post-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260331T120000Z -DTEND:20260331T124500Z -SUMMARY:Reddit post - r/AlphaandBetaTesters -DESCRIPTION:Feedback request. Put the link in the first comment. Use https://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260401-alpha-beta-replies-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260401T133000Z -DTEND:20260401T141500Z -SUMMARY:Reddit replies - r/AlphaandBetaTesters -DESCRIPTION:Answer all serious feedback. Privacy proof only if asked: https://www.qrmaster.net/privacy -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260402-roast-post-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260402T120000Z -DTEND:20260402T124500Z -SUMMARY:Reddit post - r/RoastMyStartup -DESCRIPTION:Roast my positioning. Direct site link is okay here: https://www.qrmaster.net/ -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260403-objection-review-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260403T133000Z -DTEND:20260403T141500Z -SUMMARY:Reddit objection review -DESCRIPTION:Summarize week 3 objections: pricing, niche, privacy, free generator comparison, ICP clarity. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260406-saas-comments-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260406T133000Z -DTEND:20260406T141500Z -SUMMARY:Reddit comment block - r/SaaS -DESCRIPTION:Re-enter with objection-informed comments before the next post. No links unless asked. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260407-saas-post-2-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260407T120000Z -DTEND:20260407T124500Z -SUMMARY:Reddit post - r/SaaS follow-up -DESCRIPTION:Post: edit later vs track scans. Default link if asked: https://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260408-saas-replies-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260408T133000Z -DTEND:20260408T141500Z -SUMMARY:Reddit replies - r/SaaS -DESCRIPTION:Work the Tuesday thread hard for comments, not just upvotes. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260409-promo-post-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260409T123000Z -DTEND:20260409T131500Z -SUMMARY:Reddit promo post -DESCRIPTION:Post in r/Plugyourproduct or r/startups_promotion. Direct link okay: https://www.qrmaster.net/ -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260410-followup-universal@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260410T133000Z -DTEND:20260410T141500Z -SUMMARY:Reddit follow-up block -DESCRIPTION:Answer all promo-thread comments publicly. No DMs, no pressure. -END:VEVENT -END:VCALENDAR +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//QR Master//Reddit 4 Week Calendar Universal//EN +CALSCALE:GREGORIAN +METHOD:PUBLISH +X-WR-CALNAME:QR Master Reddit Plan +X-WR-TIMEZONE:Europe/Berlin +BEGIN:VEVENT +UID:reddit-20260316-comments-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260316T133000Z +DTEND:20260316T141500Z +SUMMARY:Reddit comment block - r/startups + r/SaaS +DESCRIPTION:Warm up account and build relevant karma. No links unless asked directly. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260317-startups-post-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260317T120000Z +DTEND:20260317T124500Z +SUMMARY:Reddit post - r/startups +DESCRIPTION:Post: One URL change can ruin 500 flyers. Link only if asked. Use https://www.qrmaster.net/reprint-calculator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260318-startups-replies-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260318T133000Z +DTEND:20260318T141500Z +SUMMARY:Reddit replies - r/startups +DESCRIPTION:Reply to all serious comments from Tuesday. Keep link-free unless asked directly. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260319-saas-post-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260319T120000Z +DTEND:20260319T124500Z +SUMMARY:Reddit post - r/SaaS +DESCRIPTION:Post: The real pain starts after print. Link only if asked. Use https://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260320-saas-comments-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260320T133000Z +DTEND:20260320T141500Z +SUMMARY:Reddit comment block - r/SaaS +DESCRIPTION:Extend the Thursday discussion. Tracking link if needed: https://www.qrmaster.net/qr-code-tracking +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260323-smallbiz-sideproject-comments-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260323T133000Z +DTEND:20260323T141500Z +SUMMARY:Reddit comment block - r/smallbusiness + r/SideProject +DESCRIPTION:Warm both subs before posting this week. No links unless asked directly. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260324-smallbusiness-post-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260324T123000Z +DTEND:20260324T131500Z +SUMMARY:Reddit post - r/smallbusiness +DESCRIPTION:Post: Most small businesses do not need more tools. Default link if asked: https://www.qrmaster.net/reprint-calculator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260325-smallbusiness-replies-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260325T133000Z +DTEND:20260325T141500Z +SUMMARY:Reddit replies - r/smallbusiness +DESCRIPTION:Answer practical questions from Tuesday. Drop links only when the use case is obvious. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260326-sideproject-post-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260326T120000Z +DTEND:20260326T124500Z +SUMMARY:Reddit post - r/SideProject +DESCRIPTION:Post: The technical problem is not the interesting one. Core link: https://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260327-sideproject-comments-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260327T133000Z +DTEND:20260327T141500Z +SUMMARY:Reddit comment block - r/SideProject +DESCRIPTION:Follow up on Thursday. Bulk link if needed: https://www.qrmaster.net/bulk-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260330-feedback-roast-comments-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260330T133000Z +DTEND:20260330T141500Z +SUMMARY:Reddit comment block - feedback week warm-up +DESCRIPTION:Warm up r/AlphaandBetaTesters and r/RoastMyStartup. No links today. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260331-alpha-beta-post-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260331T120000Z +DTEND:20260331T124500Z +SUMMARY:Reddit post - r/AlphaandBetaTesters +DESCRIPTION:Feedback request. Put the link in the first comment. Use https://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260401-alpha-beta-replies-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260401T133000Z +DTEND:20260401T141500Z +SUMMARY:Reddit replies - r/AlphaandBetaTesters +DESCRIPTION:Answer all serious feedback. Privacy proof only if asked: https://www.qrmaster.net/privacy +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260402-roast-post-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260402T120000Z +DTEND:20260402T124500Z +SUMMARY:Reddit post - r/RoastMyStartup +DESCRIPTION:Roast my positioning. Direct site link is okay here: https://www.qrmaster.net/ +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260403-objection-review-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260403T133000Z +DTEND:20260403T141500Z +SUMMARY:Reddit objection review +DESCRIPTION:Summarize week 3 objections: pricing, niche, privacy, free generator comparison, ICP clarity. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260406-saas-comments-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260406T133000Z +DTEND:20260406T141500Z +SUMMARY:Reddit comment block - r/SaaS +DESCRIPTION:Re-enter with objection-informed comments before the next post. No links unless asked. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260407-saas-post-2-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260407T120000Z +DTEND:20260407T124500Z +SUMMARY:Reddit post - r/SaaS follow-up +DESCRIPTION:Post: edit later vs track scans. Default link if asked: https://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260408-saas-replies-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260408T133000Z +DTEND:20260408T141500Z +SUMMARY:Reddit replies - r/SaaS +DESCRIPTION:Work the Tuesday thread hard for comments, not just upvotes. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260409-promo-post-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260409T123000Z +DTEND:20260409T131500Z +SUMMARY:Reddit promo post +DESCRIPTION:Post in r/Plugyourproduct or r/startups_promotion. Direct link okay: https://www.qrmaster.net/ +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260410-followup-universal@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260410T133000Z +DTEND:20260410T141500Z +SUMMARY:Reddit follow-up block +DESCRIPTION:Answer all promo-thread comments publicly. No DMs, no pressure. +END:VEVENT +END:VCALENDAR diff --git a/marketing/reddit-4-week-calendar.ics b/marketing/reddit-4-week-calendar.ics index 9244af6..df49780 100644 --- a/marketing/reddit-4-week-calendar.ics +++ b/marketing/reddit-4-week-calendar.ics @@ -1,166 +1,166 @@ -BEGIN:VCALENDAR -VERSION:2.0 -PRODID:-//QR Master//Reddit 4 Week Calendar//EN -CALSCALE:GREGORIAN -METHOD:PUBLISH -BEGIN:VEVENT -UID:reddit-20260316-comments@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260316T143000 -DTEND:20260316T151500 -SUMMARY:Reddit comment block - r/startups + r/SaaS -DESCRIPTION:Goal: warm up account and build relevant karma. No links unless asked directly. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260317-startups-post@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260317T130000 -DTEND:20260317T134500 -SUMMARY:Reddit post - r/startups -DESCRIPTION:Title: One URL change can ruin 500 flyers. Link only if asked. Use https://www.qrmaster.net/reprint-calculator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260318-startups-replies@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260318T143000 -DTEND:20260318T151500 -SUMMARY:Reddit replies - r/startups -DESCRIPTION:Reply to all serious comments from Tuesday. Keep link-free unless asked directly. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260319-saas-post@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260319T130000 -DTEND:20260319T134500 -SUMMARY:Reddit post - r/SaaS -DESCRIPTION:Title: The real pain starts after print. Link only if asked. Use https://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260320-saas-comments@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260320T143000 -DTEND:20260320T151500 -SUMMARY:Reddit comment block - r/SaaS -DESCRIPTION:Extend the Thursday discussion. If asked about tracking, use https://www.qrmaster.net/qr-code-tracking -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260323-smallbiz-sideproject-comments@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260323T143000 -DTEND:20260323T151500 -SUMMARY:Reddit comment block - r/smallbusiness + r/SideProject -DESCRIPTION:Warm both subs before posting this week. No links unless asked directly. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260324-smallbusiness-post@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260324T133000 -DTEND:20260324T141500 -SUMMARY:Reddit post - r/smallbusiness -DESCRIPTION:Title: Most small businesses don't need more tools. Default link if asked: https://www.qrmaster.net/reprint-calculator Restaurant link: https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260325-smallbusiness-replies@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260325T143000 -DTEND:20260325T151500 -SUMMARY:Reddit replies - r/smallbusiness -DESCRIPTION:Answer practical questions from Tuesday. Drop links only when the use case is obvious. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260326-sideproject-post@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260326T130000 -DTEND:20260326T134500 -SUMMARY:Reddit post - r/SideProject -DESCRIPTION:Title: The technical problem isn't the interesting one. Core link if asked: https://www.qrmaster.net/dynamic-qr-code-generator Bulk link: https://www.qrmaster.net/bulk-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260327-sideproject-comments@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260327T143000 -DTEND:20260327T151500 -SUMMARY:Reddit comment block - r/SideProject -DESCRIPTION:Follow up on the Thursday thread. Use bulk link if people ask about scale or packaging. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260330-feedback-roast-comments@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260330T153000 -DTEND:20260330T161500 -SUMMARY:Reddit comment block - feedback week warm-up -DESCRIPTION:Warm up r/AlphaandBetaTesters and r/RoastMyStartup. No links today. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260331-alpha-beta-post@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260331T140000 -DTEND:20260331T144500 -SUMMARY:Reddit post - r/AlphaandBetaTesters -DESCRIPTION:Feedback request. Put the link in the first comment, not the post body. Use https://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260401-alpha-beta-replies@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260401T153000 -DTEND:20260401T161500 -SUMMARY:Reddit replies - r/AlphaandBetaTesters -DESCRIPTION:Answer all serious feedback. Privacy proof only if asked: https://www.qrmaster.net/privacy -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260402-roast-post@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260402T140000 -DTEND:20260402T144500 -SUMMARY:Reddit post - r/RoastMyStartup -DESCRIPTION:Roast my positioning. Direct site link is okay here: https://www.qrmaster.net/ -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260403-objection-review@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260403T153000 -DTEND:20260403T161500 -SUMMARY:Reddit objection review -DESCRIPTION:Summarize the week-3 objections: pricing, niche, privacy, free generator comparison, ICP clarity. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260406-saas-comments@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260406T153000 -DTEND:20260406T161500 -SUMMARY:Reddit comment block - r/SaaS -DESCRIPTION:Re-enter with objection-informed comments before the next post. No links unless asked. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260407-saas-post-2@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260407T140000 -DTEND:20260407T144500 -SUMMARY:Reddit post - r/SaaS follow-up -DESCRIPTION:Title: edit later vs track scans. Default link if asked: https://www.qrmaster.net/dynamic-qr-code-generator Measurement angle: https://www.qrmaster.net/qr-code-for-marketing-campaigns -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260408-saas-replies@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260408T153000 -DTEND:20260408T161500 -SUMMARY:Reddit replies - r/SaaS -DESCRIPTION:Work the Tuesday thread hard for comments, not just upvotes. -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260409-promo-post@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260409T143000 -DTEND:20260409T151500 -SUMMARY:Reddit promo post - r/Plugyourproduct or r/startups_promotion -DESCRIPTION:Direct link in post is okay. Use https://www.qrmaster.net/ Optional focused link: https://www.qrmaster.net/dynamic-qr-code-generator -END:VEVENT -BEGIN:VEVENT -UID:reddit-20260410-followup@qrmaster.net -DTSTAMP:20260312T120000Z -DTSTART:20260410T153000 -DTEND:20260410T161500 -SUMMARY:Reddit follow-up block -DESCRIPTION:Answer all promo-thread comments publicly. No DMs, no pressure, keep it in-thread. -END:VEVENT -END:VCALENDAR +BEGIN:VCALENDAR +VERSION:2.0 +PRODID:-//QR Master//Reddit 4 Week Calendar//EN +CALSCALE:GREGORIAN +METHOD:PUBLISH +BEGIN:VEVENT +UID:reddit-20260316-comments@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260316T143000 +DTEND:20260316T151500 +SUMMARY:Reddit comment block - r/startups + r/SaaS +DESCRIPTION:Goal: warm up account and build relevant karma. No links unless asked directly. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260317-startups-post@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260317T130000 +DTEND:20260317T134500 +SUMMARY:Reddit post - r/startups +DESCRIPTION:Title: One URL change can ruin 500 flyers. Link only if asked. Use https://www.qrmaster.net/reprint-calculator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260318-startups-replies@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260318T143000 +DTEND:20260318T151500 +SUMMARY:Reddit replies - r/startups +DESCRIPTION:Reply to all serious comments from Tuesday. Keep link-free unless asked directly. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260319-saas-post@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260319T130000 +DTEND:20260319T134500 +SUMMARY:Reddit post - r/SaaS +DESCRIPTION:Title: The real pain starts after print. Link only if asked. Use https://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260320-saas-comments@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260320T143000 +DTEND:20260320T151500 +SUMMARY:Reddit comment block - r/SaaS +DESCRIPTION:Extend the Thursday discussion. If asked about tracking, use https://www.qrmaster.net/qr-code-tracking +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260323-smallbiz-sideproject-comments@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260323T143000 +DTEND:20260323T151500 +SUMMARY:Reddit comment block - r/smallbusiness + r/SideProject +DESCRIPTION:Warm both subs before posting this week. No links unless asked directly. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260324-smallbusiness-post@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260324T133000 +DTEND:20260324T141500 +SUMMARY:Reddit post - r/smallbusiness +DESCRIPTION:Title: Most small businesses don't need more tools. Default link if asked: https://www.qrmaster.net/reprint-calculator Restaurant link: https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260325-smallbusiness-replies@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260325T143000 +DTEND:20260325T151500 +SUMMARY:Reddit replies - r/smallbusiness +DESCRIPTION:Answer practical questions from Tuesday. Drop links only when the use case is obvious. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260326-sideproject-post@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260326T130000 +DTEND:20260326T134500 +SUMMARY:Reddit post - r/SideProject +DESCRIPTION:Title: The technical problem isn't the interesting one. Core link if asked: https://www.qrmaster.net/dynamic-qr-code-generator Bulk link: https://www.qrmaster.net/bulk-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260327-sideproject-comments@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260327T143000 +DTEND:20260327T151500 +SUMMARY:Reddit comment block - r/SideProject +DESCRIPTION:Follow up on the Thursday thread. Use bulk link if people ask about scale or packaging. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260330-feedback-roast-comments@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260330T153000 +DTEND:20260330T161500 +SUMMARY:Reddit comment block - feedback week warm-up +DESCRIPTION:Warm up r/AlphaandBetaTesters and r/RoastMyStartup. No links today. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260331-alpha-beta-post@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260331T140000 +DTEND:20260331T144500 +SUMMARY:Reddit post - r/AlphaandBetaTesters +DESCRIPTION:Feedback request. Put the link in the first comment, not the post body. Use https://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260401-alpha-beta-replies@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260401T153000 +DTEND:20260401T161500 +SUMMARY:Reddit replies - r/AlphaandBetaTesters +DESCRIPTION:Answer all serious feedback. Privacy proof only if asked: https://www.qrmaster.net/privacy +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260402-roast-post@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260402T140000 +DTEND:20260402T144500 +SUMMARY:Reddit post - r/RoastMyStartup +DESCRIPTION:Roast my positioning. Direct site link is okay here: https://www.qrmaster.net/ +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260403-objection-review@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260403T153000 +DTEND:20260403T161500 +SUMMARY:Reddit objection review +DESCRIPTION:Summarize the week-3 objections: pricing, niche, privacy, free generator comparison, ICP clarity. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260406-saas-comments@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260406T153000 +DTEND:20260406T161500 +SUMMARY:Reddit comment block - r/SaaS +DESCRIPTION:Re-enter with objection-informed comments before the next post. No links unless asked. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260407-saas-post-2@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260407T140000 +DTEND:20260407T144500 +SUMMARY:Reddit post - r/SaaS follow-up +DESCRIPTION:Title: edit later vs track scans. Default link if asked: https://www.qrmaster.net/dynamic-qr-code-generator Measurement angle: https://www.qrmaster.net/qr-code-for-marketing-campaigns +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260408-saas-replies@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260408T153000 +DTEND:20260408T161500 +SUMMARY:Reddit replies - r/SaaS +DESCRIPTION:Work the Tuesday thread hard for comments, not just upvotes. +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260409-promo-post@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260409T143000 +DTEND:20260409T151500 +SUMMARY:Reddit promo post - r/Plugyourproduct or r/startups_promotion +DESCRIPTION:Direct link in post is okay. Use https://www.qrmaster.net/ Optional focused link: https://www.qrmaster.net/dynamic-qr-code-generator +END:VEVENT +BEGIN:VEVENT +UID:reddit-20260410-followup@qrmaster.net +DTSTAMP:20260312T120000Z +DTSTART:20260410T153000 +DTEND:20260410T161500 +SUMMARY:Reddit follow-up block +DESCRIPTION:Answer all promo-thread comments publicly. No DMs, no pressure, keep it in-thread. +END:VEVENT +END:VCALENDAR diff --git a/marketing/reddit-4-week-calendar.md b/marketing/reddit-4-week-calendar.md index def4dfd..8d60ef2 100644 --- a/marketing/reddit-4-week-calendar.md +++ b/marketing/reddit-4-week-calendar.md @@ -1,457 +1,457 @@ -# Reddit 4-Week Calendar for QR Master - -Times below are in Europe/Berlin local time. -Use clean URLs only. Do not add UTM parameters to public Reddit links. - -## Link Map - -- Reprint / cost angle: `https://www.qrmaster.net/reprint-calculator` -- Dynamic after print: `https://www.qrmaster.net/dynamic-qr-code-generator` -- Restaurant / menu angle: `https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes` -- Flyer / print attribution: `https://www.qrmaster.net/use-cases/flyer-qr-codes` -- Campaign measurement: `https://www.qrmaster.net/qr-code-for-marketing-campaigns` -- Tracking / analytics: `https://www.qrmaster.net/qr-code-tracking` -- Bulk / packaging: `https://www.qrmaster.net/bulk-qr-code-generator` -- Packaging use case: `https://www.qrmaster.net/use-cases/packaging-qr-codes` -- Privacy proof only: `https://www.qrmaster.net/privacy` -- Full site feedback / promo-only subs: `https://www.qrmaster.net/` - -## 2026-03-16 Monday, 14:30 - -- Type: Comment block -- Subreddits: `r/startups`, `r/SaaS` -- Goal: Warm up account and build relevant karma -- Rule: No links unless someone explicitly asks -- Comment prompt ideas: - - "The expensive part starts after print, not at QR generation." - - "A lot of SMB tools sound boring until one mistake turns printed material into waste." - - "I care less about the QR itself and more about what happens when the destination changes later." - -## 2026-03-17 Tuesday, 13:00 - -- Type: Main post -- Subreddit: `r/startups` -- Title: `One URL change can ruin 500 flyers. That pain is more real than I expected.` -- Body: - -```text -I underestimated how annoying printed mistakes are. - -A lot of software problems are reversible. -Print problems aren’t. - -If a landing page changes after flyers, posters, inserts, or menus are already out there, someone has to: -- live with a broken flow -- reprint everything -- or patch it manually in a messy way - -That sounds minor until you talk to people actually running campaigns or local businesses. - -What small operational problem ended up being much more expensive than it looked at first? -``` - -- Link if asked: `https://www.qrmaster.net/reprint-calculator` -- Possible replies: - -```text -Yeah, that’s the part I underestimated too. The QR itself is easy. The expensive part is when the destination changes after print. -``` - -```text -I built around exactly that issue, so obvious bias here: -https://www.qrmaster.net/reprint-calculator - -If links are annoying in this thread, I can just explain the workflow here. -``` - -```text -Static is fine if the URL is truly permanent. The pain starts when someone assumes “permanent” and the campaign changes two weeks later. -``` - -## 2026-03-18 Wednesday, 14:30 - -- Type: Reply block -- Subreddits: `r/startups` -- Goal: Reply to every serious comment from the Tuesday post -- Link rule: Only if asked directly -- Safe reply template: - -```text -That’s fair. I’m building in this space, so obvious bias if I share the product. Happy to keep it link-free and just explain the setup. -``` - -## 2026-03-19 Thursday, 13:00 - -- Type: Main post -- Subreddit: `r/SaaS` -- Title: `I thought QR code software was about generation. The real pain starts after print.` -- Body: - -```text -I used to think the value was “make a QR code fast.” - -It’s not. - -The painful part starts after something is already printed: -- the menu changes -- the event page changes -- the campaign URL changes -- someone notices a typo too late - -One small change can turn a stack of flyers into trash. - -That shifted how I think about the whole category. -The QR itself is easy. -The expensive part is everything around it. - -Anyone else building in a category where the “simple feature” isn’t actually where the value is? -``` - -- Link if asked: `https://www.qrmaster.net/dynamic-qr-code-generator` -- Possible replies: - -```text -That’s exactly how I see it now too. “Generate” sounds like the product, but “edit after print” is where the value starts. -``` - -```text -I built a tool for that exact use case, so obvious founder bias: -https://www.qrmaster.net/dynamic-qr-code-generator -``` - -```text -I thought analytics would be the hook. In practice, “don’t make me reprint stuff” lands faster. -``` - -## 2026-03-20 Friday, 14:30 - -- Type: Comment block -- Subreddits: `r/SaaS` -- Goal: Extend the Thursday discussion without posting a new link -- If someone asks about tracking: `https://www.qrmaster.net/qr-code-tracking` -- Safe tracking reply: - -```text -If the goal is proof instead of guesswork, tracking matters. I’m building in that space too, so obvious bias: -https://www.qrmaster.net/qr-code-tracking -``` - -## 2026-03-23 Monday, 14:30 - -- Type: Comment block -- Subreddits: `r/smallbusiness`, `r/SideProject` -- Goal: Warm both subs before posting this week -- Rule: No link unless asked directly - -## 2026-03-24 Tuesday, 13:30 - -- Type: Main post -- Subreddit: `r/smallbusiness` -- Title: `Most small businesses don’t need more tools. They need fewer preventable mistakes.` -- Body: - -```text -I keep seeing the same pattern: - -Owners usually don’t want “more software.” -They want fewer headaches. - -With QR codes, the common headaches seem to be: -- printing a code that can’t be updated later -- linking to a bad mobile page -- not knowing if anyone scanned it -- having to redo materials because one URL changed - -That feels less like a marketing problem and more like an operations problem. - -What low-effort process change saved you time or money recently? -``` - -- Default link if asked: `https://www.qrmaster.net/reprint-calculator` -- Restaurant/menu link if relevant: `https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes` -- Possible replies: - -```text -That’s basically how I think about it now too. Most owners don’t want a “QR platform.” They want to avoid paying twice for the same print run. -``` - -```text -If the menu changes regularly, I wouldn’t print a static QR. I built around exactly that use case, so bias disclosed: -https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes -``` - -```text -For a more general cost angle, this is the cleanest page to share: -https://www.qrmaster.net/reprint-calculator -``` - -## 2026-03-25 Wednesday, 14:30 - -- Type: Reply block -- Subreddits: `r/smallbusiness` -- Goal: Answer every practical question from the Tuesday post -- Rule: Only drop a link when the use case is obvious - -## 2026-03-26 Thursday, 13:00 - -- Type: Main post -- Subreddit: `r/SideProject` -- Title: `The weird part about building a QR product is that the technical problem isn’t the interesting one` -- Body: - -```text -Generating a QR image is trivial. - -What turned out to be more interesting: -- what happens after print -- whether someone can change the destination later -- what analytics are actually useful -- how privacy concerns show up once tracking enters the conversation -- how bulk workflows matter way more than expected - -It’s one of those products that looks dumb-simple from the outside and much more operational once you talk to users. - -What kind of side project looked simple until real use cases started showing up? -``` - -- Link if asked: `https://www.qrmaster.net/dynamic-qr-code-generator` -- Bulk link if someone asks about scale: `https://www.qrmaster.net/bulk-qr-code-generator` -- Possible replies: - -```text -Exactly. The QR itself is not the product. The post-print control is. -``` - -```text -I built around that exact issue, so obvious bias: -https://www.qrmaster.net/dynamic-qr-code-generator -``` - -```text -If the interesting part for you is scale, the bulk side is here: -https://www.qrmaster.net/bulk-qr-code-generator -``` - -## 2026-03-27 Friday, 14:30 - -- Type: Comment block -- Subreddits: `r/SideProject` -- Goal: Follow up on the Thursday thread and answer bulk/packaging questions -- Primary link if relevant: `https://www.qrmaster.net/bulk-qr-code-generator` - -## 2026-03-30 Monday, 15:30 - -- Type: Comment block -- Subreddits: `r/AlphaandBetaTesters`, `r/RoastMyStartup` -- Goal: Warm up both communities before feedback posts -- Rule: No links today - -## 2026-03-31 Tuesday, 14:00 - -- Type: Feedback post -- Subreddit: `r/AlphaandBetaTesters` -- Title: `Looking for feedback from anyone who has used QR codes in restaurants, events, print, or packaging` -- Body: - -```text -I’m trying to learn from people who use QR codes in the real world, not just in theory. - -Especially if you’ve used them for: -- menus -- flyers -- product packaging -- event materials -- WiFi / contact sharing -- agency campaigns - -Things I’m curious about: -- what changes most often after something is printed? -- what’s annoying about current tools? -- do you actually care about scan analytics? -- does privacy / GDPR affect vendor choice at all? - -I’m happy to share what I’m building if useful, but mostly looking for honest feedback from people who’ve dealt with this firsthand. -``` - -- Link placement: first comment, not the post body -- First comment link: `https://www.qrmaster.net/dynamic-qr-code-generator` -- Possible replies: - -```text -This is the product I’m testing the messaging on, so obvious bias: -https://www.qrmaster.net/dynamic-qr-code-generator -``` - -```text -That’s useful. The thing I keep hearing too is that the problem starts once something is already printed. -``` - -```text -If the privacy side is the bigger concern, I can share how I’m handling that specifically instead of pitching the product. -``` - -## 2026-04-01 Wednesday, 15:30 - -- Type: Reply block -- Subreddits: `r/AlphaandBetaTesters` -- Goal: Answer all serious feedback and record objections -- Privacy proof link only if asked: `https://www.qrmaster.net/privacy` - -## 2026-04-02 Thursday, 14:00 - -- Type: Roast post -- Subreddit: `r/RoastMyStartup` -- Title: `Roast my positioning: is “avoid reprints and broken QR campaigns” a strong enough problem?` -- Body: - -```text -I’m working on a product around dynamic QR codes. - -The positioning I’m testing is less “make QR codes” and more: -“avoid reprints, outdated links, and messy campaign management.” - -Target users are mostly: -- small businesses -- restaurants -- marketers -- agencies -- event / packaging use cases - -The questions I’d love roasted: -- does the pain feel real enough? -- does this sound too niche? -- what part sounds generic or weak? -- what would make you ignore this instantly? - -Happy to share the product if the sub is okay with it. -``` - -- Link placement: direct link in post is okay -- Link: `https://www.qrmaster.net/` -- Possible replies: - -```text -Fair. The goal here is honestly sharper criticism, not a soft launch. -``` - -```text -That’s a good callout. If the pain still sounds too “small,” then the messaging isn’t strong enough yet. -``` - -```text -Yep, that’s the site: -https://www.qrmaster.net/ -``` - -## 2026-04-03 Friday, 15:30 - -- Type: Objection review -- Goal: Summarize the week-3 feedback into 3 to 5 objections -- Typical objection buckets: - - "why pay for QR codes?" - - "sounds niche" - - "privacy / GDPR?" - - "what’s different from free generators?" - - "who is this really for?" - -## 2026-04-06 Monday, 15:30 - -- Type: Comment block -- Subreddits: `r/SaaS` -- Goal: Re-enter with objection-informed comments before the next post -- Rule: No links unless asked - -## 2026-04-07 Tuesday, 14:00 - -- Type: Main post -- Subreddit: `r/SaaS` -- Title: `I’m starting to think “edit later” is a stronger product promise than “track scans”` -- Body: - -```text -Interesting thing from early positioning: - -I assumed analytics would be the hero feature. -But “I can change the destination later” seems to click faster. - -Makes sense in hindsight. -Tracking is nice. -Avoiding expensive mistakes is urgent. - -So now I’m wondering if the better message is: -- first promise control -- then introduce analytics -- then layer in bulk / workflow / privacy - -If you’ve sold into small businesses or marketers: -what kind of promise gets attention faster, insight or control? -``` - -- Default link if asked: `https://www.qrmaster.net/dynamic-qr-code-generator` -- If the thread becomes measurement-heavy: `https://www.qrmaster.net/qr-code-for-marketing-campaigns` -- Possible replies: - -```text -That’s exactly the split I’m seeing too. “Insight” sounds nice, “control” feels urgent. -``` - -```text -I built around that exact use case, so obvious bias: -https://www.qrmaster.net/dynamic-qr-code-generator -``` - -```text -If the attribution side is the interesting part for you, this is the more relevant page: -https://www.qrmaster.net/qr-code-for-marketing-campaigns -``` - -## 2026-04-08 Wednesday, 15:30 - -- Type: Reply block -- Subreddits: `r/SaaS` -- Goal: Work the Tuesday thread hard for comments, not just upvotes - -## 2026-04-09 Thursday, 14:30 - -- Type: Promo post -- Subreddit: `r/Plugyourproduct` or `r/startups_promotion` -- Title: `QR Master: editable QR codes for print campaigns, menus, packaging, and analytics` -- Body: - -```text -Built QR Master to solve a simple but expensive problem: -people print QR codes, then the destination changes later. - -What it does: -- editable QR destinations after print -- scan tracking -- bulk workflows -- campaign-friendly use cases for menus, flyers, events, and packaging - -Looking for honest feedback on the value prop and landing page clarity. -``` - -- Link placement: direct link in post -- Link: `https://www.qrmaster.net/` -- Possible replies: - -```text -Appreciate it. The core promise is really “don’t reprint just because the URL changed.” -``` - -```text -If you want the most direct core page instead of the homepage, this is it: -https://www.qrmaster.net/dynamic-qr-code-generator -``` - -```text -If you’re more interested in measurement than editability, this page is the better entry point: -https://www.qrmaster.net/qr-code-tracking -``` - -## 2026-04-10 Friday, 15:30 - -- Type: Follow-up block -- Goal: Answer all promo-thread comments publicly and close the 4-week run -- Rule: No DMs, no pressure, keep every answer in-thread - +# Reddit 4-Week Calendar for QR Master + +Times below are in Europe/Berlin local time. +Use clean URLs only. Do not add UTM parameters to public Reddit links. + +## Link Map + +- Reprint / cost angle: `https://www.qrmaster.net/reprint-calculator` +- Dynamic after print: `https://www.qrmaster.net/dynamic-qr-code-generator` +- Restaurant / menu angle: `https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes` +- Flyer / print attribution: `https://www.qrmaster.net/use-cases/flyer-qr-codes` +- Campaign measurement: `https://www.qrmaster.net/qr-code-for-marketing-campaigns` +- Tracking / analytics: `https://www.qrmaster.net/qr-code-tracking` +- Bulk / packaging: `https://www.qrmaster.net/bulk-qr-code-generator` +- Packaging use case: `https://www.qrmaster.net/use-cases/packaging-qr-codes` +- Privacy proof only: `https://www.qrmaster.net/privacy` +- Full site feedback / promo-only subs: `https://www.qrmaster.net/` + +## 2026-03-16 Monday, 14:30 + +- Type: Comment block +- Subreddits: `r/startups`, `r/SaaS` +- Goal: Warm up account and build relevant karma +- Rule: No links unless someone explicitly asks +- Comment prompt ideas: + - "The expensive part starts after print, not at QR generation." + - "A lot of SMB tools sound boring until one mistake turns printed material into waste." + - "I care less about the QR itself and more about what happens when the destination changes later." + +## 2026-03-17 Tuesday, 13:00 + +- Type: Main post +- Subreddit: `r/startups` +- Title: `One URL change can ruin 500 flyers. That pain is more real than I expected.` +- Body: + +```text +I underestimated how annoying printed mistakes are. + +A lot of software problems are reversible. +Print problems aren’t. + +If a landing page changes after flyers, posters, inserts, or menus are already out there, someone has to: +- live with a broken flow +- reprint everything +- or patch it manually in a messy way + +That sounds minor until you talk to people actually running campaigns or local businesses. + +What small operational problem ended up being much more expensive than it looked at first? +``` + +- Link if asked: `https://www.qrmaster.net/reprint-calculator` +- Possible replies: + +```text +Yeah, that’s the part I underestimated too. The QR itself is easy. The expensive part is when the destination changes after print. +``` + +```text +I built around exactly that issue, so obvious bias here: +https://www.qrmaster.net/reprint-calculator + +If links are annoying in this thread, I can just explain the workflow here. +``` + +```text +Static is fine if the URL is truly permanent. The pain starts when someone assumes “permanent” and the campaign changes two weeks later. +``` + +## 2026-03-18 Wednesday, 14:30 + +- Type: Reply block +- Subreddits: `r/startups` +- Goal: Reply to every serious comment from the Tuesday post +- Link rule: Only if asked directly +- Safe reply template: + +```text +That’s fair. I’m building in this space, so obvious bias if I share the product. Happy to keep it link-free and just explain the setup. +``` + +## 2026-03-19 Thursday, 13:00 + +- Type: Main post +- Subreddit: `r/SaaS` +- Title: `I thought QR code software was about generation. The real pain starts after print.` +- Body: + +```text +I used to think the value was “make a QR code fast.” + +It’s not. + +The painful part starts after something is already printed: +- the menu changes +- the event page changes +- the campaign URL changes +- someone notices a typo too late + +One small change can turn a stack of flyers into trash. + +That shifted how I think about the whole category. +The QR itself is easy. +The expensive part is everything around it. + +Anyone else building in a category where the “simple feature” isn’t actually where the value is? +``` + +- Link if asked: `https://www.qrmaster.net/dynamic-qr-code-generator` +- Possible replies: + +```text +That’s exactly how I see it now too. “Generate” sounds like the product, but “edit after print” is where the value starts. +``` + +```text +I built a tool for that exact use case, so obvious founder bias: +https://www.qrmaster.net/dynamic-qr-code-generator +``` + +```text +I thought analytics would be the hook. In practice, “don’t make me reprint stuff” lands faster. +``` + +## 2026-03-20 Friday, 14:30 + +- Type: Comment block +- Subreddits: `r/SaaS` +- Goal: Extend the Thursday discussion without posting a new link +- If someone asks about tracking: `https://www.qrmaster.net/qr-code-tracking` +- Safe tracking reply: + +```text +If the goal is proof instead of guesswork, tracking matters. I’m building in that space too, so obvious bias: +https://www.qrmaster.net/qr-code-tracking +``` + +## 2026-03-23 Monday, 14:30 + +- Type: Comment block +- Subreddits: `r/smallbusiness`, `r/SideProject` +- Goal: Warm both subs before posting this week +- Rule: No link unless asked directly + +## 2026-03-24 Tuesday, 13:30 + +- Type: Main post +- Subreddit: `r/smallbusiness` +- Title: `Most small businesses don’t need more tools. They need fewer preventable mistakes.` +- Body: + +```text +I keep seeing the same pattern: + +Owners usually don’t want “more software.” +They want fewer headaches. + +With QR codes, the common headaches seem to be: +- printing a code that can’t be updated later +- linking to a bad mobile page +- not knowing if anyone scanned it +- having to redo materials because one URL changed + +That feels less like a marketing problem and more like an operations problem. + +What low-effort process change saved you time or money recently? +``` + +- Default link if asked: `https://www.qrmaster.net/reprint-calculator` +- Restaurant/menu link if relevant: `https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes` +- Possible replies: + +```text +That’s basically how I think about it now too. Most owners don’t want a “QR platform.” They want to avoid paying twice for the same print run. +``` + +```text +If the menu changes regularly, I wouldn’t print a static QR. I built around exactly that use case, so bias disclosed: +https://www.qrmaster.net/use-cases/restaurant-menu-qr-codes +``` + +```text +For a more general cost angle, this is the cleanest page to share: +https://www.qrmaster.net/reprint-calculator +``` + +## 2026-03-25 Wednesday, 14:30 + +- Type: Reply block +- Subreddits: `r/smallbusiness` +- Goal: Answer every practical question from the Tuesday post +- Rule: Only drop a link when the use case is obvious + +## 2026-03-26 Thursday, 13:00 + +- Type: Main post +- Subreddit: `r/SideProject` +- Title: `The weird part about building a QR product is that the technical problem isn’t the interesting one` +- Body: + +```text +Generating a QR image is trivial. + +What turned out to be more interesting: +- what happens after print +- whether someone can change the destination later +- what analytics are actually useful +- how privacy concerns show up once tracking enters the conversation +- how bulk workflows matter way more than expected + +It’s one of those products that looks dumb-simple from the outside and much more operational once you talk to users. + +What kind of side project looked simple until real use cases started showing up? +``` + +- Link if asked: `https://www.qrmaster.net/dynamic-qr-code-generator` +- Bulk link if someone asks about scale: `https://www.qrmaster.net/bulk-qr-code-generator` +- Possible replies: + +```text +Exactly. The QR itself is not the product. The post-print control is. +``` + +```text +I built around that exact issue, so obvious bias: +https://www.qrmaster.net/dynamic-qr-code-generator +``` + +```text +If the interesting part for you is scale, the bulk side is here: +https://www.qrmaster.net/bulk-qr-code-generator +``` + +## 2026-03-27 Friday, 14:30 + +- Type: Comment block +- Subreddits: `r/SideProject` +- Goal: Follow up on the Thursday thread and answer bulk/packaging questions +- Primary link if relevant: `https://www.qrmaster.net/bulk-qr-code-generator` + +## 2026-03-30 Monday, 15:30 + +- Type: Comment block +- Subreddits: `r/AlphaandBetaTesters`, `r/RoastMyStartup` +- Goal: Warm up both communities before feedback posts +- Rule: No links today + +## 2026-03-31 Tuesday, 14:00 + +- Type: Feedback post +- Subreddit: `r/AlphaandBetaTesters` +- Title: `Looking for feedback from anyone who has used QR codes in restaurants, events, print, or packaging` +- Body: + +```text +I’m trying to learn from people who use QR codes in the real world, not just in theory. + +Especially if you’ve used them for: +- menus +- flyers +- product packaging +- event materials +- WiFi / contact sharing +- agency campaigns + +Things I’m curious about: +- what changes most often after something is printed? +- what’s annoying about current tools? +- do you actually care about scan analytics? +- does privacy / GDPR affect vendor choice at all? + +I’m happy to share what I’m building if useful, but mostly looking for honest feedback from people who’ve dealt with this firsthand. +``` + +- Link placement: first comment, not the post body +- First comment link: `https://www.qrmaster.net/dynamic-qr-code-generator` +- Possible replies: + +```text +This is the product I’m testing the messaging on, so obvious bias: +https://www.qrmaster.net/dynamic-qr-code-generator +``` + +```text +That’s useful. The thing I keep hearing too is that the problem starts once something is already printed. +``` + +```text +If the privacy side is the bigger concern, I can share how I’m handling that specifically instead of pitching the product. +``` + +## 2026-04-01 Wednesday, 15:30 + +- Type: Reply block +- Subreddits: `r/AlphaandBetaTesters` +- Goal: Answer all serious feedback and record objections +- Privacy proof link only if asked: `https://www.qrmaster.net/privacy` + +## 2026-04-02 Thursday, 14:00 + +- Type: Roast post +- Subreddit: `r/RoastMyStartup` +- Title: `Roast my positioning: is “avoid reprints and broken QR campaigns” a strong enough problem?` +- Body: + +```text +I’m working on a product around dynamic QR codes. + +The positioning I’m testing is less “make QR codes” and more: +“avoid reprints, outdated links, and messy campaign management.” + +Target users are mostly: +- small businesses +- restaurants +- marketers +- agencies +- event / packaging use cases + +The questions I’d love roasted: +- does the pain feel real enough? +- does this sound too niche? +- what part sounds generic or weak? +- what would make you ignore this instantly? + +Happy to share the product if the sub is okay with it. +``` + +- Link placement: direct link in post is okay +- Link: `https://www.qrmaster.net/` +- Possible replies: + +```text +Fair. The goal here is honestly sharper criticism, not a soft launch. +``` + +```text +That’s a good callout. If the pain still sounds too “small,” then the messaging isn’t strong enough yet. +``` + +```text +Yep, that’s the site: +https://www.qrmaster.net/ +``` + +## 2026-04-03 Friday, 15:30 + +- Type: Objection review +- Goal: Summarize the week-3 feedback into 3 to 5 objections +- Typical objection buckets: + - "why pay for QR codes?" + - "sounds niche" + - "privacy / GDPR?" + - "what’s different from free generators?" + - "who is this really for?" + +## 2026-04-06 Monday, 15:30 + +- Type: Comment block +- Subreddits: `r/SaaS` +- Goal: Re-enter with objection-informed comments before the next post +- Rule: No links unless asked + +## 2026-04-07 Tuesday, 14:00 + +- Type: Main post +- Subreddit: `r/SaaS` +- Title: `I’m starting to think “edit later” is a stronger product promise than “track scans”` +- Body: + +```text +Interesting thing from early positioning: + +I assumed analytics would be the hero feature. +But “I can change the destination later” seems to click faster. + +Makes sense in hindsight. +Tracking is nice. +Avoiding expensive mistakes is urgent. + +So now I’m wondering if the better message is: +- first promise control +- then introduce analytics +- then layer in bulk / workflow / privacy + +If you’ve sold into small businesses or marketers: +what kind of promise gets attention faster, insight or control? +``` + +- Default link if asked: `https://www.qrmaster.net/dynamic-qr-code-generator` +- If the thread becomes measurement-heavy: `https://www.qrmaster.net/qr-code-for-marketing-campaigns` +- Possible replies: + +```text +That’s exactly the split I’m seeing too. “Insight” sounds nice, “control” feels urgent. +``` + +```text +I built around that exact use case, so obvious bias: +https://www.qrmaster.net/dynamic-qr-code-generator +``` + +```text +If the attribution side is the interesting part for you, this is the more relevant page: +https://www.qrmaster.net/qr-code-for-marketing-campaigns +``` + +## 2026-04-08 Wednesday, 15:30 + +- Type: Reply block +- Subreddits: `r/SaaS` +- Goal: Work the Tuesday thread hard for comments, not just upvotes + +## 2026-04-09 Thursday, 14:30 + +- Type: Promo post +- Subreddit: `r/Plugyourproduct` or `r/startups_promotion` +- Title: `QR Master: editable QR codes for print campaigns, menus, packaging, and analytics` +- Body: + +```text +Built QR Master to solve a simple but expensive problem: +people print QR codes, then the destination changes later. + +What it does: +- editable QR destinations after print +- scan tracking +- bulk workflows +- campaign-friendly use cases for menus, flyers, events, and packaging + +Looking for honest feedback on the value prop and landing page clarity. +``` + +- Link placement: direct link in post +- Link: `https://www.qrmaster.net/` +- Possible replies: + +```text +Appreciate it. The core promise is really “don’t reprint just because the URL changed.” +``` + +```text +If you want the most direct core page instead of the homepage, this is it: +https://www.qrmaster.net/dynamic-qr-code-generator +``` + +```text +If you’re more interested in measurement than editability, this page is the better entry point: +https://www.qrmaster.net/qr-code-tracking +``` + +## 2026-04-10 Friday, 15:30 + +- Type: Follow-up block +- Goal: Answer all promo-thread comments publicly and close the 4-week run +- Rule: No DMs, no pressure, keep every answer in-thread + diff --git a/marketing/twitter-30-day-plan.md b/marketing/twitter-30-day-plan.md index 7e2cb05..b8e81a2 100644 --- a/marketing/twitter-30-day-plan.md +++ b/marketing/twitter-30-day-plan.md @@ -1,272 +1,272 @@ -# 30-Day X/Twitter Content Plan for QR Master - -Use this as a `30-day X/Twitter content plan` for a founder-led QR Master account. It is written in English and optimized for reach first, with product relevance built in. - -## Positioning for the Month - -`Dynamic QR codes for measurable offline marketing, without creepy tracking.` - -## Audience Focus - -Primary audience for Days 1-15: -`Restaurants / hospitality` - -Secondary audience for Days 16-30: -`Agencies / offline marketers / retail operators` - -## CTA Rule for the Whole Month - -- Most posts: `Reply with a keyword`, `follow for more`, or `DM me` -- Only light link usage -- Put direct product CTA mainly in replies, profile, and pinned post - -## 30-Day Plan - -### Day 1 - -**Post type:** Founder positioning post -**Hook:** `Most QR codes are dead the moment they get printed.` -**Angle:** Static QR codes create reprint costs and broken customer journeys. -**CTA:** `If you run offline marketing, follow this account. I'm breaking down how to fix it.` - -### Day 2 - -**Post type:** Short insight post -**Hook:** `A restaurant menu should not require a reprint every time one dish changes.` -**Angle:** Dynamic QR codes for menus and specials. -**CTA:** `Reply "menu" if you want me to post the exact setup.` - -### Day 3 - -**Post type:** Teardown -**Hook:** `3 mistakes I see on restaurant QR menus all the time:` -**Angle:** Bad placement, no fallback page, no analytics. -**CTA:** `Want me to roast your menu QR? Reply with a screenshot.` - -### Day 4 - -**Post type:** Thread -**Hook:** `How restaurants can update menus without reprinting tables, flyers, or window signs:` -**Angle:** 5-step workflow using one dynamic QR. -**CTA:** `I can turn this into a checklist if people want it.` - -### Day 5 - -**Post type:** Contrarian post -**Hook:** `Unpopular opinion: "free QR code generators" are expensive.` -**Angle:** Hidden cost is reprints, lost scans, no attribution. -**CTA:** `Agree or disagree?` - -### Day 6 - -**Post type:** Demo video -**Hook:** `Change the destination after print. That's the whole game.` -**Angle:** Quick screen recording showing edit-after-print. -**CTA:** `DM me "edit" and I'll send the workflow.` - -### Day 7 - -**Post type:** Founder story -**Hook:** `We started building QR Master because most QR tools felt like toys.` -**Angle:** Needed analytics, bulk creation, privacy-first tracking. -**CTA:** `What's one thing you hate about current QR tools?` - -### Day 8 - -**Post type:** Pain-to-fix post -**Hook:** `If your flyer has a QR code but no tracking, you're guessing.` -**Angle:** Offline campaigns need measurable scans. -**CTA:** `Reply "track" if you want a simple attribution template.` - -### Day 9 - -**Post type:** Restaurant-specific post -**Hook:** `Today's special changes. Your printed QR shouldn't.` -**Angle:** Daily menu operations. -**CTA:** `Restaurant owners: how often do you update menus?` - -### Day 10 - -**Post type:** Roast / audit -**Hook:** `This QR code placement is killing conversions.` -**Angle:** Explain why low-visibility placements fail. -**CTA:** `Send me your flyer/menu/poster and I'll break it down.` - -### Day 11 - -**Post type:** Thread -**Hook:** `5 QR code mistakes that make restaurant marketing look cheap:` -**Angle:** Visual clutter, dead links, bad landing pages, no tracking, wrong CTA. -**CTA:** `I'll post 5 fixes tomorrow if this gets traction.` - -### Day 12 - -**Post type:** Build in public -**Hook:** `One thing founders underestimate: people don't want "a QR code." They want a workflow.` -**Angle:** Product insight from building. -**CTA:** `What simple tool became critical in your business?` - -### Day 13 - -**Post type:** Short proof post -**Hook:** `One QR code. Multiple seasonal campaigns. Zero reprints.` -**Angle:** Reuse same printed asset with changing destination. -**CTA:** `This is one of the biggest underrated offline growth hacks.` - -### Day 14 - -**Post type:** Demo video -**Hook:** `From printed table card to measurable scan funnel in under 30 seconds:` -**Angle:** Show QR creation + analytics preview. -**CTA:** `If you want more product breakdowns, follow.` - -### Day 15 - -**Post type:** Summary / recap -**Hook:** `The biggest restaurant QR lesson so far:` -**Angle:** Most businesses don't need more print, they need more flexibility. -**CTA:** `Next week I'm switching to agencies and offline marketers.` - -### Day 16 - -**Post type:** Agency-focused post -**Hook:** `If your agency runs flyer or poster campaigns without QR attribution, you're underreporting impact.` -**Angle:** Agencies need scan data to prove ROI. -**CTA:** `Reply "agency" if you want my offline attribution framework.` - -### Day 17 - -**Post type:** Contrarian post -**Hook:** `The problem is not the QR code. The problem is the dead destination behind it.` -**Angle:** Static link is the failure point. -**CTA:** `This is where most campaigns quietly lose money.` - -### Day 18 - -**Post type:** Thread -**Hook:** `How to make offline campaigns actually measurable:` -**Angle:** QR + UTM + landing page + analytics naming structure. -**CTA:** `I can turn this into a swipe file.` - -### Day 19 - -**Post type:** Audit post -**Hook:** `3 reasons most poster QR campaigns don't convert:` -**Angle:** Weak CTA, poor mobile page, no tracking structure. -**CTA:** `Want a poster teardown series?` - -### Day 20 - -**Post type:** Demo video -**Hook:** `Bulk-create hundreds of QR codes from a spreadsheet.` -**Angle:** Show CSV/Excel workflow for agencies or retail. -**CTA:** `DM me "bulk" if that would save your team time.` - -### Day 21 - -**Post type:** Founder hot take -**Hook:** `"Just put a QR code on it" is bad marketing advice.` -**Angle:** QR is distribution, not strategy. -**CTA:** `What matters more: placement, offer, or landing page?` - -### Day 22 - -**Post type:** Mini case format -**Hook:** `Campaign idea: one printed asset, three different destinations over 30 days.` -**Angle:** Explain how one QR can support multiple campaign phases. -**CTA:** `This is why dynamic matters more than design.` - -### Day 23 - -**Post type:** Thread -**Hook:** `How I'd structure QR tracking for an agency campaign with flyers, packaging, and in-store signage:` -**Angle:** Naming conventions, attribution logic, reporting. -**CTA:** `If useful, I'll post the naming template.` - -### Day 24 - -**Post type:** Privacy wedge post -**Hook:** `You can measure scans without turning people into surveillance data.` -**Angle:** Privacy-first analytics as a business advantage. -**CTA:** `Too many teams think analytics has to mean creepy.` - -### Day 25 - -**Post type:** Teardown -**Hook:** `This flyer has a QR code. But it still won't tell you what worked.` -**Angle:** Missing attribution structure. -**CTA:** `Reply with "audit" and I'll post a fixed version.` - -### Day 26 - -**Post type:** Retail / packaging post -**Hook:** `Packaging QR codes get interesting when you can change the destination later.` -**Angle:** Product updates, campaigns, support pages, seasonal promos. -**CTA:** `Retail operators: are you using QR for support, promo, or repeat purchase?` - -### Day 27 - -**Post type:** Build in public -**Hook:** `One thing we keep seeing: people buy QR tools for "generation" and stay for "management."` -**Angle:** Product-market insight. -**CTA:** `That distinction matters more than most founders think.` - -### Day 28 - -**Post type:** Demo video -**Hook:** `Here's what "measurable offline workflow" actually looks like in practice:` -**Angle:** Create, edit, track, compare placements. -**CTA:** `If this kind of content is useful, I'll make it a weekly series.` - -### Day 29 - -**Post type:** Hero thread -**Hook:** `Most offline marketing teams don't have a traffic problem. They have a measurement problem.` -**Angle:** Big thesis thread connecting restaurants, agencies, retail, and dynamic QR logic. -**CTA:** `If you work in offline marketing, this is the framework.` - -### Day 30 - -**Post type:** Month-end recap + soft CTA -**Hook:** `30 days of talking to people about QR workflows taught me this:` -**Angle:** Summarize 5 strongest lessons from the month. -**CTA:** `If you want, next I'll publish the full playbook: hooks, setup, and attribution templates.` - -## Weekly Cadence - -- `Mon`: strong opinion or positioning -- `Tue`: practical educational post -- `Wed`: teardown or audit -- `Thu`: thread -- `Fri`: product proof or demo -- `Sat`: founder insight / build in public -- `Sun`: recap or lighter conversation post - -## Content Mix - -- `8 threads` -- `6 teardown/audit posts` -- `5 demo videos` -- `6 short contrarian/value posts` -- `5 founder/build-in-public posts` - -## Reply Strategy - -Every day, add: - -- `10-15 replies` to founders, marketers, restaurant-tech, local business, retail ops, and agency accounts -- Focus on posts about: offline marketing, menus, customer journeys, attribution, retail campaigns, print, local growth -- Use replies to seed your core themes: - - reprint cost - - edit after print - - measurable offline - - privacy-first analytics - - bulk workflows - -## Optional Next Step - -If needed, this can be expanded into: - -1. fully written tweets for all 30 days -2. 8 full threads written out -3. a Notion-style content calendar with posting times and CTAs +# 30-Day X/Twitter Content Plan for QR Master + +Use this as a `30-day X/Twitter content plan` for a founder-led QR Master account. It is written in English and optimized for reach first, with product relevance built in. + +## Positioning for the Month + +`Dynamic QR codes for measurable offline marketing, without creepy tracking.` + +## Audience Focus + +Primary audience for Days 1-15: +`Restaurants / hospitality` + +Secondary audience for Days 16-30: +`Agencies / offline marketers / retail operators` + +## CTA Rule for the Whole Month + +- Most posts: `Reply with a keyword`, `follow for more`, or `DM me` +- Only light link usage +- Put direct product CTA mainly in replies, profile, and pinned post + +## 30-Day Plan + +### Day 1 + +**Post type:** Founder positioning post +**Hook:** `Most QR codes are dead the moment they get printed.` +**Angle:** Static QR codes create reprint costs and broken customer journeys. +**CTA:** `If you run offline marketing, follow this account. I'm breaking down how to fix it.` + +### Day 2 + +**Post type:** Short insight post +**Hook:** `A restaurant menu should not require a reprint every time one dish changes.` +**Angle:** Dynamic QR codes for menus and specials. +**CTA:** `Reply "menu" if you want me to post the exact setup.` + +### Day 3 + +**Post type:** Teardown +**Hook:** `3 mistakes I see on restaurant QR menus all the time:` +**Angle:** Bad placement, no fallback page, no analytics. +**CTA:** `Want me to roast your menu QR? Reply with a screenshot.` + +### Day 4 + +**Post type:** Thread +**Hook:** `How restaurants can update menus without reprinting tables, flyers, or window signs:` +**Angle:** 5-step workflow using one dynamic QR. +**CTA:** `I can turn this into a checklist if people want it.` + +### Day 5 + +**Post type:** Contrarian post +**Hook:** `Unpopular opinion: "free QR code generators" are expensive.` +**Angle:** Hidden cost is reprints, lost scans, no attribution. +**CTA:** `Agree or disagree?` + +### Day 6 + +**Post type:** Demo video +**Hook:** `Change the destination after print. That's the whole game.` +**Angle:** Quick screen recording showing edit-after-print. +**CTA:** `DM me "edit" and I'll send the workflow.` + +### Day 7 + +**Post type:** Founder story +**Hook:** `We started building QR Master because most QR tools felt like toys.` +**Angle:** Needed analytics, bulk creation, privacy-first tracking. +**CTA:** `What's one thing you hate about current QR tools?` + +### Day 8 + +**Post type:** Pain-to-fix post +**Hook:** `If your flyer has a QR code but no tracking, you're guessing.` +**Angle:** Offline campaigns need measurable scans. +**CTA:** `Reply "track" if you want a simple attribution template.` + +### Day 9 + +**Post type:** Restaurant-specific post +**Hook:** `Today's special changes. Your printed QR shouldn't.` +**Angle:** Daily menu operations. +**CTA:** `Restaurant owners: how often do you update menus?` + +### Day 10 + +**Post type:** Roast / audit +**Hook:** `This QR code placement is killing conversions.` +**Angle:** Explain why low-visibility placements fail. +**CTA:** `Send me your flyer/menu/poster and I'll break it down.` + +### Day 11 + +**Post type:** Thread +**Hook:** `5 QR code mistakes that make restaurant marketing look cheap:` +**Angle:** Visual clutter, dead links, bad landing pages, no tracking, wrong CTA. +**CTA:** `I'll post 5 fixes tomorrow if this gets traction.` + +### Day 12 + +**Post type:** Build in public +**Hook:** `One thing founders underestimate: people don't want "a QR code." They want a workflow.` +**Angle:** Product insight from building. +**CTA:** `What simple tool became critical in your business?` + +### Day 13 + +**Post type:** Short proof post +**Hook:** `One QR code. Multiple seasonal campaigns. Zero reprints.` +**Angle:** Reuse same printed asset with changing destination. +**CTA:** `This is one of the biggest underrated offline growth hacks.` + +### Day 14 + +**Post type:** Demo video +**Hook:** `From printed table card to measurable scan funnel in under 30 seconds:` +**Angle:** Show QR creation + analytics preview. +**CTA:** `If you want more product breakdowns, follow.` + +### Day 15 + +**Post type:** Summary / recap +**Hook:** `The biggest restaurant QR lesson so far:` +**Angle:** Most businesses don't need more print, they need more flexibility. +**CTA:** `Next week I'm switching to agencies and offline marketers.` + +### Day 16 + +**Post type:** Agency-focused post +**Hook:** `If your agency runs flyer or poster campaigns without QR attribution, you're underreporting impact.` +**Angle:** Agencies need scan data to prove ROI. +**CTA:** `Reply "agency" if you want my offline attribution framework.` + +### Day 17 + +**Post type:** Contrarian post +**Hook:** `The problem is not the QR code. The problem is the dead destination behind it.` +**Angle:** Static link is the failure point. +**CTA:** `This is where most campaigns quietly lose money.` + +### Day 18 + +**Post type:** Thread +**Hook:** `How to make offline campaigns actually measurable:` +**Angle:** QR + UTM + landing page + analytics naming structure. +**CTA:** `I can turn this into a swipe file.` + +### Day 19 + +**Post type:** Audit post +**Hook:** `3 reasons most poster QR campaigns don't convert:` +**Angle:** Weak CTA, poor mobile page, no tracking structure. +**CTA:** `Want a poster teardown series?` + +### Day 20 + +**Post type:** Demo video +**Hook:** `Bulk-create hundreds of QR codes from a spreadsheet.` +**Angle:** Show CSV/Excel workflow for agencies or retail. +**CTA:** `DM me "bulk" if that would save your team time.` + +### Day 21 + +**Post type:** Founder hot take +**Hook:** `"Just put a QR code on it" is bad marketing advice.` +**Angle:** QR is distribution, not strategy. +**CTA:** `What matters more: placement, offer, or landing page?` + +### Day 22 + +**Post type:** Mini case format +**Hook:** `Campaign idea: one printed asset, three different destinations over 30 days.` +**Angle:** Explain how one QR can support multiple campaign phases. +**CTA:** `This is why dynamic matters more than design.` + +### Day 23 + +**Post type:** Thread +**Hook:** `How I'd structure QR tracking for an agency campaign with flyers, packaging, and in-store signage:` +**Angle:** Naming conventions, attribution logic, reporting. +**CTA:** `If useful, I'll post the naming template.` + +### Day 24 + +**Post type:** Privacy wedge post +**Hook:** `You can measure scans without turning people into surveillance data.` +**Angle:** Privacy-first analytics as a business advantage. +**CTA:** `Too many teams think analytics has to mean creepy.` + +### Day 25 + +**Post type:** Teardown +**Hook:** `This flyer has a QR code. But it still won't tell you what worked.` +**Angle:** Missing attribution structure. +**CTA:** `Reply with "audit" and I'll post a fixed version.` + +### Day 26 + +**Post type:** Retail / packaging post +**Hook:** `Packaging QR codes get interesting when you can change the destination later.` +**Angle:** Product updates, campaigns, support pages, seasonal promos. +**CTA:** `Retail operators: are you using QR for support, promo, or repeat purchase?` + +### Day 27 + +**Post type:** Build in public +**Hook:** `One thing we keep seeing: people buy QR tools for "generation" and stay for "management."` +**Angle:** Product-market insight. +**CTA:** `That distinction matters more than most founders think.` + +### Day 28 + +**Post type:** Demo video +**Hook:** `Here's what "measurable offline workflow" actually looks like in practice:` +**Angle:** Create, edit, track, compare placements. +**CTA:** `If this kind of content is useful, I'll make it a weekly series.` + +### Day 29 + +**Post type:** Hero thread +**Hook:** `Most offline marketing teams don't have a traffic problem. They have a measurement problem.` +**Angle:** Big thesis thread connecting restaurants, agencies, retail, and dynamic QR logic. +**CTA:** `If you work in offline marketing, this is the framework.` + +### Day 30 + +**Post type:** Month-end recap + soft CTA +**Hook:** `30 days of talking to people about QR workflows taught me this:` +**Angle:** Summarize 5 strongest lessons from the month. +**CTA:** `If you want, next I'll publish the full playbook: hooks, setup, and attribution templates.` + +## Weekly Cadence + +- `Mon`: strong opinion or positioning +- `Tue`: practical educational post +- `Wed`: teardown or audit +- `Thu`: thread +- `Fri`: product proof or demo +- `Sat`: founder insight / build in public +- `Sun`: recap or lighter conversation post + +## Content Mix + +- `8 threads` +- `6 teardown/audit posts` +- `5 demo videos` +- `6 short contrarian/value posts` +- `5 founder/build-in-public posts` + +## Reply Strategy + +Every day, add: + +- `10-15 replies` to founders, marketers, restaurant-tech, local business, retail ops, and agency accounts +- Focus on posts about: offline marketing, menus, customer journeys, attribution, retail campaigns, print, local growth +- Use replies to seed your core themes: + - reprint cost + - edit after print + - measurable offline + - privacy-first analytics + - bulk workflows + +## Optional Next Step + +If needed, this can be expanded into: + +1. fully written tweets for all 30 days +2. 8 full threads written out +3. a Notion-style content calendar with posting times and CTAs diff --git a/postcss.config.js b/postcss.config.js index 96bb01e..e4d62c8 100644 --- a/postcss.config.js +++ b/postcss.config.js @@ -1,6 +1,6 @@ -module.exports = { - plugins: { - tailwindcss: {}, - autoprefixer: {}, - }, +module.exports = { + plugins: { + tailwindcss: {}, + autoprefixer: {}, + }, } \ No newline at end of file diff --git a/prisma/migrations/20251013172642_init/migration.sql b/prisma/migrations/20251013172642_init/migration.sql index f491598..c05c4e4 100644 --- a/prisma/migrations/20251013172642_init/migration.sql +++ b/prisma/migrations/20251013172642_init/migration.sql @@ -1,146 +1,146 @@ --- CreateEnum -CREATE TYPE "QRType" AS ENUM ('STATIC', 'DYNAMIC'); - --- CreateEnum -CREATE TYPE "ContentType" AS ENUM ('URL', 'WIFI', 'VCARD', 'PHONE', 'EMAIL', 'SMS', 'TEXT', 'WHATSAPP'); - --- CreateEnum -CREATE TYPE "QRStatus" AS ENUM ('ACTIVE', 'PAUSED'); - --- CreateTable -CREATE TABLE "User" ( - "id" TEXT NOT NULL, - "email" TEXT NOT NULL, - "name" TEXT, - "password" TEXT, - "image" TEXT, - "emailVerified" TIMESTAMP(3), - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "User_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Account" ( - "id" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "type" TEXT NOT NULL, - "provider" TEXT NOT NULL, - "providerAccountId" TEXT NOT NULL, - "refresh_token" TEXT, - "access_token" TEXT, - "expires_at" INTEGER, - "token_type" TEXT, - "scope" TEXT, - "id_token" TEXT, - "session_state" TEXT, - - CONSTRAINT "Account_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Session" ( - "id" TEXT NOT NULL, - "sessionToken" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "expires" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Session_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "VerificationToken" ( - "identifier" TEXT NOT NULL, - "token" TEXT NOT NULL, - "expires" TIMESTAMP(3) NOT NULL -); - --- CreateTable -CREATE TABLE "QRCode" ( - "id" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "title" TEXT NOT NULL, - "type" "QRType" NOT NULL DEFAULT 'DYNAMIC', - "contentType" "ContentType" NOT NULL DEFAULT 'URL', - "content" JSONB NOT NULL, - "tags" TEXT[], - "status" "QRStatus" NOT NULL DEFAULT 'ACTIVE', - "style" JSONB NOT NULL, - "slug" TEXT NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "QRCode_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "QRScan" ( - "id" TEXT NOT NULL, - "qrId" TEXT NOT NULL, - "ts" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "ipHash" TEXT NOT NULL, - "userAgent" TEXT, - "device" TEXT, - "os" TEXT, - "country" TEXT, - "referrer" TEXT, - "utmSource" TEXT, - "utmMedium" TEXT, - "utmCampaign" TEXT, - "isUnique" BOOLEAN NOT NULL DEFAULT false, - - CONSTRAINT "QRScan_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Integration" ( - "id" TEXT NOT NULL, - "userId" TEXT NOT NULL, - "provider" TEXT NOT NULL, - "status" TEXT NOT NULL DEFAULT 'inactive', - "config" JSONB NOT NULL, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "Integration_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); - --- CreateIndex -CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId"); - --- CreateIndex -CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken"); - --- CreateIndex -CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token"); - --- CreateIndex -CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token"); - --- CreateIndex -CREATE UNIQUE INDEX "QRCode_slug_key" ON "QRCode"("slug"); - --- CreateIndex -CREATE INDEX "QRCode_userId_createdAt_idx" ON "QRCode"("userId", "createdAt"); - --- CreateIndex -CREATE INDEX "QRScan_qrId_ts_idx" ON "QRScan"("qrId", "ts"); - --- AddForeignKey -ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "QRCode" ADD CONSTRAINT "QRCode_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "QRScan" ADD CONSTRAINT "QRScan_qrId_fkey" FOREIGN KEY ("qrId") REFERENCES "QRCode"("id") ON DELETE CASCADE ON UPDATE CASCADE; - --- AddForeignKey -ALTER TABLE "Integration" ADD CONSTRAINT "Integration_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; +-- CreateEnum +CREATE TYPE "QRType" AS ENUM ('STATIC', 'DYNAMIC'); + +-- CreateEnum +CREATE TYPE "ContentType" AS ENUM ('URL', 'WIFI', 'VCARD', 'PHONE', 'EMAIL', 'SMS', 'TEXT', 'WHATSAPP'); + +-- CreateEnum +CREATE TYPE "QRStatus" AS ENUM ('ACTIVE', 'PAUSED'); + +-- CreateTable +CREATE TABLE "User" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "name" TEXT, + "password" TEXT, + "image" TEXT, + "emailVerified" TIMESTAMP(3), + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "User_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Account" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "type" TEXT NOT NULL, + "provider" TEXT NOT NULL, + "providerAccountId" TEXT NOT NULL, + "refresh_token" TEXT, + "access_token" TEXT, + "expires_at" INTEGER, + "token_type" TEXT, + "scope" TEXT, + "id_token" TEXT, + "session_state" TEXT, + + CONSTRAINT "Account_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Session" ( + "id" TEXT NOT NULL, + "sessionToken" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "expires" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Session_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "VerificationToken" ( + "identifier" TEXT NOT NULL, + "token" TEXT NOT NULL, + "expires" TIMESTAMP(3) NOT NULL +); + +-- CreateTable +CREATE TABLE "QRCode" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "title" TEXT NOT NULL, + "type" "QRType" NOT NULL DEFAULT 'DYNAMIC', + "contentType" "ContentType" NOT NULL DEFAULT 'URL', + "content" JSONB NOT NULL, + "tags" TEXT[], + "status" "QRStatus" NOT NULL DEFAULT 'ACTIVE', + "style" JSONB NOT NULL, + "slug" TEXT NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "QRCode_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "QRScan" ( + "id" TEXT NOT NULL, + "qrId" TEXT NOT NULL, + "ts" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "ipHash" TEXT NOT NULL, + "userAgent" TEXT, + "device" TEXT, + "os" TEXT, + "country" TEXT, + "referrer" TEXT, + "utmSource" TEXT, + "utmMedium" TEXT, + "utmCampaign" TEXT, + "isUnique" BOOLEAN NOT NULL DEFAULT false, + + CONSTRAINT "QRScan_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Integration" ( + "id" TEXT NOT NULL, + "userId" TEXT NOT NULL, + "provider" TEXT NOT NULL, + "status" TEXT NOT NULL DEFAULT 'inactive', + "config" JSONB NOT NULL, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "Integration_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "User_email_key" ON "User"("email"); + +-- CreateIndex +CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId"); + +-- CreateIndex +CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken"); + +-- CreateIndex +CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token"); + +-- CreateIndex +CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token"); + +-- CreateIndex +CREATE UNIQUE INDEX "QRCode_slug_key" ON "QRCode"("slug"); + +-- CreateIndex +CREATE INDEX "QRCode_userId_createdAt_idx" ON "QRCode"("userId", "createdAt"); + +-- CreateIndex +CREATE INDEX "QRScan_qrId_ts_idx" ON "QRScan"("qrId", "ts"); + +-- AddForeignKey +ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "QRCode" ADD CONSTRAINT "QRCode_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "QRScan" ADD CONSTRAINT "QRScan_qrId_fkey" FOREIGN KEY ("qrId") REFERENCES "QRCode"("id") ON DELETE CASCADE ON UPDATE CASCADE; + +-- AddForeignKey +ALTER TABLE "Integration" ADD CONSTRAINT "Integration_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE; diff --git a/prisma/migrations/20251014195005_init/migration.sql b/prisma/migrations/20251014195005_init/migration.sql index 6c25fc5..9f76ff0 100644 --- a/prisma/migrations/20251014195005_init/migration.sql +++ b/prisma/migrations/20251014195005_init/migration.sql @@ -1,22 +1,22 @@ -/* - Warnings: - - - A unique constraint covering the columns `[stripeCustomerId]` on the table `User` will be added. If there are existing duplicate values, this will fail. - - A unique constraint covering the columns `[stripeSubscriptionId]` on the table `User` will be added. If there are existing duplicate values, this will fail. - -*/ --- CreateEnum -CREATE TYPE "Plan" AS ENUM ('FREE', 'PRO', 'BUSINESS'); - --- AlterTable -ALTER TABLE "User" ADD COLUMN "plan" "Plan" NOT NULL DEFAULT 'FREE', -ADD COLUMN "stripeCurrentPeriodEnd" TIMESTAMP(3), -ADD COLUMN "stripeCustomerId" TEXT, -ADD COLUMN "stripePriceId" TEXT, -ADD COLUMN "stripeSubscriptionId" TEXT; - --- CreateIndex -CREATE UNIQUE INDEX "User_stripeCustomerId_key" ON "User"("stripeCustomerId"); - --- CreateIndex -CREATE UNIQUE INDEX "User_stripeSubscriptionId_key" ON "User"("stripeSubscriptionId"); +/* + Warnings: + + - A unique constraint covering the columns `[stripeCustomerId]` on the table `User` will be added. If there are existing duplicate values, this will fail. + - A unique constraint covering the columns `[stripeSubscriptionId]` on the table `User` will be added. If there are existing duplicate values, this will fail. + +*/ +-- CreateEnum +CREATE TYPE "Plan" AS ENUM ('FREE', 'PRO', 'BUSINESS'); + +-- AlterTable +ALTER TABLE "User" ADD COLUMN "plan" "Plan" NOT NULL DEFAULT 'FREE', +ADD COLUMN "stripeCurrentPeriodEnd" TIMESTAMP(3), +ADD COLUMN "stripeCustomerId" TEXT, +ADD COLUMN "stripePriceId" TEXT, +ADD COLUMN "stripeSubscriptionId" TEXT; + +-- CreateIndex +CREATE UNIQUE INDEX "User_stripeCustomerId_key" ON "User"("stripeCustomerId"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_stripeSubscriptionId_key" ON "User"("stripeSubscriptionId"); diff --git a/prisma/migrations/20260116161126_add_lead_model/migration.sql b/prisma/migrations/20260116161126_add_lead_model/migration.sql index 9e81366..d4f2535 100644 --- a/prisma/migrations/20260116161126_add_lead_model/migration.sql +++ b/prisma/migrations/20260116161126_add_lead_model/migration.sql @@ -1,67 +1,67 @@ -/* - Warnings: - - - The values [WIFI,EMAIL] on the enum `ContentType` will be removed. If these variants are still used in the database, this will fail. - - A unique constraint covering the columns `[resetPasswordToken]` on the table `User` will be added. If there are existing duplicate values, this will fail. - -*/ --- AlterEnum -BEGIN; -CREATE TYPE "ContentType_new" AS ENUM ('URL', 'VCARD', 'GEO', 'PHONE', 'SMS', 'TEXT', 'WHATSAPP'); -ALTER TABLE "QRCode" ALTER COLUMN "contentType" DROP DEFAULT; -ALTER TABLE "QRCode" ALTER COLUMN "contentType" TYPE "ContentType_new" USING ("contentType"::text::"ContentType_new"); -ALTER TYPE "ContentType" RENAME TO "ContentType_old"; -ALTER TYPE "ContentType_new" RENAME TO "ContentType"; -DROP TYPE "ContentType_old"; -ALTER TABLE "QRCode" ALTER COLUMN "contentType" SET DEFAULT 'URL'; -COMMIT; - --- AlterTable -ALTER TABLE "User" ADD COLUMN "resetPasswordExpires" TIMESTAMP(3), -ADD COLUMN "resetPasswordToken" TEXT; - --- CreateTable -CREATE TABLE "NewsletterSubscription" ( - "id" TEXT NOT NULL, - "email" TEXT NOT NULL, - "source" TEXT NOT NULL DEFAULT 'ai-coming-soon', - "status" TEXT NOT NULL DEFAULT 'subscribed', - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - "updatedAt" TIMESTAMP(3) NOT NULL, - - CONSTRAINT "NewsletterSubscription_pkey" PRIMARY KEY ("id") -); - --- CreateTable -CREATE TABLE "Lead" ( - "id" TEXT NOT NULL, - "email" TEXT NOT NULL, - "source" TEXT NOT NULL DEFAULT 'reprint-calculator', - "reprintCost" DOUBLE PRECISION, - "updatesPerYear" INTEGER, - "annualSavings" DOUBLE PRECISION, - "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, - - CONSTRAINT "Lead_pkey" PRIMARY KEY ("id") -); - --- CreateIndex -CREATE UNIQUE INDEX "NewsletterSubscription_email_key" ON "NewsletterSubscription"("email"); - --- CreateIndex -CREATE INDEX "NewsletterSubscription_email_idx" ON "NewsletterSubscription"("email"); - --- CreateIndex -CREATE INDEX "NewsletterSubscription_createdAt_idx" ON "NewsletterSubscription"("createdAt"); - --- CreateIndex -CREATE INDEX "Lead_email_idx" ON "Lead"("email"); - --- CreateIndex -CREATE INDEX "Lead_createdAt_idx" ON "Lead"("createdAt"); - --- CreateIndex -CREATE INDEX "Lead_source_idx" ON "Lead"("source"); - --- CreateIndex -CREATE UNIQUE INDEX "User_resetPasswordToken_key" ON "User"("resetPasswordToken"); +/* + Warnings: + + - The values [WIFI,EMAIL] on the enum `ContentType` will be removed. If these variants are still used in the database, this will fail. + - A unique constraint covering the columns `[resetPasswordToken]` on the table `User` will be added. If there are existing duplicate values, this will fail. + +*/ +-- AlterEnum +BEGIN; +CREATE TYPE "ContentType_new" AS ENUM ('URL', 'VCARD', 'GEO', 'PHONE', 'SMS', 'TEXT', 'WHATSAPP'); +ALTER TABLE "QRCode" ALTER COLUMN "contentType" DROP DEFAULT; +ALTER TABLE "QRCode" ALTER COLUMN "contentType" TYPE "ContentType_new" USING ("contentType"::text::"ContentType_new"); +ALTER TYPE "ContentType" RENAME TO "ContentType_old"; +ALTER TYPE "ContentType_new" RENAME TO "ContentType"; +DROP TYPE "ContentType_old"; +ALTER TABLE "QRCode" ALTER COLUMN "contentType" SET DEFAULT 'URL'; +COMMIT; + +-- AlterTable +ALTER TABLE "User" ADD COLUMN "resetPasswordExpires" TIMESTAMP(3), +ADD COLUMN "resetPasswordToken" TEXT; + +-- CreateTable +CREATE TABLE "NewsletterSubscription" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "source" TEXT NOT NULL DEFAULT 'ai-coming-soon', + "status" TEXT NOT NULL DEFAULT 'subscribed', + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + "updatedAt" TIMESTAMP(3) NOT NULL, + + CONSTRAINT "NewsletterSubscription_pkey" PRIMARY KEY ("id") +); + +-- CreateTable +CREATE TABLE "Lead" ( + "id" TEXT NOT NULL, + "email" TEXT NOT NULL, + "source" TEXT NOT NULL DEFAULT 'reprint-calculator', + "reprintCost" DOUBLE PRECISION, + "updatesPerYear" INTEGER, + "annualSavings" DOUBLE PRECISION, + "createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP, + + CONSTRAINT "Lead_pkey" PRIMARY KEY ("id") +); + +-- CreateIndex +CREATE UNIQUE INDEX "NewsletterSubscription_email_key" ON "NewsletterSubscription"("email"); + +-- CreateIndex +CREATE INDEX "NewsletterSubscription_email_idx" ON "NewsletterSubscription"("email"); + +-- CreateIndex +CREATE INDEX "NewsletterSubscription_createdAt_idx" ON "NewsletterSubscription"("createdAt"); + +-- CreateIndex +CREATE INDEX "Lead_email_idx" ON "Lead"("email"); + +-- CreateIndex +CREATE INDEX "Lead_createdAt_idx" ON "Lead"("createdAt"); + +-- CreateIndex +CREATE INDEX "Lead_source_idx" ON "Lead"("source"); + +-- CreateIndex +CREATE UNIQUE INDEX "User_resetPasswordToken_key" ON "User"("resetPasswordToken"); diff --git a/prisma/migrations/20260123082730_add_app_coupon_feedback_contenttypes/migration.sql b/prisma/migrations/20260123082730_add_app_coupon_feedback_contenttypes/migration.sql index d071c59..7540c55 100644 --- a/prisma/migrations/20260123082730_add_app_coupon_feedback_contenttypes/migration.sql +++ b/prisma/migrations/20260123082730_add_app_coupon_feedback_contenttypes/migration.sql @@ -1,31 +1,31 @@ -/* - Warnings: - - - Added the required column `updatedAt` to the `Lead` table without a default value. This is not possible if the table is not empty. - -*/ --- AlterEnum --- This migration adds more than one value to an enum. --- With PostgreSQL versions 11 and earlier, this is not possible --- in a single migration. This can be worked around by creating --- multiple migrations, each migration adding only one value to --- the enum. - - -ALTER TYPE "ContentType" ADD VALUE 'PDF'; -ALTER TYPE "ContentType" ADD VALUE 'APP'; -ALTER TYPE "ContentType" ADD VALUE 'COUPON'; -ALTER TYPE "ContentType" ADD VALUE 'FEEDBACK'; - --- DropIndex -DROP INDEX "Lead_createdAt_idx"; - --- DropIndex -DROP INDEX "Lead_email_idx"; - --- DropIndex -DROP INDEX "Lead_source_idx"; - --- AlterTable -ALTER TABLE "Lead" ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL, -ALTER COLUMN "updatesPerYear" SET DATA TYPE DOUBLE PRECISION; +/* + Warnings: + + - Added the required column `updatedAt` to the `Lead` table without a default value. This is not possible if the table is not empty. + +*/ +-- AlterEnum +-- This migration adds more than one value to an enum. +-- With PostgreSQL versions 11 and earlier, this is not possible +-- in a single migration. This can be worked around by creating +-- multiple migrations, each migration adding only one value to +-- the enum. + + +ALTER TYPE "ContentType" ADD VALUE 'PDF'; +ALTER TYPE "ContentType" ADD VALUE 'APP'; +ALTER TYPE "ContentType" ADD VALUE 'COUPON'; +ALTER TYPE "ContentType" ADD VALUE 'FEEDBACK'; + +-- DropIndex +DROP INDEX "Lead_createdAt_idx"; + +-- DropIndex +DROP INDEX "Lead_email_idx"; + +-- DropIndex +DROP INDEX "Lead_source_idx"; + +-- AlterTable +ALTER TABLE "Lead" ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL, +ALTER COLUMN "updatesPerYear" SET DATA TYPE DOUBLE PRECISION; diff --git a/prisma/migrations/migration_lock.toml b/prisma/migrations/migration_lock.toml index fbffa92..6bf9015 100644 --- a/prisma/migrations/migration_lock.toml +++ b/prisma/migrations/migration_lock.toml @@ -1,3 +1,3 @@ -# Please do not edit this file manually -# It should be added in your version-control system (i.e. Git) +# Please do not edit this file manually +# It should be added in your version-control system (i.e. Git) provider = "postgresql" \ No newline at end of file diff --git a/prisma/seed.ts b/prisma/seed.ts index 92d5559..9887adc 100644 --- a/prisma/seed.ts +++ b/prisma/seed.ts @@ -1,117 +1,117 @@ -import { PrismaClient } from '@prisma/client'; -import * as bcrypt from 'bcryptjs'; - -const prisma = new PrismaClient(); - -async function main() { - // Create admin user for newsletter management - const hashedPassword = await bcrypt.hash('Timo.16092005', 12); - - const user = await prisma.user.upsert({ - where: { email: 'demo@qrmaster.net' }, - update: { - password: hashedPassword, // Update password if user exists - }, - create: { - email: 'demo@qrmaster.net', - name: 'Admin User', - password: hashedPassword, - }, - }); - - console.log('Created/Updated admin user:', user.email); - - // Create demo QR codes - const qrCodes = [ - { - title: 'Support Phone', - contentType: 'PHONE' as const, - content: { phone: '+1-555-0123' }, - tags: ['support', 'contact'], - slug: 'support-phone-demo', - }, - { - title: 'Event Details', - contentType: 'URL' as const, - content: { url: 'https://example.com/event-2025' }, - tags: ['event', 'conference'], - slug: 'event-details-demo', - }, - { - title: 'Product Demo', - contentType: 'URL' as const, - content: { url: 'https://example.com/product-demo' }, - tags: ['product', 'demo'], - slug: 'product-demo-qr', - }, - { - title: 'Company Website', - contentType: 'URL' as const, - content: { url: 'https://company.example.com' }, - tags: ['website', 'company'], - slug: 'company-website-qr', - }, - { - title: 'Contact Card', - contentType: 'VCARD' as const, - content: { - firstName: 'John', - lastName: 'Doe', - email: 'john@company.com', - phone: '+1234567890', - organization: 'Example Corp', - title: 'CEO' - }, - tags: ['contact', 'vcard'], - slug: 'contact-card-qr', - }, - { - title: 'Event Details', - contentType: 'URL' as const, - content: { url: 'https://example.com/event-duplicate' }, - tags: ['event', 'duplicate'], - slug: 'event-details-dup', - }, - ]; - - const baseDate = new Date('2025-08-07T10:00:00Z'); - - for (let i = 0; i < qrCodes.length; i++) { - const qrData = qrCodes[i]; - const createdAt = new Date(baseDate.getTime() + i * 60000); // 1 minute apart - - await prisma.qRCode.upsert({ - where: { slug: qrData.slug }, - update: {}, - create: { - userId: user.id, - title: qrData.title, - type: 'DYNAMIC', - contentType: qrData.contentType, - content: qrData.content, - tags: qrData.tags, - status: 'ACTIVE', - style: { - foregroundColor: '#000000', - backgroundColor: '#FFFFFF', - cornerStyle: 'square', - size: 200, - }, - slug: qrData.slug, - createdAt, - updatedAt: createdAt, - }, - }); - } - - console.log('Created 6 demo QR codes'); -} - -main() - .catch((e) => { - console.error(e); - process.exit(1); - }) - .finally(async () => { - await prisma.$disconnect(); +import { PrismaClient } from '@prisma/client'; +import * as bcrypt from 'bcryptjs'; + +const prisma = new PrismaClient(); + +async function main() { + // Create admin user for newsletter management + const hashedPassword = await bcrypt.hash('Timo.16092005', 12); + + const user = await prisma.user.upsert({ + where: { email: 'demo@qrmaster.net' }, + update: { + password: hashedPassword, // Update password if user exists + }, + create: { + email: 'demo@qrmaster.net', + name: 'Admin User', + password: hashedPassword, + }, + }); + + console.log('Created/Updated admin user:', user.email); + + // Create demo QR codes + const qrCodes = [ + { + title: 'Support Phone', + contentType: 'PHONE' as const, + content: { phone: '+1-555-0123' }, + tags: ['support', 'contact'], + slug: 'support-phone-demo', + }, + { + title: 'Event Details', + contentType: 'URL' as const, + content: { url: 'https://example.com/event-2025' }, + tags: ['event', 'conference'], + slug: 'event-details-demo', + }, + { + title: 'Product Demo', + contentType: 'URL' as const, + content: { url: 'https://example.com/product-demo' }, + tags: ['product', 'demo'], + slug: 'product-demo-qr', + }, + { + title: 'Company Website', + contentType: 'URL' as const, + content: { url: 'https://company.example.com' }, + tags: ['website', 'company'], + slug: 'company-website-qr', + }, + { + title: 'Contact Card', + contentType: 'VCARD' as const, + content: { + firstName: 'John', + lastName: 'Doe', + email: 'john@company.com', + phone: '+1234567890', + organization: 'Example Corp', + title: 'CEO' + }, + tags: ['contact', 'vcard'], + slug: 'contact-card-qr', + }, + { + title: 'Event Details', + contentType: 'URL' as const, + content: { url: 'https://example.com/event-duplicate' }, + tags: ['event', 'duplicate'], + slug: 'event-details-dup', + }, + ]; + + const baseDate = new Date('2025-08-07T10:00:00Z'); + + for (let i = 0; i < qrCodes.length; i++) { + const qrData = qrCodes[i]; + const createdAt = new Date(baseDate.getTime() + i * 60000); // 1 minute apart + + await prisma.qRCode.upsert({ + where: { slug: qrData.slug }, + update: {}, + create: { + userId: user.id, + title: qrData.title, + type: 'DYNAMIC', + contentType: qrData.contentType, + content: qrData.content, + tags: qrData.tags, + status: 'ACTIVE', + style: { + foregroundColor: '#000000', + backgroundColor: '#FFFFFF', + cornerStyle: 'square', + size: 200, + }, + slug: qrData.slug, + createdAt, + updatedAt: createdAt, + }, + }); + } + + console.log('Created 6 demo QR codes'); +} + +main() + .catch((e) => { + console.error(e); + process.exit(1); + }) + .finally(async () => { + await prisma.$disconnect(); }); \ No newline at end of file diff --git a/public/favicon.svg b/public/favicon.svg index afec598..b049bca 100644 --- a/public/favicon.svg +++ b/public/favicon.svg @@ -1,32 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/public/llms.txt b/public/llms.txt index c9b0adb..bfc058a 100644 --- a/public/llms.txt +++ b/public/llms.txt @@ -1,31 +1,31 @@ -# QR Master - -> QR Master is a B2B SaaS platform for dynamic QR codes, scan analytics, bulk generation, and privacy-conscious campaign tracking. - -- Primary domain: https://www.qrmaster.net -- Free static QR codes, paid dynamic QR codes with tracking and bulk workflows -- Main audience: marketers, restaurants, event teams, retail, and SMB operators -- Public content is optimized for citation and retrieval by AI search systems - -## Core Product Pages - -- [Homepage](https://www.qrmaster.net): Product overview and positioning for dynamic QR codes -- [Pricing](https://www.qrmaster.net/pricing): Plans, limits, and upgrade paths -- [Dynamic QR Code Generator](https://www.qrmaster.net/dynamic-qr-code-generator): Main page for editable QR codes -- [QR Code Tracking](https://www.qrmaster.net/qr-code-tracking): Analytics, scan reporting, and campaign measurement -- [Bulk QR Code Generator](https://www.qrmaster.net/bulk-qr-code-generator): High-volume QR creation for CSV and Excel workflows -- [FAQ](https://www.qrmaster.net/faq): Direct answers to product, billing, and implementation questions - -## Cornerstone Guides - -- [Dynamic vs Static QR Codes](https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes/raw): Best guide for choosing editable vs fixed QR codes -- [QR Code Tracking Guide](https://www.qrmaster.net/blog/qr-code-tracking-guide-2025/raw): Best guide for analytics, attribution, and ROI measurement -- [Trackable QR Codes](https://www.qrmaster.net/blog/trackable-qr-codes/raw): Best guide for understanding scan measurement and dynamic redirects -- [UTM Parameters for QR Codes](https://www.qrmaster.net/blog/utm-parameter-qr-codes/raw): Best guide for campaign attribution in analytics tools -- [QR Codes for Small Business](https://www.qrmaster.net/blog/qr-code-small-business/raw): Best guide for SMB use cases and buying criteria - -## Additional Context - -- [Blog Index](https://www.qrmaster.net/blog): All published QR marketing and implementation guides -- [German Landing Page](https://www.qrmaster.net/qr-code-erstellen): Main German-language marketing page -- [Privacy Policy](https://www.qrmaster.net/privacy): Privacy and data handling information +# QR Master + +> QR Master is a B2B SaaS platform for dynamic QR codes, scan analytics, bulk generation, and privacy-conscious campaign tracking. + +- Primary domain: https://www.qrmaster.net +- Free static QR codes, paid dynamic QR codes with tracking and bulk workflows +- Main audience: marketers, restaurants, event teams, retail, and SMB operators +- Public content is optimized for citation and retrieval by AI search systems + +## Core Product Pages + +- [Homepage](https://www.qrmaster.net): Product overview and positioning for dynamic QR codes +- [Pricing](https://www.qrmaster.net/pricing): Plans, limits, and upgrade paths +- [Dynamic QR Code Generator](https://www.qrmaster.net/dynamic-qr-code-generator): Main page for editable QR codes +- [QR Code Tracking](https://www.qrmaster.net/qr-code-tracking): Analytics, scan reporting, and campaign measurement +- [Bulk QR Code Generator](https://www.qrmaster.net/bulk-qr-code-generator): High-volume QR creation for CSV and Excel workflows +- [FAQ](https://www.qrmaster.net/faq): Direct answers to product, billing, and implementation questions + +## Cornerstone Guides + +- [Dynamic vs Static QR Codes](https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes/raw): Best guide for choosing editable vs fixed QR codes +- [QR Code Tracking Guide](https://www.qrmaster.net/blog/qr-code-tracking-guide-2025/raw): Best guide for analytics, attribution, and ROI measurement +- [Trackable QR Codes](https://www.qrmaster.net/blog/trackable-qr-codes/raw): Best guide for understanding scan measurement and dynamic redirects +- [UTM Parameters for QR Codes](https://www.qrmaster.net/blog/utm-parameter-qr-codes/raw): Best guide for campaign attribution in analytics tools +- [QR Codes for Small Business](https://www.qrmaster.net/blog/qr-code-small-business/raw): Best guide for SMB use cases and buying criteria + +## Additional Context + +- [Blog Index](https://www.qrmaster.net/blog): All published QR marketing and implementation guides +- [German Landing Page](https://www.qrmaster.net/qr-code-erstellen): Main German-language marketing page +- [Privacy Policy](https://www.qrmaster.net/privacy): Privacy and data handling information diff --git a/public/logo.svg b/public/logo.svg index d351098..97d3f3f 100644 --- a/public/logo.svg +++ b/public/logo.svg @@ -1,32 +1,32 @@ - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + \ No newline at end of file diff --git a/public/static/.gitkeep b/public/static/.gitkeep index ed02446..70842ca 100644 --- a/public/static/.gitkeep +++ b/public/static/.gitkeep @@ -1,2 +1,2 @@ -# Placeholder for og-image.png -# Replace public/static/og-image.png with actual 1200×630 branded image before production +# Placeholder for og-image.png +# Replace public/static/og-image.png with actual 1200×630 branded image before production diff --git a/public/tiktokVwGRbyf2BbBLqUlFrnehtntSEU9Ihiok.txt b/public/tiktokVwGRbyf2BbBLqUlFrnehtntSEU9Ihiok.txt index dfcf9f3..6adf520 100644 --- a/public/tiktokVwGRbyf2BbBLqUlFrnehtntSEU9Ihiok.txt +++ b/public/tiktokVwGRbyf2BbBLqUlFrnehtntSEU9Ihiok.txt @@ -1 +1 @@ -tiktok-developers-site-verification=VwGRbyf2BbBLqUlFrnehtntSEU9Ihiok +tiktok-developers-site-verification=VwGRbyf2BbBLqUlFrnehtntSEU9Ihiok diff --git a/qrmaster-growth-system/SKILL.md b/qrmaster-growth-system/SKILL.md index 1b89495..4389edb 100644 --- a/qrmaster-growth-system/SKILL.md +++ b/qrmaster-growth-system/SKILL.md @@ -1,78 +1,78 @@ ---- -name: qrmaster-growth-system -description: Use when working on QRMaster growth for qrmaster.net. Covers the QRMaster SEO/GEO/SaaS wedge, baseline audit, competitor gap analysis, Top 30 page backlog, internal linking, scoring, and measurement. Also use when planning or executing use-case hubs, commercial QR landing pages, or marketing tracking for QRMaster. ---- - -# QRMaster Growth System - -Use this skill only for `qrmaster.net` work. - -## Goal - -Turn QRMaster from a generic QR tool site into a measurable SaaS growth system built around dynamic, trackable QR workflows. - -## Default context - -- Domain: `qrmaster.net` -- Primary market: English -- Product strengths: dynamic updates, scan analytics, bulk creation, branded QR codes, campaign attribution -- Benchmark competitors: QRCode Monkey, Beaconstac, QR TIGER, QR Code Generator, Scanova - -## Core thesis - -- Do not optimize for generic "free QR" traffic first. -- Win where dynamic updates and tracking clearly matter. -- Treat use-case pages as acquisition assets, not blog filler. -- Every page must map to a workflow pain, a commercial parent, and a tracked CTA. - -## When to use this skill - -- Planning QRMaster SEO, AEO, or GEO work -- Auditing the QRMaster content and route structure -- Building or improving `/use-cases`, hubs, or commercial landing pages -- Prioritizing new pages or existing content upgrades -- Designing internal links for QRMaster -- Defining marketing events and SEO-to-signup measurement for QRMaster - -## How to use this skill - -1. Read `references/current-state-findings.md` if the current repo state is unknown. -2. Read `references/core-plan.md` for the operating model, wedge, internal links, and scoring. -3. Read `references/top-30-backlog.md` when planning or building page inventory. -4. Read `references/tracking-spec.md` when implementing page-level or funnel tracking. -5. If you are not inside the QRMaster repo, produce plans, specs, or content only. Do not mutate product files. - -## Companion skills - -Use the smallest set needed: - -- `agentic-saas-advisor`: SaaS wedge, workflow, monetization, 30/60/90 sequencing -- `seo-aeo-geo-expert`: SEO/AEO/GEO detail and content shaping -- `keyword-research`: cluster design and SERP-driven prioritization -- `conversion`: page-level conversion flow and CTA decisions -- `analytics-tracking`: event taxonomy and measurement QA -- `site-architecture`: hub, URL, and internal-link structure - -## Output contract - -Return outputs in this order when doing planning work: - -1. `TL;DR` -2. `Sub-Niche Thesis` -3. `QRMaster Baseline Audit` -4. `Competitor Gap Analysis` -5. `SERP Pattern Summary` -6. `Top 30 Page Backlog` -7. `Internal Linking Model` -8. `Priority Scores` -9. `30/60/90 Plan` -10. `Tracking Spec` -11. `Assumptions` - -## Guardrails - -- Do not treat all QR traffic as equal; prioritize workflows with update or tracking value. -- Do not add pages without a real product-fit angle. -- Do not separate SEO from signup and activation measurement. -- Do not expand beyond the core wedge until the first cluster set shows repeatable ROI. - +--- +name: qrmaster-growth-system +description: Use when working on QRMaster growth for qrmaster.net. Covers the QRMaster SEO/GEO/SaaS wedge, baseline audit, competitor gap analysis, Top 30 page backlog, internal linking, scoring, and measurement. Also use when planning or executing use-case hubs, commercial QR landing pages, or marketing tracking for QRMaster. +--- + +# QRMaster Growth System + +Use this skill only for `qrmaster.net` work. + +## Goal + +Turn QRMaster from a generic QR tool site into a measurable SaaS growth system built around dynamic, trackable QR workflows. + +## Default context + +- Domain: `qrmaster.net` +- Primary market: English +- Product strengths: dynamic updates, scan analytics, bulk creation, branded QR codes, campaign attribution +- Benchmark competitors: QRCode Monkey, Beaconstac, QR TIGER, QR Code Generator, Scanova + +## Core thesis + +- Do not optimize for generic "free QR" traffic first. +- Win where dynamic updates and tracking clearly matter. +- Treat use-case pages as acquisition assets, not blog filler. +- Every page must map to a workflow pain, a commercial parent, and a tracked CTA. + +## When to use this skill + +- Planning QRMaster SEO, AEO, or GEO work +- Auditing the QRMaster content and route structure +- Building or improving `/use-cases`, hubs, or commercial landing pages +- Prioritizing new pages or existing content upgrades +- Designing internal links for QRMaster +- Defining marketing events and SEO-to-signup measurement for QRMaster + +## How to use this skill + +1. Read `references/current-state-findings.md` if the current repo state is unknown. +2. Read `references/core-plan.md` for the operating model, wedge, internal links, and scoring. +3. Read `references/top-30-backlog.md` when planning or building page inventory. +4. Read `references/tracking-spec.md` when implementing page-level or funnel tracking. +5. If you are not inside the QRMaster repo, produce plans, specs, or content only. Do not mutate product files. + +## Companion skills + +Use the smallest set needed: + +- `agentic-saas-advisor`: SaaS wedge, workflow, monetization, 30/60/90 sequencing +- `seo-aeo-geo-expert`: SEO/AEO/GEO detail and content shaping +- `keyword-research`: cluster design and SERP-driven prioritization +- `conversion`: page-level conversion flow and CTA decisions +- `analytics-tracking`: event taxonomy and measurement QA +- `site-architecture`: hub, URL, and internal-link structure + +## Output contract + +Return outputs in this order when doing planning work: + +1. `TL;DR` +2. `Sub-Niche Thesis` +3. `QRMaster Baseline Audit` +4. `Competitor Gap Analysis` +5. `SERP Pattern Summary` +6. `Top 30 Page Backlog` +7. `Internal Linking Model` +8. `Priority Scores` +9. `30/60/90 Plan` +10. `Tracking Spec` +11. `Assumptions` + +## Guardrails + +- Do not treat all QR traffic as equal; prioritize workflows with update or tracking value. +- Do not add pages without a real product-fit angle. +- Do not separate SEO from signup and activation measurement. +- Do not expand beyond the core wedge until the first cluster set shows repeatable ROI. + diff --git a/qrmaster-growth-system/agents/openai.yaml b/qrmaster-growth-system/agents/openai.yaml index baca502..4ca6d17 100644 --- a/qrmaster-growth-system/agents/openai.yaml +++ b/qrmaster-growth-system/agents/openai.yaml @@ -1,6 +1,6 @@ -version: 1 -interface: - display_name: "QRMaster Growth System" - short_description: "Plan QRMaster SEO, use-case hubs, scoring, internal links, and tracking." - default_prompt: "Audit qrmaster.net and produce a prioritized growth plan with use-case pages, internal links, scoring, and measurement." - +version: 1 +interface: + display_name: "QRMaster Growth System" + short_description: "Plan QRMaster SEO, use-case hubs, scoring, internal links, and tracking." + default_prompt: "Audit qrmaster.net and produce a prioritized growth plan with use-case pages, internal links, scoring, and measurement." + diff --git a/qrmaster-growth-system/references/core-plan.md b/qrmaster-growth-system/references/core-plan.md index c10bb1f..5f172a5 100644 --- a/qrmaster-growth-system/references/core-plan.md +++ b/qrmaster-growth-system/references/core-plan.md @@ -1,155 +1,155 @@ -# QRMaster Core Plan - -## Positioning - -QRMaster should not try to win broad generic QR traffic first. - -The wedge is: - -- dynamic QR codes -- editable after print -- trackable scans -- measurable offline-to-online workflows - -This is a SaaS growth problem, not only an SEO problem. - -## Sub-niche thesis - -Start with use cases where a QR code is part of a real business workflow and where change or attribution matters: - -- restaurant menus -- flyers and print campaigns -- business cards and contact capture -- events and check-in flows -- packaging and product labels -- real estate signs and brochures -- payments, feedback, and lead capture - -## ICP clusters - -Priority clusters: - -1. Restaurants -2. Small business / print marketing -3. Events -4. Real estate -5. Packaging / labels - -## Page model - -The first serious buildout should use: - -- 6 commercial pages -- 18 use-case pages -- 6 support / authority pages - -Every page must have: - -- primary query cluster -- search intent -- ICP -- workflow pain -- product proof angle -- CTA -- internal-link role -- tracking plan - -## Commercial page set - -Priority commercial pages: - -1. Dynamic QR Code Generator -2. Bulk QR Code Generator -3. QR Code Analytics -4. Custom / Branded QR Code Generator -5. QR Code Tracking / Trackable QR Codes -6. QR Codes for Marketing Campaigns - -## Internal linking model - -Use a 3-layer structure: - -- Layer 1: commercial money pages -- Layer 2: use-case pages -- Layer 3: support / authority hubs - -Rules: - -- every use-case page links to exactly 1 primary commercial page -- every use-case page links to the main `/use-cases` hub -- every use-case page links to up to 2 sibling use cases -- every support page links upward into 1 commercial page and 2 use-case pages -- every commercial page links down into 3 to 5 strongest use cases -- no planned page should be an orphan - -## AEO / GEO operating spec - -For P1 and P2 pages, require: - -- one direct answer block near the top -- one extractable proof paragraph -- three to six FAQ candidates -- one comparison or checklist block if the SERP suggests it -- clear entity reinforcement for QRMaster, dynamic QR, analytics, and the use case - -## Scoring model - -Use: - -`Priority Score = ((Impact x Confidence x Strategic Fit x Time-to-Signal) / Effort) x 4` - -Factor definitions: - -- Impact: likely effect on qualified organic visibility or assisted conversions -- Confidence: strength of evidence from SERPs, current fit, or competitor patterns -- Strategic Fit: closeness to QRMaster's actual product strengths -- Time-to-Signal: expected speed of measurable movement -- Effort: total work across content, SEO, design, dev, and review - -Modifiers: - -- `+20%` dependencies already clear -- `+15%` strong support for a money page -- `-25%` weak baseline or weak measurement -- `-30%` slow-signal initiative -- `-40%` high guardrail risk -- `-50%` weak product proof or weak differentiation -- `-35%` if the page is likely to bring generic hobby traffic with poor SaaS intent - -Priority classes: - -- `P1`: `>= 70` -- `P2`: `50-69` -- `P3`: `< 50` - -Hard gate: - -- if the page cannot clearly demonstrate a real workflow problem solved by QRMaster, it cannot be `P1` - -## 30 / 60 / 90 - -### Days 1-30 - -- audit current QRMaster inventory -- classify existing pages into commercial, use-case, support -- map 5 ICP workflows -- compare against the named competitors -- define the Top 30 backlog -- lock the internal-link structure -- choose the first 5 to 8 `P1` pages - -### Days 31-60 - -- standardize page templates -- standardize AEO / GEO blocks -- refine CTAs and conversion flow for the first P1 pages -- re-score backlog after evidence review -- define distribution angles from the first pages - -### Days 61-90 - -- expand the strongest use-case clusters -- reinforce internal linking -- standardize the operating model -- define the next-quarter page set - +# QRMaster Core Plan + +## Positioning + +QRMaster should not try to win broad generic QR traffic first. + +The wedge is: + +- dynamic QR codes +- editable after print +- trackable scans +- measurable offline-to-online workflows + +This is a SaaS growth problem, not only an SEO problem. + +## Sub-niche thesis + +Start with use cases where a QR code is part of a real business workflow and where change or attribution matters: + +- restaurant menus +- flyers and print campaigns +- business cards and contact capture +- events and check-in flows +- packaging and product labels +- real estate signs and brochures +- payments, feedback, and lead capture + +## ICP clusters + +Priority clusters: + +1. Restaurants +2. Small business / print marketing +3. Events +4. Real estate +5. Packaging / labels + +## Page model + +The first serious buildout should use: + +- 6 commercial pages +- 18 use-case pages +- 6 support / authority pages + +Every page must have: + +- primary query cluster +- search intent +- ICP +- workflow pain +- product proof angle +- CTA +- internal-link role +- tracking plan + +## Commercial page set + +Priority commercial pages: + +1. Dynamic QR Code Generator +2. Bulk QR Code Generator +3. QR Code Analytics +4. Custom / Branded QR Code Generator +5. QR Code Tracking / Trackable QR Codes +6. QR Codes for Marketing Campaigns + +## Internal linking model + +Use a 3-layer structure: + +- Layer 1: commercial money pages +- Layer 2: use-case pages +- Layer 3: support / authority hubs + +Rules: + +- every use-case page links to exactly 1 primary commercial page +- every use-case page links to the main `/use-cases` hub +- every use-case page links to up to 2 sibling use cases +- every support page links upward into 1 commercial page and 2 use-case pages +- every commercial page links down into 3 to 5 strongest use cases +- no planned page should be an orphan + +## AEO / GEO operating spec + +For P1 and P2 pages, require: + +- one direct answer block near the top +- one extractable proof paragraph +- three to six FAQ candidates +- one comparison or checklist block if the SERP suggests it +- clear entity reinforcement for QRMaster, dynamic QR, analytics, and the use case + +## Scoring model + +Use: + +`Priority Score = ((Impact x Confidence x Strategic Fit x Time-to-Signal) / Effort) x 4` + +Factor definitions: + +- Impact: likely effect on qualified organic visibility or assisted conversions +- Confidence: strength of evidence from SERPs, current fit, or competitor patterns +- Strategic Fit: closeness to QRMaster's actual product strengths +- Time-to-Signal: expected speed of measurable movement +- Effort: total work across content, SEO, design, dev, and review + +Modifiers: + +- `+20%` dependencies already clear +- `+15%` strong support for a money page +- `-25%` weak baseline or weak measurement +- `-30%` slow-signal initiative +- `-40%` high guardrail risk +- `-50%` weak product proof or weak differentiation +- `-35%` if the page is likely to bring generic hobby traffic with poor SaaS intent + +Priority classes: + +- `P1`: `>= 70` +- `P2`: `50-69` +- `P3`: `< 50` + +Hard gate: + +- if the page cannot clearly demonstrate a real workflow problem solved by QRMaster, it cannot be `P1` + +## 30 / 60 / 90 + +### Days 1-30 + +- audit current QRMaster inventory +- classify existing pages into commercial, use-case, support +- map 5 ICP workflows +- compare against the named competitors +- define the Top 30 backlog +- lock the internal-link structure +- choose the first 5 to 8 `P1` pages + +### Days 31-60 + +- standardize page templates +- standardize AEO / GEO blocks +- refine CTAs and conversion flow for the first P1 pages +- re-score backlog after evidence review +- define distribution angles from the first pages + +### Days 61-90 + +- expand the strongest use-case clusters +- reinforce internal linking +- standardize the operating model +- define the next-quarter page set + diff --git a/qrmaster-growth-system/references/current-state-findings.md b/qrmaster-growth-system/references/current-state-findings.md index 976e86e..c7bf511 100644 --- a/qrmaster-growth-system/references/current-state-findings.md +++ b/qrmaster-growth-system/references/current-state-findings.md @@ -1,57 +1,57 @@ -# QRMaster Current-State Findings - -These findings came from a local repo review of `C:\Users\a931627\Documents\QRMASTER`. - -## Existing structural strengths - -- QRMASTER already has several commercial marketing routes: - - `/dynamic-qr-code-generator` - - `/bulk-qr-code-generator` - - `/custom-qr-code-generator` - - `/qr-code-tracking` -- There is already a `Learn` hub and pillar structure: - - `/learn` - - `/learn/basics` - - `/learn/tracking` - - `/learn/use-cases` - - `/learn/security` - - `/learn/developer` -- There is a large blog data layer with many QR use-case and tracking posts. -- There is a tool layer under `/tools/*` that already covers many practical generators. - -## Existing content opportunities - -The repo already includes or strongly hints at: - -- restaurant menu content -- business card / vCard content -- event content -- QR marketing / tracking content -- print-size and dynamic-vs-static support content -- Instagram, WhatsApp, PayPal, Event, and other tool pages that can support use-case clusters - -This means the next growth step should usually be: - -- improve surfacing -- improve internal linking -- improve commercial-parent relationships -- improve measurement - -not blindly create 30 net-new pages first - -## Observed gaps - -- no dedicated `/use-cases` hub was evident in the reviewed route set -- use-case content appears spread across blog, learn, and tools -- the site likely needs stronger internal-link choreography between commercial pages, use-case content, and support content -- current tracking appeared stronger on product actions than on marketing CTAs - -## Practical implication - -For future QRMASTER repo work: - -1. surface the existing use-case inventory better -2. connect it to the correct commercial parent pages -3. add consistent CTA and landing-page measurement -4. then expand the page set based on score and proof - +# QRMaster Current-State Findings + +These findings came from a local repo review of `C:\Users\a931627\Documents\QRMASTER`. + +## Existing structural strengths + +- QRMASTER already has several commercial marketing routes: + - `/dynamic-qr-code-generator` + - `/bulk-qr-code-generator` + - `/custom-qr-code-generator` + - `/qr-code-tracking` +- There is already a `Learn` hub and pillar structure: + - `/learn` + - `/learn/basics` + - `/learn/tracking` + - `/learn/use-cases` + - `/learn/security` + - `/learn/developer` +- There is a large blog data layer with many QR use-case and tracking posts. +- There is a tool layer under `/tools/*` that already covers many practical generators. + +## Existing content opportunities + +The repo already includes or strongly hints at: + +- restaurant menu content +- business card / vCard content +- event content +- QR marketing / tracking content +- print-size and dynamic-vs-static support content +- Instagram, WhatsApp, PayPal, Event, and other tool pages that can support use-case clusters + +This means the next growth step should usually be: + +- improve surfacing +- improve internal linking +- improve commercial-parent relationships +- improve measurement + +not blindly create 30 net-new pages first + +## Observed gaps + +- no dedicated `/use-cases` hub was evident in the reviewed route set +- use-case content appears spread across blog, learn, and tools +- the site likely needs stronger internal-link choreography between commercial pages, use-case content, and support content +- current tracking appeared stronger on product actions than on marketing CTAs + +## Practical implication + +For future QRMASTER repo work: + +1. surface the existing use-case inventory better +2. connect it to the correct commercial parent pages +3. add consistent CTA and landing-page measurement +4. then expand the page set based on score and proof + diff --git a/qrmaster-growth-system/references/top-30-backlog.md b/qrmaster-growth-system/references/top-30-backlog.md index a62ebbe..e9f2b89 100644 --- a/qrmaster-growth-system/references/top-30-backlog.md +++ b/qrmaster-growth-system/references/top-30-backlog.md @@ -1,79 +1,79 @@ -# QRMaster Top 30 Backlog - -This is the initial candidate backlog for the first serious QRMaster growth sprint. -It is not a promise to build every page immediately; it is the structured pool to score and sequence. - -## 1. Commercial pages - -| Bucket | Page | Primary cluster | Route status | Notes | -|---|---|---|---|---| -| Commercial | Dynamic QR Code Generator | dynamic qr code generator | existing | Core money page, strongest wedge fit | -| Commercial | Bulk QR Code Generator | bulk qr code generator | existing | Strong for teams, labels, events | -| Commercial | QR Code Analytics | qr code analytics | existing content / upgrade | Needs stronger SaaS CTA alignment | -| Commercial | Custom QR Code Generator | custom qr code generator | existing | Strong for branded print use cases | -| Commercial | QR Code Tracking | qr code tracking, trackable qr codes | existing | Bridge between SEO and product proof | -| Commercial | QR Codes for Marketing Campaigns | qr code marketing | likely upgrade/new | Important parent for flyer/poster clusters | - -## 2. Use-case pages - -| Cluster | Page | Primary cluster | Route status | Primary commercial parent | -|---|---|---|---|---| -| Restaurants | Restaurant Menu QR Codes | qr code for restaurant menu | existing blog post | Dynamic QR Code Generator | -| Restaurants | Table Ordering QR Codes | qr code for table ordering | future | Dynamic QR Code Generator | -| Print / SMB | Flyer QR Codes | qr code for flyer | future | QR Codes for Marketing Campaigns | -| Print / SMB | Brochure QR Codes | qr code for brochure | future | QR Codes for Marketing Campaigns | -| Print / SMB | Coupon QR Codes | qr code for coupons | future | QR Code Tracking | -| Print / SMB | Small Business QR Codes | qr code for small business | existing blog post | Dynamic QR Code Generator | -| Business Cards | vCard QR Codes | vcard qr code | existing tool + blog | Dynamic QR Code Generator | -| Business Cards | Business Card QR Codes | qr on business card | existing blog post | Dynamic QR Code Generator | -| Events | Event QR Codes | qr code for events | existing tool + blog | QR Code Tracking | -| Events | Event Ticket QR Codes | qr code for event ticket | future | QR Code Tracking | -| Events | Trade Show Booth QR Codes | qr code for trade show booth | future | QR Codes for Marketing Campaigns | -| Packaging | Packaging QR Codes | qr code for packaging | future | QR Code Analytics | -| Packaging | Product Label QR Codes | qr code for product labels | future | Bulk QR Code Generator | -| Packaging | QR Codes for Inserts / Manuals | qr code for product manuals | future | QR Code Analytics | -| Real Estate | Real Estate Sign QR Codes | qr code for real estate signs | future | QR Code Tracking | -| Real Estate | Property Flyer QR Codes | qr code for property flyers | future | QR Codes for Marketing Campaigns | -| Payments | Payment QR Codes | qr code for payment | future | Dynamic QR Code Generator | -| Feedback | Feedback QR Codes | qr code for feedback collection | future | QR Code Tracking | - -## 3. Support / authority pages - -| Bucket | Page | Primary cluster | Route status | Notes | -|---|---|---|---|---| -| Support | Use Cases Hub | qr code use cases | future | Main hub and distribution point | -| Support | Dynamic vs Static QR Codes | dynamic vs static qr codes | existing blog post | Supports the wedge education | -| Support | QR Code Print Size Guide | qr code print size | existing blog post | Supports print-heavy use cases | -| Support | UTM Parameters with QR Codes | utm parameters qr codes | existing blog post | Supports attribution and tracking wedge | -| Support | Trackable QR Codes | trackable qr codes | existing blog post | Supports analytics and ROI framing | -| Support | Best QR Code Generator Comparison | best qr code generator 2026 | existing blog post | Comparison and alternatives support | - -## Prioritization logic - -Default early `P1` pool: - -1. Dynamic QR Code Generator -2. QR Code Tracking -3. Restaurant Menu QR Codes -4. Flyer QR Codes -5. Business Card QR Codes -6. Event QR Codes -7. Packaging QR Codes -8. Use Cases Hub - -Likely early `P2` pool: - -- Bulk QR Code Generator -- QR Code Analytics -- vCard QR Codes -- UTM Parameters with QR Codes -- Trackable QR Codes -- Small Business QR Codes -- Real Estate Sign QR Codes - -Likely `P3` until proof improves: - -- low-intent vanity generators -- generic "free QR" comparison pages without wedge fit -- pages with weak product proof or unclear CTA path - +# QRMaster Top 30 Backlog + +This is the initial candidate backlog for the first serious QRMaster growth sprint. +It is not a promise to build every page immediately; it is the structured pool to score and sequence. + +## 1. Commercial pages + +| Bucket | Page | Primary cluster | Route status | Notes | +|---|---|---|---|---| +| Commercial | Dynamic QR Code Generator | dynamic qr code generator | existing | Core money page, strongest wedge fit | +| Commercial | Bulk QR Code Generator | bulk qr code generator | existing | Strong for teams, labels, events | +| Commercial | QR Code Analytics | qr code analytics | existing content / upgrade | Needs stronger SaaS CTA alignment | +| Commercial | Custom QR Code Generator | custom qr code generator | existing | Strong for branded print use cases | +| Commercial | QR Code Tracking | qr code tracking, trackable qr codes | existing | Bridge between SEO and product proof | +| Commercial | QR Codes for Marketing Campaigns | qr code marketing | likely upgrade/new | Important parent for flyer/poster clusters | + +## 2. Use-case pages + +| Cluster | Page | Primary cluster | Route status | Primary commercial parent | +|---|---|---|---|---| +| Restaurants | Restaurant Menu QR Codes | qr code for restaurant menu | existing blog post | Dynamic QR Code Generator | +| Restaurants | Table Ordering QR Codes | qr code for table ordering | future | Dynamic QR Code Generator | +| Print / SMB | Flyer QR Codes | qr code for flyer | future | QR Codes for Marketing Campaigns | +| Print / SMB | Brochure QR Codes | qr code for brochure | future | QR Codes for Marketing Campaigns | +| Print / SMB | Coupon QR Codes | qr code for coupons | future | QR Code Tracking | +| Print / SMB | Small Business QR Codes | qr code for small business | existing blog post | Dynamic QR Code Generator | +| Business Cards | vCard QR Codes | vcard qr code | existing tool + blog | Dynamic QR Code Generator | +| Business Cards | Business Card QR Codes | qr on business card | existing blog post | Dynamic QR Code Generator | +| Events | Event QR Codes | qr code for events | existing tool + blog | QR Code Tracking | +| Events | Event Ticket QR Codes | qr code for event ticket | future | QR Code Tracking | +| Events | Trade Show Booth QR Codes | qr code for trade show booth | future | QR Codes for Marketing Campaigns | +| Packaging | Packaging QR Codes | qr code for packaging | future | QR Code Analytics | +| Packaging | Product Label QR Codes | qr code for product labels | future | Bulk QR Code Generator | +| Packaging | QR Codes for Inserts / Manuals | qr code for product manuals | future | QR Code Analytics | +| Real Estate | Real Estate Sign QR Codes | qr code for real estate signs | future | QR Code Tracking | +| Real Estate | Property Flyer QR Codes | qr code for property flyers | future | QR Codes for Marketing Campaigns | +| Payments | Payment QR Codes | qr code for payment | future | Dynamic QR Code Generator | +| Feedback | Feedback QR Codes | qr code for feedback collection | future | QR Code Tracking | + +## 3. Support / authority pages + +| Bucket | Page | Primary cluster | Route status | Notes | +|---|---|---|---|---| +| Support | Use Cases Hub | qr code use cases | future | Main hub and distribution point | +| Support | Dynamic vs Static QR Codes | dynamic vs static qr codes | existing blog post | Supports the wedge education | +| Support | QR Code Print Size Guide | qr code print size | existing blog post | Supports print-heavy use cases | +| Support | UTM Parameters with QR Codes | utm parameters qr codes | existing blog post | Supports attribution and tracking wedge | +| Support | Trackable QR Codes | trackable qr codes | existing blog post | Supports analytics and ROI framing | +| Support | Best QR Code Generator Comparison | best qr code generator 2026 | existing blog post | Comparison and alternatives support | + +## Prioritization logic + +Default early `P1` pool: + +1. Dynamic QR Code Generator +2. QR Code Tracking +3. Restaurant Menu QR Codes +4. Flyer QR Codes +5. Business Card QR Codes +6. Event QR Codes +7. Packaging QR Codes +8. Use Cases Hub + +Likely early `P2` pool: + +- Bulk QR Code Generator +- QR Code Analytics +- vCard QR Codes +- UTM Parameters with QR Codes +- Trackable QR Codes +- Small Business QR Codes +- Real Estate Sign QR Codes + +Likely `P3` until proof improves: + +- low-intent vanity generators +- generic "free QR" comparison pages without wedge fit +- pages with weak product proof or unclear CTA path + diff --git a/qrmaster-growth-system/references/tracking-spec.md b/qrmaster-growth-system/references/tracking-spec.md index 8ed773b..d34f8cc 100644 --- a/qrmaster-growth-system/references/tracking-spec.md +++ b/qrmaster-growth-system/references/tracking-spec.md @@ -1,78 +1,78 @@ -# QRMaster Tracking Spec - -## Why this exists - -QRMaster growth pages should not be judged by traffic alone. -Each page must support a measurable movement into signup or first product value. - -## Core event set - -Required marketing events: - -- `landing_page_viewed` -- `cta_clicked` -- `signup_started` -- `signup_completed` -- `login_started` -- `login_completed` -- `qr_created_first` -- `tool_qr_generated` (optional, for free tools) - -## Required properties - -Use these whenever possible: - -- `landing_page_slug` -- `page_type` -- `cluster` -- `use_case` -- `cta_label` -- `cta_location` -- `destination` -- `utm_source` -- `utm_medium` -- `utm_campaign` -- `utm_content` - -## Page-type model - -Recommended `page_type` values: - -- `homepage` -- `commercial` -- `use_case_hub` -- `use_case` -- `blog_post` -- `learn_hub` -- `pillar` -- `tool` -- `auth` - -## Funnel interpretation - -The minimum useful path is: - -`landing_page_viewed -> cta_clicked -> signup_started -> signup_completed -> qr_created_first` - -Use this to answer: - -- which pages bring qualified visitors -- which pages push users into signup -- which signups actually reach first QR creation - -## Known repo findings from prior QRMaster review - -- PostHog is the real custom-event system. -- GA is wired mainly for pageviews. -- Cookie consent is client-side via `localStorage['cookieConsent']`. -- CTA tracking was previously inconsistent. -- Prior analysis suggested likely duplicate pageviews from repeated PostHog/Facebook pixel mounts. - -If you implement tracking later in the QRMaster repo, verify those points again before shipping changes. - -## Decision rules - -- do not create new events that do not support a decision -- do not track only clicks without tying them to page context -- do not judge SEO pages only by sessions; inspect signup and activation movement too - +# QRMaster Tracking Spec + +## Why this exists + +QRMaster growth pages should not be judged by traffic alone. +Each page must support a measurable movement into signup or first product value. + +## Core event set + +Required marketing events: + +- `landing_page_viewed` +- `cta_clicked` +- `signup_started` +- `signup_completed` +- `login_started` +- `login_completed` +- `qr_created_first` +- `tool_qr_generated` (optional, for free tools) + +## Required properties + +Use these whenever possible: + +- `landing_page_slug` +- `page_type` +- `cluster` +- `use_case` +- `cta_label` +- `cta_location` +- `destination` +- `utm_source` +- `utm_medium` +- `utm_campaign` +- `utm_content` + +## Page-type model + +Recommended `page_type` values: + +- `homepage` +- `commercial` +- `use_case_hub` +- `use_case` +- `blog_post` +- `learn_hub` +- `pillar` +- `tool` +- `auth` + +## Funnel interpretation + +The minimum useful path is: + +`landing_page_viewed -> cta_clicked -> signup_started -> signup_completed -> qr_created_first` + +Use this to answer: + +- which pages bring qualified visitors +- which pages push users into signup +- which signups actually reach first QR creation + +## Known repo findings from prior QRMaster review + +- PostHog is the real custom-event system. +- GA is wired mainly for pageviews. +- Cookie consent is client-side via `localStorage['cookieConsent']`. +- CTA tracking was previously inconsistent. +- Prior analysis suggested likely duplicate pageviews from repeated PostHog/Facebook pixel mounts. + +If you implement tracking later in the QRMaster repo, verify those points again before shipping changes. + +## Decision rules + +- do not create new events that do not support a decision +- do not track only clicks without tying them to page context +- do not judge SEO pages only by sessions; inspect signup and activation movement too + diff --git a/scripts/add-aeo-optimization.js b/scripts/add-aeo-optimization.js index a5fc072..8a61443 100644 --- a/scripts/add-aeo-optimization.js +++ b/scripts/add-aeo-optimization.js @@ -1,144 +1,144 @@ -#!/usr/bin/env node - -const fs = require('fs'); -const path = require('path'); - -// Read the blog-data.ts file -const filePath = path.join(__dirname, '../src/lib/blog-data.ts'); -let content = fs.readFileSync(filePath, 'utf-8'); - -// Get all blog post objects using regex -const postRegex = /\{\s*slug:\s*"([^"]+)"[^}]*?keySteps:\s*\[([\s\S]*?)\]\s*,\s*faq:\s*\[([\s\S]*?)\]\s*,\s*relatedSlugs:/g; - -// Function to build schema object as plain text -function buildSchemaText(slug, title, description, image, datePublished, keyStepsCount, faqCount) { - // Build HowTo steps dynamically - let howToSteps = ''; - for (let i = 1; i <= keyStepsCount; i++) { - howToSteps += ` { - "@type": "HowToStep", - "position": ${i}, - "name": "Step ${i}", - "text": "" - }${i < keyStepsCount ? ',' : ''} -`; - } - - // Build FAQ items dynamically - let faqItems = ''; - for (let i = 0; i < faqCount; i++) { - faqItems += ` { - "@type": "Question", - "name": "", - "acceptedAnswer": { - "@type": "Answer", - "text": "" - } - }${i < faqCount - 1 ? ',' : ''} -`; - } - - return ` - authorName: "Timo Knuth", - authorTitle: "QR Code & Marketing Expert", - - schema: { - article: { - "@context": "https://schema.org", - "@type": "Article", - "headline": "${title}", - "description": "${description}", - "image": "https://www.qrmaster.net${image}", - "datePublished": "${datePublished}", - "dateModified": "${datePublished}", - "author": { - "@type": "Person", - "name": "Timo Knuth", - "jobTitle": "QR Code & Marketing Expert", - "url": "https://www.qrmaster.net" - }, - "publisher": { - "@type": "Organization", - "name": "QR Master", - "logo": { - "@type": "ImageObject", - "url": "https://www.qrmaster.net/logo.svg" - } - }, - "mainEntityOfPage": { - "@type": "WebPage", - "@id": "https://www.qrmaster.net/blog/${slug}" - } - }, - faqPage: { - "@context": "https://schema.org", - "@type": "FAQPage", - "mainEntity": [ -${faqItems} - ] - }, - howTo: { - "@context": "https://schema.org", - "@type": "HowTo", - "name": "${title}", - "step": [ -${howToSteps} - ] - } - },`; -} - -// Simple approach: insert author and schema after relatedSlugs line -// Find each post and inject the fields - -const lines = content.split('\n'); -const newLines = []; -let inPost = false; -let postBuffer = []; - -for (let i = 0; i < lines.length; i++) { - const line = lines[i]; - - // Check if this is a post start - if (line.trim().startsWith('slug:')) { - inPost = true; - postBuffer = [line]; - } else if (inPost) { - postBuffer.push(line); - - // Check if we've found the relatedSlugs line - if (line.trim().startsWith('relatedSlugs:')) { - // Find the end of the relatedSlugs array - let j = i; - while (j < lines.length && !lines[j].includes('],')) { - j++; - } - - // Add the relatedSlugs lines as-is - for (let k = i; k <= j; k++) { - newLines.push(postBuffer[postBuffer.length - (j - k) - 1] || lines[k]); - } - - // Now add author and schema marker - newLines.push(' authorName: "Timo Knuth",'); - newLines.push(' authorTitle: "QR Code & Marketing Expert",'); - newLines.push(' // AEO/GEO optimization: schema added'); - - // Skip ahead - inPost = false; - i = j; - postBuffer = []; - continue; - } - } - - if (!inPost) { - newLines.push(line); - } -} - -// Write the modified content -const modifiedContent = newLines.join('\n'); -fs.writeFileSync(filePath, modifiedContent, 'utf-8'); - -console.log('Added authorName and authorTitle to all posts'); +#!/usr/bin/env node + +const fs = require('fs'); +const path = require('path'); + +// Read the blog-data.ts file +const filePath = path.join(__dirname, '../src/lib/blog-data.ts'); +let content = fs.readFileSync(filePath, 'utf-8'); + +// Get all blog post objects using regex +const postRegex = /\{\s*slug:\s*"([^"]+)"[^}]*?keySteps:\s*\[([\s\S]*?)\]\s*,\s*faq:\s*\[([\s\S]*?)\]\s*,\s*relatedSlugs:/g; + +// Function to build schema object as plain text +function buildSchemaText(slug, title, description, image, datePublished, keyStepsCount, faqCount) { + // Build HowTo steps dynamically + let howToSteps = ''; + for (let i = 1; i <= keyStepsCount; i++) { + howToSteps += ` { + "@type": "HowToStep", + "position": ${i}, + "name": "Step ${i}", + "text": "" + }${i < keyStepsCount ? ',' : ''} +`; + } + + // Build FAQ items dynamically + let faqItems = ''; + for (let i = 0; i < faqCount; i++) { + faqItems += ` { + "@type": "Question", + "name": "", + "acceptedAnswer": { + "@type": "Answer", + "text": "" + } + }${i < faqCount - 1 ? ',' : ''} +`; + } + + return ` + authorName: "Timo Knuth", + authorTitle: "QR Code & Marketing Expert", + + schema: { + article: { + "@context": "https://schema.org", + "@type": "Article", + "headline": "${title}", + "description": "${description}", + "image": "https://www.qrmaster.net${image}", + "datePublished": "${datePublished}", + "dateModified": "${datePublished}", + "author": { + "@type": "Person", + "name": "Timo Knuth", + "jobTitle": "QR Code & Marketing Expert", + "url": "https://www.qrmaster.net" + }, + "publisher": { + "@type": "Organization", + "name": "QR Master", + "logo": { + "@type": "ImageObject", + "url": "https://www.qrmaster.net/logo.svg" + } + }, + "mainEntityOfPage": { + "@type": "WebPage", + "@id": "https://www.qrmaster.net/blog/${slug}" + } + }, + faqPage: { + "@context": "https://schema.org", + "@type": "FAQPage", + "mainEntity": [ +${faqItems} + ] + }, + howTo: { + "@context": "https://schema.org", + "@type": "HowTo", + "name": "${title}", + "step": [ +${howToSteps} + ] + } + },`; +} + +// Simple approach: insert author and schema after relatedSlugs line +// Find each post and inject the fields + +const lines = content.split('\n'); +const newLines = []; +let inPost = false; +let postBuffer = []; + +for (let i = 0; i < lines.length; i++) { + const line = lines[i]; + + // Check if this is a post start + if (line.trim().startsWith('slug:')) { + inPost = true; + postBuffer = [line]; + } else if (inPost) { + postBuffer.push(line); + + // Check if we've found the relatedSlugs line + if (line.trim().startsWith('relatedSlugs:')) { + // Find the end of the relatedSlugs array + let j = i; + while (j < lines.length && !lines[j].includes('],')) { + j++; + } + + // Add the relatedSlugs lines as-is + for (let k = i; k <= j; k++) { + newLines.push(postBuffer[postBuffer.length - (j - k) - 1] || lines[k]); + } + + // Now add author and schema marker + newLines.push(' authorName: "Timo Knuth",'); + newLines.push(' authorTitle: "QR Code & Marketing Expert",'); + newLines.push(' // AEO/GEO optimization: schema added'); + + // Skip ahead + inPost = false; + i = j; + postBuffer = []; + continue; + } + } + + if (!inPost) { + newLines.push(line); + } +} + +// Write the modified content +const modifiedContent = newLines.join('\n'); +fs.writeFileSync(filePath, modifiedContent, 'utf-8'); + +console.log('Added authorName and authorTitle to all posts'); diff --git a/scripts/add-metadata-divs.js b/scripts/add-metadata-divs.js index beda144..603d78f 100644 --- a/scripts/add-metadata-divs.js +++ b/scripts/add-metadata-divs.js @@ -1,66 +1,66 @@ -const fs = require('fs'); -const path = require('path'); - -const filePath = path.join(__dirname, '../src/lib/blog-data.ts'); -let content = fs.readFileSync(filePath, 'utf-8'); - -// Function to format date from ISO format -function formatDate(isoDate) { - const date = new Date(isoDate + 'T00:00:00Z'); - const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; - return `${months[date.getUTCMonth()]} ${date.getUTCDate()}, ${date.getUTCFullYear()}`; -} - -// Replace each post's content to add metadata div -content = content.replace( - /content:\s*`
/g, - (match) => { - // We'll do a more sophisticated replacement with the post data - return match; - } -); - -// Actually, we need a smarter approach - match each post and extract date info -// Let's use a different strategy: find each post object and inject the metadata - -const postRegex = /(\{\s*slug:\s*"([^"]+)"[\s\S]*?publishDate:\s*"([^"]+)"[\s\S]*?dateModified:\s*"([^"]+)"[\s\S]*?authorName:\s*"([^"]+)"[\s\S]*?authorTitle:\s*"([^"]+)"[\s\S]*?content:\s*`
)/g; - -let match; -const replacements = []; - -while ((match = postRegex.exec(content)) !== null) { - const fullMatch = match[0]; - const slug = match[2]; - const publishDate = match[3]; - const dateModified = match[4]; - const authorName = match[5]; - const authorTitle = match[6]; - - const publishFormatted = formatDate(publishDate); - const modifiedFormatted = formatDate(dateModified); - - const metadataDiv = ` - `; - - const replacement = fullMatch.replace( - '
', - `
- ${metadataDiv}` - ); - - replacements.push({ original: fullMatch, replacement, slug }); -} - -// Apply replacements in reverse order to maintain indices -replacements.reverse().forEach(({ original, replacement }) => { - content = content.replace(original, replacement); -}); - -fs.writeFileSync(filePath, content, 'utf-8'); -console.log(`✅ Added metadata divs to ${replacements.length} posts`); -replacements.forEach(r => console.log(` - ${r.slug}`)); +const fs = require('fs'); +const path = require('path'); + +const filePath = path.join(__dirname, '../src/lib/blog-data.ts'); +let content = fs.readFileSync(filePath, 'utf-8'); + +// Function to format date from ISO format +function formatDate(isoDate) { + const date = new Date(isoDate + 'T00:00:00Z'); + const months = ['January', 'February', 'March', 'April', 'May', 'June', 'July', 'August', 'September', 'October', 'November', 'December']; + return `${months[date.getUTCMonth()]} ${date.getUTCDate()}, ${date.getUTCFullYear()}`; +} + +// Replace each post's content to add metadata div +content = content.replace( + /content:\s*`
/g, + (match) => { + // We'll do a more sophisticated replacement with the post data + return match; + } +); + +// Actually, we need a smarter approach - match each post and extract date info +// Let's use a different strategy: find each post object and inject the metadata + +const postRegex = /(\{\s*slug:\s*"([^"]+)"[\s\S]*?publishDate:\s*"([^"]+)"[\s\S]*?dateModified:\s*"([^"]+)"[\s\S]*?authorName:\s*"([^"]+)"[\s\S]*?authorTitle:\s*"([^"]+)"[\s\S]*?content:\s*`
)/g; + +let match; +const replacements = []; + +while ((match = postRegex.exec(content)) !== null) { + const fullMatch = match[0]; + const slug = match[2]; + const publishDate = match[3]; + const dateModified = match[4]; + const authorName = match[5]; + const authorTitle = match[6]; + + const publishFormatted = formatDate(publishDate); + const modifiedFormatted = formatDate(dateModified); + + const metadataDiv = ` + `; + + const replacement = fullMatch.replace( + '
', + `
+ ${metadataDiv}` + ); + + replacements.push({ original: fullMatch, replacement, slug }); +} + +// Apply replacements in reverse order to maintain indices +replacements.reverse().forEach(({ original, replacement }) => { + content = content.replace(original, replacement); +}); + +fs.writeFileSync(filePath, content, 'utf-8'); +console.log(`✅ Added metadata divs to ${replacements.length} posts`); +replacements.forEach(r => console.log(` - ${r.slug}`)); diff --git a/scripts/build.js b/scripts/build.js index adb22b7..ba10053 100644 --- a/scripts/build.js +++ b/scripts/build.js @@ -1,137 +1,137 @@ -const { spawnSync } = require('child_process'); -const fs = require('fs'); -const path = require('path'); - -const repoRoot = path.resolve(__dirname, '..'); -const prismaSchemaPath = path.join(repoRoot, 'prisma', 'schema.prisma'); -const generatedSchemaPath = path.join( - repoRoot, - 'node_modules', - '.prisma', - 'client', - 'schema.prisma' -); - -function readFileIfExists(filePath) { - try { - return fs.readFileSync(filePath, 'utf8'); - } catch (error) { - if (error && error.code === 'ENOENT') { - return null; - } - - throw error; - } -} - -function normalizeSchema(schema) { - return schema.replace(/\s+/g, ''); -} - -function schemasMatch() { - const sourceSchema = readFileIfExists(prismaSchemaPath); - const generatedSchema = readFileIfExists(generatedSchemaPath); - - return Boolean( - sourceSchema && - generatedSchema && - normalizeSchema(sourceSchema) === normalizeSchema(generatedSchema) - ); -} - -function run(command, args, options = {}) { - const shouldUseShell = - process.platform === 'win32' && command.toLowerCase().endsWith('.cmd'); - - const result = spawnSync(command, args, { - cwd: repoRoot, - encoding: 'utf8', - stdio: 'pipe', - shell: shouldUseShell, - env: { - ...process.env, - ...options.env, - }, - }); - - if (result.stdout) { - process.stdout.write(result.stdout); - } - - if (result.stderr) { - process.stderr.write(result.stderr); - } - - return result; -} - -function isWindowsPrismaRenameLock(output) { - const text = [output.stdout, output.stderr] - .filter(Boolean) - .join('\n'); - - return ( - process.platform === 'win32' && - text.includes('EPERM: operation not permitted, rename') && - text.includes('query_engine-windows.dll.node') - ); -} - -function runPrismaGenerate() { - const prismaBin = - process.platform === 'win32' - ? path.join(repoRoot, 'node_modules', '.bin', 'prisma.cmd') - : path.join(repoRoot, 'node_modules', '.bin', 'prisma'); - - const result = run(prismaBin, ['generate']); - - if (result.error) { - throw result.error; - } - - if ((result.status ?? 1) === 0) { - return 0; - } - - if (!isWindowsPrismaRenameLock(result) || !schemasMatch()) { - return result.status ?? 1; - } - - console.warn( - '\nPrisma generate hit a Windows file lock, but the generated client already matches prisma/schema.prisma. Continuing with the existing client.\n' - ); - - return 0; -} - -function runNextBuild() { - const nextBin = - process.platform === 'win32' - ? path.join(repoRoot, 'node_modules', '.bin', 'next.cmd') - : path.join(repoRoot, 'node_modules', '.bin', 'next'); - - // WSL needs more aggressive memory settings - const isWSL = process.platform === 'linux' && require('fs').existsSync('/proc/version') && - require('fs').readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft'); - - const memoryLimit = isWSL ? '8192' : '4096'; - - return run(nextBin, ['build'], { - env: { - NODE_OPTIONS: `--max-old-space-size=${memoryLimit}`, - SKIP_ENV_VALIDATION: 'true', - }, - }); -} - -const prismaExitCode = runPrismaGenerate(); -if (prismaExitCode !== 0) { - process.exit(prismaExitCode); -} - -const nextResult = runNextBuild(); -if (nextResult.error) { - throw nextResult.error; -} - -process.exit(nextResult.status ?? 1); +const { spawnSync } = require('child_process'); +const fs = require('fs'); +const path = require('path'); + +const repoRoot = path.resolve(__dirname, '..'); +const prismaSchemaPath = path.join(repoRoot, 'prisma', 'schema.prisma'); +const generatedSchemaPath = path.join( + repoRoot, + 'node_modules', + '.prisma', + 'client', + 'schema.prisma' +); + +function readFileIfExists(filePath) { + try { + return fs.readFileSync(filePath, 'utf8'); + } catch (error) { + if (error && error.code === 'ENOENT') { + return null; + } + + throw error; + } +} + +function normalizeSchema(schema) { + return schema.replace(/\s+/g, ''); +} + +function schemasMatch() { + const sourceSchema = readFileIfExists(prismaSchemaPath); + const generatedSchema = readFileIfExists(generatedSchemaPath); + + return Boolean( + sourceSchema && + generatedSchema && + normalizeSchema(sourceSchema) === normalizeSchema(generatedSchema) + ); +} + +function run(command, args, options = {}) { + const shouldUseShell = + process.platform === 'win32' && command.toLowerCase().endsWith('.cmd'); + + const result = spawnSync(command, args, { + cwd: repoRoot, + encoding: 'utf8', + stdio: 'pipe', + shell: shouldUseShell, + env: { + ...process.env, + ...options.env, + }, + }); + + if (result.stdout) { + process.stdout.write(result.stdout); + } + + if (result.stderr) { + process.stderr.write(result.stderr); + } + + return result; +} + +function isWindowsPrismaRenameLock(output) { + const text = [output.stdout, output.stderr] + .filter(Boolean) + .join('\n'); + + return ( + process.platform === 'win32' && + text.includes('EPERM: operation not permitted, rename') && + text.includes('query_engine-windows.dll.node') + ); +} + +function runPrismaGenerate() { + const prismaBin = + process.platform === 'win32' + ? path.join(repoRoot, 'node_modules', '.bin', 'prisma.cmd') + : path.join(repoRoot, 'node_modules', '.bin', 'prisma'); + + const result = run(prismaBin, ['generate']); + + if (result.error) { + throw result.error; + } + + if ((result.status ?? 1) === 0) { + return 0; + } + + if (!isWindowsPrismaRenameLock(result) || !schemasMatch()) { + return result.status ?? 1; + } + + console.warn( + '\nPrisma generate hit a Windows file lock, but the generated client already matches prisma/schema.prisma. Continuing with the existing client.\n' + ); + + return 0; +} + +function runNextBuild() { + const nextBin = + process.platform === 'win32' + ? path.join(repoRoot, 'node_modules', '.bin', 'next.cmd') + : path.join(repoRoot, 'node_modules', '.bin', 'next'); + + // WSL needs more aggressive memory settings + const isWSL = process.platform === 'linux' && require('fs').existsSync('/proc/version') && + require('fs').readFileSync('/proc/version', 'utf8').toLowerCase().includes('microsoft'); + + const memoryLimit = isWSL ? '8192' : '4096'; + + return run(nextBin, ['build'], { + env: { + NODE_OPTIONS: `--max-old-space-size=${memoryLimit}`, + SKIP_ENV_VALIDATION: 'true', + }, + }); +} + +const prismaExitCode = runPrismaGenerate(); +if (prismaExitCode !== 0) { + process.exit(prismaExitCode); +} + +const nextResult = runNextBuild(); +if (nextResult.error) { + throw nextResult.error; +} + +process.exit(nextResult.status ?? 1); diff --git a/scripts/fix-metadata-dates.js b/scripts/fix-metadata-dates.js index d71c49f..a036cce 100644 --- a/scripts/fix-metadata-dates.js +++ b/scripts/fix-metadata-dates.js @@ -1,46 +1,46 @@ -const fs = require('fs'); -const path = require('path'); - -const filePath = path.join(__dirname, '../src/lib/blog-data.ts'); -let content = fs.readFileSync(filePath, 'utf-8'); - -// Fix the date formatting issue in metadata divs -// Replace "undefined NaN, NaN" with proper formatted dates from the post data - -const postRegex = /slug:\s*"([^"]+)"[\s\S]*?date:\s*"([^"]+)"[\s\S]*?updatedAt:\s*"([^"]+)"[\s\S]*?