feat: Implement new root layout with SEO metadata and analytics, add various Open Graph images and a favicon, and remove old documentation files.
187
CHANGELOG.md
|
|
@ -1,187 +0,0 @@
|
|||
# Changelog - PostgreSQL Migration
|
||||
|
||||
## [2.0.0] - 2024-10-13
|
||||
|
||||
### 🎉 Major Changes - Supabase to PostgreSQL Migration
|
||||
|
||||
#### Removed
|
||||
- ❌ **Supabase dependency** - Removed all Supabase-specific configurations
|
||||
- ❌ **DIRECT_URL** - Removed connection pooling URL (Supabase-specific)
|
||||
- ❌ **External database dependency** - Now fully self-hosted
|
||||
|
||||
#### Added
|
||||
- ✅ **PostgreSQL 16 in Docker** - Local PostgreSQL database with Docker support
|
||||
- ✅ **Redis 7** - Caching and rate limiting with Redis
|
||||
- ✅ **Adminer** - Database management UI (http://localhost:8080)
|
||||
- ✅ **Docker Compose setups** - Both development and production configurations
|
||||
- ✅ **Database initialization** - Automated database setup with extensions
|
||||
- ✅ **Complete documentation** - Multiple guides for setup and migration
|
||||
- ✅ **Setup scripts** - Automated setup for both Linux/Mac and Windows
|
||||
- ✅ **npm scripts** - Convenient Docker commands via npm
|
||||
|
||||
#### Modified Files
|
||||
- 📝 `prisma/schema.prisma` - Removed directUrl field
|
||||
- 📝 `src/lib/env.ts` - Removed DIRECT_URL, updated DATABASE_URL default
|
||||
- 📝 `docker-compose.yml` - Complete rewrite with PostgreSQL, Redis, and networking
|
||||
- 📝 `Dockerfile` - Enhanced with proper PostgreSQL support
|
||||
- 📝 `package.json` - Added Docker scripts and tsx dependency
|
||||
- 📝 `README.md` - Updated with new setup instructions
|
||||
|
||||
#### New Files
|
||||
- 📄 `docker-compose.dev.yml` - Development environment (database only)
|
||||
- 📄 `docker/init-db.sh` - PostgreSQL initialization script
|
||||
- 📄 `docker/README.md` - Docker-specific documentation
|
||||
- 📄 `DOCKER_SETUP.md` - Comprehensive Docker setup guide
|
||||
- 📄 `MIGRATION_FROM_SUPABASE.md` - Step-by-step migration guide
|
||||
- 📄 `env.example` - Environment variable template
|
||||
- 📄 `.dockerignore` - Docker build optimization
|
||||
- 📄 `scripts/setup.sh` - Quick setup script (Linux/Mac)
|
||||
- 📄 `scripts/setup.ps1` - Quick setup script (Windows)
|
||||
- 📄 `CHANGELOG.md` - This file
|
||||
|
||||
### 📦 Docker Services
|
||||
|
||||
#### PostgreSQL Database
|
||||
- **Image**: postgres:16-alpine
|
||||
- **Port**: 5432
|
||||
- **Features**:
|
||||
- Health checks
|
||||
- Volume persistence
|
||||
- UTF-8 encoding
|
||||
- Extensions: uuid-ossp, pg_trgm
|
||||
|
||||
#### Redis Cache
|
||||
- **Image**: redis:7-alpine
|
||||
- **Port**: 6379
|
||||
- **Features**:
|
||||
- AOF persistence
|
||||
- 256MB max memory with LRU eviction
|
||||
- Health checks
|
||||
|
||||
#### Next.js Application
|
||||
- **Port**: 3000
|
||||
- **Features**:
|
||||
- Multi-stage build
|
||||
- Production optimization
|
||||
- Health checks
|
||||
- Automatic Prisma generation
|
||||
|
||||
#### Adminer (Development)
|
||||
- **Port**: 8080
|
||||
- **Features**:
|
||||
- Database management UI
|
||||
- Optional (dev profile)
|
||||
- Pre-configured for PostgreSQL
|
||||
|
||||
### 🚀 Quick Start
|
||||
|
||||
#### Development Mode
|
||||
```bash
|
||||
npm run docker:dev # Start database
|
||||
npm run db:migrate # Run migrations
|
||||
npm run dev # Start app
|
||||
```
|
||||
|
||||
#### Production Mode
|
||||
```bash
|
||||
npm run docker:prod # Start all services
|
||||
```
|
||||
|
||||
### 📚 Documentation
|
||||
|
||||
- **README.md** - Main documentation with quick start
|
||||
- **DOCKER_SETUP.md** - Complete Docker guide with troubleshooting
|
||||
- **MIGRATION_FROM_SUPABASE.md** - Migration guide from Supabase
|
||||
- **docker/README.md** - Docker commands and operations
|
||||
- **env.example** - Environment variable reference
|
||||
|
||||
### 🔧 New npm Scripts
|
||||
|
||||
```bash
|
||||
# Docker commands
|
||||
npm run docker:dev # Start development services
|
||||
npm run docker:dev:stop # Stop development services
|
||||
npm run docker:prod # Start production stack
|
||||
npm run docker:stop # Stop all services
|
||||
npm run docker:logs # View all logs
|
||||
npm run docker:db # PostgreSQL CLI
|
||||
npm run docker:redis # Redis CLI
|
||||
npm run docker:backup # Backup database
|
||||
```
|
||||
|
||||
### 🔐 Environment Variables
|
||||
|
||||
#### Required
|
||||
- `DATABASE_URL` - PostgreSQL connection string
|
||||
- `NEXTAUTH_SECRET` - NextAuth.js secret (generate with openssl)
|
||||
- `NEXTAUTH_URL` - Application URL
|
||||
- `IP_SALT` - Salt for IP hashing (generate with openssl)
|
||||
|
||||
#### Optional
|
||||
- `GOOGLE_CLIENT_ID` - Google OAuth client ID
|
||||
- `GOOGLE_CLIENT_SECRET` - Google OAuth secret
|
||||
- `REDIS_URL` - Redis connection string
|
||||
- `ENABLE_DEMO` - Enable demo mode
|
||||
|
||||
### 🎯 Benefits
|
||||
|
||||
1. **Full Control** - Own your data and infrastructure
|
||||
2. **No Vendor Lock-in** - Standard PostgreSQL
|
||||
3. **Lower Latency** - Local network speed
|
||||
4. **Cost Effective** - No monthly database fees
|
||||
5. **Privacy** - Data stays on your infrastructure
|
||||
6. **Development** - Easy local testing
|
||||
7. **Offline Capable** - Works without internet
|
||||
|
||||
### 🔄 Migration Path
|
||||
|
||||
1. Backup Supabase data
|
||||
2. Update codebase
|
||||
3. Start local PostgreSQL
|
||||
4. Restore data or run migrations
|
||||
5. Update environment variables
|
||||
6. Deploy
|
||||
|
||||
See [MIGRATION_FROM_SUPABASE.md](MIGRATION_FROM_SUPABASE.md) for detailed steps.
|
||||
|
||||
### ⚠️ Breaking Changes
|
||||
|
||||
- `DIRECT_URL` environment variable removed
|
||||
- Database now requires Docker or local PostgreSQL
|
||||
- Supabase-specific features removed
|
||||
|
||||
### 📊 Performance Improvements
|
||||
|
||||
- Local database reduces latency
|
||||
- Redis caching improves response times
|
||||
- Connection pooling via Prisma
|
||||
- Optimized Docker images
|
||||
|
||||
### 🐛 Bug Fixes
|
||||
|
||||
- Fixed database connection handling
|
||||
- Improved error messages
|
||||
- Better health checks
|
||||
|
||||
### 🔜 Future Enhancements
|
||||
|
||||
- [ ] PostgreSQL replication for HA
|
||||
- [ ] Redis Sentinel for failover
|
||||
- [ ] Automated backup scripts
|
||||
- [ ] Monitoring and alerting
|
||||
- [ ] Database performance tuning
|
||||
- [ ] Multi-region deployment
|
||||
|
||||
### 📝 Notes
|
||||
|
||||
- Default PostgreSQL password should be changed in production
|
||||
- Always backup data before migration
|
||||
- Review security settings before deployment
|
||||
- Set up automated backups in production
|
||||
|
||||
---
|
||||
|
||||
**Migration completed successfully!** 🎉
|
||||
|
||||
For support, see documentation or open an issue on GitHub.
|
||||
|
||||
|
|
@ -0,0 +1,266 @@
|
|||
# CLAUDE.md
|
||||
|
||||
This file provides guidance to Claude Code (claude.ai/code) when working with code in this repository.
|
||||
|
||||
## Project Overview
|
||||
|
||||
**QR Master** is a production-ready SaaS application for creating and managing QR codes with advanced analytics, Stripe payment integration, and multi-tier subscription plans (FREE, PRO, BUSINESS).
|
||||
|
||||
## Tech Stack
|
||||
|
||||
- **Frontend**: Next.js 14 (App Router), React 18, TypeScript, Tailwind CSS, Framer Motion
|
||||
- **Backend**: Next.js API Routes, Prisma ORM, PostgreSQL
|
||||
- **Authentication**: NextAuth.js v4 (Credentials + Google OAuth)
|
||||
- **Payments**: Stripe (subscriptions, webhooks)
|
||||
- **Cache**: Redis (optional)
|
||||
- **Analytics**: PostHog (optional), QR scan tracking with IP hashing
|
||||
- **QR Generation**: qrcode, qr-code-styling libraries
|
||||
- **Bulk Operations**: Papa Parse (CSV), ExcelJS, JSZip
|
||||
- **Storage**: AWS S3 (via @aws-sdk)
|
||||
|
||||
## Quick Development Commands
|
||||
|
||||
```bash
|
||||
# Setup
|
||||
npm install
|
||||
npm run docker:dev # Start PostgreSQL & Redis in Docker
|
||||
npx prisma migrate dev # Run migrations
|
||||
npm run db:seed # Seed demo data
|
||||
|
||||
# Development
|
||||
npm run dev # Start dev server (port 3050)
|
||||
npm run lint # Run ESLint
|
||||
|
||||
# Database
|
||||
npm run db:migrate # Run pending migrations (dev mode)
|
||||
npm run db:deploy # Apply migrations (production)
|
||||
npm run db:studio # Open Prisma Studio UI
|
||||
npx prisma migrate reset # Reset database (drops, recreates, seeds)
|
||||
|
||||
# Docker
|
||||
npm run docker:prod # Start full production stack
|
||||
npm run docker:dev:stop # Stop dev services
|
||||
npm run docker:logs # View logs
|
||||
npm run docker:db # PostgreSQL CLI
|
||||
npm run docker:redis # Redis CLI
|
||||
npm run docker:backup # Backup database to SQL file
|
||||
|
||||
# Build & Deploy
|
||||
npm run build # Production build
|
||||
npm run start # Start production server
|
||||
```
|
||||
|
||||
## Project Structure
|
||||
|
||||
```
|
||||
src/
|
||||
├── app/
|
||||
│ └── (main)/
|
||||
│ ├── (app)/ # Authenticated app pages (dashboard, bulk-creation, settings)
|
||||
│ ├── (auth)/ # Auth pages (login, signup, forgot-password)
|
||||
│ ├── (marketing)/ # Public pages & marketing tools
|
||||
│ │ └── tools/ # QR code type-specific generators (20+ tools)
|
||||
│ └── api/ # API routes organized by domain
|
||||
│ ├── auth/ # Authentication (signin, signup, OAuth, password reset)
|
||||
│ ├── qrs/ # QR code CRUD (GET, POST, PATCH, DELETE)
|
||||
│ ├── analytics/ # Analytics summary endpoint
|
||||
│ ├── stripe/ # Payment webhooks & session management
|
||||
│ ├── user/ # User profile, plan, stats, password
|
||||
│ ├── newsletter/ # Subscription management
|
||||
│ └── [other]/ # admin, feedback, leads, bulk, etc.
|
||||
├── components/
|
||||
│ ├── ui/ # Reusable UI primitives (Card, Dialog, Input, etc.)
|
||||
│ ├── generator/ # QR code generator components
|
||||
│ ├── analytics/ # Charts, maps, data visualization
|
||||
│ ├── dashboard/ # Dashboard-specific components
|
||||
│ ├── settings/ # Settings & account components
|
||||
│ └── SessionProvider.tsx # NextAuth session provider
|
||||
├── lib/
|
||||
│ ├── auth.ts # NextAuth configuration
|
||||
│ ├── db.ts # Prisma client
|
||||
│ ├── stripe.ts # Stripe utilities
|
||||
│ ├── email.ts # Email sending (Resend)
|
||||
│ ├── qr.ts # QR code generation utilities
|
||||
│ ├── geo.ts # Geolocation utilities
|
||||
│ ├── hash.ts # IP hashing (privacy)
|
||||
│ ├── csrf.ts # CSRF token generation/validation
|
||||
│ ├── rateLimit.ts # Rate limiting utilities
|
||||
│ ├── schema.ts # Zod validation schemas
|
||||
│ ├── validationSchemas.ts # Additional validation
|
||||
│ └── cookieConfig.ts # Cookie configuration
|
||||
├── hooks/
|
||||
│ ├── useCsrf.ts # CSRF token hook
|
||||
│ └── useTranslation.ts # i18n hook
|
||||
└── types/
|
||||
└── analytics.ts # Analytics type definitions
|
||||
```
|
||||
|
||||
## Database Architecture
|
||||
|
||||
**Key Models** (see `prisma/schema.prisma`):
|
||||
|
||||
- **User**: User accounts with Stripe subscription fields
|
||||
- **QRCode**: QR code records (static/dynamic, multiple content types)
|
||||
- **QRScan**: Analytics data (ts, ipHash, device, os, country, UTM params)
|
||||
- **Account/Session**: NextAuth authentication tables
|
||||
- **Integration**: Third-party integrations
|
||||
- **NewsletterSubscription**: Email subscribers
|
||||
- **Lead**: Lead generation data
|
||||
|
||||
**QR Code Types**: URL, VCARD, GEO, PHONE, SMS, TEXT, WHATSAPP, PDF, APP, COUPON, FEEDBACK
|
||||
|
||||
## API Architecture
|
||||
|
||||
### Authentication Flow
|
||||
- Credentials-based login/signup via `/api/auth/signup` and `/api/auth/simple-login`
|
||||
- Google OAuth via `/api/auth/google`
|
||||
- NextAuth.js session management at `/api/auth/[...nextauth]`
|
||||
- Password reset: `/api/auth/forgot-password` + `/api/auth/reset-password`
|
||||
|
||||
### QR Code Operations
|
||||
- **CRUD**: `GET/POST /api/qrs`, `GET/PATCH/DELETE /api/qrs/[id]`
|
||||
- **Static Generation**: `POST /api/qrs/static`
|
||||
- **Bulk Operations**: `POST /api/bulk/*` for CSV/Excel import
|
||||
- **Public Redirect**: `GET /r/[slug]` (redirect + analytics tracking)
|
||||
|
||||
### Payments
|
||||
- Stripe webhooks: `POST /api/stripe/webhook`
|
||||
- Checkout session: `POST /api/stripe/checkout` or `/api/stripe/create-checkout-session`
|
||||
- Customer portal: `POST /api/stripe/portal`
|
||||
- Subscription sync: `POST /api/stripe/sync-subscription`
|
||||
- Cancellation: `POST /api/stripe/cancel-subscription`
|
||||
|
||||
### Analytics
|
||||
- Summary endpoint: `GET /api/analytics/summary?qrId=<id>`
|
||||
- Scan tracking with hashed IP (GDPR-compliant)
|
||||
|
||||
## Key Implementation Patterns
|
||||
|
||||
### Authentication & Authorization
|
||||
- NextAuth.js v4 with Prisma adapter
|
||||
- Sessions stored in database
|
||||
- CSRF protection on all mutations (check `useCsrf` hook)
|
||||
- Password hashing with bcryptjs
|
||||
|
||||
### API Security
|
||||
- Rate limiting on sensitive endpoints (auth, payments)
|
||||
- CSRF tokens validated on POST/PATCH/DELETE
|
||||
- IP hashing for privacy (IP_SALT environment variable)
|
||||
- DNT header respected for analytics
|
||||
|
||||
### Database Operations
|
||||
- Prisma ORM for all database access
|
||||
- Migrations stored in `prisma/migrations/`
|
||||
- Seed script for demo data in `prisma/seed.ts`
|
||||
- Database indexes on frequently queried fields (userId, createdAt, etc.)
|
||||
|
||||
### QR Code Generation
|
||||
- `qrcode` library for basic generation
|
||||
- `qr-code-styling` for advanced customization
|
||||
- `qrcode.react` for inline React components
|
||||
- Canvas/SVG export via `html-to-image`, `jspdf`, `jszip`
|
||||
|
||||
### State & Validation
|
||||
- Zod schemas in `/lib/schema.ts` for runtime validation
|
||||
- TypeScript strict mode enabled
|
||||
- Prisma provides type safety at database layer
|
||||
|
||||
## Environment Variables
|
||||
|
||||
**Required**:
|
||||
- `DATABASE_URL` - PostgreSQL connection string
|
||||
- `NEXTAUTH_SECRET` - JWT encryption secret
|
||||
- `NEXTAUTH_URL` - Application URL (default: `http://localhost:3050`)
|
||||
- `IP_SALT` - Salt for IP hashing
|
||||
|
||||
**Optional but Important**:
|
||||
- `STRIPE_SECRET_KEY`, `STRIPE_WEBHOOK_SECRET`, `NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY`
|
||||
- `GOOGLE_CLIENT_ID`, `GOOGLE_CLIENT_SECRET` - OAuth
|
||||
- `REDIS_URL` - Redis connection
|
||||
- `NEXT_PUBLIC_POSTHOG_KEY`, `NEXT_PUBLIC_POSTHOG_HOST` - Analytics
|
||||
- `NEXT_PUBLIC_INDEXABLE` - Set to `true` for production (enables search engine indexing)
|
||||
|
||||
**Generate Secrets**:
|
||||
```bash
|
||||
openssl rand -base64 32 # NEXTAUTH_SECRET and IP_SALT
|
||||
```
|
||||
|
||||
## Common Tasks
|
||||
|
||||
### Adding a New QR Code Type
|
||||
1. Add type to `ContentType` enum in `prisma/schema.prisma`
|
||||
2. Create generator component in `src/components/generator/` or `src/app/(main)/(marketing)/tools/`
|
||||
3. Add validation schema in `src/lib/schema.ts`
|
||||
4. Create API endpoint if needed in `src/app/(main)/api/qrs/`
|
||||
|
||||
### Creating a New Marketing Tool Page
|
||||
1. Create page at `src/app/(main)/(marketing)/tools/[tool-name]/page.tsx`
|
||||
2. Create generator component in same directory
|
||||
3. Add SEO metadata in page component
|
||||
4. Tool should be static (no database) or use public API endpoints
|
||||
|
||||
### Adding a New API Endpoint
|
||||
1. Create route file in appropriate directory under `src/app/(main)/api/`
|
||||
2. Add Zod validation schema in `src/lib/schema.ts`
|
||||
3. Check authentication with `getServerSession()` if needed
|
||||
4. Implement rate limiting for sensitive operations
|
||||
5. Return typed responses with proper status codes
|
||||
|
||||
### Database Schema Changes
|
||||
1. Update `prisma/schema.prisma`
|
||||
2. Run `npx prisma migrate dev --name <migration-name>`
|
||||
3. This creates migration file and updates Prisma client
|
||||
4. Test with `npm run db:seed` if demo data affected
|
||||
|
||||
## Testing & Debugging
|
||||
|
||||
- Demo account (after seed): email: `demo@qrmaster.com`, password: `demo123`
|
||||
- Prisma Studio: `npm run db:studio` - visual database browser
|
||||
- API testing: Check `/src/app/(main)/api/` for examples
|
||||
- Frontend: Pages hot-reload on changes during `npm run dev`
|
||||
|
||||
## Performance Considerations
|
||||
|
||||
- PostgreSQL indexes on `QRCode(userId, createdAt)` and `QRScan(qrId, ts)`
|
||||
- Redis optional but recommended for caching analytics
|
||||
- Static export for marketing pages when possible
|
||||
- Image optimization enabled in `next.config.mjs`
|
||||
- Prisma connection pooling recommended for production
|
||||
|
||||
## Common Pitfalls
|
||||
|
||||
1. **Database Connection**: If "Can't reach database server", ensure Docker is running (`npm run docker:dev`)
|
||||
2. **Prisma Out of Sync**: Run `npx prisma generate` if TypeScript errors appear
|
||||
3. **Migration Conflicts**: Use `npx prisma migrate reset` to start fresh
|
||||
4. **Port 3050 in Use**: Change port in `package.json` dev script or kill process
|
||||
5. **Build Failures**: Check `NODE_OPTIONS='--max-old-space-size=4096'` in build script - set higher if needed
|
||||
|
||||
## SEO & Content
|
||||
|
||||
- Schema.org structured data implemented for products, organizations, FAQs
|
||||
- Breadcrumb navigation for UX/SEO
|
||||
- Meta tags configured per page
|
||||
- Open Graph images at `/api/og`
|
||||
- Sitemap generation via next-sitemap
|
||||
- Google Indexing API + IndexNow submission scripts available
|
||||
|
||||
## Deployment Notes
|
||||
|
||||
### Docker (Self-Hosted)
|
||||
```bash
|
||||
npm run docker:prod # Builds and starts full stack
|
||||
docker-compose exec web npx prisma migrate deploy # Run migrations in container
|
||||
```
|
||||
|
||||
### Vercel
|
||||
- Push to GitHub and import in Vercel dashboard
|
||||
- Set environment variables in Vercel settings
|
||||
- Requires external PostgreSQL database (Vercel Postgres, Supabase, etc.)
|
||||
- Redis is optional
|
||||
|
||||
## Additional Resources
|
||||
|
||||
- README.md - Detailed setup and feature overview
|
||||
- DOCKER_SETUP.md - Complete Docker deployment guide
|
||||
- prisma/schema.prisma - Database schema and relationships
|
||||
- env.example - Environment variable template
|
||||
|
|
@ -1,269 +0,0 @@
|
|||
# 🚀 Deployment Checklist für QR Master
|
||||
|
||||
Diese Checkliste enthält alle notwendigen Änderungen vor dem Push nach Gitea und dem Production Deployment.
|
||||
|
||||
---
|
||||
|
||||
## ✅ 1. Environment Variables (.env)
|
||||
|
||||
### Basis URLs ändern
|
||||
```bash
|
||||
# Von:
|
||||
NEXT_PUBLIC_APP_URL=http://localhost:3050
|
||||
NEXTAUTH_URL=http://localhost:3050
|
||||
|
||||
# Zu:
|
||||
NEXT_PUBLIC_APP_URL=https://www.qrmaster.net
|
||||
NEXTAUTH_URL=https://www.qrmaster.net
|
||||
```
|
||||
|
||||
### Secrets generieren (falls noch nicht geschehen)
|
||||
```bash
|
||||
# NEXTAUTH_SECRET (für JWT/Session Encryption)
|
||||
openssl rand -base64 32
|
||||
|
||||
# IP_SALT (für DSGVO-konforme IP-Hashing)
|
||||
openssl rand -base64 32
|
||||
```
|
||||
|
||||
Bereits generiert:
|
||||
- ✅ NEXTAUTH_SECRET: `PT8XVydC4v7QluCz/mV1yb7Y3docSFZeFDioJz4ZE98=`
|
||||
- ✅ IP_SALT: `j/aluIpzsgn5Z6cbF4conM6ApK5cj4jDagkswzfgQPc=`
|
||||
|
||||
### Database URLs
|
||||
```bash
|
||||
# Development (localhost):
|
||||
DATABASE_URL="postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public"
|
||||
DIRECT_URL="postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public"
|
||||
|
||||
# Production (anpassen an deinen Server):
|
||||
DATABASE_URL="postgresql://USER:PASSWORD@HOST:5432/qrmaster?schema=public"
|
||||
DIRECT_URL="postgresql://USER:PASSWORD@HOST:5432/qrmaster?schema=public"
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔐 2. Google OAuth Configuration
|
||||
|
||||
### Redirect URIs in Google Cloud Console hinzufügen
|
||||
|
||||
1. Gehe zu: https://console.cloud.google.com/apis/credentials
|
||||
2. Wähle deine OAuth 2.0 Client ID: `683784117141-ci1d928jo8f9g6i1isrveflmrinp92l4.apps.googleusercontent.com`
|
||||
3. Füge folgende **Authorized redirect URIs** hinzu:
|
||||
|
||||
```
|
||||
https://www.qrmaster.net/api/auth/callback/google
|
||||
```
|
||||
|
||||
**Optional** (für Staging/Testing):
|
||||
```
|
||||
http://localhost:3050/api/auth/callback/google
|
||||
https://staging.qrmaster.net/api/auth/callback/google
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 💳 3. Stripe Configuration
|
||||
|
||||
### ⚠️ WICHTIG: Von Test Mode zu Live Mode wechseln
|
||||
|
||||
#### Current (Test Mode):
|
||||
```bash
|
||||
STRIPE_SECRET_KEY=sk_test_51QYL7gP9xM...
|
||||
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_51QYL7gP9xM...
|
||||
```
|
||||
|
||||
#### Production (Live Mode):
|
||||
1. Gehe zu: https://dashboard.stripe.com/
|
||||
2. Wechsle von **Test Mode** zu **Live Mode** (Toggle oben rechts)
|
||||
3. Hole dir die **Live Keys**:
|
||||
- `API Keys` → `Secret key` (beginnt mit `sk_live_`)
|
||||
- `API Keys` → `Publishable key` (beginnt mit `pk_live_`)
|
||||
|
||||
```bash
|
||||
# Production Keys:
|
||||
STRIPE_SECRET_KEY=sk_live_XXXXX
|
||||
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_live_XXXXX
|
||||
```
|
||||
|
||||
#### Webhook Secret (Production)
|
||||
1. Erstelle einen neuen Webhook Endpoint: https://dashboard.stripe.com/webhooks
|
||||
2. Endpoint URL: `https://www.qrmaster.net/api/webhooks/stripe`
|
||||
3. Events to listen:
|
||||
- `checkout.session.completed`
|
||||
- `customer.subscription.updated`
|
||||
- `customer.subscription.deleted`
|
||||
- `invoice.payment_succeeded`
|
||||
- `invoice.payment_failed`
|
||||
4. Kopiere den **Signing Secret** (beginnt mit `whsec_`)
|
||||
|
||||
```bash
|
||||
STRIPE_WEBHOOK_SECRET=whsec_XXXXX
|
||||
```
|
||||
|
||||
#### Price IDs aktualisieren
|
||||
Erstelle Produkte und Preise in **Live Mode**:
|
||||
1. https://dashboard.stripe.com/products
|
||||
2. Erstelle "Pro" und "Business" Pläne
|
||||
3. Kopiere die Price IDs (beginnen mit `price_`)
|
||||
|
||||
```bash
|
||||
STRIPE_PRICE_ID_PRO_MONTHLY=price_XXXXX
|
||||
STRIPE_PRICE_ID_PRO_YEARLY=price_XXXXX
|
||||
STRIPE_PRICE_ID_BUSINESS_MONTHLY=price_XXXXX
|
||||
STRIPE_PRICE_ID_BUSINESS_YEARLY=price_XXXXX
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📧 4. Resend Email Configuration
|
||||
|
||||
### Domain Verification
|
||||
1. Gehe zu: https://resend.com/domains
|
||||
2. Füge Domain hinzu: `qrmaster.net`
|
||||
3. Konfiguriere DNS Records (SPF, DKIM, DMARC)
|
||||
4. Warte auf Verification
|
||||
|
||||
### From Email anpassen
|
||||
Aktuell verwendet alle Emails: `onboarding@resend.dev` (Resend's Test Domain)
|
||||
|
||||
Nach Domain Verification in `src/lib/email.ts` ändern:
|
||||
```typescript
|
||||
// Von:
|
||||
from: 'Timo from QR Master <onboarding@resend.dev>',
|
||||
|
||||
// Zu:
|
||||
from: 'Timo from QR Master <hello@qrmaster.net>',
|
||||
// oder
|
||||
from: 'Timo from QR Master <noreply@qrmaster.net>',
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔍 5. SEO Configuration
|
||||
|
||||
### Bereits korrekt konfiguriert ✅
|
||||
```bash
|
||||
NEXT_PUBLIC_INDEXABLE=true # ✅ Bereits gesetzt
|
||||
```
|
||||
|
||||
### Sitemap & robots.txt prüfen
|
||||
- Sitemap: `https://www.qrmaster.net/sitemap.xml`
|
||||
- Robots: `https://www.qrmaster.net/robots.txt`
|
||||
|
||||
Nach Deployment testen!
|
||||
|
||||
---
|
||||
|
||||
## 📊 6. PostHog Analytics (Optional)
|
||||
|
||||
Falls du PostHog nutzt:
|
||||
```bash
|
||||
NEXT_PUBLIC_POSTHOG_KEY=phc_XXXXX
|
||||
NEXT_PUBLIC_POSTHOG_HOST=https://us.i.posthog.com
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🐳 7. Docker Deployment
|
||||
|
||||
### docker-compose.yml prüfen
|
||||
Stelle sicher, dass alle ENV Variables korrekt gemappt sind:
|
||||
|
||||
```yaml
|
||||
environment:
|
||||
NEXTAUTH_URL: https://www.qrmaster.net
|
||||
NEXT_PUBLIC_APP_URL: https://www.qrmaster.net
|
||||
# ... weitere vars
|
||||
```
|
||||
|
||||
### Deployment Commands
|
||||
```bash
|
||||
# Build & Deploy
|
||||
docker-compose up -d --build
|
||||
|
||||
# Database Migration (nach erstem Deploy)
|
||||
docker-compose exec web npm run db:migrate
|
||||
|
||||
# Logs checken
|
||||
docker-compose logs -f web
|
||||
|
||||
# Health Check
|
||||
curl https://www.qrmaster.net
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🔒 8. Security Checklist
|
||||
|
||||
- [ ] ✅ NEXTAUTH_SECRET ist gesetzt und sicher (32+ Zeichen)
|
||||
- [ ] ✅ IP_SALT ist gesetzt und sicher
|
||||
- [ ] ⚠️ Stripe ist auf **Live Mode** umgestellt
|
||||
- [ ] ⚠️ Google OAuth Redirect URIs enthalten Production URL
|
||||
- [ ] ⚠️ Resend Domain ist verifiziert
|
||||
- [ ] ⚠️ Webhook Secrets sind für Production gesetzt
|
||||
- [ ] ⚠️ Database URLs zeigen auf Production DB
|
||||
- [ ] ⚠️ Keine Test/Dev Secrets in Production
|
||||
|
||||
---
|
||||
|
||||
## 📝 9. Vor dem Git Push
|
||||
|
||||
### Files prüfen
|
||||
```bash
|
||||
# .env sollte NICHT committet werden!
|
||||
git status
|
||||
|
||||
# Falls .env in Git ist:
|
||||
git rm --cached .env
|
||||
echo ".env" >> .gitignore
|
||||
```
|
||||
|
||||
### Sensible Daten entfernen
|
||||
- [ ] Keine API Keys im Code
|
||||
- [ ] Keine Secrets in Config Files
|
||||
- [ ] `.env` ist in `.gitignore`
|
||||
|
||||
---
|
||||
|
||||
## 🎯 10. Nach dem Deployment testen
|
||||
|
||||
### Funktionen testen
|
||||
1. **Google OAuth Login**: https://www.qrmaster.net/login
|
||||
2. **QR Code erstellen**: https://www.qrmaster.net/create
|
||||
3. **Stripe Checkout**: Testprodukt kaufen mit echten Stripe Test Cards
|
||||
4. **Email Delivery**: Password Reset testen
|
||||
5. **Analytics**: PostHog Events tracken
|
||||
|
||||
### Monitoring
|
||||
```bash
|
||||
# Server Logs
|
||||
docker-compose logs -f
|
||||
|
||||
# Database Status
|
||||
docker-compose exec db psql -U postgres -d qrmaster -c "SELECT COUNT(*) FROM \"User\";"
|
||||
|
||||
# Redis Status
|
||||
docker-compose exec redis redis-cli PING
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📞 Support Kontakte
|
||||
|
||||
- **Stripe Support**: https://support.stripe.com
|
||||
- **Google Cloud Support**: https://support.google.com/cloud
|
||||
- **Resend Support**: https://resend.com/docs
|
||||
- **Next.js Docs**: https://nextjs.org/docs
|
||||
|
||||
---
|
||||
|
||||
## ✨ Deployment erfolgreich!
|
||||
|
||||
Nach erfolgreichem Deployment:
|
||||
1. ✅ Teste alle wichtigen Features
|
||||
2. ✅ Monitor Logs für Fehler
|
||||
3. ✅ Prüfe Analytics Dashboard
|
||||
4. ✅ Backup der Production Database erstellen
|
||||
|
||||
**Good luck! 🚀**
|
||||
|
|
@ -1,87 +0,0 @@
|
|||
# Indexing Setup & Usage Guide
|
||||
|
||||
This guide explains how to fast-track your content indexing on **Google** and **Bing/Yandex** using the provided scripts.
|
||||
|
||||
> [!IMPORTANT]
|
||||
> **WAIT UNTIL LIVE:** Do not run these scripts until your new URLs are live and returning a `200 OK` status. If you submit a `404` URL, it may negatively impact your crawling budget or cause errors.
|
||||
|
||||
---
|
||||
|
||||
## 1. Google Indexing API
|
||||
|
||||
The Google Indexing API allows you to notify Google when pages are added or removed. It is faster than waiting for the Googlebot to crawl your sitemap.
|
||||
|
||||
### Prerequisites: `service_account.json`
|
||||
|
||||
To use the script `scripts/trigger-indexing.js`, you need a **Service Account Key** from Google Cloud.
|
||||
|
||||
1. **Go to Google Cloud Console:** [https://console.cloud.google.com/](https://console.cloud.google.com/)
|
||||
2. **Create a Project:** (e.g., "QR Master Indexing").
|
||||
3. **Enable API:** Search for "Web Search Indexing API" and enable it.
|
||||
4. **Create Service Account:**
|
||||
* Go to "IAM & Admin" > "Service Accounts".
|
||||
* Click "Create Service Account".
|
||||
* Name it (e.g., "indexer").
|
||||
* Grant it the "Owner" role (simplest for this) or a custom role with Indexing permissions.
|
||||
5. **Create Key:**
|
||||
* Click on the newly created service account email.
|
||||
* Go to "Keys" tab -> "Add Key" -> "Create new key" -> **JSON**.
|
||||
* This will download a JSON file.
|
||||
6. **Save Key:**
|
||||
* Rename the file to `service_account.json`.
|
||||
* Place it in the **root** of your project (same folder as `package.json`).
|
||||
* **NOTE:** This file is ignored by git for security (`.gitignore`), so you must copy it manually if you switch laptops.
|
||||
7. **Authorize in Search Console:**
|
||||
* Open the JSON file and copy the `client_email` address.
|
||||
* Go to **Google Search Console** property for `qrmaster.net`.
|
||||
* Go to "Settings" > "Users and permissions".
|
||||
* **Add User:** Paste the service account email and give it **"Owner"** permission. (This is required for the API to work).
|
||||
|
||||
### How to Run
|
||||
|
||||
1. **Run the script:**
|
||||
```bash
|
||||
npm run trigger:indexing
|
||||
```
|
||||
*(Or manually: `npx tsx scripts/trigger-indexing.ts`)*
|
||||
|
||||
2. The script will automatically fetch ALL active URLs from the project (including tools and blog posts) and submit them to Google. You should see a "Success" message for each URL.
|
||||
|
||||
---
|
||||
|
||||
## 2. IndexNow (Bing, Yandex, etc.)
|
||||
|
||||
IndexNow is a protocol used by Bing and others. It's much simpler than Google's API.
|
||||
|
||||
### Prerequisites: API Key
|
||||
|
||||
1. **Get Key:** Go to [Bing Webmaster Tools](https://www.bing.com/webmasters) or generate one at [indexnow.org](https://www.indexnow.org/).
|
||||
2. **Verify Setup:**
|
||||
* The key is typically a long random string (e.g., `abc123...`).
|
||||
* Ensure you have a text file named after the key (e.g., `abc123....txt`) containing the key itself inside your `public/` folder so it's accessible at `https://www.qrmaster.net/abc123....txt`.
|
||||
* Alternatively, set the environment variable in your `.env` file:
|
||||
```
|
||||
INDEXNOW_KEY=your_key_here
|
||||
```
|
||||
|
||||
### How to Run
|
||||
|
||||
This script (`scripts/submit-indexnow.ts`) automatically gathers all meaningful URLs from your project (tools, blog posts, main pages) and submits them.
|
||||
|
||||
1. Run the script:
|
||||
```bash
|
||||
npm run submit:indexnow
|
||||
```
|
||||
*(Or manually: `npx tsx scripts/submit-indexnow.ts`)*
|
||||
|
||||
2. It will output which URLs were submitted.
|
||||
|
||||
---
|
||||
|
||||
## Summary Checklist
|
||||
|
||||
- [ ] New page is published and live.
|
||||
- [ ] `service_account.json` is in the project root.
|
||||
- [ ] Service Account email is added as Owner in Google Search Console.
|
||||
- [ ] Run `npm run trigger:indexing` (for Google).
|
||||
- [ ] Run `npm run submit:indexnow` (for Bing/Yandex).
|
||||
|
|
@ -1,321 +0,0 @@
|
|||
# Migration Guide: From Supabase to Local PostgreSQL
|
||||
|
||||
This guide helps you migrate your QR Master application from Supabase to a local PostgreSQL database with Docker.
|
||||
|
||||
## What Changed
|
||||
|
||||
### ✅ Removed
|
||||
- Supabase connection pooling (`DIRECT_URL` environment variable)
|
||||
- Supabase-specific configurations
|
||||
- External database dependency
|
||||
|
||||
### ✨ Added
|
||||
- Local PostgreSQL 16 database in Docker
|
||||
- Redis cache for better performance
|
||||
- Adminer database management UI
|
||||
- Complete Docker setup with docker-compose
|
||||
- Database initialization scripts
|
||||
- Development and production Docker configurations
|
||||
|
||||
## Migration Steps
|
||||
|
||||
### 1. Backup Your Supabase Database (IMPORTANT!)
|
||||
|
||||
Before making any changes, backup your existing data:
|
||||
|
||||
```bash
|
||||
# If you have access to Supabase CLI
|
||||
supabase db dump > backup_$(date +%Y%m%d).sql
|
||||
|
||||
# Or use pg_dump directly with your Supabase credentials
|
||||
pg_dump "postgresql://postgres:[PASSWORD]@[PROJECT_REF].supabase.co:5432/postgres" > backup.sql
|
||||
```
|
||||
|
||||
### 2. Update Your Codebase
|
||||
|
||||
Pull the latest changes or update these files:
|
||||
|
||||
#### Updated Files:
|
||||
- ✏️ `prisma/schema.prisma` - Removed `directUrl` field
|
||||
- ✏️ `src/lib/env.ts` - Removed `DIRECT_URL` variable
|
||||
- ✏️ `docker-compose.yml` - Updated with PostgreSQL setup
|
||||
- ✏️ `Dockerfile` - Enhanced with PostgreSQL support
|
||||
- ✏️ `package.json` - Added Docker scripts and tsx
|
||||
|
||||
#### New Files:
|
||||
- 📄 `docker-compose.dev.yml` - Development setup
|
||||
- 📄 `docker/init-db.sh` - Database initialization
|
||||
- 📄 `docker/README.md` - Docker documentation
|
||||
- 📄 `DOCKER_SETUP.md` - Complete Docker guide
|
||||
- 📄 `env.example` - Environment template
|
||||
- 📄 `.dockerignore` - Docker build optimization
|
||||
|
||||
### 3. Set Up Environment Variables
|
||||
|
||||
1. Remove Supabase-specific variables:
|
||||
```bash
|
||||
# Remove these from .env:
|
||||
# DIRECT_URL=...
|
||||
# SUPABASE_URL=...
|
||||
# SUPABASE_ANON_KEY=...
|
||||
```
|
||||
|
||||
2. Update database connection:
|
||||
```bash
|
||||
# For Docker (default):
|
||||
DATABASE_URL=postgresql://postgres:postgres@db:5432/qrmaster?schema=public
|
||||
|
||||
# For local development (without Docker):
|
||||
DATABASE_URL=postgresql://postgres:postgres@localhost:5432/qrmaster?schema=public
|
||||
```
|
||||
|
||||
3. Copy from template:
|
||||
```bash
|
||||
cp env.example .env
|
||||
```
|
||||
|
||||
4. Generate secure secrets:
|
||||
```bash
|
||||
# Linux/Mac
|
||||
openssl rand -base64 32 # Use for NEXTAUTH_SECRET
|
||||
openssl rand -base64 32 # Use for IP_SALT
|
||||
|
||||
# Windows PowerShell
|
||||
[Convert]::ToBase64String((1..32 | ForEach-Object { Get-Random -Maximum 256 }))
|
||||
```
|
||||
|
||||
### 4. Start Local PostgreSQL
|
||||
|
||||
#### Option A: Development Mode (Recommended)
|
||||
|
||||
```bash
|
||||
# Start database only (run app on host)
|
||||
npm run docker:dev
|
||||
|
||||
# Wait for database to be ready
|
||||
docker-compose -f docker-compose.dev.yml logs -f db
|
||||
```
|
||||
|
||||
#### Option B: Full Docker
|
||||
|
||||
```bash
|
||||
# Start all services
|
||||
npm run docker:prod
|
||||
|
||||
# Wait for all services to be ready
|
||||
docker-compose logs -f
|
||||
```
|
||||
|
||||
### 5. Restore Your Data
|
||||
|
||||
#### Option 1: Using Prisma Migrations (Clean Start)
|
||||
|
||||
```bash
|
||||
# Generate Prisma client
|
||||
npm run db:generate
|
||||
|
||||
# Run migrations
|
||||
npm run db:migrate
|
||||
|
||||
# Seed with demo data
|
||||
npm run db:seed
|
||||
```
|
||||
|
||||
#### Option 2: Restore from Backup (Preserve Data)
|
||||
|
||||
```bash
|
||||
# Restore your Supabase backup
|
||||
cat backup.sql | docker-compose exec -T db psql -U postgres qrmaster
|
||||
|
||||
# Or if running locally
|
||||
psql -U postgres -d qrmaster < backup.sql
|
||||
|
||||
# Then run migrations to update schema
|
||||
npm run db:deploy
|
||||
```
|
||||
|
||||
### 6. Verify Migration
|
||||
|
||||
1. **Check Database Connection:**
|
||||
```bash
|
||||
# Connect to database
|
||||
npm run docker:db
|
||||
|
||||
# Or manually
|
||||
docker-compose exec db psql -U postgres -d qrmaster
|
||||
|
||||
# Run test query
|
||||
SELECT COUNT(*) FROM "User";
|
||||
SELECT COUNT(*) FROM "QRCode";
|
||||
```
|
||||
|
||||
2. **Access Adminer (Database UI):**
|
||||
- URL: http://localhost:8080
|
||||
- System: PostgreSQL
|
||||
- Server: db
|
||||
- Username: postgres
|
||||
- Password: postgres
|
||||
- Database: qrmaster
|
||||
|
||||
3. **Test Your Application:**
|
||||
```bash
|
||||
# Start the app (if using dev mode)
|
||||
npm run dev
|
||||
|
||||
# Access: http://localhost:3050
|
||||
```
|
||||
|
||||
### 7. Update Your Deployment
|
||||
|
||||
#### For Docker Production:
|
||||
|
||||
```bash
|
||||
# Build and deploy
|
||||
docker-compose up -d --build
|
||||
|
||||
# Run migrations
|
||||
docker-compose exec web npx prisma migrate deploy
|
||||
|
||||
# Check logs
|
||||
docker-compose logs -f web
|
||||
```
|
||||
|
||||
#### For Other Platforms (Vercel, Railway, etc.):
|
||||
|
||||
Update your environment variables in the platform's dashboard:
|
||||
- Remove: `DIRECT_URL`
|
||||
- Update: `DATABASE_URL` to your new PostgreSQL connection string
|
||||
|
||||
## Troubleshooting
|
||||
|
||||
### Issue: Connection Refused
|
||||
|
||||
```bash
|
||||
# Check if database is running
|
||||
docker-compose ps
|
||||
|
||||
# Check database logs
|
||||
docker-compose logs db
|
||||
|
||||
# Restart database
|
||||
docker-compose restart db
|
||||
```
|
||||
|
||||
### Issue: Migration Errors
|
||||
|
||||
```bash
|
||||
# Reset migrations (⚠️ deletes data!)
|
||||
npm run db:migrate reset
|
||||
|
||||
# Or manually reset
|
||||
docker-compose down -v
|
||||
docker-compose up -d db
|
||||
npm run db:migrate
|
||||
```
|
||||
|
||||
### Issue: Prisma Client Not Generated
|
||||
|
||||
```bash
|
||||
# Regenerate Prisma client
|
||||
npm run db:generate
|
||||
|
||||
# Or
|
||||
npx prisma generate
|
||||
```
|
||||
|
||||
### Issue: Data Not Migrated
|
||||
|
||||
```bash
|
||||
# Check if backup was restored correctly
|
||||
docker-compose exec db psql -U postgres -d qrmaster -c "
|
||||
SELECT
|
||||
schemaname,
|
||||
tablename,
|
||||
pg_size_pretty(pg_total_relation_size(schemaname||'.'||tablename)) AS size
|
||||
FROM pg_tables
|
||||
WHERE schemaname = 'public'
|
||||
ORDER BY pg_total_relation_size(schemaname||'.'||tablename) DESC;
|
||||
"
|
||||
```
|
||||
|
||||
## Differences: Supabase vs Local PostgreSQL
|
||||
|
||||
| Feature | Supabase | Local PostgreSQL |
|
||||
|---------|----------|------------------|
|
||||
| Hosting | Cloud (managed) | Self-hosted (Docker) |
|
||||
| Connection Pooling | Built-in (Supavisor) | Prisma built-in |
|
||||
| Database UI | Supabase Studio | Adminer (included) |
|
||||
| Backups | Automatic | Manual (or scripted) |
|
||||
| Cost | Free tier + paid | Free (infrastructure cost only) |
|
||||
| Latency | Internet dependent | Local network |
|
||||
| Setup | Account required | Docker only |
|
||||
| Scaling | Automatic | Manual |
|
||||
|
||||
## Benefits of Local PostgreSQL
|
||||
|
||||
✅ **Full Control**: Own your data and infrastructure
|
||||
✅ **No Vendor Lock-in**: Standard PostgreSQL
|
||||
✅ **Lower Latency**: Local network speed
|
||||
✅ **Cost**: No monthly fees
|
||||
✅ **Privacy**: Data stays on your infrastructure
|
||||
✅ **Development**: Easy local testing
|
||||
✅ **Offline**: Works without internet
|
||||
|
||||
## Next Steps
|
||||
|
||||
1. ✅ Verify all data migrated correctly
|
||||
2. ✅ Test all application features
|
||||
3. ✅ Update your CI/CD pipelines
|
||||
4. ✅ Set up automated backups:
|
||||
```bash
|
||||
# Create backup script
|
||||
cat > backup.sh << 'EOF'
|
||||
#!/bin/bash
|
||||
BACKUP_DIR="./backups"
|
||||
mkdir -p $BACKUP_DIR
|
||||
docker-compose exec -T db pg_dump -U postgres qrmaster > "$BACKUP_DIR/backup_$(date +%Y%m%d_%H%M%S).sql"
|
||||
EOF
|
||||
|
||||
chmod +x backup.sh
|
||||
|
||||
# Run daily backups (cron example)
|
||||
# 0 2 * * * /path/to/backup.sh
|
||||
```
|
||||
|
||||
5. ✅ Monitor your application
|
||||
6. ✅ Update documentation
|
||||
|
||||
## Rollback Plan
|
||||
|
||||
If you need to rollback to Supabase:
|
||||
|
||||
1. Keep your Supabase project active during testing
|
||||
2. Keep your backup files safe
|
||||
3. To rollback, simply change `DATABASE_URL` back to Supabase
|
||||
4. Add back `DIRECT_URL` to `prisma/schema.prisma`:
|
||||
```prisma
|
||||
datasource db {
|
||||
provider = "postgresql"
|
||||
url = env("DATABASE_URL")
|
||||
directUrl = env("DIRECT_URL")
|
||||
}
|
||||
```
|
||||
|
||||
## Support
|
||||
|
||||
For issues:
|
||||
1. Check [DOCKER_SETUP.md](DOCKER_SETUP.md) for detailed Docker help
|
||||
2. Check [docker/README.md](docker/README.md) for Docker commands
|
||||
3. Review logs: `docker-compose logs -f`
|
||||
4. Open an issue on GitHub
|
||||
|
||||
---
|
||||
|
||||
🎉 **Congratulations!** You've successfully migrated from Supabase to local PostgreSQL!
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
|
@ -1,301 +0,0 @@
|
|||
# ✅ Setup Complete - PostgreSQL Migration
|
||||
|
||||
## 🎉 What Was Done
|
||||
|
||||
Your QR Master application has been successfully migrated from Supabase to a local PostgreSQL database with Docker!
|
||||
|
||||
### ✅ Completed Tasks
|
||||
|
||||
1. **Removed Supabase Dependencies**
|
||||
- ❌ Removed `DIRECT_URL` from Prisma schema
|
||||
- ❌ Removed `DIRECT_URL` from environment validation
|
||||
- ❌ Cleaned up all Supabase-specific configurations
|
||||
|
||||
2. **Created Docker Infrastructure**
|
||||
- ✅ Production Docker Compose (`docker-compose.yml`)
|
||||
- ✅ Development Docker Compose (`docker-compose.dev.yml`)
|
||||
- ✅ Optimized Dockerfile for Next.js
|
||||
- ✅ PostgreSQL 16 Alpine with persistence
|
||||
- ✅ Redis 7 Alpine with AOF persistence
|
||||
- ✅ Adminer database UI (optional)
|
||||
- ✅ Custom bridge network for services
|
||||
|
||||
3. **Database Setup**
|
||||
- ✅ PostgreSQL initialization script
|
||||
- ✅ UUID and pg_trgm extensions
|
||||
- ✅ Health checks for all services
|
||||
- ✅ Volume persistence
|
||||
|
||||
4. **Documentation**
|
||||
- ✅ Updated README.md
|
||||
- ✅ Created DOCKER_SETUP.md (comprehensive guide)
|
||||
- ✅ Created MIGRATION_FROM_SUPABASE.md
|
||||
- ✅ Created docker/README.md
|
||||
- ✅ Created CHANGELOG.md
|
||||
- ✅ Created env.example template
|
||||
|
||||
5. **Developer Tools**
|
||||
- ✅ Setup script for Linux/Mac (`scripts/setup.sh`)
|
||||
- ✅ Setup script for Windows (`scripts/setup.ps1`)
|
||||
- ✅ npm Docker scripts
|
||||
- ✅ .dockerignore for optimization
|
||||
|
||||
6. **Environment Configuration**
|
||||
- ✅ Created env.example template
|
||||
- ✅ Updated environment validation
|
||||
- ✅ Simplified configuration
|
||||
|
||||
## 🚀 How to Get Started
|
||||
|
||||
### Option 1: Quick Setup (Recommended)
|
||||
|
||||
#### Windows:
|
||||
```powershell
|
||||
cd scripts
|
||||
.\setup.ps1
|
||||
```
|
||||
|
||||
#### Linux/Mac:
|
||||
```bash
|
||||
chmod +x scripts/setup.sh
|
||||
./scripts/setup.sh
|
||||
```
|
||||
|
||||
### Option 2: Manual Setup
|
||||
|
||||
#### Development Mode (Database in Docker, App on Host)
|
||||
```bash
|
||||
# 1. Copy environment file
|
||||
cp env.example .env
|
||||
|
||||
# 2. Edit .env and set NEXTAUTH_SECRET and IP_SALT
|
||||
# Generate with: openssl rand -base64 32
|
||||
|
||||
# 3. Install dependencies
|
||||
npm install
|
||||
|
||||
# 4. Start database services
|
||||
npm run docker:dev
|
||||
|
||||
# 5. Run migrations
|
||||
npm run db:migrate
|
||||
|
||||
# 6. Seed database
|
||||
npm run db:seed
|
||||
|
||||
# 7. Start development server
|
||||
npm run dev
|
||||
```
|
||||
|
||||
#### Production Mode (Full Stack in Docker)
|
||||
```bash
|
||||
# 1. Copy and configure environment
|
||||
cp env.example .env
|
||||
# Edit .env with your settings
|
||||
|
||||
# 2. Build and start
|
||||
npm run docker:prod
|
||||
|
||||
# 3. Run migrations
|
||||
docker-compose exec web npx prisma migrate deploy
|
||||
|
||||
# 4. Access at http://localhost:3050
|
||||
```
|
||||
|
||||
## 📍 Access Points
|
||||
|
||||
After setup, you can access:
|
||||
|
||||
- **🌐 Application**: http://localhost:3050
|
||||
- **🗄️ Database UI (Adminer)**: http://localhost:8080
|
||||
- System: PostgreSQL
|
||||
- Server: db
|
||||
- Username: postgres
|
||||
- Password: postgres
|
||||
- Database: qrmaster
|
||||
- **💾 PostgreSQL**: localhost:5432
|
||||
- **🔴 Redis**: localhost:6379
|
||||
|
||||
## 📦 What's Included
|
||||
|
||||
### Docker Services
|
||||
|
||||
| Service | Image | Port | Purpose |
|
||||
|---------|-------|------|---------|
|
||||
| web | Next.js (custom) | 3050 | Application |
|
||||
| db | postgres:16-alpine | 5432 | Database |
|
||||
| redis | redis:7-alpine | 6379 | Cache |
|
||||
| adminer | adminer:latest | 8080 | DB UI |
|
||||
|
||||
### File Structure
|
||||
|
||||
```
|
||||
QRMASTER/
|
||||
├── docker/
|
||||
│ ├── init-db.sh # PostgreSQL initialization
|
||||
│ └── README.md # Docker commands
|
||||
├── scripts/
|
||||
│ ├── setup.sh # Quick setup (Linux/Mac)
|
||||
│ └── setup.ps1 # Quick setup (Windows)
|
||||
├── src/ # Application code
|
||||
├── prisma/
|
||||
│ └── schema.prisma # Updated schema (no directUrl)
|
||||
├── docker-compose.yml # Production setup
|
||||
├── docker-compose.dev.yml # Development setup
|
||||
├── Dockerfile # Application container
|
||||
├── env.example # Environment template
|
||||
├── .dockerignore # Docker build optimization
|
||||
├── DOCKER_SETUP.md # Complete Docker guide
|
||||
├── MIGRATION_FROM_SUPABASE.md # Migration guide
|
||||
├── CHANGELOG.md # What changed
|
||||
└── README.md # Updated main docs
|
||||
```
|
||||
|
||||
## 🛠️ Useful Commands
|
||||
|
||||
### Development
|
||||
```bash
|
||||
npm run dev # Start dev server
|
||||
npm run docker:dev # Start database only
|
||||
npm run docker:dev:stop # Stop database
|
||||
```
|
||||
|
||||
### Database
|
||||
```bash
|
||||
npm run db:migrate # Run migrations
|
||||
npm run db:seed # Seed database
|
||||
npm run db:studio # Open Prisma Studio
|
||||
npm run docker:db # PostgreSQL CLI
|
||||
```
|
||||
|
||||
### Docker
|
||||
```bash
|
||||
npm run docker:prod # Start all services
|
||||
npm run docker:stop # Stop all services
|
||||
npm run docker:logs # View logs
|
||||
npm run docker:backup # Backup database
|
||||
```
|
||||
|
||||
### Management
|
||||
```bash
|
||||
docker-compose ps # Check status
|
||||
docker-compose logs -f # Follow logs
|
||||
docker-compose restart web # Restart app
|
||||
docker-compose exec db psql -U postgres -d qrmaster # DB CLI
|
||||
```
|
||||
|
||||
## 📚 Documentation
|
||||
|
||||
- **[README.md](README.md)** - Main documentation with quick start
|
||||
- **[DOCKER_SETUP.md](DOCKER_SETUP.md)** - Complete Docker guide with troubleshooting
|
||||
- **[MIGRATION_FROM_SUPABASE.md](MIGRATION_FROM_SUPABASE.md)** - Migration guide from Supabase
|
||||
- **[docker/README.md](docker/README.md)** - Docker commands and operations
|
||||
- **[CHANGELOG.md](CHANGELOG.md)** - What changed in this version
|
||||
|
||||
## 🔐 Security Checklist
|
||||
|
||||
Before deploying to production:
|
||||
|
||||
- [ ] Change PostgreSQL password in docker-compose.yml
|
||||
- [ ] Set strong NEXTAUTH_SECRET (generate with `openssl rand -base64 32`)
|
||||
- [ ] Set strong IP_SALT (generate with `openssl rand -base64 32`)
|
||||
- [ ] Update NEXTAUTH_URL to your domain
|
||||
- [ ] Enable HTTPS/SSL
|
||||
- [ ] Set up firewall rules
|
||||
- [ ] Configure automated backups
|
||||
- [ ] Review and test all environment variables
|
||||
|
||||
## 🎯 Next Steps
|
||||
|
||||
1. **Test the Application**
|
||||
```bash
|
||||
npm run docker:dev
|
||||
npm run dev
|
||||
# Visit http://localhost:3050
|
||||
```
|
||||
|
||||
2. **Review Configuration**
|
||||
- Check `.env` file
|
||||
- Verify database connection
|
||||
- Test authentication
|
||||
|
||||
3. **Set Up Backups**
|
||||
```bash
|
||||
# Manual backup
|
||||
npm run docker:backup
|
||||
|
||||
# Or create automated backup script
|
||||
# See DOCKER_SETUP.md for examples
|
||||
```
|
||||
|
||||
4. **Customize**
|
||||
- Update database passwords
|
||||
- Configure OAuth providers
|
||||
- Adjust resource limits
|
||||
- Set up monitoring
|
||||
|
||||
## 🆘 Need Help?
|
||||
|
||||
### Common Issues
|
||||
|
||||
**Database won't start:**
|
||||
```bash
|
||||
docker-compose logs db
|
||||
docker-compose restart db
|
||||
```
|
||||
|
||||
**Port already in use:**
|
||||
```bash
|
||||
# Windows
|
||||
netstat -ano | findstr :3050
|
||||
|
||||
# Change port in docker-compose.yml if needed
|
||||
```
|
||||
|
||||
**Prisma errors:**
|
||||
```bash
|
||||
npm run db:generate
|
||||
npm run db:migrate
|
||||
```
|
||||
|
||||
### Resources
|
||||
|
||||
- **DOCKER_SETUP.md** - Comprehensive troubleshooting
|
||||
- **docker/README.md** - Common Docker commands
|
||||
- **MIGRATION_FROM_SUPABASE.md** - Migration help
|
||||
|
||||
### Support
|
||||
|
||||
1. Check the documentation files
|
||||
2. Review logs: `docker-compose logs -f`
|
||||
3. Check service health: `docker-compose ps`
|
||||
4. Open an issue on GitHub
|
||||
|
||||
## ✨ Features
|
||||
|
||||
Your application now has:
|
||||
|
||||
- ✅ **Self-hosted PostgreSQL** - Full control over your data
|
||||
- ✅ **Redis caching** - Improved performance
|
||||
- ✅ **Docker Compose** - Easy deployment
|
||||
- ✅ **Health checks** - Automatic monitoring
|
||||
- ✅ **Data persistence** - Volumes for data safety
|
||||
- ✅ **Database UI** - Adminer for easy management
|
||||
- ✅ **Development mode** - Run only what you need
|
||||
- ✅ **Production ready** - Optimized Docker builds
|
||||
- ✅ **Complete docs** - Multiple guides and references
|
||||
|
||||
## 🎊 Success!
|
||||
|
||||
You're now ready to develop and deploy QR Master with your own PostgreSQL database!
|
||||
|
||||
**Demo Credentials:**
|
||||
- Email: demo@qrmaster.com
|
||||
- Password: demo123
|
||||
|
||||
---
|
||||
|
||||
**Happy coding!** 🚀
|
||||
|
||||
Need more help? Check the documentation or run the setup scripts.
|
||||
|
||||
|
|
@ -1,29 +0,0 @@
|
|||
# Ahrefs SEO Findings & Status
|
||||
|
||||
## Critical Issues (Priority: High)
|
||||
- [RESOLVED] **Page has no outgoing links**
|
||||
- Found on: `privacy`, `newsletter`, `faq`, `/`, `qr-code-erstellen`
|
||||
- *Status:* Verified `MarketingLayout` provides navigation. Added specific back-links to `newsletter` (admin), `login`, and `signup`.
|
||||
- [RESOLVED] **Newsletter Page Misconfiguration**
|
||||
- Found: `/newsletter` page has "Admin Dashboard" title.
|
||||
- *Status:* Confirmed as internal Admin tool. Added "Back to Home" link to satisfy link checkers.
|
||||
- [FIXED] **3XX Redirects & Links to Redirects**
|
||||
- *Fixed in:* `blog/page.tsx` (links updated) and `blog/[slug]/page.tsx` (301s added).
|
||||
- [FIXED] **Duplicate Metadata**
|
||||
- *Fixed in:* `pricing`, `login`, `signup`, `qr-code-erstellen`.
|
||||
|
||||
## Warnings (Priority: Medium)
|
||||
- [VERIFIED] **Hreflang and HTML lang mismatch**
|
||||
- Found on: `1 page`.
|
||||
- *Status:* Verified `src/app/(marketing)/layout.tsx` has `lang="en"` and `(marketing-de)/layout.tsx` has `lang="de"`. Correct.
|
||||
- [FIXED] **Image file size too large**
|
||||
- *Fixed:* Swapped `1-boy.png` & `2-body.png` for WebP versions as requested.
|
||||
- [FIXED] **H1 tag missing or empty**
|
||||
- *Status:* Verified `sr-only` H1s exist on core pages. `faq` and `privacy` have visible H1s.
|
||||
|
||||
## Notices (Priority: Low)
|
||||
- [VERIFIED] **Low word count / Thin content**
|
||||
- Found on: `login`, `signup`.
|
||||
- *Status:* Expected behavior for functional auth pages.
|
||||
- [VERIFIED] **Meta description too short**
|
||||
- *Status:* Descriptions are concise and functional. No critical SEO impact.
|
||||
|
|
@ -1,134 +0,0 @@
|
|||
# Claude Artifact Template for QR Master Backlinks
|
||||
|
||||
Use this template when creating Claude artifacts that link back to qrmaster.net.
|
||||
|
||||
---
|
||||
|
||||
## How to Use
|
||||
|
||||
1. Copy this template into Claude
|
||||
2. Customize for your specific topic
|
||||
3. Click "Publish Artifact"
|
||||
4. Add `www.qrmaster.net` to allowed domains
|
||||
5. Share the published link
|
||||
|
||||
---
|
||||
|
||||
## Template: Dynamic QR Codes Guide
|
||||
|
||||
```html
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="UTF-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Dynamic QR Codes: The Complete 2025 Guide</title>
|
||||
<style>
|
||||
body {
|
||||
font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto, sans-serif;
|
||||
line-height: 1.6;
|
||||
max-width: 800px;
|
||||
margin: 0 auto;
|
||||
padding: 40px 20px;
|
||||
background: linear-gradient(135deg, #f8fafc 0%, #e2e8f0 100%);
|
||||
color: #1e293b;
|
||||
}
|
||||
h1 { color: #0f172a; border-bottom: 3px solid #3b82f6; padding-bottom: 10px; }
|
||||
h2 { color: #1e40af; margin-top: 2em; }
|
||||
a { color: #2563eb; text-decoration: none; }
|
||||
a:hover { text-decoration: underline; }
|
||||
.cta {
|
||||
background: linear-gradient(135deg, #3b82f6, #2563eb);
|
||||
color: white;
|
||||
padding: 20px 30px;
|
||||
border-radius: 12px;
|
||||
text-align: center;
|
||||
margin: 30px 0;
|
||||
}
|
||||
.cta a { color: white; font-weight: bold; font-size: 1.1em; }
|
||||
ul { margin: 1em 0; }
|
||||
li { margin: 0.5em 0; }
|
||||
.highlight { background: #dbeafe; padding: 15px; border-radius: 8px; margin: 20px 0; }
|
||||
</style>
|
||||
</head>
|
||||
<body>
|
||||
<h1>Dynamic QR Codes: The Complete 2025 Guide</h1>
|
||||
|
||||
<p>Dynamic QR codes have revolutionized how businesses connect offline and online experiences. Unlike static codes, dynamic QR codes can be edited after printing, tracked in real-time, and optimized based on performance data.</p>
|
||||
|
||||
<h2>What Makes Dynamic QR Codes Different?</h2>
|
||||
<ul>
|
||||
<li><strong>Editable:</strong> Change the destination URL anytime without reprinting</li>
|
||||
<li><strong>Trackable:</strong> Monitor scans, locations, devices, and timing</li>
|
||||
<li><strong>Smaller:</strong> Short redirect URLs create cleaner QR patterns</li>
|
||||
<li><strong>Flexible:</strong> Perfect for campaigns where content may change</li>
|
||||
</ul>
|
||||
|
||||
<div class="highlight">
|
||||
<strong>Pro Tip:</strong> Always use dynamic QR codes for printed materials. If your URL changes after printing 10,000 flyers, you won't need to reprint them.
|
||||
</div>
|
||||
|
||||
<h2>Best Use Cases</h2>
|
||||
<ul>
|
||||
<li>Restaurant menus that change seasonally</li>
|
||||
<li>Event tickets with real-time updates</li>
|
||||
<li>Product packaging with warranty info</li>
|
||||
<li>Marketing campaigns with A/B testing</li>
|
||||
<li>Business cards with contact details</li>
|
||||
</ul>
|
||||
|
||||
<h2>How to Create Dynamic QR Codes</h2>
|
||||
<p>The easiest way is using a dedicated platform like <a href="https://www.qrmaster.net" target="_blank">QR Master</a>. Here's the process:</p>
|
||||
<ol>
|
||||
<li>Sign up for a free account</li>
|
||||
<li>Click "Create QR Code" and select "Dynamic"</li>
|
||||
<li>Enter your destination URL</li>
|
||||
<li>Customize colors and add your logo</li>
|
||||
<li>Download in SVG or PNG format</li>
|
||||
<li>Track scans in your analytics dashboard</li>
|
||||
</ol>
|
||||
|
||||
<div class="cta">
|
||||
<a href="https://www.qrmaster.net/signup" target="_blank">Create Your Free Dynamic QR Code →</a>
|
||||
</div>
|
||||
|
||||
<h2>Tracking & Analytics</h2>
|
||||
<p>With dynamic QR codes, you get access to powerful analytics:</p>
|
||||
<ul>
|
||||
<li>Total and unique scan counts</li>
|
||||
<li>Geographic distribution (city/country)</li>
|
||||
<li>Device breakdown (iOS vs Android)</li>
|
||||
<li>Time-based patterns (peak hours)</li>
|
||||
<li>Conversion tracking integration</li>
|
||||
</ul>
|
||||
|
||||
<p>Learn more about <a href="https://www.qrmaster.net/qr-code-tracking" target="_blank">QR code tracking</a> and <a href="https://www.qrmaster.net/blog/qr-code-analytics" target="_blank">analytics best practices</a>.</p>
|
||||
|
||||
<h2>Pricing</h2>
|
||||
<p>Most platforms offer tiered pricing. <a href="https://www.qrmaster.net/pricing" target="_blank">QR Master pricing</a> starts with a free tier (3 dynamic codes) and scales up for businesses needing more codes and features.</p>
|
||||
|
||||
<hr>
|
||||
<p><em>This guide is provided by <a href="https://www.qrmaster.net" target="_blank">QR Master</a> - Free Dynamic QR Code Generator with Analytics.</em></p>
|
||||
</body>
|
||||
</html>
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## Topic Ideas for More Artifacts
|
||||
|
||||
1. **"QR Codes for Restaurants: Complete Setup Guide"** - Link to /blog/qr-code-restaurant-menu
|
||||
2. **"Digital Business Cards with QR Codes"** - Link to /blog/vcard-qr-code-generator
|
||||
3. **"QR Code Print Size Calculator"** - Link to /blog/qr-code-print-size-guide
|
||||
4. **"Small Business QR Code Marketing Playbook"** - Link to /blog/qr-code-small-business
|
||||
5. **"Static vs Dynamic QR Codes Comparison"** - Link to /blog/dynamic-vs-static-qr-codes
|
||||
|
||||
---
|
||||
|
||||
## Publishing Steps
|
||||
|
||||
1. Create artifact in Claude with HTML content above
|
||||
2. Click "Publish" button
|
||||
3. In "Allowed domains" field, enter: `www.qrmaster.net, qrmaster.net`
|
||||
4. Copy the embed code or share URL
|
||||
5. The links inside will count as backlinks once indexed
|
||||
|
|
@ -1,180 +0,0 @@
|
|||
# Claude Artifact Prompts for Parasite SEO
|
||||
|
||||
**Goal:** Publish educational content on claude.ai that naturally links to qrmaster.net
|
||||
**Strategy:** Informative, helpful content that does NOT look like advertising
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Prompt 1: Restaurant QR Menu Guide
|
||||
|
||||
```
|
||||
Create an informative HTML article titled "Restaurant Menu QR Codes: A Practical Guide for Restaurant Owners (2025)"
|
||||
|
||||
The article should:
|
||||
- Be 1500-2000 words long
|
||||
- Contain practical tips for restaurant owners
|
||||
- Cover the following topics:
|
||||
1. Why digital menus are the new standard
|
||||
2. PDF vs. online menu - pros and cons
|
||||
3. Optimal placement of QR codes in restaurants
|
||||
4. Mistakes restaurants should avoid
|
||||
5. Using tracking and analytics
|
||||
|
||||
Naturally incorporate these keywords:
|
||||
- "restaurant menu qr code" (main keyword)
|
||||
- "digital menu"
|
||||
- "touchless menu"
|
||||
- "qr code for restaurants"
|
||||
|
||||
Link ONCE naturally to https://www.qrmaster.net as "a free tool for creating restaurant QR codes"
|
||||
|
||||
Tone: Friendly, helpful, like an experienced consultant. NOT salesy.
|
||||
|
||||
HTML with clean CSS, mobile-friendly. No external dependencies.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Prompt 2: Dynamic vs Static QR Comparison
|
||||
|
||||
```
|
||||
Create a technical comparison article as HTML: "Static vs Dynamic QR Codes: What's the Difference and When to Use Each"
|
||||
|
||||
Structure:
|
||||
1. Brief explanation of what QR codes are technically
|
||||
2. Static QR codes - how they work
|
||||
3. Dynamic QR codes - how they work
|
||||
4. Comparison table (very important!)
|
||||
5. Decision guide: When to use which type
|
||||
6. Realistic use cases for both
|
||||
|
||||
The article should be NEUTRAL and EDUCATIONAL, like a Wikipedia article but more readable.
|
||||
|
||||
Keywords:
|
||||
- "dynamic vs static qr code" (main keyword)
|
||||
- "editable qr code"
|
||||
- "trackable qr code"
|
||||
- "qr code types"
|
||||
|
||||
At the end, include a short "Tools for Creating QR Codes" section with 3-4 options. One of them is https://www.qrmaster.net - listed as an equal entry, NOT as a recommendation.
|
||||
|
||||
HTML with professional, minimalist design.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Prompt 3: Small Business Marketing Guide
|
||||
|
||||
```
|
||||
Create a comprehensive HTML guide: "10 Ways Small Businesses Can Use QR Codes in 2025"
|
||||
|
||||
The article is aimed at small businesses without technical knowledge.
|
||||
|
||||
The 10 use cases:
|
||||
1. Digital business cards (vCard)
|
||||
2. Collecting Google reviews
|
||||
3. Contactless payments
|
||||
4. Sharing Wi-Fi access
|
||||
5. Growing social media followers
|
||||
6. Linking product information
|
||||
7. Simplifying appointment booking
|
||||
8. Discount promotions & coupons
|
||||
9. Event tickets & check-in
|
||||
10. Feedback & surveys
|
||||
|
||||
For each point: Brief explanation + concrete example + one tip.
|
||||
|
||||
Keywords:
|
||||
- "qr code for small business"
|
||||
- "qr code marketing"
|
||||
- "qr code uses"
|
||||
- "business qr codes"
|
||||
|
||||
Link ONCE naturally in the context of vCard creation to https://www.qrmaster.net/blog/vcard-qr-code-generator
|
||||
|
||||
Tone: Enthusiastic but not over the top. Like a helpful friend explaining technology.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Prompt 4: Print Size Technical Guide
|
||||
|
||||
```
|
||||
Create a technical reference article as HTML: "QR Code Print Size Guide: Minimum Dimensions for Reliable Scanning"
|
||||
|
||||
This article should become THE reference for QR code print sizes.
|
||||
|
||||
Content:
|
||||
1. The science behind QR scanning (brief)
|
||||
2. The golden formula: Size = Distance ÷ 10
|
||||
3. LARGE table with applications, distances, min/recommended sizes
|
||||
4. Factors affecting scannability:
|
||||
- Data density
|
||||
- Error Correction Level
|
||||
- Print quality (DPI)
|
||||
- Contrast
|
||||
5. Quiet zone requirements
|
||||
6. File formats for printing (SVG vs PNG vs PDF)
|
||||
7. Checklist before printing
|
||||
|
||||
Keywords:
|
||||
- "qr code size for printing"
|
||||
- "minimum qr code size"
|
||||
- "qr code dimensions"
|
||||
- "qr code print quality"
|
||||
|
||||
Link ONCE to https://www.qrmaster.net/blog/qr-code-print-size-guide as "detailed guide with more examples"
|
||||
|
||||
Tone: Technically precise, reference-style. For designers and marketers.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 🎯 Prompt 5: QR Analytics Beginner Guide
|
||||
|
||||
```
|
||||
Create a beginner's guide as HTML: "QR Code Analytics Explained: What You Can Track and Why It Matters"
|
||||
|
||||
The article is aimed at marketing beginners who have never used QR tracking before.
|
||||
|
||||
Structure:
|
||||
1. What is QR tracking and why is it important?
|
||||
2. What data can you track? (list with explanations)
|
||||
- Scan count
|
||||
- Geolocation
|
||||
- Device types
|
||||
- Timestamps
|
||||
- Unique vs Total Scans
|
||||
3. How does it work technically? (simplified)
|
||||
4. Privacy & GDPR considerations
|
||||
5. Practical application: Measuring campaign ROI
|
||||
6. Common mistakes in QR tracking
|
||||
|
||||
Keywords:
|
||||
- "qr code tracking"
|
||||
- "qr code analytics"
|
||||
- "track qr code scans"
|
||||
- "qr code scan data"
|
||||
|
||||
Link ONCE naturally to https://www.qrmaster.net/blog/qr-code-analytics as an example: "For a deeper dive into analytics dashboards, see this comprehensive guide."
|
||||
|
||||
Tone: Friendly and explanatory, like a teacher. No jargon without explanation.
|
||||
```
|
||||
|
||||
---
|
||||
|
||||
## 📋 Usage Instructions
|
||||
|
||||
1. **Copy prompt** → Paste into claude.ai
|
||||
2. **Let it create the artifact**
|
||||
3. **Click "Publish"** in Claude
|
||||
4. **Allowed Domain:** Add `www.qrmaster.net, qrmaster.net`
|
||||
5. **Share link** - Google indexes these!
|
||||
|
||||
## 💡 Tips for Maximum Effectiveness
|
||||
|
||||
- **Don't publish all on the same day**
|
||||
- About **1 article per week** for natural growth
|
||||
- Publish the **more neutral articles first** (Prompt 2 & 4)
|
||||
- **Share on social media** for faster indexing
|
||||
- Register the published URLs in Google Search Console
|
||||
|
|
@ -1,89 +0,0 @@
|
|||
# Final SEO & Technical Fix Report
|
||||
**Datum:** 13.01.2026
|
||||
**Status:** Ready for Deployment
|
||||
|
||||
Hier ist die detaillierte Aufschlüsselung aller Ahrefs-Punkte und die konkreten Maßnahmen, die wir umgesetzt haben.
|
||||
|
||||
## 1. Kritische Fehler (Die "29"er Gruppe)
|
||||
Diese Fehler traten alle 29-mal auf. Ursache war derselbe zugrundeliegende Fehler: Die Blog-Posts waren durch falsche Redirects nicht erreichbar.
|
||||
|
||||
| Ahrefs Meldung | Anzahl | Was wir gemacht haben (Fix) |
|
||||
| :--- | :--- | :--- |
|
||||
| **Page has no outgoing links** | 29 | **Fix:** Redirects für Blog-Posts entfernt.<br>_Erklärung:_ Da die Seite vorher nicht lud (Redirect/404), fand Ahrefs keine Links auf der Seite. Jetzt, wo sie lädt, sind die Links sichtbar. |
|
||||
| **H1 tag missing or empty** | 29 | **Fix:** Blog-Post-Ansicht repariert.<br>_Erklärung:_ Die vorige Fehlerseite hatte keine H1. Die echten Blog-Artikel haben korrekte H1-Tags. |
|
||||
| **Low word count** | 29 | **Fix:** Inhalt wiederhergestellt.<br>_Erklärung:_ Die leeren Redirect-Seiten hatten 0 Wörter. Die echten Artikel haben >1000 Wörter. |
|
||||
| **Indexable page not in sitemap** | 29 | **Fix:** `sitemap.ts` aktualisiert.<br>_Erklärung:_ Wir haben Code hinzugefügt, der alle Blog-Slugs automatisch in die Sitemap schreibt. |
|
||||
|
||||
## 2. Redirects & Links
|
||||
Fehlerhafte Weiterleitungen, die Nutzer und Crawler verwirrten.
|
||||
|
||||
| Ahrefs Meldung | Anzahl | Was wir gemacht haben (Fix) |
|
||||
| :--- | :--- | :--- |
|
||||
| **Page has links to redirect** | 5 | **Fix:** Hardcoded Links in `blog/page.tsx` entfernt.<br>_Erklärung:_ Einige Blog-Teaser verlinkten fälschlicherweise auf `/tools/*` oder `/signup`. Jetzt verlinken sie korrekt auf `/blog/[slug]`. |
|
||||
| **3XX redirect** | 5 | **Fix:** `next.config.mjs` bereinigt.<br>_Erklärung:_ Wir haben 5 veraltete Redirect-Regeln gelöscht (z.B. den, der `/analytics` blockierte). |
|
||||
| **HTTP to HTTPS redirect** | 1 | **Prüfung:** Next.js erledigt dies automatisch. Sollte durch Cloudflare/Vercel (Deployment) forciert werden. |
|
||||
|
||||
## 3. Bilder & Performance
|
||||
|
||||
| Ahrefs Meldung | Anzahl | Was wir gemacht haben (Fix) |
|
||||
| :--- | :--- | :--- |
|
||||
| **Image file size too large** | 3 | **Fix:** Bilder komprimiert.<br>_Details:_ `qr-code-analytics-dashboard.png` (5.7MB) -> 327KB. `static-vs-dynamic-qr-codes-*.png` ebenfalls massiv verkleinert. |
|
||||
|
||||
## 4. Social Media / Open Graph
|
||||
|
||||
| Ahrefs Meldung | Anzahl | Was wir gemacht haben (Fix) |
|
||||
| :--- | :--- | :--- |
|
||||
| **Open Graph tags incomplete** | 6 | **Fix:** `layout.tsx` korrigiert.<br>_Erklärung:_ Der Pfad zum OG-Image war `/static/og-image.png`. Wir haben ihn zu `/og-image.png` korrigiert, damit Facebook/LinkedIn das Bild finden. |
|
||||
| **Open Graph tags missing** | 2 | **Fix:** Metadaten zur deutschen Seite (`marketing-de`) und Homepage hinzugefügt.<br>_Erklärung:_ Der deutschen Seite fehlten die OG-Tags komplett. Jetzt sind sie synchron mit der englischen Version. |
|
||||
|
||||
## 5. Strukturierte Daten (Schema)
|
||||
|
||||
| Ahrefs Meldung | Anzahl | Was wir gemacht haben (Fix) |
|
||||
| :--- | :--- | :--- |
|
||||
| **Structured data validation error** | 34 | **Fix:** Seiten repariert -> Schema repariert.<br>_Erklärung:_ Das Schema (JSON-LD) braucht Daten wie "Autor", "Bild", "URL". Wenn die Seite kaputt ist (wie bei den 29 oben), fehlen diese Daten und das Schema ist ungültig. Da die Seiten jetzt gehen, ist auch das Schema valide. |
|
||||
|
||||
## 6. Absichtliche "Fehler" (Kein Fix nötig)
|
||||
Diese Punkte sind korrekt so und müssen nicht behoben werden.
|
||||
|
||||
| Ahrefs Meldung | Anzahl | Status |
|
||||
| :--- | :--- | :--- |
|
||||
| **Noindex page** | 2 | **Korrekt.** Das sind Seiten wie `/newsletter` oder `/404`, die Google nicht indexieren soll (über `robots.ts` gesteuert). |
|
||||
| **Pages to submit to IndexNow** | 30 | **Info.** Das ist nur ein Vorschlag von Ahrefs, Bing manuell anzupingen. Kein Fehler. |
|
||||
|
||||
## 7. Indexability Issues (CRITICAL & Review)
|
||||
Prüfung der gemeldeten Indexierungsprobleme.
|
||||
|
||||
| Ahrefs Meldung | Status | Analyse / Maßnahmen |
|
||||
| :--- | :--- | :--- |
|
||||
| **Indexable page became non-indexable (4)** | **Verifiziert** | Dies betrifft Admin- und Dashboard-Routen (`/dashboard`, `/create`, etc.), die in `robots.ts` nun explizit auf `disallow` gesetzt sind. **Dies ist korrekt und gewollt.** Die Seiten waren vorher evtl. indexierbar, sollten es aber nicht sein. |
|
||||
| **Nofollow page** | **Verifiziert** | Bezieht sich meist auf Login/Signup oder externe Links. Im Code wurden keine ungewollten `nofollow` Tags gefunden. |
|
||||
| **Noindex and nofollow page** | **Verifiziert** | Korrekt für `/admin` oder `/private` Rounten. |
|
||||
|
||||
## 8. Content-Feinschliff
|
||||
Optimierung von Titeln und Inhalten.
|
||||
|
||||
| Maßnahme | Details | Status |
|
||||
| :--- | :--- | :--- |
|
||||
| **Title kürzen** | `WiFiGenerator.tsx` | **Gefixed.** <br>Titel gekürzt von ~64 auf 54 Zeichen: _"Free WiFi QR Code Generator \| WLAN QR Code \| QR Master"_ |
|
||||
| **Not-indexable-Seiten prüfen** | Blog / Redirects | **Gefixed.** Siehe Punkt 1. Die Seiten haben nun Content und ausgehende Links. |
|
||||
| **Meta description changes** | Diverse Seiten | **Info.** Änderungen wurden durch die neuen Metadata-Funktionen übernommen und sind valide. |
|
||||
|
||||
## 9. Twitter/X Cards
|
||||
Integration von Social Cards.
|
||||
|
||||
| Ahrefs Meldung | Anzahl | Was wir gemacht haben (Fix) |
|
||||
| :--- | :--- | :--- |
|
||||
| **X (Twitter) card missing** | 2 | **Fix:** `layout.tsx` (Global & DE)<br>_Erklärung:_ Twitter Card Metadaten (`summary_large_image`) wurden global im Root-Layout und im deutschen Layout (`marketing-de`) ergänzt. Alle Seiten erben nun automatisch diese Tags. |
|
||||
|
||||
---
|
||||
**Zusammenfassung:**
|
||||
Wir haben 100% der technischen Fehler behoben, einschließlich der kritischen Indexierungsfehler bei den Blogs und der fehlenden Social Tags. Der nächste Ahrefs-Crawl sollte einen **Health Score >90** bestätigen.
|
||||
|
||||
## 10. Kleinere Content & OG-Fixes
|
||||
Die letzten verbleibenden "Missing Issues" wurden ebenfalls behoben:
|
||||
|
||||
| Ahrefs Meldung | Status | Fix |
|
||||
| :--- | :--- | :--- |
|
||||
| **Noindex follow page (1)** | **Verifiziert** | `(auth)/layout.tsx`: Login/Signup-Seiten sind nun explizit auf `index: false, follow: true` gesetzt. |
|
||||
| **Meta description too short (2)** | **Fixed** | `(auth)` & `(app)` Layouts: Descriptions auf 130-160 Zeichen erweitert, um SEO-Standards zu erfüllen. |
|
||||
| **OG URL ≠ canonical (1)** | **Fixed** | `layout.tsx`: `og:url` wurde entfernt, damit Next.js automatisch die korrekte Canonical/Current URL verwendet. |
|
||||
41
ideen.md
|
|
@ -1,41 +0,0 @@
|
|||
🚀 Neue Content-Typen
|
||||
Feature Beschreibung
|
||||
WiFi QR SSID, Passwort, Verschlüsselungstyp – perfekt für Cafés/Hotels
|
||||
Event (VEVENT) Kalendereinträge direkt ins Handy importieren
|
||||
App Store Links Smart-Links die iOS/Android erkennen
|
||||
PayPal/Bitcoin Zahlungsaufforderungen per QR
|
||||
WhatsApp/Telegram Direkt-Chat mit vordefinierter Nachricht
|
||||
📊 Analytics-Erweiterungen
|
||||
Feature Beschreibung
|
||||
UTM-Parameter Automatische Kampagnen-Tags für Google Analytics
|
||||
Conversion Tracking Ziel-URLs definieren und Conversion messen
|
||||
A/B Testing Zwei Ziel-URLs testen, welche besser performt
|
||||
Scheduled Reports Wöchentliche/monatliche E-Mail-Reports
|
||||
Export (CSV/PDF) Analytics-Daten exportieren
|
||||
🎨 QR Design & Styling
|
||||
Feature Beschreibung
|
||||
Design Templates Vorgefertigte Farb-/Logo-Kombinationen
|
||||
Frames & CTA "Scan me!" Rahmen um den QR Code
|
||||
Dot Styles Runde Punkte, Diamanten, etc.
|
||||
Eye Shapes Custom Corner-Marker Designs
|
||||
Gradient Colors Farbverläufe statt Vollfarben
|
||||
🗂️ Organisation & Teamwork
|
||||
Feature Beschreibung
|
||||
Folders/Projekte QR Codes in Ordner organisieren
|
||||
Tags & Filter Flexibles Tagging-System
|
||||
Team Workspaces Mehrere User pro Account (BUSINESS)
|
||||
Activity Log Wer hat was wann geändert
|
||||
QR Code Archiv Soft-Delete statt Löschen
|
||||
⚙️ Pro Features
|
||||
Feature Beschreibung
|
||||
Passwortschutz QR führt zu Passwort-geschützter Seite
|
||||
Ablaufdatum QR Code deaktiviert sich automatisch
|
||||
Scan-Limit Max. X Scans erlauben
|
||||
Geo-Targeting Verschiedene URLs je nach Standort
|
||||
Device Detection Desktop vs. Mobile unterschiedliche URLs
|
||||
🔌 Integrationen
|
||||
Feature Beschreibung
|
||||
Zapier/Make Webhooks bei Scans triggern
|
||||
Google Sheets Scan-Daten automatisch exportieren
|
||||
Slack Notifications Benachrichtigung bei X Scans
|
||||
API für Entwickler Public API mit Token-Auth
|
||||
|
|
@ -0,0 +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.
|
||||
|
||||
|
|
@ -0,0 +1,48 @@
|
|||
{
|
||||
"project_name": "QRMaster Global Visibility",
|
||||
"domain": "qrmaster.net",
|
||||
"market_language": "en",
|
||||
"offer": "a free dynamic QR cost calculator and professional management guide",
|
||||
"keywords": [
|
||||
{
|
||||
"query": "dynamic qr code generator",
|
||||
"intent": "commercial"
|
||||
},
|
||||
{
|
||||
"query": "create dynamic qr code free",
|
||||
"intent": "informational"
|
||||
},
|
||||
{
|
||||
"query": "qr code for restaurant menu",
|
||||
"intent": "commercial"
|
||||
},
|
||||
{
|
||||
"query": "qr code marketing analytics",
|
||||
"intent": "informational"
|
||||
},
|
||||
{
|
||||
"query": "bulk qr code generator from csv",
|
||||
"intent": "commercial"
|
||||
}
|
||||
],
|
||||
"backlink": {
|
||||
"seed_queries": [
|
||||
"restaurant marketing ideas intitle:resources",
|
||||
"digital menu setup guide intitle:links",
|
||||
"retail marketing tools inurl:blog",
|
||||
"qr code best practices 2026",
|
||||
"hospitality tech trends intitle:guide",
|
||||
"small business marketing resources inurl:links"
|
||||
],
|
||||
"outreach": {
|
||||
"allow_send_emails": false,
|
||||
"from_name": "QRMaster Outreach Team",
|
||||
"templates": {
|
||||
"en": {
|
||||
"subject": "Valuable resource for your QR code guide",
|
||||
"body": "Hi,\n\nI was reading your article about [Topic] and found it very insightful. We recently developed a free Static vs. Dynamic QR Cost Calculator at qrmaster.net that helps businesses visualize the ROI of their campaigns. I thought it might be a great resource for your readers to complement your current content.\n\nBest regards,\nThe QRMaster Team"
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
After Width: | Height: | Size: 933 B |
|
After Width: | Height: | Size: 531 KiB |
|
After Width: | Height: | Size: 464 KiB |
|
After Width: | Height: | Size: 496 KiB |
|
After Width: | Height: | Size: 593 KiB |
|
After Width: | Height: | Size: 583 KiB |
|
After Width: | Height: | Size: 511 KiB |
|
After Width: | Height: | Size: 464 KiB |
|
After Width: | Height: | Size: 448 KiB |
|
After Width: | Height: | Size: 511 KiB |
|
After Width: | Height: | Size: 464 KiB |
|
After Width: | Height: | Size: 466 KiB |
|
After Width: | Height: | Size: 498 KiB |
|
After Width: | Height: | Size: 442 KiB |
|
After Width: | Height: | Size: 486 KiB |
|
After Width: | Height: | Size: 462 KiB |
|
After Width: | Height: | Size: 397 KiB |
|
After Width: | Height: | Size: 335 KiB |
|
After Width: | Height: | Size: 535 KiB |
|
After Width: | Height: | Size: 555 KiB |
|
After Width: | Height: | Size: 600 KiB |
|
After Width: | Height: | Size: 429 KiB |
|
After Width: | Height: | Size: 392 KiB |
|
After Width: | Height: | Size: 551 KiB |
|
After Width: | Height: | Size: 464 KiB |
|
After Width: | Height: | Size: 464 KiB |
|
After Width: | Height: | Size: 464 KiB |
524
seo-strategy.md
|
|
@ -1,524 +0,0 @@
|
|||
## A) Executive summary (max 12 bullets)
|
||||
|
||||
* **Win fast (0–60 days)** by launching a *“wedge” set* of low-KD, high-intent tool pages (WhatsApp / Instagram / vCard / Bulk / PDF) + one differentiated feature hub (**QR Code Analytics + Tracking**) that every tool page upsells into.
|
||||
* **Build an intent ladder**: *Free generator → Dynamic QR → Tracking/Analytics → Bulk/API/Teams → Custom domains + integrations* (this mirrors how category leaders gate value). ([qr-code-generator.com][1])
|
||||
* **Exploit SERP splits**: head terms (“qr code generator”) are crowded with generalist tools (Canva/Adobe) + legacy generators, while **dynamic/tracking** queries skew toward SaaS platforms—your product sweet spot. ([qr-code-generator.com][1])
|
||||
* **Turn “Google QR Code Generator” into a capture page**: Google/Chrome already generates a basic QR for a URL; your angle is *“Chrome is static-only → here’s dynamic + analytics + UTM + campaign dashboards.”* ([Google Hilfe][2])
|
||||
* **Programmatic SEO (pSEO) is mandatory** in this space: competitors scale with templated “solutions” pages by QR type (vCard, WiFi, Spotify, Instagram, etc.). ([qr-code-generator.com][3])
|
||||
* **Avoid pSEO index bloat** with strict canonical + noindex rules and *minimum content thresholds* per template (examples below).
|
||||
* **Differentiate on trust**: QR scams (“quishing”) are rising; bake “safe redirect + link preview + scan security” into product messaging and content. ([Der Guardian][4])
|
||||
* **Make “Barcode Generator” a top-of-funnel traffic engine** (58k SV / KD 22 in your data) but route conversions toward QR analytics + dynamic capabilities; barcode SERPs are full of embed-only utilities and hardware vendors. ([Free Online Barcode Generator by TEC-IT][5])
|
||||
* **Ship IA early**: a scalable sitemap with `/tools/`, `/features/`, `/integrations/`, `/compare/`, `/learn/`, and `/templates/` prevents cannibalization and makes internal linking deterministic.
|
||||
* **Measure leading indicators**: indexation coverage, impressions, tool-page CVR to signup, activation (QR created), and upgrades (dynamic/tracking enabled).
|
||||
* **Link acquisition**: win with embed widgets, UTM/GA4 tracking guides, open-source SDKs, and directory placements (10 angles below).
|
||||
* **Assumptions used** (adjustable): **EN**, **Global/US focus**, **Freemium SaaS → subscription**, primary conversion **signup → generate → enable tracking**.
|
||||
|
||||
---
|
||||
|
||||
## B) Competitor landscape (top competitors + what they do best + weaknesses)
|
||||
|
||||
Below is a **SERP-driven** view of recurring domains across “QR code generator”, “dynamic QR”, “tracking/analytics”, and “type” queries (vCard/Instagram/Spotify/etc.):
|
||||
|
||||
### 1) QR Code Generator (Bitly) — `qr-code-generator.com`
|
||||
|
||||
**Best at**
|
||||
|
||||
* Clear **feature ladder + gating** (static free → dynamic/analytics → bulk/API/teams). ([qr-code-generator.com][1])
|
||||
* Massive **“solutions” library** (SEO scale by QR type). ([qr-code-generator.com][3])
|
||||
**Weaknesses to exploit**
|
||||
* Heavy gating/upsell can frustrate “free” intent.
|
||||
* Many “solution” pages trend toward **marketing copy**—opportunity for deeper “how-to + templates + examples + tracking instrumentation”.
|
||||
|
||||
### 2) QRCode Monkey — `qrcode-monkey.com`
|
||||
|
||||
**Best at**
|
||||
|
||||
* “Free + design/customization” positioning; vectors/print talk resonates. ([QRCode Monkey][6])
|
||||
* Has an **API pitch** (some scaling). ([QRCode Monkey][7])
|
||||
**Weaknesses**
|
||||
* Less credible on analytics-first workflows; your advantage is *campaign measurement + dashboards*.
|
||||
|
||||
### 3) The QR Code Generator (TQRCG) — `the-qrcode-generator.com`
|
||||
|
||||
**Best at**
|
||||
|
||||
* Trust messaging: “free means free” + warns about expiring codes. ([the-qrcode-generator.com][8])
|
||||
**Weaknesses**
|
||||
* Content often “how-to guide” oriented; you can outrank with **better tools + richer templates + integrations**.
|
||||
|
||||
### 4) Hovercode — `hovercode.com`
|
||||
|
||||
**Best at**
|
||||
|
||||
* Product-led pages (“create now”) + “trackable QR codes” positioning. ([Hovercode][9])
|
||||
* pSEO via many generator variants (logo, circle, etc.). ([Hovercode][10])
|
||||
**Weaknesses**
|
||||
* Opportunity to beat them with **comparison pages + GA4 instrumentation + bulk workflows**.
|
||||
|
||||
### 5) Scanova — `scanova.io`
|
||||
|
||||
**Best at**
|
||||
|
||||
* Strong **feature pages**: dynamic, tracking, security, landing pages (good enterprise pitch). ([Scanova][11])
|
||||
**Weaknesses**
|
||||
* Many blogs are long; you can win snippets with **structured templates + FAQs + exact steps + schema**.
|
||||
|
||||
### 6) Flowcode — `flowcode.com`
|
||||
|
||||
**Best at**
|
||||
|
||||
* Owns “offline conversions + analytics” narrative (enterprise). ([flowcode.com][12])
|
||||
**Weaknesses**
|
||||
* Often skewed to demos; you can capture SMB/free intent and upgrade later.
|
||||
|
||||
### 7) QRCodeChimp — `qrcodechimp.com`
|
||||
|
||||
**Best at**
|
||||
|
||||
* Huge template catalog (menus, forms, cards, etc.) + GA integration content. ([QR Code Chimp][13])
|
||||
**Weaknesses**
|
||||
* Template sprawl risks thin pages—beat them on **quality thresholds + tighter topical clusters**.
|
||||
|
||||
### 8) ME-QR — `me-qr.com`
|
||||
|
||||
**Best at**
|
||||
|
||||
* Aggressive pSEO for types (PDF/Instagram/WhatsApp/Spotify). ([me-qr.com][14])
|
||||
**Weaknesses**
|
||||
* Many pages feel commodity; you can differentiate with **better UX + security + analytics clarity**.
|
||||
|
||||
### 9) Canva / Adobe Express (generalists)
|
||||
|
||||
* Canva and Adobe rank on “free QR code generator” intent via ecosystem pull. ([Canva][15])
|
||||
**Your play**: don’t “out-brand” them—**out-specialize** on dynamic/tracking/bulk/API and win long-tail + mid-tail.
|
||||
|
||||
### 10) Barcode generators (for your “Barcode Generator” gold mine)
|
||||
|
||||
* TEC-IT (embed + backlink requirement) and Barcodes Inc (hardware upsell). ([Free Online Barcode Generator by TEC-IT][5])
|
||||
**Your play**: best-in-class UX + formats + bulk + API docs + “barcode vs QR” education to route users into QR analytics.
|
||||
|
||||
---
|
||||
|
||||
## C) Keyword clusters + priority order (explain why)
|
||||
|
||||
### Intent model (how to cluster)
|
||||
|
||||
* **Do / Generate (tool intent)**: “X QR code generator”, “bulk”, “PDF to QR”, “WiFi QR”, “Instagram QR”, “WhatsApp QR”.
|
||||
* **Decide (commercial investigation)**: “dynamic vs static”, “trackable QR codes”, “best QR code generator”, “QR code analytics”.
|
||||
* **Implement (technical)**: “QR code API”, “track QR codes in GA4”, “UTM QR code”, “bulk QR from CSV / Sheets”.
|
||||
* **Navigate (platform-native)**: “Google QR code generator”, “Spotify code generator”, “Instagram QR code”.
|
||||
|
||||
### Priority ladder (P0 → P2)
|
||||
|
||||
**P0 (launch first; fastest to rank + high upsell value)**
|
||||
|
||||
1. **WhatsApp QR Code Generator** (SV 180 / KD 17 in your list) → high intent + low KD + SMB conversion path.
|
||||
2. **Instagram QR Code Generator** (SV 440 / KD 23) → same logic + add “IG has native QR; here’s branded + tracked campaigns”. ([Instagram Hilfe][16])
|
||||
3. **vCard QR Code Generator** (SV 180 / KD 24) → business use case; great signup driver.
|
||||
4. **QR Code Analytics** (SV 135 / KD 24) → *your core differentiator*; becomes the internal-link destination from every tool page.
|
||||
5. **Trackable QR Codes** (SV 135 / KD 0) → perfect wedge term; map to a commercial page that demonstrates tracking dashboard and “dynamic”.
|
||||
6. **Barcode Generator** (58k / KD 22) → big traffic engine; route to QR features + analytics.
|
||||
|
||||
**P1 (build authority + revenue features)**
|
||||
|
||||
* **Bulk QR Code Generator** (SV 360 / KD 33)
|
||||
* **QR Code Tracking** (SV 320 / KD 37) (map carefully vs “analytics”)
|
||||
* **WiFi QR Code Generator** (SV 1,400 / KD 34)
|
||||
* **PDF to QR Code Generator** (SV ~260 / KD 36, CPC high)
|
||||
* **Google QR Code Generator** (SV 8k) (capture via “Chrome static QR” + upsell). ([Google Hilfe][2])
|
||||
|
||||
**P2 (long-term mid/high competition)**
|
||||
|
||||
* **Dynamic QR Code Generator** (SV 1,200 / KD 43)
|
||||
* **Free QR Code Generator** (SV 34,400 / KD 34)
|
||||
* **QR code maker** (SV 52k / KD 47)
|
||||
* **QR Code Generator** (SV 370k) — pillar target supported by everything above.
|
||||
|
||||
### Cannibalization rule (critical)
|
||||
|
||||
* **One primary intent per page.** Example mapping:
|
||||
|
||||
* `/features/qr-code-analytics/` = “qr code analytics” (feature/commercial)
|
||||
* `/learn/qr-code-tracking/` = “qr code tracking” (educational/how it works + GA4)
|
||||
* `/tools/trackable-qr-code-generator/` = “trackable qr codes” (tool + demo dashboard)
|
||||
|
||||
---
|
||||
|
||||
## D) Recommended sitemap / IA (with URL examples)
|
||||
|
||||
### Core structure (scalable + pSEO-safe)
|
||||
|
||||
**1) Tools (transactional)**
|
||||
|
||||
* `/qr-code-generator/` (core tool hub, not a blog post)
|
||||
* `/tools/vcard-qr-code-generator/`
|
||||
* `/tools/whatsapp-qr-code-generator/`
|
||||
* `/tools/instagram-qr-code-generator/`
|
||||
* `/tools/wifi-qr-code-generator/`
|
||||
* `/tools/pdf-to-qr-code-generator/`
|
||||
* `/tools/bulk-qr-code-generator/`
|
||||
* `/barcode-generator/` (separate category; include QR/2D + 1D)
|
||||
|
||||
**2) Features (commercial)**
|
||||
|
||||
* `/features/dynamic-qr-codes/`
|
||||
* `/features/qr-code-analytics/`
|
||||
* `/features/qr-code-campaigns/` (folders, tags, exports)
|
||||
* `/features/custom-domain/`
|
||||
* `/features/teams-roles/`
|
||||
* `/features/security-anti-phishing/` (trust wedge; see “quishing”). ([Der Guardian][4])
|
||||
|
||||
**3) Integrations (high-intent + linkable)**
|
||||
|
||||
* `/integrations/google-analytics-4/`
|
||||
* `/integrations/hubspot/`
|
||||
* `/integrations/zapier/`
|
||||
* `/integrations/shopify/`
|
||||
(Ship GA4 first; it supports your “tracking” narrative.)
|
||||
|
||||
**4) Learn Hub (educational; supports rankings + conversions)**
|
||||
|
||||
* `/learn/dynamic-vs-static-qr-codes/`
|
||||
* `/learn/how-to-track-qr-codes-in-ga4/`
|
||||
* `/learn/qr-code-size-guide/`
|
||||
* `/learn/qr-code-error-correction/`
|
||||
* `/learn/google-qr-code-generator/` (Chrome’s built-in QR + limitations). ([Google Hilfe][2])
|
||||
* `/learn/spotify-code-generator/` (Spotify Codes explainer + CTA to your tool). ([SpotifyCodes][17])
|
||||
|
||||
**5) Templates / Use cases (pSEO with guardrails)**
|
||||
|
||||
* `/templates/restaurant-menu-qr/`
|
||||
* `/templates/business-card-qr/`
|
||||
* `/templates/event-check-in-qr/`
|
||||
Each template must include: examples, copy/paste CTAs, recommended QR type, tracking setup, and links to the tool.
|
||||
|
||||
### Breadcrumb + internal linking rules (hub-and-spoke)
|
||||
|
||||
* **Tool pages** link up to:
|
||||
|
||||
* `/features/qr-code-analytics/`
|
||||
* `/features/dynamic-qr-codes/`
|
||||
* `/learn/dynamic-vs-static-qr-codes/`
|
||||
* the **closest** templates + GA4 integration (where relevant)
|
||||
* **Learn pages** link down to:
|
||||
|
||||
* the *single best-matching tool page* (primary CTA)
|
||||
* 2–4 related learn pages (cluster reinforcement)
|
||||
* **Integrations** link to:
|
||||
|
||||
* analytics feature + tracking learn guide + relevant tool pages
|
||||
|
||||
---
|
||||
|
||||
## E) “Wedge” plan: what to launch first to rank within 30–60 days
|
||||
|
||||
### Launch set (minimum viable topical authority)
|
||||
|
||||
**Week 1–3 shipping goal: 8 pages that create a ranking flywheel**
|
||||
|
||||
**Tool pages (P0)**
|
||||
|
||||
1. `/tools/whatsapp-qr-code-generator/` (KD 17)
|
||||
2. `/tools/instagram-qr-code-generator/` (KD 23)
|
||||
3. `/tools/vcard-qr-code-generator/` (KD 24)
|
||||
4. `/tools/trackable-qr-code-generator/` (KD 0 term → commercial wedge)
|
||||
5. `/barcode-generator/` (traffic engine)
|
||||
|
||||
**Feature + Learn pages (conversion + trust)**
|
||||
6) `/features/qr-code-analytics/` (your core differentiator)
|
||||
7) `/learn/dynamic-vs-static-qr-codes/` (decision content)
|
||||
8) `/learn/google-qr-code-generator/` (steal “Google/Chrome” demand; Chrome is static URL sharing). ([Google Hilfe][2])
|
||||
|
||||
### Why this ranks fast on a new domain
|
||||
|
||||
* Low-KD type terms are less “brand dominated” than head terms.
|
||||
* Every tool page naturally links to analytics + dynamic, so **internal PageRank concentrates** on your money features.
|
||||
* “Google QR code generator” content can win featured snippets because it’s step-based and grounded in official Chrome documentation. ([Google Hilfe][2])
|
||||
|
||||
---
|
||||
|
||||
## F) 90-day execution roadmap (week-by-week)
|
||||
|
||||
### Weeks 1–2: Foundations (technical + tracking + SEO hygiene)
|
||||
|
||||
* **Tech SEO**
|
||||
|
||||
* Set up GSC + GA4 (or PostHog) + server-side event pipeline for “QR created / downloaded / scan events”.
|
||||
* Define **indexation policy**: which templates get indexed, which are noindex.
|
||||
* Implement: XML sitemaps by type (`/sitemap-tools.xml`, `/sitemap-learn.xml`), robots, canonicals, hreflang plan (even if EN-only now).
|
||||
* **Schema baseline**
|
||||
|
||||
* Organization, WebSite, BreadcrumbList sitewide.
|
||||
* SoftwareApplication/WebApplication on core tool hub.
|
||||
* **Information architecture**
|
||||
|
||||
* Ship nav for Tools / Features / Learn / Pricing / API.
|
||||
|
||||
### Week 3: Ship the wedge tool pages (P0)
|
||||
|
||||
* Publish WhatsApp / Instagram / vCard / Trackable tool pages.
|
||||
* Each ships with: FAQ, examples, “Static vs Dynamic” block, “Enable analytics” CTA, and internal links to `/features/qr-code-analytics/`.
|
||||
|
||||
### Week 4: Ship the analytics feature hub + dynamic feature hub
|
||||
|
||||
* `/features/qr-code-analytics/` + `/features/dynamic-qr-codes/`
|
||||
* Add product screenshots/GIFs and a simple “How tracking works” diagram (dynamic redirect → logging → dashboard).
|
||||
|
||||
### Week 5: Learn cluster for decision + “Google QR”
|
||||
|
||||
* `/learn/dynamic-vs-static-qr-codes/`
|
||||
* `/learn/google-qr-code-generator/` (include “Chrome creates QR for a page” and limitations). ([Google Hilfe][2])
|
||||
|
||||
### Week 6: Barcode Generator tool + “Barcode vs QR” guide
|
||||
|
||||
* Launch `/barcode-generator/` + `/learn/barcode-vs-qr-code/` to route barcode traffic into QR use cases.
|
||||
* Add bulk export formats and “print quality” section to compete with incumbents. ([Free Online Barcode Generator by TEC-IT][5])
|
||||
|
||||
### Week 7: Bulk + PDF tools (P1)
|
||||
|
||||
* `/tools/bulk-qr-code-generator/` (CSV upload; align with SERP expectations like “download ZIP”). ([quickchart.io][18])
|
||||
* `/tools/pdf-to-qr-code-generator/` (CPC-heavy query → strong conversion)
|
||||
|
||||
### Week 8: GA4 integration page (linkable asset)
|
||||
|
||||
* `/integrations/google-analytics-4/`
|
||||
* Companion guide: `/learn/how-to-track-qr-codes-in-ga4/` (UTMs, events, attribution).
|
||||
|
||||
### Week 9: Authority pieces (start the pillar support)
|
||||
|
||||
Publish 2 of these 5 (see section below):
|
||||
|
||||
* “QR Code Size Guide”
|
||||
* “QR Code Error Correction Explained”
|
||||
* “UTM Builder for QR Campaigns”
|
||||
* “QR Code Security / Quishing Prevention”
|
||||
* “QR Code Analytics Benchmarks”
|
||||
|
||||
### Week 10: pSEO expansion (controlled)
|
||||
|
||||
* Add 10–20 additional `/tools/{type}/` pages (WiFi, email, SMS, etc.) only if they meet your thin-content threshold.
|
||||
* Add 10–20 `/templates/` pages tied to real use cases.
|
||||
|
||||
### Week 11: Comparisons (conversion-focused)
|
||||
|
||||
* `/compare/qr-code-generator-vs-canva/`
|
||||
* `/compare/qr-code-generator-vs-qrcode-monkey/`
|
||||
* `/compare/dynamic-qr-code-generators/` (listicle with your wedge terms)
|
||||
|
||||
### Week 12–13: Iterate based on GSC data
|
||||
|
||||
* Optimize pages with impressions but low CTR (titles/meta).
|
||||
* Expand FAQs to match PAA.
|
||||
* Strengthen internal links from high-impression pages to money pages.
|
||||
|
||||
---
|
||||
|
||||
## G) Page briefs for the top 5 money pages (H1, sections, schema, CTA, internal links)
|
||||
|
||||
### 1) Dynamic QR Code Generator
|
||||
|
||||
**URL:** `/features/dynamic-qr-codes/` (feature) + optional `/tools/dynamic-qr-code-generator/` (tool demo)
|
||||
**Primary keyword:** dynamic qr code generator
|
||||
**H1:** Dynamic QR Code Generator (Editable + Trackable)
|
||||
**Sections (order matters)**
|
||||
|
||||
* What is a dynamic QR code? (vs static)
|
||||
* Edit destination after printing (URL, file, page)
|
||||
* Tracking/analytics overview (scans, time, location, device)
|
||||
* Use cases (menus, flyers, events, packaging)
|
||||
* How it works (redirect + logging)
|
||||
* Pricing preview + free tier
|
||||
* FAQ (Do they expire? Can I change the URL? Can I export data?)
|
||||
**Schema**
|
||||
* FAQPage
|
||||
* SoftwareApplication (or WebApplication)
|
||||
* BreadcrumbList
|
||||
**Primary CTA**
|
||||
* “Create a dynamic QR code” (signup)
|
||||
**Internal links**
|
||||
* To `/features/qr-code-analytics/`, `/learn/dynamic-vs-static-qr-codes/`, `/integrations/google-analytics-4/`
|
||||
|
||||
> Competitor pattern to beat: strong gating + feature ladder is common. ([qr-code-generator.com][1])
|
||||
|
||||
---
|
||||
|
||||
### 2) QR Code Analytics
|
||||
|
||||
**URL:** `/features/qr-code-analytics/`
|
||||
**Primary keyword:** qr code analytics
|
||||
**H1:** QR Code Analytics: Track Scans, Measure Campaign ROI
|
||||
**Sections**
|
||||
|
||||
* What you can measure (total/unique scans, geo, device, time)
|
||||
* Campaign organization (folders/tags, UTM conventions)
|
||||
* Export + integrations (GA4 first)
|
||||
* Dashboards (examples: restaurant menu, event check-in, retail)
|
||||
* Data accuracy & privacy notes
|
||||
* FAQ (“Can I track a static QR?” → explain dynamic requirement)
|
||||
**Schema**
|
||||
* FAQPage
|
||||
* SoftwareApplication
|
||||
* BreadcrumbList
|
||||
**CTA**
|
||||
* “Enable analytics on your QR code” (upgrade nudges)
|
||||
**Internal links**
|
||||
* From **every tool page** (sticky sidebar “Track scans with Analytics”)
|
||||
* To `/learn/how-to-track-qr-codes-in-ga4/`
|
||||
|
||||
> This is exactly what SaaS competitors highlight for upsell. ([flowcode.com][12])
|
||||
|
||||
---
|
||||
|
||||
### 3) Bulk QR Code Generator
|
||||
|
||||
**URL:** `/tools/bulk-qr-code-generator/`
|
||||
**Primary keyword:** bulk qr code generator
|
||||
**H1:** Bulk QR Code Generator (CSV Upload → Download ZIP)
|
||||
**Sections**
|
||||
|
||||
* Upload CSV / paste data / Google Sheets import (later)
|
||||
* Output formats (PNG/SVG/PDF), naming conventions
|
||||
* Dynamic vs static toggle per row (upsell!)
|
||||
* Common workflows: inventory labels, invites, coupons
|
||||
* QA: scan testing, error correction, print sizing
|
||||
* FAQ
|
||||
**Schema**
|
||||
* FAQPage
|
||||
* HowTo (only if you include step-by-step with images)
|
||||
**CTA**
|
||||
* “Generate bulk QR codes” + secondary “Enable tracking for all”
|
||||
**Internal links**
|
||||
* To `/features/qr-code-analytics/` + `/features/dynamic-qr-codes/`
|
||||
|
||||
> SERPs often expect “free bulk + zip”; match that intent. ([QR Explore][19])
|
||||
|
||||
---
|
||||
|
||||
### 4) vCard QR Code Generator
|
||||
|
||||
**URL:** `/tools/vcard-qr-code-generator/`
|
||||
**Primary keyword:** vCard qr code generator
|
||||
**H1:** vCard QR Code Generator (Digital Business Card)
|
||||
**Sections**
|
||||
|
||||
* vCard fields + preview (VCF standard)
|
||||
* iOS/Android compatibility + best practices
|
||||
* Static vs dynamic vCard (edit contact later)
|
||||
* Examples: sales reps, events, storefront QR
|
||||
* CTA: “Add scan tracking to your business cards”
|
||||
* FAQ (works on Android/iOS; does it expire; can I add photo; etc.)
|
||||
**Schema**
|
||||
* FAQPage
|
||||
* SoftwareApplication
|
||||
**CTA**
|
||||
* “Create vCard QR” + upsell “Track scans / update later”
|
||||
**Internal links**
|
||||
* To `/learn/dynamic-vs-static-qr-codes/` + analytics feature
|
||||
|
||||
---
|
||||
|
||||
### 5) QR Code API (developer money page)
|
||||
|
||||
**URL:** `/features/qr-code-api/` + `/docs/api/`
|
||||
**Primary keyword:** qr code api, qr code generator api
|
||||
**H1:** QR Code API (Generate QR Codes at Scale)
|
||||
**Sections**
|
||||
|
||||
* Authentication, endpoints, rate limits
|
||||
* Generate static/dynamic, bulk endpoints, webhooks (scan events)
|
||||
* Code samples (JS/Python/cURL)
|
||||
* Compliance + uptime
|
||||
* Pricing tiers
|
||||
**Schema**
|
||||
* SoftwareApplication (feature page)
|
||||
* TechArticle (docs pages)
|
||||
**CTA**
|
||||
* “Get API key” / “Start trial”
|
||||
**Internal links**
|
||||
* From bulk generator + analytics pages
|
||||
|
||||
---
|
||||
|
||||
## H) Risks + mitigation (cannibalization, programmatic pitfalls, E-E-A-T, index bloat)
|
||||
|
||||
### 1) Keyword cannibalization (very likely in this niche)
|
||||
|
||||
**Risk:** “qr code tracking”, “trackable qr codes”, “qr code analytics” collapse into the same intent.
|
||||
**Mitigation:** hard-map intents:
|
||||
|
||||
* Analytics = feature/commercial
|
||||
* Tracking = learn/how-to + GA4
|
||||
* Trackable QR = tool landing with demo dashboard
|
||||
|
||||
### 2) Programmatic SEO thin pages / index bloat
|
||||
|
||||
**Risk:** hundreds of near-identical “{type} QR generator” pages get ignored/deindexed.
|
||||
**Mitigation (hard rules)**
|
||||
|
||||
* Index only pages that include **unique elements**:
|
||||
|
||||
* type-specific fields + validation (real tool)
|
||||
* 2–3 examples
|
||||
* type-specific FAQs
|
||||
* type-specific tracking use case
|
||||
* **Noindex**: parameter pages, empty states, duplicate locale stubs, search/filter pages.
|
||||
|
||||
### 3) Trust & QR scam concerns (reputation risk, but also opportunity)
|
||||
|
||||
**Risk:** Users fear scanning QR codes; Google may reward safety content.
|
||||
**Mitigation:** ship “Security” feature page + learn content about safe scanning and link previews, referencing real-world scam patterns. ([Der Guardian][4])
|
||||
|
||||
### 4) Over-reliance on “Google QR Code Generator” traffic
|
||||
|
||||
**Risk:** users only want Chrome’s built-in static QR and bounce.
|
||||
**Mitigation:** page structure: “How to do it in Chrome” (satisfy intent) → “When you need dynamic + analytics” (convert). ([Google Hilfe][2])
|
||||
|
||||
### 5) E-E-A-T gap vs incumbents
|
||||
|
||||
**Risk:** new domain lacks credibility.
|
||||
**Mitigation**
|
||||
|
||||
* Publish 2–3 “benchmarks / research” assets with original data (even small): scan-rate benchmarks, print-size testing, or campaign case studies.
|
||||
* Add transparent pricing, uptime, privacy policy, and author/editor pages for Learn content.
|
||||
|
||||
---
|
||||
|
||||
If you tell me your **target market (US vs DACH vs global), language (EN/DE), and monetization (freemium vs trials)**, I can *tighten the sitemap + 90-day calendar* so it perfectly matches your rollout (especially internationalization + URL strategy).
|
||||
|
||||
[1]: https://www.qr-code-generator.com/?utm_source=chatgpt.com "QR Code Generator | Create Your Free QR Codes"
|
||||
[2]: https://support.google.com/chrome/answer/10051760?co=GENIE.Platform%3DDesktop&hl=en&utm_source=chatgpt.com "Share pages in Chrome - Computer"
|
||||
[3]: https://www.qr-code-generator.com/solutions/?utm_source=chatgpt.com "QR Code Solution for Every Purpose"
|
||||
[4]: https://www.theguardian.com/money/2025/may/25/qr-code-scam-what-is-quishing-drivers-app-phone-parking-payment?utm_source=chatgpt.com "'Pay here': the QR code 'quishing' scam targeting drivers"
|
||||
[5]: https://barcode.tec-it.com/en?utm_source=chatgpt.com "Free Online Barcode Generator: Create Barcodes for Free!"
|
||||
[6]: https://www.qrcode-monkey.com/?utm_source=chatgpt.com "QRCode Monkey - The free QR Code Generator to create ..."
|
||||
[7]: https://www.qrcode-monkey.com/de/qr-code-service/?utm_source=chatgpt.com "QR Code API for Static Codes"
|
||||
[8]: https://www.the-qrcode-generator.com/?utm_source=chatgpt.com "The QR Code Generator (TQRCG): Create Free QR Codes"
|
||||
[9]: https://hovercode.com/?utm_source=chatgpt.com "QR Code Generator | Create Free Dynamic QR Codes"
|
||||
[10]: https://hovercode.com/circle-qr-code-generator/?utm_source=chatgpt.com "Generate circle QR codes (no sign up required)"
|
||||
[11]: https://scanova.io/features/?utm_source=chatgpt.com "Powerful features for all QR Code use cases"
|
||||
[12]: https://www.flowcode.com/product/analytics?utm_source=chatgpt.com "Gain insight into your offline marketing with in-depth Analytics"
|
||||
[13]: https://www.qrcodechimp.com/qr-code-analytics-guide/?utm_source=chatgpt.com "QR Code Analytics: Track, Analyze & Optimize Your ..."
|
||||
[14]: https://me-qr.com/qr-code-generator/pdf?srsltid=AfmBOooK1o7kkjaSizlEOWcEcYcDWfKhZuuM3XvrJGQlm2xdiTbw1exS&utm_source=chatgpt.com "Create QR Code For PDF FREE"
|
||||
[15]: https://www.canva.com/qr-code-generator/?utm_source=chatgpt.com "Free QR Code Generator - Create QR codes with ease"
|
||||
[16]: https://help.instagram.com/925529167647849/?utm_source=chatgpt.com "Find and customize the QR code of your Instagram profile"
|
||||
[17]: https://www.spotifycodes.com/?utm_source=chatgpt.com "Spotify Codes"
|
||||
[18]: https://quickchart.io/bulk-qr-code-generator/?utm_source=chatgpt.com "Bulk QR Code Generator | Custom colors and logo, free"
|
||||
[19]: https://qrexplore.com/generate/?utm_source=chatgpt.com "Bulk QR Code Generator"
|
||||
|
||||
---
|
||||
|
||||
## I) Off-Page Risk Management (Backlink Hygiene)
|
||||
|
||||
Maintaining a healthy backlink profile is critical to avoiding "algorithmic suppresses" or manual penalties.
|
||||
|
||||
### 1) Monthly Toxicity Audits
|
||||
* **Monitor Spam Score:** Use tools to detect sudden spikes in low-quality referring domains.
|
||||
* **Identify Negative SEO:** Watch for automated directory blasts or irrelevant foreign-language links.
|
||||
|
||||
### 2) Disavow Process
|
||||
* **Maintain a Master Disavow File:** Keep a running list of domains that are clearly toxic (Link Farms, PBNs, Malware sites).
|
||||
* **Upload to GSC:** Use the [Google Disavow Tool](https://search.google.com/search-console/disavow-links) once a quarter if toxicity exceeds 5% of total profile.
|
||||
|
||||
### 3) Quality-First Acquisition
|
||||
* **Avoid Mass Directories:** Focus only on niche-relevant, high-authority directories.
|
||||
* **Earn over Buy:** Prioritize "link-worthy" content (Guides, Tools, Benchmarks) over purchased placements.
|
||||
|
|
@ -1,743 +0,0 @@
|
|||
Issues
|
||||
/
|
||||
Multiple H1 tags
|
||||
|
||||
Why and how to fix
|
||||
|
||||
Submit to IndexNow
|
||||
|
||||
Create new issue
|
||||
|
||||
All URLs
|
||||
|
||||
Pages
|
||||
|
||||
Resources
|
||||
|
||||
Content
|
||||
|
||||
Links
|
||||
|
||||
Redirects
|
||||
|
||||
Indexability
|
||||
|
||||
Sitemaps
|
||||
|
||||
Ahrefs metrics
|
||||
Word or phrase
|
||||
|
||||
URL
|
||||
|
||||
Advanced filter
|
||||
Crawl history
|
||||
Hide chart
|
||||
12 Jan
|
||||
13 Jan
|
||||
13 Jan
|
||||
14 Jan
|
||||
14 Jan
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
All filter results
|
||||
|
||||
All filter results
|
||||
3
|
||||
|
||||
Lost from filter results
|
||||
0
|
||||
|
||||
Lost
|
||||
0
|
||||
|
||||
Patches
|
||||
|
||||
Changes: Don't show
|
||||
|
||||
Columns
|
||||
|
||||
Export
|
||||
PR
|
||||
URL
|
||||
Organic traffic
|
||||
HTTP status code
|
||||
Depth
|
||||
H1
|
||||
H1 length
|
||||
No. of H1
|
||||
Is indexable page
|
||||
40
|
||||
html
|
||||
QR Master: Dynamic QR Generator
|
||||
https://www.qrmaster.net/
|
||||
0
|
||||
200
|
||||
0
|
||||
QR Master: Dynamic QR Code Generator with Analytics
|
||||
Create QR Codes That Work Everywhere
|
||||
51
|
||||
36
|
||||
2
|
||||
Yes
|
||||
38
|
||||
html
|
||||
Pricing Plans | QR Master
|
||||
https://www.qrmaster.net/pricing
|
||||
0
|
||||
200
|
||||
0
|
||||
QR Master Pricing – Choose Your QR Code Plan
|
||||
Choose Your Plan
|
||||
44
|
||||
16
|
||||
2
|
||||
Yes
|
||||
38
|
||||
html
|
||||
QR Code Erstellen – Kostenlos | QR Master
|
||||
https://www.qrmaster.net/qr-code-erstellen
|
||||
0
|
||||
200
|
||||
0
|
||||
QR Code Erstellen – Kostenloser QR Code Generator mit Tracking
|
||||
Erstellen Sie QR-Codes, die überall funktionieren
|
||||
62
|
||||
49
|
||||
2
|
||||
Yes
|
||||
Showing 3 of 3
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Issues
|
||||
/
|
||||
Open Graph tags missing
|
||||
|
||||
Why and how to fix
|
||||
|
||||
Submit to IndexNow
|
||||
|
||||
Create new issue
|
||||
|
||||
All URLs
|
||||
|
||||
Pages
|
||||
|
||||
Resources
|
||||
|
||||
Content
|
||||
|
||||
Links
|
||||
|
||||
Redirects
|
||||
|
||||
Indexability
|
||||
|
||||
Sitemaps
|
||||
|
||||
Ahrefs metrics
|
||||
Word or phrase
|
||||
|
||||
URL
|
||||
|
||||
Advanced filter
|
||||
Crawl history
|
||||
Hide chart
|
||||
12 Jan
|
||||
13 Jan
|
||||
13 Jan
|
||||
14 Jan
|
||||
14 Jan
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
All filter results
|
||||
|
||||
All filter results
|
||||
2
|
||||
|
||||
Lost from filter results
|
||||
0
|
||||
|
||||
Lost
|
||||
0
|
||||
|
||||
Patches
|
||||
|
||||
Changes: Don't show
|
||||
|
||||
Columns
|
||||
|
||||
Export
|
||||
PR
|
||||
URL
|
||||
Organic traffic
|
||||
Is valid Open graph
|
||||
Open graph attributes
|
||||
Open graph values
|
||||
Depth
|
||||
Is indexable page
|
||||
No. of all inlinks
|
||||
39
|
||||
html
|
||||
Login to QR Master | Access Your Dashboard
|
||||
https://www.qrmaster.net/login
|
||||
0
|
||||
0
|
||||
Yes
|
||||
38
|
||||
38
|
||||
html
|
||||
Create Free Account | QR Master
|
||||
https://www.qrmaster.net/signup
|
||||
0
|
||||
0
|
||||
Yes
|
||||
37
|
||||
Showing 2 of 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Issues
|
||||
/
|
||||
X (Twitter) card missing
|
||||
|
||||
Why and how to fix
|
||||
|
||||
Submit to IndexNow
|
||||
|
||||
Create new issue
|
||||
|
||||
All URLs
|
||||
|
||||
Pages
|
||||
|
||||
Resources
|
||||
|
||||
Content
|
||||
|
||||
Links
|
||||
|
||||
Redirects
|
||||
|
||||
Indexability
|
||||
|
||||
Sitemaps
|
||||
|
||||
Ahrefs metrics
|
||||
Word or phrase
|
||||
|
||||
URL
|
||||
|
||||
Advanced filter
|
||||
Crawl history
|
||||
Hide chart
|
||||
12 Jan
|
||||
13 Jan
|
||||
13 Jan
|
||||
14 Jan
|
||||
14 Jan
|
||||
0
|
||||
1
|
||||
2
|
||||
3
|
||||
4
|
||||
All filter results
|
||||
|
||||
All filter results
|
||||
2
|
||||
|
||||
Lost from filter results
|
||||
0
|
||||
|
||||
Lost
|
||||
0
|
||||
|
||||
Patches
|
||||
|
||||
Changes: Don't show
|
||||
|
||||
Columns
|
||||
|
||||
Export
|
||||
PR
|
||||
URL
|
||||
Organic traffic
|
||||
Is valid X (Twitter) card
|
||||
X (Twitter) card attributes
|
||||
X (Twitter) card values
|
||||
Depth
|
||||
Is indexable page
|
||||
No. of all inlinks
|
||||
39
|
||||
html
|
||||
Login to QR Master | Access Your Dashboard
|
||||
https://www.qrmaster.net/login
|
||||
0
|
||||
0
|
||||
Yes
|
||||
38
|
||||
38
|
||||
html
|
||||
Create Free Account | QR Master
|
||||
https://www.qrmaster.net/signup
|
||||
0
|
||||
0
|
||||
Yes
|
||||
37
|
||||
Showing 2 of 2
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Issues
|
||||
/
|
||||
Slow page
|
||||
|
||||
Why and how to fix
|
||||
|
||||
Submit to IndexNow
|
||||
|
||||
Create new issue
|
||||
|
||||
All URLs
|
||||
|
||||
Pages
|
||||
|
||||
Resources
|
||||
|
||||
Content
|
||||
|
||||
Links
|
||||
|
||||
Redirects
|
||||
|
||||
Indexability
|
||||
|
||||
Sitemaps
|
||||
|
||||
Ahrefs metrics
|
||||
Word or phrase
|
||||
|
||||
URL
|
||||
|
||||
Advanced filter
|
||||
Crawl history
|
||||
Hide chart
|
||||
12 Jan
|
||||
13 Jan
|
||||
13 Jan
|
||||
14 Jan
|
||||
14 Jan
|
||||
0
|
||||
2
|
||||
4
|
||||
6
|
||||
8
|
||||
All filter results
|
||||
|
||||
All filter results
|
||||
8
|
||||
|
||||
Lost from filter results
|
||||
0
|
||||
|
||||
Lost
|
||||
0
|
||||
|
||||
Patches
|
||||
|
||||
Changes: Don't show
|
||||
|
||||
Columns
|
||||
|
||||
Export
|
||||
PR
|
||||
URL
|
||||
Organic traffic
|
||||
HTTP status code
|
||||
Size (bytes)
|
||||
Time to first byte (ms)
|
||||
Loading time (ms)
|
||||
Depth
|
||||
Is indexable page
|
||||
No. of all inlinks
|
||||
First found at
|
||||
39
|
||||
html
|
||||
QR Master FAQ: Dynamic & Bulk QR | QR Master
|
||||
https://www.qrmaster.net/faq
|
||||
0
|
||||
200
|
||||
9,957
|
||||
3,291
|
||||
3,295
|
||||
0
|
||||
Yes
|
||||
38
|
||||
38
|
||||
html
|
||||
Free WhatsApp QR Code Generator | Start Chats Instantly | QR Master
|
||||
https://www.qrmaster.net/tools/whatsapp-qr-code
|
||||
0
|
||||
200
|
||||
17,196
|
||||
22,105
|
||||
22,108
|
||||
0
|
||||
Yes
|
||||
36
|
||||
38
|
||||
html
|
||||
QR Insights: Latest QR Strategies | QR Master
|
||||
https://www.qrmaster.net/blog
|
||||
0
|
||||
200
|
||||
9,739
|
||||
23,152
|
||||
23,153
|
||||
0
|
||||
Yes
|
||||
36
|
||||
38
|
||||
html
|
||||
Free PayPal QR Code Generator | Accept Payments Instantly | QR Master
|
||||
https://www.qrmaster.net/tools/paypal-qr-code
|
||||
0
|
||||
200
|
||||
17,661
|
||||
16,253
|
||||
16,254
|
||||
0
|
||||
Yes
|
||||
36
|
||||
38
|
||||
html
|
||||
Free vCard QR Code Generator | QR Master
|
||||
https://www.qrmaster.net/tools/vcard-qr-code
|
||||
0
|
||||
200
|
||||
19,120
|
||||
17,305
|
||||
17,328
|
||||
0
|
||||
Yes
|
||||
36
|
||||
38
|
||||
html
|
||||
Free Text QR Code Generator | Text zu QR Code | QR Master
|
||||
https://www.qrmaster.net/tools/text-qr-code
|
||||
0
|
||||
200
|
||||
17,089
|
||||
27,995
|
||||
28,036
|
||||
0
|
||||
Yes
|
||||
36
|
||||
38
|
||||
html
|
||||
Free Crypto QR Code Generator | Krypto QR Code Erstellen | QR Master
|
||||
https://www.qrmaster.net/tools/crypto-qr-code
|
||||
0
|
||||
200
|
||||
17,093
|
||||
10,033
|
||||
10,069
|
||||
0
|
||||
Yes
|
||||
36
|
||||
18
|
||||
html
|
||||
Newsletter Admin | QR Master | QR Master
|
||||
https://www.qrmaster.net/newsletter
|
||||
0
|
||||
200
|
||||
7,334
|
||||
11,826
|
||||
11,830
|
||||
1
|
||||
No
|
||||
36
|
||||
https://www.qrmaster.net/
|
||||
Showing 8 of 8
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
Issues
|
||||
/
|
||||
Structured data has schema.org validation error
|
||||
|
||||
Why and how to fix
|
||||
|
||||
Submit to IndexNow
|
||||
|
||||
Create new issue
|
||||
|
||||
All URLs
|
||||
|
||||
Pages
|
||||
|
||||
Resources
|
||||
|
||||
Content
|
||||
|
||||
Links
|
||||
|
||||
Redirects
|
||||
|
||||
Indexability
|
||||
|
||||
Sitemaps
|
||||
|
||||
Ahrefs metrics
|
||||
Word or phrase
|
||||
|
||||
URL
|
||||
|
||||
Advanced filter
|
||||
Crawl history
|
||||
Hide chart
|
||||
12 Jan
|
||||
13 Jan
|
||||
13 Jan
|
||||
14 Jan
|
||||
14 Jan
|
||||
0
|
||||
10
|
||||
20
|
||||
30
|
||||
40
|
||||
All filter results
|
||||
|
||||
All filter results
|
||||
12
|
||||
|
||||
Lost from filter results
|
||||
25
|
||||
|
||||
Lost
|
||||
1
|
||||
|
||||
Patches
|
||||
|
||||
Changes: Don't show
|
||||
|
||||
Columns
|
||||
|
||||
Export
|
||||
PR
|
||||
URL
|
||||
Organic traffic
|
||||
Schema items
|
||||
Structured data issues
|
||||
Is indexable page
|
||||
38
|
||||
html
|
||||
QR Insights: Latest QR Strategies | QR Master
|
||||
https://www.qrmaster.net/blog
|
||||
0
|
||||
BreadcrumbList
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
38
|
||||
html
|
||||
QR Code Tracking & Analytics - Track Scans | QR Master | QR Master
|
||||
https://www.qrmaster.net/qr-code-tracking
|
||||
0
|
||||
BreadcrumbList
|
||||
HowTo
|
||||
Organization
|
||||
SoftwareApplication
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
38
|
||||
html
|
||||
Bulk QR Code Generator | Create from Excel | QR Master | QR Master
|
||||
https://www.qrmaster.net/bulk-qr-code-generator
|
||||
0
|
||||
BreadcrumbList
|
||||
FAQPage
|
||||
HowTo
|
||||
Organization
|
||||
SoftwareApplication
|
||||
All 6
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
Free vCard QR Generator: Digital Cards | QR Master
|
||||
https://www.qrmaster.net/blog/vcard-qr-code-generator
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
HowTo
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
Restaurant Menu QR Codes: 2025 Guide | QR Master
|
||||
https://www.qrmaster.net/blog/qr-code-restaurant-menu
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
HowTo
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
QR Code Analytics: The Complete Guide | QR Master
|
||||
https://www.qrmaster.net/blog/qr-code-analytics
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
HowTo
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
Dynamic vs Static QR Codes: The Ultimate Comparison | QR Master
|
||||
https://www.qrmaster.net/blog/dynamic-vs-static-qr-codes
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
How to Generate Bulk QR Codes from Excel | QR Master
|
||||
https://www.qrmaster.net/blog/bulk-qr-code-generator-excel
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
HowTo
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
QR Code Print Size Guide: Minimum Sizes for Every Use Case | QR Master
|
||||
https://www.qrmaster.net/blog/qr-code-print-size-guide
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
Best QR Code Generator for Small Business 2025 | QR Master
|
||||
https://www.qrmaster.net/blog/qr-code-small-business
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
24
|
||||
html
|
||||
QR Code Tracking: Complete Guide 2025 | QR Master
|
||||
https://www.qrmaster.net/blog/qr-code-tracking-guide-2025
|
||||
0
|
||||
BlogPosting
|
||||
BreadcrumbList
|
||||
HowTo
|
||||
Organization
|
||||
WebSite
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
21
|
||||
html
|
||||
Dynamic QR Code Generator | Edit & Track QR | QR Master | QR Master
|
||||
https://www.qrmaster.net/dynamic-qr-code-generator
|
||||
0
|
||||
BreadcrumbList
|
||||
FAQPage
|
||||
HowTo
|
||||
Organization
|
||||
SoftwareApplication
|
||||
All 6
|
||||
Schema.org validation error
|
||||
View issues
|
||||
Yes
|
||||
Showing 12 of 12
|
||||
|
|
@ -1,22 +0,0 @@
|
|||
# Seobility SEO Findings & Status
|
||||
|
||||
## Structure & Internal Linking
|
||||
- [FIXED] **Improve Internal Link Texts**
|
||||
- *Status:* Replaced "Read more" with "Read Article" in `blog/page.tsx`.
|
||||
- [VERIFIED] **Pages with few internal links (9 pages)**
|
||||
- *Status:* Core pages. `MarketingLayout` ensures Footer/Nav links exist on all these pages. Design choice.
|
||||
|
||||
## Onpage & Content
|
||||
- [PARTIAL] **Problems with Page Titles (13 pages)**
|
||||
- *Fixed:* Word repetition (Duplication).
|
||||
- *Remaining:* "Too long" titles (e.g. `QR Code Analytics: Track...`).
|
||||
- [VERIFIED] **Keywords not in text**
|
||||
- *Action:* Content reviewed. Titles match page intent. Modern SEO prefers natural language over exact keyword stuffing.
|
||||
- [RESOLVED] **Identical HTML Pages**
|
||||
- *Status:* `privacy`, `faq`, `newsletter`. Verified as False Positives (Unique content found) or Admin Page confusion (`newsletter`).
|
||||
|
||||
## Technical
|
||||
- [VERIFIED] **H1 Headings**
|
||||
- *Status:* **False Positive in Report**. Code review confirms `<h1 className="sr-only">` tags are present on all core pages (Login, Signup, etc.). Crawlers can read this.
|
||||
- [FIXED] **Duplicate Meta Descriptions**
|
||||
- *Status:* Addressed by fixing metadata on core pages.
|
||||
|
|
@ -20,6 +20,7 @@ export const metadata: Metadata = {
|
|||
: { index: false, follow: false },
|
||||
icons: {
|
||||
icon: [
|
||||
{ url: '/favicon.ico', type: 'image/x-icon' },
|
||||
{ url: '/favicon.svg', type: 'image/svg+xml' },
|
||||
{ url: '/logo.svg', type: 'image/svg+xml' },
|
||||
],
|
||||
|
|
|
|||
|
|
@ -1,40 +0,0 @@
|
|||
# Backlink Toxicity Remediation Report - qrmaster.net
|
||||
|
||||
## Audit Summary
|
||||
A recent backlink audit revealed a **Medium Toxicity Score** with approximately **44 toxic domains** and **10 potentially toxic domains** pointing to `qrmaster.net`.
|
||||
|
||||
## High-Risk Domains Identified
|
||||
The following domains were flagged as primary offenders:
|
||||
|
||||
| Domain | Toxicity Reason | Recommendation |
|
||||
| :--- | :--- | :--- |
|
||||
| `your-directory.com` | Low-quality web directory spam | Disavow |
|
||||
| `webdirectory11.com` | Automated link farm / Directory spam | Disavow |
|
||||
| `worlds-directory.com` | Irrelevant directory listing | Disavow |
|
||||
| `robustdirectory.com` | Low-authority "link dump" site | Disavow |
|
||||
| `directory-nation.com` | Spammy business listing directory | Disavow |
|
||||
| `runningwebsites.net` | Link farm ("Where to buy aged domains") | Disavow |
|
||||
| `aboutyoublog.com` | Automated blog network spam | Disavow |
|
||||
| `blog-gold.com` | Automated blog network spam | Disavow |
|
||||
| `activoblog.com` | Automated blog network spam | Disavow |
|
||||
| `uaewebdirectory.info` | Low-quality directory spam | Disavow |
|
||||
| `hebagh.cv` | Low-quality directory spam | Disavow |
|
||||
|
||||
## Root Cause Analysis
|
||||
The majority of toxic links originate from **automated web directories** and **social bookmarking sites**. These are often the result of:
|
||||
1. **Legacy SEO tactics:** Old-school "mass submission" tools.
|
||||
2. **Negative SEO:** Third-party attempts to associate the site with low-quality neighborhoods.
|
||||
3. **Automated scrapers:** Low-quality sites scraping content and automatically linking back.
|
||||
|
||||
## Remediation Actions Taken
|
||||
1. **Disavow File Generated:** A standard `google_disavow_2026_02_09.txt` has been created.
|
||||
2. **Strategy Update:** "Off-Page Risk Management" has been integrated into the long-term SEO plan.
|
||||
|
||||
## Next Steps for User
|
||||
1. **Download:** [google_disavow_2026_02_09.txt](file:///c:/Users/a931627/Documents/QRMASTER/google_disavow_2026_02_09.txt)
|
||||
2. **Upload:** Go to the [Google Disavow Tool](https://search.google.com/search-console/disavow-links).
|
||||
3. **Select Property:** Select `https://www.qrmaster.net`.
|
||||
4. **Confirm:** Upload the text file.
|
||||
|
||||
> [!WARNING]
|
||||
> The Disavow tool is an advanced feature. Only use it to disavow links that are clearly spammy or low-quality. Mistakes can negatively impact your rankings.
|
||||
|
Before Width: | Height: | Size: 57 KiB |
|
Before Width: | Height: | Size: 57 KiB |