Compare commits
90 Commits
analytics
...
9e37136efd
| Author | SHA1 | Date | |
|---|---|---|---|
| 9e37136efd | |||
| 4569d89ab2 | |||
| 916ea51d68 | |||
| 8ade0ef92b | |||
| 7e894bf65e | |||
| 54c3652c99 | |||
|
|
702e2710de | ||
|
|
9ae05d48a4 | ||
|
|
324526cb64 | ||
|
|
9040e50837 | ||
|
|
30c1e57eab | ||
|
|
eef4855c1b | ||
| f3637fc2fe | |||
| 53dcfb686e | |||
|
|
74d0b5e7f2 | ||
|
|
ce4c6ab985 | ||
|
|
c2b32b794b | ||
|
|
7f4de4bd1e | ||
|
|
738f9766e1 | ||
|
|
cbafffdf1b | ||
|
|
f872fb64b2 | ||
|
|
9c5f7beb91 | ||
|
|
cb521f2aee | ||
|
|
b00697bc37 | ||
| 0409fe2afd | |||
| f67945d8e7 | |||
| 59131a54f0 | |||
|
|
e44dc1c6bb | ||
| 3682673852 | |||
|
|
1251584b13 | ||
|
|
dd93ca560a | ||
|
|
efb1654370 | ||
|
|
896c9b1a07 | ||
|
|
cca1374c9e | ||
|
|
c1471830f3 | ||
| 373e19a515 | |||
|
|
99acb37c83 | ||
| 7328b3240d | |||
|
|
185c40f470 | ||
|
|
9373db8ae6 | ||
|
|
0eafe421d2 | ||
|
|
af1c0456d7 | ||
|
|
2dec18fc97 | ||
| 2879fd0d8e | |||
|
|
be54d388bb | ||
|
|
83ea141230 | ||
|
|
0a02876ea4 | ||
|
|
904e439102 | ||
|
|
f68b7a331c | ||
| 1747922b29 | |||
| 8b7deb9312 | |||
| 6b586ac21b | |||
| 3e9daa648a | |||
| ceb2ac40ec | |||
| 65def796ea | |||
| e9bc1fe98b | |||
|
|
b63f5f424e | ||
|
|
9746fb970d | ||
|
|
fb788d89d3 | ||
|
|
d585e5aed3 | ||
|
|
fa538b8bec | ||
|
|
4fc1dcd7d8 | ||
|
|
ffe4cca5e5 | ||
|
|
5b74b7b405 | ||
|
|
5784a52e3c | ||
|
|
b3e858c033 | ||
|
|
111575aeda | ||
|
|
beed961eef | ||
|
|
95aa378763 | ||
|
|
e0871e2960 | ||
|
|
038c8dddbc | ||
|
|
c6adc8567f | ||
|
|
1f067e81f3 | ||
|
|
d64459b200 | ||
|
|
05531cda3f | ||
|
|
268689f2ee | ||
|
|
fb9058688e | ||
|
|
eb2faec952 | ||
|
|
e539aaf9a1 | ||
|
|
95e062eab6 | ||
|
|
a48045dacb | ||
|
|
b4fe905d8e | ||
|
|
d04e7a1f70 | ||
|
|
e7478a4af7 | ||
|
|
749cabf0bf | ||
|
|
036500f6d1 | ||
|
|
57d6e3a449 | ||
|
|
509e5a51a7 | ||
|
|
b2d83a0cd6 | ||
|
|
0774ff6f03 |
@@ -52,4 +52,4 @@ logs
|
|||||||
*.log
|
*.log
|
||||||
|
|
||||||
# Prisma
|
# Prisma
|
||||||
prisma/migrations
|
# prisma/migrations # Now included in Docker image for deployment
|
||||||
|
|||||||
@@ -1,7 +1,12 @@
|
|||||||
|
# Database credentials (used by both db and web services in docker-compose.yml)
|
||||||
|
POSTGRES_USER=postgres
|
||||||
|
POSTGRES_PASSWORD=postgres
|
||||||
|
POSTGRES_DB=qrmaster
|
||||||
|
|
||||||
|
# Note: DATABASE_URL and DIRECT_URL are auto-generated from POSTGRES_* vars in docker-compose.yml
|
||||||
|
# You don't need to set them here when using Docker Compose
|
||||||
NODE_ENV=production
|
NODE_ENV=production
|
||||||
PORT=3000
|
PORT=3000
|
||||||
DATABASE_URL=postgresql://postgres:postgres@db:5432/qrmaster?schema=public
|
|
||||||
DIRECT_URL=postgresql://postgres:postgres@db:5432/qrmaster?schema=public
|
|
||||||
NEXTAUTH_URL=http://localhost:3000
|
NEXTAUTH_URL=http://localhost:3000
|
||||||
NEXTAUTH_SECRET=CHANGE_ME
|
NEXTAUTH_SECRET=CHANGE_ME
|
||||||
NEXT_PUBLIC_APP_URL=http://localhost:3000
|
NEXT_PUBLIC_APP_URL=http://localhost:3000
|
||||||
|
|||||||
2
.gitignore
vendored
@@ -36,7 +36,7 @@ yarn-error.log*
|
|||||||
next-env.d.ts
|
next-env.d.ts
|
||||||
|
|
||||||
# prisma
|
# prisma
|
||||||
/prisma/migrations/
|
# /prisma/migrations/ # Now tracked in Git for deployment
|
||||||
|
|
||||||
# docker
|
# docker
|
||||||
docker-compose.override.yml
|
docker-compose.override.yml
|
||||||
|
|||||||
@@ -26,7 +26,6 @@ COPY --from=deps /app/node_modules ./node_modules
|
|||||||
COPY . .
|
COPY . .
|
||||||
ENV NEXT_TELEMETRY_DISABLED=1
|
ENV NEXT_TELEMETRY_DISABLED=1
|
||||||
# Add build-time environment variables with defaults
|
# Add build-time environment variables with defaults
|
||||||
ENV DATABASE_URL="postgresql://postgres:postgres@db:5432/qrmaster?schema=public"
|
|
||||||
ENV NEXTAUTH_URL="https://www.qrmaster.net"
|
ENV NEXTAUTH_URL="https://www.qrmaster.net"
|
||||||
ENV NEXTAUTH_SECRET="build-time-secret"
|
ENV NEXTAUTH_SECRET="build-time-secret"
|
||||||
ENV IP_SALT="build-time-salt"
|
ENV IP_SALT="build-time-salt"
|
||||||
@@ -37,6 +36,7 @@ ENV NEXT_PUBLIC_APP_URL="https://www.qrmaster.net"
|
|||||||
ENV NEXT_PUBLIC_POSTHOG_KEY="phc_97JBJVVQlqqiZuTVRHuBnnG9HasOv3GSsdeVjossizJ"
|
ENV NEXT_PUBLIC_POSTHOG_KEY="phc_97JBJVVQlqqiZuTVRHuBnnG9HasOv3GSsdeVjossizJ"
|
||||||
ENV NEXT_PUBLIC_POSTHOG_HOST="https://us.i.posthog.com"
|
ENV NEXT_PUBLIC_POSTHOG_HOST="https://us.i.posthog.com"
|
||||||
ENV NEXT_PUBLIC_INDEXABLE="true"
|
ENV NEXT_PUBLIC_INDEXABLE="true"
|
||||||
|
ENV NEXT_PUBLIC_FACEBOOK_PIXEL_ID="1601718491252690"
|
||||||
RUN npx prisma generate
|
RUN npx prisma generate
|
||||||
RUN npm run build
|
RUN npm run build
|
||||||
|
|
||||||
|
|||||||
87
INDEXING_GUIDE.md
Normal file
@@ -0,0 +1,87 @@
|
|||||||
|
# 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).
|
||||||
11
README.md
@@ -284,9 +284,9 @@ qr-master/
|
|||||||
|
|
||||||
| Variable | Description | Required | Default |
|
| Variable | Description | Required | Default |
|
||||||
| ------------------------------------ | ----------------------------- | -------- | ---------------------------------------------------------------------- |
|
| ------------------------------------ | ----------------------------- | -------- | ---------------------------------------------------------------------- |
|
||||||
| `DATABASE_URL` | PostgreSQL connection string | Yes | `postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public` |
|
| `DATABASE_URL` | PostgreSQL connection string | Yes | - |
|
||||||
| `NEXTAUTH_URL` | Application URL | Yes | `http://localhost:3050` |
|
| `NEXTAUTH_URL` | Application URL | Yes | `http://localhost:3050` |
|
||||||
| `NEXTAUTH_SECRET` | Secret for JWT encryption | Yes | Generate with `openssl rand -base64 32` |
|
| `NEXTAUTH_SECRET` | Secret for JWT encryption | Yes | - (Generate with `openssl rand -base64 32`) |
|
||||||
| `IP_SALT` | Salt for IP hashing (privacy) | Yes | Generate with `openssl rand -base64 32` |
|
| `IP_SALT` | Salt for IP hashing (privacy) | Yes | Generate with `openssl rand -base64 32` |
|
||||||
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | No | - |
|
| `GOOGLE_CLIENT_ID` | Google OAuth client ID | No | - |
|
||||||
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | No | - |
|
| `GOOGLE_CLIENT_SECRET` | Google OAuth client secret | No | - |
|
||||||
@@ -473,3 +473,10 @@ For support, email support@qrmaster.net or open an issue on GitHub.
|
|||||||
---
|
---
|
||||||
|
|
||||||
Built with ❤️ by QR Master Team
|
Built with ❤️ by QR Master Team
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Führe diese im Terminal aus:
|
||||||
|
|
||||||
|
IndexNow (Bing/Yandex + Partner): npm run submit:indexnow
|
||||||
|
Google Indexing API: npm run trigger:indexing
|
||||||
291
SIDE_PROJECT_STRATEGY.md
Normal file
@@ -0,0 +1,291 @@
|
|||||||
|
# 🚀 Side Project Marketing Strategy
|
||||||
|
|
||||||
|
> **"Engineering as Marketing"** – Kostenlose Micro-Tools bauen, um SEO-Traffic abzufangen und in zahlende Kunden zu konvertieren.
|
||||||
|
|
||||||
|
**Status:** Planung abgeschlossen, bereit für Implementierung
|
||||||
|
**Autor:** QR Master Team
|
||||||
|
**Letzte Aktualisierung:** 2026-01-08
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Executive Summary
|
||||||
|
|
||||||
|
Wir nutzen die bewiesene "Engineering as Marketing" Strategie (bekannt von HubSpot's Website Grader, Ahrefs' Free Tools, Shopify's Business Tools), um organischen Traffic über spezialisierte, kostenlose QR-Generatoren zu gewinnen.
|
||||||
|
|
||||||
|
### Das Konzept in einem Satz
|
||||||
|
|
||||||
|
> Anstatt gegen "QR Code Generator" (DA 90+ Konkurrenz) zu kämpfen, bauen wir 10 spezialisierte Tools für Long-Tail-Keywords wie "WiFi QR Code erstellen" oder "VCard QR Generator".
|
||||||
|
|
||||||
|
### Warum das funktioniert
|
||||||
|
|
||||||
|
1. **Weniger Konkurrenz:** "WiFi QR Code Generator" hat 1/10 der Konkurrenz von "QR Code Generator"
|
||||||
|
2. **Höhere Kaufabsicht:** Wer "Restaurant Menu QR Code" sucht, ist bereit für ein Premium-Tool
|
||||||
|
3. **Natürliche Backlinks:** Leute teilen nützliche Tools ("Hier, dieser Generator ist kostenlos")
|
||||||
|
4. **Zero Marginal Cost:** Client-Side Generierung = 0€ Serverkosten pro User
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## ROI Projektion (Konservativ)
|
||||||
|
|
||||||
|
| Metrik | Monat 3 | Monat 6 | Monat 12 |
|
||||||
|
|--------|---------|---------|----------|
|
||||||
|
| Organischer Traffic (alle Tools) | 2.000 | 10.000 | 25.000 |
|
||||||
|
| Free Signups (20% Conv.) | 400 | 2.000 | 5.000 |
|
||||||
|
| Paid Customers (3% der Signups) | 12 | 60 | 150 |
|
||||||
|
| **Zusätzlicher MRR** | **108€** | **540€** | **1.350€** |
|
||||||
|
|
||||||
|
> **Benchmarks verwendet:** 2-3% Free-to-Paid Conversion (Industry Standard), 20% Tool-to-Signup (optimistisch, aber erreichbar mit gutem UX).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Die Tools-Roadmap
|
||||||
|
|
||||||
|
### Phase 1: Quick Wins (Woche 1-2)
|
||||||
|
|
||||||
|
Fokus auf **hohes Suchvolumen + geringe Komplexität**.
|
||||||
|
|
||||||
|
| Tool | URL | Geschätztes SV | Implementierungs-Aufwand |
|
||||||
|
|------|-----|----------------|-------------------------|
|
||||||
|
| **WiFi QR Generator** | `/tools/wifi-qr-code` | 40.000/Monat | 4h |
|
||||||
|
| **VCard QR Generator** | `/tools/vcard-qr-code` | 15.000/Monat | 4h |
|
||||||
|
| **WhatsApp QR Generator** | `/tools/whatsapp-qr-code` | 20.000/Monat | 3h |
|
||||||
|
|
||||||
|
### Phase 2: Monetization Focus (Woche 3-4)
|
||||||
|
|
||||||
|
Fokus auf **hohe Conversion-Wahrscheinlichkeit** (B2B Use Cases).
|
||||||
|
|
||||||
|
| Tool | URL | Geschätztes SV | Upsell-Hook |
|
||||||
|
|------|-----|----------------|-------------|
|
||||||
|
| **App Store Link QR** | `/tools/app-store-qr-code` | 5.000/Monat | Smart Routing (iOS/Android) |
|
||||||
|
| **PDF to QR** | `/tools/pdf-qr-code` | 15.000/Monat | PDF Hosting (benötigt Account) |
|
||||||
|
| **Menu QR Generator** | `/tools/menu-qr-code` | 8.000/Monat | Multi-Sprache, Analytics |
|
||||||
|
|
||||||
|
### Phase 3: Differenzierung (Monat 2+)
|
||||||
|
|
||||||
|
Fokus auf **Unique Features** die Konkurrenten nicht haben.
|
||||||
|
|
||||||
|
| Tool | URL | Differenzierung |
|
||||||
|
|------|-----|-----------------|
|
||||||
|
| **Barcode Generator** | `/tools/barcode-generator` | EAN/UPC/ISBN Unterstützung |
|
||||||
|
| **Bitcoin/Crypto QR** | `/tools/bitcoin-qr-code` | Multi-Wallet Format |
|
||||||
|
| **AI Art QR (Viral)** | `/tools/ai-qr-code` | Stable Diffusion Integration |
|
||||||
|
|
||||||
|
## Geplantes Portfolio: Kostenlose Statische Generatoren (15 Typen)
|
||||||
|
|
||||||
|
Wir werden die folgenden 15 statischen QR-Code-Typen anbieten. Diese sind **dauerhaft kostenlos** und erfordern keine Server-Infrastruktur für Redirects (im Gegensatz zu dynamischen Codes).
|
||||||
|
|
||||||
|
> **Wichtig:** Alle diese Generatoren stehen sowohl **öffentlich als SEO-Landingpages** zur Verfügung (zur Neukundengewinnung), als auch im **eingeloggten Bereich** für registrierte Nutzer (für Komfort und Zentralisierung).
|
||||||
|
|
||||||
|
1. **URL / Link**: Der Standard. Öffnet eine Webseite.
|
||||||
|
2. **Text**: Zeigt reinen Text an (bis zu 300 Zeichen).
|
||||||
|
3. **WiFi**: Verbindet direkt mit einem WLAN-Netzwerk (WPA/WEP/Open).
|
||||||
|
4. **VCard / Kontakt**: Speichert einen Kontakt direkt im Adressbuch.
|
||||||
|
5. **WhatsApp**: Startet einen Chat mit einer Nummer (und optionalem Text).
|
||||||
|
6. **E-Mail**: Öffnet das E-Mail-Programm mit Empfänger, Betreff und Body.
|
||||||
|
7. **SMS**: Bereitet eine SMS an eine Nummer vor.
|
||||||
|
8. **Anruf / Tel**: Startet einen Anruf an eine Nummer.
|
||||||
|
9. **Event / Kalender**: Fügt einen Termin zum Kalender hinzu (.ics).
|
||||||
|
10. **Geo / Maps**: Öffnet einen Standort in Google Maps/Apple Maps.
|
||||||
|
11. **Facebook**: Öffnet ein Profil oder eine Seite.
|
||||||
|
12. **Instagram**: Öffnet ein Instagram-Profil.
|
||||||
|
13. **Twitter / X**: Öffnet ein Profil oder erstellt einen Tweet.
|
||||||
|
14. **YouTube**: Öffnet ein Video oder einen Kanal.
|
||||||
|
15. **TikTok**: Öffnet ein TikTok-Profil.
|
||||||
|
|
||||||
|
Diese Breite deckt 99% der "Everyday Use Cases" ab und maximiert die SEO-Angriffsfläche.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Technische Architektur
|
||||||
|
|
||||||
|
### Warum Client-Side Generierung?
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────────┐
|
||||||
|
│ USER BROWSER │
|
||||||
|
│ │
|
||||||
|
│ ┌─────────────┐ ┌──────────────┐ ┌────────────────┐ │
|
||||||
|
│ │ Form Input │ -> │ qrcode.js │ -> │ Canvas/SVG │ │
|
||||||
|
│ │ (SSID, PW) │ │ (generation) │ │ (download) │ │
|
||||||
|
│ └─────────────┘ └──────────────┘ └────────────────┘ │
|
||||||
|
│ │
|
||||||
|
│ KEINE Server-Calls! │
|
||||||
|
└─────────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**Vorteile:**
|
||||||
|
- **Privatsphäre:** Passwörter verlassen nie den Browser
|
||||||
|
- **Speed:** Instant Generation (kein Network Latency)
|
||||||
|
- **Kosten:** 0€ pro generiertem Code
|
||||||
|
- **Scale:** Kein Backend-Limit
|
||||||
|
|
||||||
|
### Datei-Struktur (Next.js)
|
||||||
|
|
||||||
|
```
|
||||||
|
src/app/(marketing)/tools/
|
||||||
|
├── wifi-qr-code/
|
||||||
|
│ ├── page.tsx # Server Component (SEO)
|
||||||
|
│ └── WiFiGenerator.tsx # Client Component (Interaktion)
|
||||||
|
├── vcard-qr-code/
|
||||||
|
│ ├── page.tsx
|
||||||
|
│ └── VCardGenerator.tsx
|
||||||
|
└── [weitere tools]/
|
||||||
|
```
|
||||||
|
|
||||||
|
### Shared Components
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// src/components/tools/QRDownloadButtons.tsx
|
||||||
|
// Wiederverwendbare Download-Buttons für alle Tools
|
||||||
|
|
||||||
|
// src/components/tools/UpgradePrompt.tsx
|
||||||
|
// "Willst du Scans tracken?" CTA Box
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## SEO-Strategie pro Tool-Page
|
||||||
|
|
||||||
|
Jede Seite folgt dem gleichen bewährten Muster:
|
||||||
|
|
||||||
|
### 1. Above the Fold: Sofort nutzbar
|
||||||
|
|
||||||
|
```
|
||||||
|
┌────────────────────────────────────────┐
|
||||||
|
│ H1: Free WiFi QR Code Generator │
|
||||||
|
│ Subline: Teile dein WLAN in Sekunden │
|
||||||
|
│ │
|
||||||
|
│ ┌─────────────────────────────────┐ │
|
||||||
|
│ │ [SSID] [Password] [WPA▼] │ │
|
||||||
|
│ │ │ │
|
||||||
|
│ │ [ Generate QR Code ] │ │
|
||||||
|
│ └─────────────────────────────────┘ │
|
||||||
|
└────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
**Regel:** Der User muss SOFORT interagieren können. Kein langer Intro-Text.
|
||||||
|
|
||||||
|
### 2. Schema Markup (Pflicht!)
|
||||||
|
|
||||||
|
```json
|
||||||
|
{
|
||||||
|
"@context": "https://schema.org",
|
||||||
|
"@type": "SoftwareApplication",
|
||||||
|
"name": "WiFi QR Code Generator",
|
||||||
|
"applicationCategory": "UtilitiesApplication",
|
||||||
|
"operatingSystem": "Web Browser",
|
||||||
|
"offers": {
|
||||||
|
"@type": "Offer",
|
||||||
|
"price": "0",
|
||||||
|
"priceCurrency": "EUR"
|
||||||
|
},
|
||||||
|
"aggregateRating": {
|
||||||
|
"@type": "AggregateRating",
|
||||||
|
"ratingValue": "4.8",
|
||||||
|
"ratingCount": "1247"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
### 3. FAQ Section (Long-Tail Keywords)
|
||||||
|
|
||||||
|
```markdown
|
||||||
|
## Häufig gestellte Fragen
|
||||||
|
|
||||||
|
### Wie funktioniert ein WiFi QR Code?
|
||||||
|
Der QR Code enthält deine WLAN-Daten im Format...
|
||||||
|
|
||||||
|
### Ist es sicher, mein WiFi Passwort in einem QR Code zu speichern?
|
||||||
|
Ja, der QR Code wird nur lokal in deinem Browser generiert...
|
||||||
|
|
||||||
|
### Kann ich den QR Code später bearbeiten?
|
||||||
|
Dieser Generator erstellt statische Codes. Für editierbare...
|
||||||
|
```
|
||||||
|
|
||||||
|
### 4. Conversion Prompt (Der Hook)
|
||||||
|
|
||||||
|
```
|
||||||
|
┌─────────────────────────────────────────────────────────┐
|
||||||
|
│ ✅ QR Code erfolgreich erstellt! │
|
||||||
|
│ │
|
||||||
|
│ ⚠️ Hinweis: Dies ist ein statischer Code. │
|
||||||
|
│ Wenn du dein Passwort änderst, musst du neu drucken. │
|
||||||
|
│ │
|
||||||
|
│ → Erstelle einen dynamischen Code (jederzeit änderbar) │
|
||||||
|
│ │
|
||||||
|
│ Bonus: Sieh wer deinen Code scannt (Datum, Standort) │
|
||||||
|
│ │
|
||||||
|
│ [ Kostenlos registrieren ] │
|
||||||
|
└─────────────────────────────────────────────────────────┘
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Conversion Optimierung
|
||||||
|
|
||||||
|
### Die "Limitation Awareness" Methode
|
||||||
|
|
||||||
|
Jedes Tool zeigt nach der Generierung **sanft** die Limitierungen auf:
|
||||||
|
|
||||||
|
| Tool | Statische Limitation | Upsell-Feature |
|
||||||
|
|------|---------------------|----------------|
|
||||||
|
| WiFi | Passwort-Änderung = Neudruck | Dynamischer Code (editierbar) |
|
||||||
|
| VCard | Kontakt-Update = Neudruck | Immer aktuelle Visitenkarte |
|
||||||
|
| Menu | Neue Speisekarte = Neudruck | PDF-Hosting + Analytics |
|
||||||
|
| App Store | Nur ein Store-Link | Smart Device Detection |
|
||||||
|
|
||||||
|
### Email Capture vor Download
|
||||||
|
|
||||||
|
**Optional (A/B testen):**
|
||||||
|
```
|
||||||
|
"Gib deine Email ein, um den QR als hochauflösende PNG zu erhalten"
|
||||||
|
```
|
||||||
|
→ Baut Email-Liste, auch wenn User nicht sofort konvertiert.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Erfolgsmetriken (KPIs)
|
||||||
|
|
||||||
|
| KPI | Tool | Ziel (Monat 3) |
|
||||||
|
|-----|------|----------------|
|
||||||
|
| **Organic Sessions** | Google Analytics | 2.000/Monat |
|
||||||
|
| **QR Generations** | PostHog Event | 500/Monat |
|
||||||
|
| **Signup Clicks** | PostHog Event | 100/Monat |
|
||||||
|
| **Actual Signups** | DB Query | 50/Monat |
|
||||||
|
| **Paid Conversion** | Stripe | 5/Monat |
|
||||||
|
|
||||||
|
### Tracking Events implementieren
|
||||||
|
|
||||||
|
```typescript
|
||||||
|
// Auf jeder Tool-Page
|
||||||
|
posthog.capture('tool_qr_generated', {
|
||||||
|
tool: 'wifi',
|
||||||
|
format: 'png'
|
||||||
|
});
|
||||||
|
|
||||||
|
posthog.capture('tool_signup_cta_clicked', {
|
||||||
|
tool: 'wifi'
|
||||||
|
});
|
||||||
|
```
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Nächste Schritte
|
||||||
|
|
||||||
|
1. [ ] **Heute:** WiFi QR Generator implementieren (`/tools/wifi-qr-code`)
|
||||||
|
2. [ ] **Diese Woche:** VCard + WhatsApp Generator
|
||||||
|
3. [ ] **Nächste Woche:** Google Search Console monitoren für erste Impressions
|
||||||
|
4. [ ] **Monat 2:** A/B Test Email-Capture vs. Direct Download
|
||||||
|
5. [ ] **Monat 3:** Phase 2 Tools (App Store, PDF, Menu)
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
## Referenzen & Inspiration
|
||||||
|
|
||||||
|
- [HubSpot Website Grader](https://website.grader.com/) – Das Original "Engineering as Marketing"
|
||||||
|
- [Ahrefs Free Tools](https://ahrefs.com/free-seo-tools) – 12+ Free Tools als Lead Magnets
|
||||||
|
- [Shopify Business Tools](https://www.shopify.com/tools) – Logo Maker, Invoice Generator, etc.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Dieses Dokument wird regelmäßig aktualisiert basierend auf Traffic-Daten und Conversion-Rates.*
|
||||||
BIN
TEMPLATE (Make a Copy) - AI SEO Audit Checklist v2.0 - v2.0.pdf
Normal file
29
ahrefs-findings.md
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# 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.
|
||||||
BIN
checklist/uploaded_image_0_1768484835516.png
Normal file
|
After Width: | Height: | Size: 216 KiB |
BIN
checklist/uploaded_image_1_1768484835516.png
Normal file
|
After Width: | Height: | Size: 206 KiB |
BIN
checklist/uploaded_image_2_1768484835516.png
Normal file
|
After Width: | Height: | Size: 185 KiB |
BIN
checklist/uploaded_image_3_1768484835516.png
Normal file
|
After Width: | Height: | Size: 95 KiB |
464
claude_plan_restaurant.md
Normal file
@@ -0,0 +1,464 @@
|
|||||||
|
Here is Claude's plan:
|
||||||
|
╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌╌
|
||||||
|
Restaurant Menu QR Code - Dashboard Integration Plan
|
||||||
|
|
||||||
|
Executive Summary
|
||||||
|
|
||||||
|
Add "Restaurant Menu" as a new QR code content type in the dashboard at /create.
|
||||||
|
Users can upload PDF menus, store them in Cloudflare R2, and generate dynamic QR
|
||||||
|
codes that redirect to the PDF. This integrates with the existing QRCode model and
|
||||||
|
tracking system.
|
||||||
|
|
||||||
|
Key Change: This is a dashboard feature (authenticated), not a public marketing
|
||||||
|
tool.
|
||||||
|
|
||||||
|
Architecture Overview
|
||||||
|
|
||||||
|
Integration Approach
|
||||||
|
|
||||||
|
- New ContentType: Add MENU to existing ContentType enum
|
||||||
|
- Existing Models: Use existing QRCode and QRScan models (no new tables)
|
||||||
|
- PDF Storage: Cloudflare R2 (S3-compatible, zero egress fees)
|
||||||
|
- URL Structure: Use existing /r/[slug] redirect (not new route)
|
||||||
|
- Authentication: Required (dashboard feature for logged-in users)
|
||||||
|
|
||||||
|
Data Flow
|
||||||
|
|
||||||
|
1. User logs in → Goes to /create → Selects "Restaurant Menu" type
|
||||||
|
2. Uploads PDF → Validate → Upload to R2 → Get public URL
|
||||||
|
3. Creates QR code with content: { pdfUrl: "...", restaurantName: "...", menuTitle:
|
||||||
|
"..." }
|
||||||
|
4. QR code redirects to: /r/[slug] → Redirect to PDF URL
|
||||||
|
5. Scans tracked in existing QRScan table
|
||||||
|
|
||||||
|
Database Schema Changes
|
||||||
|
|
||||||
|
Update Existing Enum
|
||||||
|
|
||||||
|
Modify /prisma/schema.prisma:
|
||||||
|
|
||||||
|
enum ContentType {
|
||||||
|
URL
|
||||||
|
VCARD
|
||||||
|
GEO
|
||||||
|
PHONE
|
||||||
|
SMS
|
||||||
|
TEXT
|
||||||
|
WHATSAPP
|
||||||
|
MENU // NEW: Restaurant menu PDFs
|
||||||
|
}
|
||||||
|
|
||||||
|
Migration Command: npx prisma migrate dev --name add_menu_content_type
|
||||||
|
|
||||||
|
No New Models Needed
|
||||||
|
|
||||||
|
The existing models handle everything:
|
||||||
|
|
||||||
|
QRCode model (already exists):
|
||||||
|
- contentType: MENU (new enum value)
|
||||||
|
- content: Json stores: { pdfUrl: string, restaurantName?: string, menuTitle?:
|
||||||
|
string }
|
||||||
|
- userId: String (owner of QR code)
|
||||||
|
- slug: String (for /r/[slug] redirect)
|
||||||
|
|
||||||
|
QRScan model (already exists):
|
||||||
|
- Tracks all scans regardless of content type
|
||||||
|
|
||||||
|
Environment Configuration
|
||||||
|
|
||||||
|
New Environment Variables
|
||||||
|
|
||||||
|
Add to .env and production:
|
||||||
|
|
||||||
|
# Cloudflare R2 (S3-compatible API)
|
||||||
|
R2_ACCOUNT_ID=your-cloudflare-account-id
|
||||||
|
R2_ACCESS_KEY_ID=your-r2-access-key
|
||||||
|
R2_SECRET_ACCESS_KEY=your-r2-secret-key
|
||||||
|
R2_BUCKET_NAME=qrmaster-menus
|
||||||
|
R2_PUBLIC_URL=https://pub-xxxxx.r2.dev # Or custom domain
|
||||||
|
|
||||||
|
# Menu upload limits
|
||||||
|
MAX_MENU_FILE_SIZE=10485760 # 10MB in bytes
|
||||||
|
|
||||||
|
Update env.ts
|
||||||
|
|
||||||
|
Add to /src/lib/env.ts schema:
|
||||||
|
|
||||||
|
const envSchema = z.object({
|
||||||
|
// ... existing fields ...
|
||||||
|
R2_ACCOUNT_ID: z.string().optional(),
|
||||||
|
R2_ACCESS_KEY_ID: z.string().optional(),
|
||||||
|
R2_SECRET_ACCESS_KEY: z.string().optional(),
|
||||||
|
R2_BUCKET_NAME: z.string().default('qrmaster-menus'),
|
||||||
|
R2_PUBLIC_URL: z.string().optional(),
|
||||||
|
MAX_MENU_FILE_SIZE: z.string().default('10485760'),
|
||||||
|
});
|
||||||
|
|
||||||
|
Critical Files to Modify/Create
|
||||||
|
|
||||||
|
1. R2 Client Library
|
||||||
|
|
||||||
|
File: /src/lib/r2.ts (NEW)
|
||||||
|
|
||||||
|
Purpose: Handle PDF uploads to Cloudflare R2
|
||||||
|
|
||||||
|
import { S3Client, PutObjectCommand, DeleteObjectCommand } from
|
||||||
|
'@aws-sdk/client-s3';
|
||||||
|
import { env } from './env';
|
||||||
|
|
||||||
|
const r2Client = new S3Client({
|
||||||
|
region: 'auto',
|
||||||
|
endpoint: `https://${env.R2_ACCOUNT_ID}.r2.cloudflarestorage.com`,
|
||||||
|
credentials: {
|
||||||
|
accessKeyId: env.R2_ACCESS_KEY_ID!,
|
||||||
|
secretAccessKey: env.R2_SECRET_ACCESS_KEY!,
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
|
export async function uploadMenuToR2(
|
||||||
|
file: Buffer,
|
||||||
|
filename: string,
|
||||||
|
shortId: string
|
||||||
|
): Promise<string> {
|
||||||
|
const key = `menus/${shortId}.pdf`;
|
||||||
|
|
||||||
|
await r2Client.send(
|
||||||
|
new PutObjectCommand({
|
||||||
|
Bucket: env.R2_BUCKET_NAME,
|
||||||
|
Key: key,
|
||||||
|
Body: file,
|
||||||
|
ContentType: 'application/pdf',
|
||||||
|
ContentDisposition: `inline; filename="${filename}"`,
|
||||||
|
CacheControl: 'public, max-age=31536000',
|
||||||
|
})
|
||||||
|
);
|
||||||
|
|
||||||
|
return `${env.R2_PUBLIC_URL}/${key}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
export async function deleteMenuFromR2(r2Key: string): Promise<void> {
|
||||||
|
await r2Client.send(
|
||||||
|
new DeleteObjectCommand({
|
||||||
|
Bucket: env.R2_BUCKET_NAME,
|
||||||
|
Key: r2Key,
|
||||||
|
})
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function generateUniqueFilename(originalFilename: string): string {
|
||||||
|
const timestamp = Date.now();
|
||||||
|
const random = crypto.randomBytes(4).toString('hex');
|
||||||
|
const ext = originalFilename.split('.').pop();
|
||||||
|
return `menu_${timestamp}_${random}.${ext}`;
|
||||||
|
}
|
||||||
|
|
||||||
|
2. Upload API Endpoint
|
||||||
|
|
||||||
|
File: /src/app/api/menu/upload/route.ts (NEW)
|
||||||
|
|
||||||
|
Purpose: Handle PDF uploads from the create page
|
||||||
|
|
||||||
|
Responsibilities:
|
||||||
|
- Accept multipart/form-data PDF upload
|
||||||
|
- Validate file type (PDF magic bytes), size (max 10MB)
|
||||||
|
- Rate limit: 10 uploads per minute per user (authenticated)
|
||||||
|
- Upload to R2 with unique filename
|
||||||
|
- Return R2 public URL
|
||||||
|
|
||||||
|
Request: FormData { file: File }
|
||||||
|
|
||||||
|
Response:
|
||||||
|
{
|
||||||
|
"success": true,
|
||||||
|
"pdfUrl": "https://pub-xxxxx.r2.dev/menus/menu_1234567890_abcd.pdf"
|
||||||
|
}
|
||||||
|
|
||||||
|
Key Implementation Details:
|
||||||
|
- Use request.formData() to parse upload
|
||||||
|
- Check PDF magic bytes: %PDF- at file start
|
||||||
|
- Verify authentication (userId from cookies)
|
||||||
|
- Rate limit by userId (not IP, since authenticated)
|
||||||
|
- Error handling: 401 (not authenticated), 413 (too large), 415 (wrong type), 429
|
||||||
|
(rate limit)
|
||||||
|
|
||||||
|
3. Update Redirect Route
|
||||||
|
|
||||||
|
File: /src/app/r/[slug]/route.ts (MODIFY)
|
||||||
|
|
||||||
|
Add MENU case to the switch statement (around line 33-64):
|
||||||
|
|
||||||
|
case 'MENU':
|
||||||
|
destination = content.pdfUrl || 'https://example.com';
|
||||||
|
break;
|
||||||
|
|
||||||
|
Explanation: When a dynamic MENU QR code is scanned, redirect directly to the PDF
|
||||||
|
URL stored in content.pdfUrl
|
||||||
|
|
||||||
|
4. Update Validation Schema
|
||||||
|
|
||||||
|
File: /src/lib/validationSchemas.ts (MODIFY)
|
||||||
|
|
||||||
|
Line 28: Update contentType enum to include MENU:
|
||||||
|
|
||||||
|
contentType: z.enum(['URL', 'VCARD', 'GEO', 'PHONE', 'SMS', 'WHATSAPP', 'TEXT',
|
||||||
|
'MENU'], {
|
||||||
|
errorMap: () => ({ message: 'Invalid content type' })
|
||||||
|
}),
|
||||||
|
|
||||||
|
Line 63: Update bulk QR schema as well:
|
||||||
|
|
||||||
|
contentType: z.enum(['URL', 'VCARD', 'GEO', 'PHONE', 'SMS', 'WHATSAPP', 'TEXT',
|
||||||
|
'MENU']),
|
||||||
|
|
||||||
|
5. Update Create Page - Add MENU Type
|
||||||
|
|
||||||
|
File: /src/app/(app)/create/page.tsx (MODIFY)
|
||||||
|
|
||||||
|
Multiple changes needed:
|
||||||
|
|
||||||
|
A. Add MENU to contentTypes array (around line 104-109):
|
||||||
|
|
||||||
|
const contentTypes = [
|
||||||
|
{ value: 'URL', label: 'URL / Website' },
|
||||||
|
{ value: 'VCARD', label: 'Contact Card' },
|
||||||
|
{ value: 'GEO', label: 'Location/Maps' },
|
||||||
|
{ value: 'PHONE', label: 'Phone Number' },
|
||||||
|
{ value: 'MENU', label: 'Restaurant Menu' }, // NEW
|
||||||
|
];
|
||||||
|
|
||||||
|
B. Add MENU case to getQRContent() (around line 112-134):
|
||||||
|
|
||||||
|
case 'MENU':
|
||||||
|
return content.pdfUrl || 'https://example.com/menu.pdf';
|
||||||
|
|
||||||
|
C. Add MENU frame options in getFrameOptionsForContentType() (around line 19-40):
|
||||||
|
|
||||||
|
case 'MENU':
|
||||||
|
return [...baseOptions, { id: 'menu', label: 'Menu' }, { id: 'order', label:
|
||||||
|
'Order Here' }, { id: 'viewmenu', label: 'View Menu' }];
|
||||||
|
|
||||||
|
D. Add MENU-specific form fields in renderContentFields() function (needs to be
|
||||||
|
added):
|
||||||
|
|
||||||
|
This will be a new section after the URL/VCARD/GEO/PHONE sections that renders:
|
||||||
|
- File upload dropzone (react-dropzone)
|
||||||
|
- Upload button with loading state
|
||||||
|
- Optional: Restaurant name input
|
||||||
|
- Optional: Menu title input
|
||||||
|
|
||||||
|
After upload success, store pdfUrl in content state:
|
||||||
|
setContent({ pdfUrl: response.pdfUrl, restaurantName: '', menuTitle: '' });
|
||||||
|
|
||||||
|
6. Update Rate Limiting
|
||||||
|
|
||||||
|
File: /src/lib/rateLimit.ts (MODIFY)
|
||||||
|
|
||||||
|
Add to RateLimits object (after line 229):
|
||||||
|
|
||||||
|
// Menu PDF upload: 10 per minute (authenticated users)
|
||||||
|
MENU_UPLOAD: {
|
||||||
|
name: 'menu-upload',
|
||||||
|
maxRequests: 10,
|
||||||
|
windowSeconds: 60,
|
||||||
|
},
|
||||||
|
|
||||||
|
Implementation Steps
|
||||||
|
|
||||||
|
Phase 1: Backend Setup (Day 1)
|
||||||
|
|
||||||
|
1. Install Dependencies
|
||||||
|
npm install @aws-sdk/client-s3 react-dropzone
|
||||||
|
2. Configure Cloudflare R2
|
||||||
|
- Create R2 bucket: "qrmaster-menus" via Cloudflare dashboard
|
||||||
|
- Generate API credentials (Access Key ID + Secret)
|
||||||
|
- Add credentials to .env and production environment
|
||||||
|
- Set bucket to public (for PDF access)
|
||||||
|
3. Database Migration
|
||||||
|
- Add MENU to ContentType enum in prisma/schema.prisma
|
||||||
|
- Run: npx prisma migrate dev --name add_menu_content_type
|
||||||
|
- Verify migration: npx prisma studio
|
||||||
|
4. Environment Configuration
|
||||||
|
- Update src/lib/env.ts with R2 variables
|
||||||
|
- Update src/lib/rateLimit.ts with MENU_UPLOAD config
|
||||||
|
5. Create R2 Client
|
||||||
|
- Create src/lib/r2.ts with upload function
|
||||||
|
- Test in development: upload sample PDF
|
||||||
|
|
||||||
|
Phase 2: API & Validation (Day 1-2)
|
||||||
|
|
||||||
|
6. Update Validation Schema (/src/lib/validationSchemas.ts)
|
||||||
|
- Add MENU to contentType enums (line 28 and 63)
|
||||||
|
- Verify no other changes needed
|
||||||
|
7. Create Upload API (/src/app/api/menu/upload/route.ts)
|
||||||
|
- Parse multipart/form-data
|
||||||
|
- Validate PDF (magic bytes, size)
|
||||||
|
- Verify authentication (userId from cookies)
|
||||||
|
- Rate limit by userId (10/minute)
|
||||||
|
- Upload to R2
|
||||||
|
- Return pdfUrl
|
||||||
|
8. Update Redirect Route (/src/app/r/[slug]/route.ts)
|
||||||
|
- Add MENU case to switch statement (line 33-64)
|
||||||
|
- Redirect to content.pdfUrl
|
||||||
|
|
||||||
|
Phase 3: Dashboard Integration (Day 2-3)
|
||||||
|
|
||||||
|
9. Update Create Page (/src/app/(app)/create/page.tsx)
|
||||||
|
- Add MENU to contentTypes array (line 104-109)
|
||||||
|
- Add MENU case in getQRContent() (line 112-134)
|
||||||
|
- Add MENU frame options in getFrameOptionsForContentType() (line 19-40)
|
||||||
|
- Add renderContentFields() for MENU type:
|
||||||
|
- File upload dropzone (react-dropzone)
|
||||||
|
- Upload button + loading state
|
||||||
|
- Optional restaurant name input
|
||||||
|
- Optional menu title input
|
||||||
|
- Handle file upload:
|
||||||
|
- POST to /api/menu/upload
|
||||||
|
- Update content state with pdfUrl
|
||||||
|
- Show success message
|
||||||
|
|
||||||
|
Phase 4: Testing & Polish (Day 3-4)
|
||||||
|
|
||||||
|
10. Functional Testing
|
||||||
|
- Login to dashboard → Go to /create
|
||||||
|
- Select "Restaurant Menu" content type
|
||||||
|
- Upload various PDF sizes (1MB, 5MB, 10MB, 11MB - should reject)
|
||||||
|
- Test non-PDF files (should reject)
|
||||||
|
- Test rate limiting (11th upload in minute should fail)
|
||||||
|
- Create dynamic QR code with restaurant name
|
||||||
|
- Test QR code redirect (/r/[slug] → PDF URL)
|
||||||
|
- Test scan tracking (verify QRScan record created)
|
||||||
|
- Test on mobile (scan QR with phone camera, PDF opens)
|
||||||
|
11. Error Handling
|
||||||
|
- Not authenticated: 401 error
|
||||||
|
- File too large: "File too large. Maximum size: 10MB"
|
||||||
|
- Invalid file type: "Please upload a PDF file"
|
||||||
|
- Upload failed: "Upload failed, please try again"
|
||||||
|
- R2 upload error: Handle gracefully with toast message
|
||||||
|
12. UI Polish
|
||||||
|
- Loading states during PDF upload
|
||||||
|
- Upload progress indicator
|
||||||
|
- Success message after upload
|
||||||
|
- Preview QR code with PDF link
|
||||||
|
- Responsive design (mobile, tablet, desktop)
|
||||||
|
- Accessibility (ARIA labels, keyboard nav)
|
||||||
|
|
||||||
|
Phase 5: Deployment (Day 4)
|
||||||
|
|
||||||
|
13. Production Setup
|
||||||
|
- Add R2 credentials to Cloudflare Pages environment variables
|
||||||
|
- Run database migration: npx prisma migrate deploy
|
||||||
|
- Verify R2 bucket is public (for PDF access)
|
||||||
|
14. Deploy to Production
|
||||||
|
- Deploy to Cloudflare Pages
|
||||||
|
- Test upload in production dashboard
|
||||||
|
- Create test QR code, verify redirect works
|
||||||
|
- Monitor logs for errors
|
||||||
|
15. Documentation
|
||||||
|
- Update user docs (if any) about new MENU content type
|
||||||
|
- Add tooltips/help text in create page for menu upload
|
||||||
|
|
||||||
|
Edge Cases & Solutions
|
||||||
|
|
||||||
|
File Validation
|
||||||
|
|
||||||
|
- Problem: User uploads 50MB PDF or .exe file
|
||||||
|
- Solution:
|
||||||
|
- Client-side validation (check file.size and file.type before upload)
|
||||||
|
- Server-side validation (PDF magic bytes: %PDF-, 10MB limit)
|
||||||
|
- Error: "File too large. Maximum size: 10MB" or "Please upload a PDF file"
|
||||||
|
|
||||||
|
Rate Limiting
|
||||||
|
|
||||||
|
- Problem: User uploads many PDFs quickly
|
||||||
|
- Solution:
|
||||||
|
- Rate limit by userId: 10 uploads per minute (authenticated)
|
||||||
|
- Show toast error: "Too many uploads. Please wait a moment."
|
||||||
|
- More generous than anonymous (since authenticated)
|
||||||
|
|
||||||
|
PDF Deletion/Management
|
||||||
|
|
||||||
|
- Problem: User deletes QR code, but PDF stays in R2
|
||||||
|
- Solution (Phase 1): Leave PDFs in R2 (simple, safe)
|
||||||
|
- Future Enhancement: Add cleanup job to delete unused PDFs
|
||||||
|
- Check QRCode records, delete orphaned R2 files
|
||||||
|
- Run monthly via cron job
|
||||||
|
|
||||||
|
Large PDF Files
|
||||||
|
|
||||||
|
- Problem: 10MB limit might be too small for some menus
|
||||||
|
- Solution (Phase 1): Start with 10MB limit
|
||||||
|
- Future: Increase to 20MB if users request it
|
||||||
|
- Best Practice: Recommend users optimize PDFs (compress images)
|
||||||
|
|
||||||
|
PDF URL Stored in JSON
|
||||||
|
|
||||||
|
- Problem: If R2 URL changes, need to update all QRCode records
|
||||||
|
- Solution: Use consistent R2 bucket URL (won't change)
|
||||||
|
- Migration: If R2 URL ever changes, run SQL update on content JSON field
|
||||||
|
|
||||||
|
Verification & Testing
|
||||||
|
|
||||||
|
End-to-End Test Scenario
|
||||||
|
|
||||||
|
1. Authentication Test
|
||||||
|
- Log in to dashboard at /login
|
||||||
|
- Navigate to /create
|
||||||
|
- Verify "Restaurant Menu" appears in content type dropdown
|
||||||
|
2. Upload Test
|
||||||
|
- Select "Restaurant Menu" content type
|
||||||
|
- Upload sample restaurant menu PDF (2MB)
|
||||||
|
- Enter restaurant name: "Test Restaurant"
|
||||||
|
- Enter menu title: "Dinner Menu"
|
||||||
|
- Verify success message and pdfUrl returned
|
||||||
|
3. QR Code Creation Test
|
||||||
|
- Enter title: "My Restaurant Menu QR"
|
||||||
|
- Select Dynamic QR type
|
||||||
|
- Customize QR color (change to blue)
|
||||||
|
- Select frame: "Menu"
|
||||||
|
- Click "Create QR Code"
|
||||||
|
- Verify success redirect to dashboard
|
||||||
|
4. Scan Test
|
||||||
|
- From dashboard, copy QR code URL: qrmaster.net/r/[slug]
|
||||||
|
- Open URL in browser
|
||||||
|
- Verify 307 redirect to R2 PDF URL
|
||||||
|
- PDF opens in browser correctly
|
||||||
|
5. Analytics Test
|
||||||
|
- Go to dashboard, click on created menu QR
|
||||||
|
- View analytics page
|
||||||
|
- Verify scan count = 1 (from previous test)
|
||||||
|
- Check device type is recorded correctly
|
||||||
|
6. Mobile Test
|
||||||
|
- Download QR code as PNG
|
||||||
|
- Display on screen
|
||||||
|
- Scan with phone camera
|
||||||
|
- Verify phone opens PDF directly
|
||||||
|
- Check dashboard - scan count should increment
|
||||||
|
7. Rate Limit Test
|
||||||
|
- Upload 10 PDFs in quick succession (should succeed)
|
||||||
|
- Upload 11th PDF within same minute (should fail with 429)
|
||||||
|
- Wait 1 minute, verify uploads work again
|
||||||
|
|
||||||
|
Success Metrics
|
||||||
|
|
||||||
|
- MENU content type available in dashboard /create page
|
||||||
|
- Users can upload PDFs and create QR codes successfully
|
||||||
|
- PDFs stored in R2 and accessible via public URLs
|
||||||
|
- Dynamic QR codes redirect correctly: /r/[slug] → PDF
|
||||||
|
- Scan tracking works (QRScan records created)
|
||||||
|
- Rate limiting prevents abuse (10/minute per user)
|
||||||
|
- Existing QR code functionality unaffected
|
||||||
|
- No breaking changes to other content types
|
||||||
|
|
||||||
|
Critical File Paths
|
||||||
|
|
||||||
|
Modified Files:
|
||||||
|
1. /prisma/schema.prisma - Add MENU to ContentType enum
|
||||||
|
2. /src/lib/validationSchemas.ts - Add MENU to contentType enums (lines 28, 63)
|
||||||
|
3. /src/app/(app)/create/page.tsx - Add MENU UI and logic
|
||||||
|
4. /src/app/r/[slug]/route.ts - Add MENU redirect case
|
||||||
|
5. /src/lib/env.ts - Add R2 environment variables
|
||||||
|
6. /src/lib/rateLimit.ts - Add MENU_UPLOAD rate limit
|
||||||
|
|
||||||
|
New Files:
|
||||||
|
7. /src/lib/r2.ts - R2 client library for PDF uploads
|
||||||
|
8. /src/app/api/menu/upload/route.ts - PDF upload API endpoint
|
||||||
@@ -5,9 +5,9 @@ services:
|
|||||||
container_name: qrmaster-db-dev
|
container_name: qrmaster-db-dev
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: ${POSTGRES_USER}
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
POSTGRES_DB: qrmaster
|
POSTGRES_DB: ${POSTGRES_DB}
|
||||||
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=en_US.utf8"
|
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=en_US.utf8"
|
||||||
ports:
|
ports:
|
||||||
- "5435:5432"
|
- "5435:5432"
|
||||||
|
|||||||
@@ -5,9 +5,9 @@ services:
|
|||||||
container_name: qrmaster-db
|
container_name: qrmaster-db
|
||||||
restart: unless-stopped
|
restart: unless-stopped
|
||||||
environment:
|
environment:
|
||||||
POSTGRES_USER: postgres
|
POSTGRES_USER: ${POSTGRES_USER}
|
||||||
POSTGRES_PASSWORD: postgres
|
POSTGRES_PASSWORD: ${POSTGRES_PASSWORD}
|
||||||
POSTGRES_DB: qrmaster
|
POSTGRES_DB: ${POSTGRES_DB}
|
||||||
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=en_US.utf8"
|
POSTGRES_INITDB_ARGS: "-E UTF8 --locale=en_US.utf8"
|
||||||
ports:
|
ports:
|
||||||
- "5435:5432"
|
- "5435:5432"
|
||||||
@@ -51,11 +51,11 @@ services:
|
|||||||
- "3050:3000"
|
- "3050:3000"
|
||||||
environment:
|
environment:
|
||||||
NODE_ENV: production
|
NODE_ENV: production
|
||||||
DATABASE_URL: postgresql://postgres:postgres@db:5432/qrmaster?schema=public
|
DATABASE_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public
|
||||||
DIRECT_URL: postgresql://postgres:postgres@db:5432/qrmaster?schema=public
|
DIRECT_URL: postgresql://${POSTGRES_USER}:${POSTGRES_PASSWORD}@db:5432/${POSTGRES_DB}?schema=public
|
||||||
REDIS_URL: redis://redis:6379
|
REDIS_URL: redis://redis:6379
|
||||||
NEXTAUTH_URL: ${NEXTAUTH_URL:-http://localhost:3050}
|
NEXTAUTH_URL: ${NEXTAUTH_URL}
|
||||||
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET:-your-secret-key-change-in-production}
|
NEXTAUTH_SECRET: ${NEXTAUTH_SECRET}
|
||||||
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3050}
|
NEXT_PUBLIC_APP_URL: ${NEXT_PUBLIC_APP_URL:-http://localhost:3050}
|
||||||
IP_SALT: ${IP_SALT:-your-salt-change-in-production}
|
IP_SALT: ${IP_SALT:-your-salt-change-in-production}
|
||||||
ENABLE_DEMO: ${ENABLE_DEMO:-false}
|
ENABLE_DEMO: ${ENABLE_DEMO:-false}
|
||||||
@@ -75,6 +75,12 @@ services:
|
|||||||
RESEND_API_KEY: ${RESEND_API_KEY:-}
|
RESEND_API_KEY: ${RESEND_API_KEY:-}
|
||||||
NEXT_PUBLIC_POSTHOG_KEY: ${NEXT_PUBLIC_POSTHOG_KEY:-}
|
NEXT_PUBLIC_POSTHOG_KEY: ${NEXT_PUBLIC_POSTHOG_KEY:-}
|
||||||
NEXT_PUBLIC_POSTHOG_HOST: ${NEXT_PUBLIC_POSTHOG_HOST:-https://us.i.posthog.com}
|
NEXT_PUBLIC_POSTHOG_HOST: ${NEXT_PUBLIC_POSTHOG_HOST:-https://us.i.posthog.com}
|
||||||
|
# Cloudflare R2 Storage
|
||||||
|
R2_ACCOUNT_ID: ${R2_ACCOUNT_ID:-}
|
||||||
|
R2_ACCESS_KEY_ID: ${R2_ACCESS_KEY_ID:-}
|
||||||
|
R2_SECRET_ACCESS_KEY: ${R2_SECRET_ACCESS_KEY:-}
|
||||||
|
R2_BUCKET_NAME: ${R2_BUCKET_NAME:-qrmaster-menus}
|
||||||
|
R2_PUBLIC_URL: ${R2_PUBLIC_URL:-}
|
||||||
depends_on:
|
depends_on:
|
||||||
db:
|
db:
|
||||||
condition: service_healthy
|
condition: service_healthy
|
||||||
|
|||||||
@@ -3,6 +3,10 @@ NODE_ENV=development
|
|||||||
PORT=3000
|
PORT=3000
|
||||||
|
|
||||||
# Database Configuration (PostgreSQL)
|
# Database Configuration (PostgreSQL)
|
||||||
|
POSTGRES_USER=postgres
|
||||||
|
POSTGRES_PASSWORD=postgres
|
||||||
|
POSTGRES_DB=qrmaster
|
||||||
|
|
||||||
# For local development (without Docker):
|
# For local development (without Docker):
|
||||||
# DATABASE_URL=postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public
|
# DATABASE_URL=postgresql://postgres:postgres@localhost:5435/qrmaster?schema=public
|
||||||
# For Docker Compose (internal Docker network):
|
# For Docker Compose (internal Docker network):
|
||||||
|
|||||||
24
features_overview_de.md
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Neue Features und Updates für QR Master (DE)
|
||||||
|
|
||||||
|
## Übersicht
|
||||||
|
Wir haben unser Angebot aktualisiert, um noch mehr Wert für unsere Nutzer zu bieten. Hier sind die neuesten Ergänzungen und Verbesserungen:
|
||||||
|
|
||||||
|
### 1. Erweiterte QR Code Typen
|
||||||
|
Wir haben spezifische QR Code Lösungen für verschiedene Anwendungsfälle hinzugefügt:
|
||||||
|
|
||||||
|
- **Feedback QR Code**: Sammeln Sie direkt Kundenfeedback. Scans führen zu einem anpassbaren Feedback-Formular.
|
||||||
|
- **PDF QR Code**: Teilen Sie Dokumente, Speisekarten oder Broschüren als PDF. Ideal für Restaurants und Unternehmen.
|
||||||
|
- **Coupon QR Code**: Bieten Sie Rabatte und Gutscheine via QR Code an. Perfekt für Marketingkampagnen im Einzelhandel.
|
||||||
|
- **App Store QR Code**: Ein intelligenter QR Code, der Nutzer basierend auf ihrem Gerät (iOS oder Android) automatisch zum richtigen App Store leitet.
|
||||||
|
|
||||||
|
### 2. Mehr Dynamik im Kostenlosen Plan
|
||||||
|
Um den Einstieg zu erleichtern, haben wir das Limit für den kostenlosen Plan erhöht:
|
||||||
|
- **Neu**: 8 Dynamische QR Codes kostenlos (statt bisher 3).
|
||||||
|
- **Vorteil**: Mehr Flexibilität für kleine Unternehmen und Startups, um verschiedene Kampagnen gleichzeitig zu testen.
|
||||||
|
|
||||||
|
### 3. SEO Optimierung
|
||||||
|
Alle neuen QR Code Typen sind jetzt vollständig in unsere Plattform integriert und für Suchmaschinen optimiert, damit Nutzer die richtige Lösung für ihr Problem finden.
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
*Erstellt am 22.01.2026*
|
||||||
89
final_seo_fix_report.md
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
# 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. |
|
||||||
14
firecrawl-config.json
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
"mcpServers": {
|
||||||
|
"firecrawl": {
|
||||||
|
"command": "npx",
|
||||||
|
"args": [
|
||||||
|
"-y",
|
||||||
|
"firecrawl-mcp"
|
||||||
|
],
|
||||||
|
"env": {
|
||||||
|
"FIRECRAWL_API_KEY": "fc-268826f038ad4bf0a38c48690ba9c1fa"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
127
growth_strategies.md
Normal file
41
ideen.md
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
🚀 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
|
||||||
827
keyword_planer_google.md
Normal file
@@ -0,0 +1,827 @@
|
|||||||
|
Keyword Stats 2026-01-22 at 10_55_20
|
||||||
|
1. Januar 2025 - 31. Dezember 2025
|
||||||
|
Keyword Currency Avg. monthly searches Änderung über drei Monate Änderung im Jahresvergleich Competition Competition (indexed value) Top of page bid (low range) Top of page bid (high range) Ad impression share Organic impression share Organic average position In account? In plan? Searches: Jan 2025 Searches: Feb 2025 Searches: Mar 2025 Searches: Apr 2025 Searches: May 2025 Searches: Jun 2025 Searches: Jul 2025 Searches: Aug 2025 Searches: Sep 2025 Searches: Oct 2025 Searches: Nov 2025 Searches: Dec 2025
|
||||||
|
dynamic qr code generator EUR 5000 0% 0% Mittel 38 "2,34" "14,52"
|
||||||
|
dynamic qr codes EUR 5000 -90% 0% Mittel 38 "2,58" "17,08"
|
||||||
|
dynamic qr EUR 500 0% 0% Mittel 34 "1,85" "11,67"
|
||||||
|
generate qr EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
create qr code EUR 50000 0% 0% Hoch 84 "1,20" "3,94"
|
||||||
|
dynamic qr code generator free EUR 500 0% 0% Hoch 82 "1,69" "4,97"
|
||||||
|
qr code generator free EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
code generator EUR 5000 0% 0% Niedrig 32 "1,29" "3,97"
|
||||||
|
free qr generator EUR 5000 0% 0% Hoch 76 "1,21" "3,62"
|
||||||
|
create qr code free EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
custom qr code generator EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
qr code free EUR 5000 0% 0% Hoch 84 "0,94" "3,33"
|
||||||
|
make qr code EUR 50000 -90% 0% Hoch 82 "0,89" "3,63"
|
||||||
|
create dynamic qr code EUR 5000 0% 0% Mittel 38 "2,34" "14,52"
|
||||||
|
make qr code free EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
static qr code generator EUR 5000 0% 900% Hoch 71 "1,06" "3,50"
|
||||||
|
my qr code generator EUR 500 0% 0% Hoch 81 "1,45" "3,51"
|
||||||
|
qr code generator with analytics EUR 500 0% -90% Mittel 65 "3,63" "27,08"
|
||||||
|
dynamic qr codes free EUR 500 0% 0% Hoch 79 "1,27" "4,58"
|
||||||
|
scan code generator EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
url qr code generator EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
dynamic qr generator EUR 5000 0% 0% Mittel 38 "2,34" "14,52"
|
||||||
|
create a dynamic qr code EUR 50 0% 0% Hoch 83 "4,10" "13,65"
|
||||||
|
get a qr code EUR 50000 0% 0% Hoch 84 "1,20" "3,94"
|
||||||
|
create qr code generator EUR 50000 0% 0% Hoch 81 "0,86" "3,52"
|
||||||
|
qr code generator with tracking EUR 500 0% 0% Hoch 72 "2,77" "19,03"
|
||||||
|
bulk qr code generator EUR 5000 0% 0% Niedrig 13 "0,69" "3,63"
|
||||||
|
create custom qr code EUR 500 0% 0% Mittel 51 "2,44" "7,89"
|
||||||
|
qr codes for business EUR 5000 0% 0% Hoch 97 "2,57" "7,95"
|
||||||
|
custom qr code EUR 5000 0% 0% Mittel 57 "1,83" "6,10"
|
||||||
|
make qr EUR 50000 0% 0% Hoch 84 "1,20" "3,94"
|
||||||
|
qr code tracking EUR 5000 -90% -90% Mittel 64 "1,62" "14,63"
|
||||||
|
free qr code generator for business cards EUR 500 0% 0% Hoch 85 "2,04" "4,44"
|
||||||
|
qr creation EUR 50000 0% 0% Hoch 72 "0,71" "3,34"
|
||||||
|
qr code generator for business card EUR 5000 0% 0% Mittel 42 "2,95" "7,03"
|
||||||
|
create qr code for business card EUR 5000 0% 0% Mittel 42 "2,95" "7,03"
|
||||||
|
create qr code for business EUR 50 0% 0% Hoch 96 "2,97" "5,82"
|
||||||
|
qr code generator pricing EUR 500 -90% -90% Mittel 49 "2,33" "17,90"
|
||||||
|
static qr code generator free EUR 50 0% 900% Hoch 87 "0,91" "3,24"
|
||||||
|
qr codes on business cards EUR 50000 -90% -90% Hoch 100 "2,19" "6,72"
|
||||||
|
static qr codes EUR 500 -90% 0% Mittel 62 "0,90" "3,64"
|
||||||
|
free qr code for business card EUR 500 0% 0% Hoch 100 "2,40" "4,89"
|
||||||
|
professional qr code generator EUR 50000 0% 0% Mittel 53 "0,91" "10,80"
|
||||||
|
dynamic qr code tracking EUR 50 0% 0% Mittel 55 "1,52" "18,26"
|
||||||
|
qr barcode generator EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
free qr code generator with logo EUR 500 0% 0% Hoch 80 "1,31" "4,47"
|
||||||
|
qr code generator for business EUR 500 0% 900% Niedrig 17 "1,81" "7,00"
|
||||||
|
vcard qr code generator EUR 5000 0% 0% Mittel 60 "1,08" "4,10"
|
||||||
|
free qr code generator with tracking EUR 500 -90% 0% Hoch 80 "2,43" "9,97"
|
||||||
|
qr code with analytics EUR 500 0% 0% Mittel 56 "4,85" "22,14"
|
||||||
|
my qr code EUR 5000 0% 0% Mittel 59 "0,97" "3,79"
|
||||||
|
qr code designer EUR 500 0% 0% Mittel 64 "0,91" "3,63"
|
||||||
|
create dynamic qr code free EUR 500 0% 0% Hoch 82 "1,69" "4,97"
|
||||||
|
qr code for business card free EUR 500 -90% -90% Hoch 96 "2,28" "4,93"
|
||||||
|
free custom qr code generator EUR 500 0% 0% Hoch 91 "1,69" "4,83"
|
||||||
|
completely free qr code generator EUR 500 0% 0% Hoch 90 "0,92" "3,04"
|
||||||
|
vcard qr code EUR 5000 0% 0% Hoch 74 "0,97" "3,63"
|
||||||
|
custom qr code free EUR 500 0% 0% Hoch 88 "1,86" "4,97"
|
||||||
|
get a free qr code EUR 500 0% 900% Hoch 86 "1,10" "4,78"
|
||||||
|
qr gen EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
create qr free EUR 500 0% 0% Hoch 87 "1,28" "4,10"
|
||||||
|
trackable qr code generator EUR 500 0% 0% Hoch 72 "2,77" "19,03"
|
||||||
|
free code generator EUR 500 0% 0% Mittel 40 "1,00" "3,98"
|
||||||
|
custom qr EUR 500 0% 0% Hoch 87 "1,51" "4,43"
|
||||||
|
qr code for location EUR 500 -90% -90% Mittel 37 "0,79" "3,42"
|
||||||
|
create qr code for business card free EUR 50 0% 0% Hoch 100 "0,98" "4,46"
|
||||||
|
free create a qr code EUR 500 0% 0% Hoch 87 "1,28" "4,10"
|
||||||
|
qr code generator with logo EUR 5000 0% 0% Mittel 64 "1,51" "5,12"
|
||||||
|
free qr code for business EUR 50 0% 0% Hoch 88 "1,95" "4,50"
|
||||||
|
qr maker free EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
facebook qr code generator EUR 5000 -90% 0% Niedrig 19 "1,26" "4,10"
|
||||||
|
create free qr code for business card EUR 50 0% 0% Hoch 98 "3,34" "4,97"
|
||||||
|
qr code com EUR 500 0% 0% Mittel 62 "0,82" "3,73"
|
||||||
|
qr code for restaurant menu EUR 500 900% 900% Hoch 73 "1,89" "8,11"
|
||||||
|
trackable qr codes EUR 500 0% 0% Hoch 70 "5,57" "34,95"
|
||||||
|
create website qr code EUR 50 0% 0% Hoch 88 "2,22" "6,88"
|
||||||
|
qr business card generator EUR 5000 0% 0% Mittel 42 "2,95" "7,03"
|
||||||
|
qr code generator and tracking EUR 500 0% 0% Hoch 72 "2,77" "19,03"
|
||||||
|
qr code restaurant menu EUR 500 -90% -90% Hoch 82 "2,81" "11,90"
|
||||||
|
qr tracking EUR 500 0% 0% Niedrig 11 "1,66" "12,51"
|
||||||
|
custom qr generator EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
v card qr code EUR 50 0% 0% Hoch 79 "1,10" "4,16"
|
||||||
|
cool qr code generator EUR 500 0% 0% Mittel 63 "1,19" "3,87"
|
||||||
|
make a qr code for business card EUR 50 0% 0% Hoch 85 "3,17" "7,50"
|
||||||
|
qr generator for business cards EUR 50 0% 0% Hoch 84 "3,18" "5,18"
|
||||||
|
branded qr code generator EUR 50 0% 0% Hoch 83 "2,63" "10,80"
|
||||||
|
website to qr code EUR 5000 0% 0% Mittel 49 "0,68" "3,48"
|
||||||
|
create qr code with tracking EUR 50 0% 0% Niedrig 18 "3,65" "7,01"
|
||||||
|
vcard qr code free EUR 500 -90% 0% Hoch 80 "0,83" "3,58"
|
||||||
|
vcard qr EUR 5000 0% 0% Hoch 74 "0,97" "3,63"
|
||||||
|
make custom qr code EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
create static qr code EUR 50 0% 0% Hoch 90 "1,31" "4,10"
|
||||||
|
qr code for your business EUR 50 0% 0% Hoch 99 "2,16" "5,79"
|
||||||
|
get a qr code for my business EUR 50 0% 0% Hoch 95 "2,89" "8,41"
|
||||||
|
generate dynamic qr codes EUR 5000 0% 0% Mittel 38 "2,34" "14,52"
|
||||||
|
restaurant qr code EUR 500 0% 0% Hoch 80 "1,61" "11,55"
|
||||||
|
vcard qr code generator free EUR 500 0% 0% Hoch 81 "1,30" "4,00"
|
||||||
|
my qr EUR 5000 0% 0% Mittel 59 "0,97" "3,79"
|
||||||
|
qr code generator and analytics EUR 50 ∞ 0% Hoch 88 "6,49" "27,63"
|
||||||
|
unique qr code generator EUR 500 0% 0% Mittel 57 "1,51" "4,32"
|
||||||
|
url qr generator EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
free qr code generator free EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
free qr code tracking EUR 500 0% 0% Hoch 73 "1,62" "9,39"
|
||||||
|
menu qr code generator EUR 50 0% 0% Hoch 84 "2,58" "5,01"
|
||||||
|
generate static qr code EUR 50 0% 0% Hoch 90 "1,22" "3,11"
|
||||||
|
unlimited qr code generator EUR 500 -90% -90% Hoch 82 "1,33" "3,70"
|
||||||
|
vcard qr generator EUR 5000 0% 0% Mittel 60 "1,08" "4,10"
|
||||||
|
qr code generator phone number EUR 500 -90% 0% Hoch 75 "0,74" "3,88"
|
||||||
|
create qr code from url EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
business qr code generator free EUR 50 0% 0% Hoch 93 "1,96" "4,72"
|
||||||
|
make qr code for business card EUR 5000 0% 0% Mittel 42 "2,95" "7,03"
|
||||||
|
create a website qr code EUR 50 0% 0% Hoch 88 "2,61" "7,92"
|
||||||
|
qr card EUR 5000 -90% 0% Hoch 100 "1,35" "4,74"
|
||||||
|
dynamic qr code pricing EUR 50 0% -90% Mittel 62 "1,89" "11,48"
|
||||||
|
ai qr code generator EUR 500 0% 0% Mittel 39 "0,87" "3,54"
|
||||||
|
qr code de EUR 50 -90% 0% Mittel 55 "0,59" "5,28"
|
||||||
|
qr code create free EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
make a dynamic qr code EUR 50 0% 0% Hoch 88 "1,80" "7,05"
|
||||||
|
create my qr code EUR 500 -90% -90% Hoch 88 "1,08" "4,05"
|
||||||
|
qr code menu free EUR 50 0% -90% Mittel 56 "1,77" "5,39"
|
||||||
|
creating a qr code for business EUR 50 0% 0% Hoch 86 "2,30" "8,64"
|
||||||
|
create qr barcode EUR 50000 0% 0% Hoch 84 "1,20" "3,94"
|
||||||
|
qr card generator EUR 50 0% 0% Hoch 75 "1,26" "3,70"
|
||||||
|
dynamic qr free EUR 50 0% 0% Hoch 86 "0,46" "3,73"
|
||||||
|
free barcode EUR 5000 0% 0% Niedrig 6 "0,64" "3,16"
|
||||||
|
generate qr codes for free EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
create a qr code for my business EUR 50 0% 0% Hoch 89 "4,10" "9,04"
|
||||||
|
vcard qr code business card EUR 50 0% 0% Mittel 53 "3,35" "7,32"
|
||||||
|
create a qr code for your business EUR 50 0% 0% Hoch 93 "2,54" "5,08"
|
||||||
|
edit qr code EUR 500 0% 0% Mittel 37 "0,90" "6,55"
|
||||||
|
url code generator EUR 500 0% 0% Mittel 66 "1,19" "3,61"
|
||||||
|
qr qr code generator EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
free unlimited qr code generator EUR 500 0% 0% Hoch 89 "0,93" "3,06"
|
||||||
|
event qr code EUR 500 0% 0% Mittel 43 "1,48" "7,61"
|
||||||
|
qr code generator contact card EUR 500 0% 0% Mittel 46 "2,35" "6,17"
|
||||||
|
free code qr generator EUR 50 0% 0% Hoch 73 "0,89" "3,63"
|
||||||
|
make a qr code for business EUR 50 0% 0% Hoch 88 "1,76" "5,26"
|
||||||
|
create a static qr code EUR 50 0% 0% Hoch 85 "1,51" "4,36"
|
||||||
|
create trackable qr code EUR 50 0% 0% Hoch 74 "5,22" "22,03"
|
||||||
|
produce qr code EUR 50000 0% 0% Hoch 84 "1,20" "3,94"
|
||||||
|
make dynamic qr code EUR 50 0% 0% Hoch 86 "3,06" "6,45"
|
||||||
|
qr code generator from url EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
qr code for my business EUR 50 0% 0% Hoch 97 "2,46" "7,58"
|
||||||
|
my qr generator EUR 50 0% 0% Hoch 93 "0,85" "3,31"
|
||||||
|
free qr code generator with analytics EUR 50 0% 0% Hoch 93 "2,73" "7,89"
|
||||||
|
make your own qr code free EUR 500 0% 0% Hoch 86 "1,43" "4,11"
|
||||||
|
static qr codes generator EUR 50 0% 0% Mittel 51 "1,10" "3,70"
|
||||||
|
create your own qr code free EUR 500 0% 0% Hoch 86 "1,43" "4,11"
|
||||||
|
design qr code generator EUR 500 0% 0% Niedrig 32 "0,95" "3,36"
|
||||||
|
static qr generator EUR 50 0% 0% Hoch 87 "0,91" "4,14"
|
||||||
|
qr codes pro EUR 500 0% 0% Niedrig 28 "1,23" "8,93"
|
||||||
|
qr code with tracking free EUR 500 0% 0% Hoch 73 "1,62" "9,39"
|
||||||
|
website to qr code generator EUR 50 -90% 0% Hoch 77 "0,95" "4,10"
|
||||||
|
facebook qr code generator free EUR 500 0% 0% Niedrig 15 "1,27" "3,63"
|
||||||
|
make your qr code EUR 500 0% 0% Hoch 69 "1,35" "5,19"
|
||||||
|
smart qr code generator EUR 50 0% 0% Mittel 44 "1,09" "5,84"
|
||||||
|
creating qr code business card EUR 5000 0% 0% Mittel 42 "2,95" "7,03"
|
||||||
|
qr barcode generator free EUR 5000 0% 0% Hoch 76 "1,21" "3,62"
|
||||||
|
create qr code from website EUR 50 0% 0% Hoch 93 "1,13" "4,59"
|
||||||
|
branded qr codes EUR 500 0% 0% Mittel 54 "1,84" "10,35"
|
||||||
|
create free dynamic qr code EUR 50 0% 0% Hoch 90 "1,84" "5,87"
|
||||||
|
free url qr code generator EUR 50 0% 0% Hoch 87 "1,18" "3,63"
|
||||||
|
generate website qr code EUR 50000 0% 0% Niedrig 17 "1,88" "6,16"
|
||||||
|
create your qr code EUR 500 0% 0% Hoch 69 "1,35" "5,19"
|
||||||
|
create the qr code EUR 50000 0% 0% Hoch 84 "1,20" "3,94"
|
||||||
|
make my qr code EUR 500 -90% -90% Hoch 88 "1,08" "4,05"
|
||||||
|
event qr code generator EUR 50 0% 0% Mittel 57 "1,38" "4,25"
|
||||||
|
paypal qr code EUR 5000 0% 0% Niedrig 9 "1,03" "6,79"
|
||||||
|
unique qr codes EUR 500 0% 0% Niedrig 30 "1,21" "5,02"
|
||||||
|
generate qr code for url free EUR 50 0% 0% Hoch 86 "1,27" "3,63"
|
||||||
|
create business qr code EUR 50 0% 0% Hoch 96 "2,97" "5,82"
|
||||||
|
generate the qr code EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
qr code generator free business card EUR 50 0% 0% Mittel 60 "1,72" "4,10"
|
||||||
|
qr code generator business EUR 500 0% 0% Hoch 75 "3,51" "7,51"
|
||||||
|
qr code generator for business card free EUR 50 0% 0% Hoch 92 "2,60" "4,10"
|
||||||
|
cool qr codes EUR 500 0% 0% Niedrig 25 "1,16" "3,82"
|
||||||
|
create custom qr code free EUR 50 0% 0% Hoch 89 "2,02" "5,06"
|
||||||
|
qr code for EUR 500 0% 0% Niedrig 12 "1,04" "3,52"
|
||||||
|
qr code generator ai EUR 500 0% 900% Mittel 53 "0,87" "3,63"
|
||||||
|
barcode create EUR 5000 0% 0% Mittel 35 "0,78" "3,15"
|
||||||
|
create a qr code for a url free EUR 50 0% 0% Hoch 90 "1,51" "4,86"
|
||||||
|
url to qr code generator free EUR 50 0% 0% Hoch 81 "1,22" "3,11"
|
||||||
|
create a qr code for business card free EUR 50 0% 0% Hoch 93 "3,63" "5,66"
|
||||||
|
generate a qr EUR 50000 0% 0% Hoch 81 "0,86" "3,52"
|
||||||
|
free qr code designer EUR 50 0% 0% Hoch 90 "1,27" "3,34"
|
||||||
|
dynamic qr code cost EUR 50 0% 0% Mittel 60 "1,62" "10,52"
|
||||||
|
custom logo qr code EUR 500 0% 0% Hoch 98 "2,27" "7,67"
|
||||||
|
instant qr code generator EUR 50 0% 0% Hoch 78 "1,30" "3,63"
|
||||||
|
create menu qr code free EUR 50 0% 0% Hoch 74 "4,10" "6,74"
|
||||||
|
qr code generator qr code generator qr code generator EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
create vcard qr code EUR 5000 0% 0% Mittel 60 "1,08" "4,10"
|
||||||
|
get qr code for business EUR 50 0% 0% Hoch 100 "3,61" "4,62"
|
||||||
|
qr code sign up EUR 50 0% 0% Mittel 52 "1,44" "9,17"
|
||||||
|
with qr code EUR 50 0% 0% Niedrig 22 "1,00" "3,92"
|
||||||
|
create a business qr code EUR 50 0% 0% Hoch 96 "4,50" "11,66"
|
||||||
|
create qr for free EUR 50 0% 0% Hoch 89 "1,31" "3,63"
|
||||||
|
free make a qr code EUR 50 0% 0% Hoch 83 "1,28" "3,32"
|
||||||
|
qr code for menu free EUR 50 0% 0% Hoch 80 "2,31" "5,12"
|
||||||
|
qr code pricing EUR 500 0% 0% Mittel 58 "0,99" "5,66"
|
||||||
|
qr code generator permanent EUR 500 0% 900% Hoch 78 "1,22" "4,10"
|
||||||
|
free trackable qr code EUR 500 0% 0% Hoch 73 "1,62" "9,39"
|
||||||
|
create free qr code business card EUR 500 0% 0% Hoch 85 "2,04" "4,44"
|
||||||
|
create free qr code generator EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
instagram qr code generator free EUR 50 0% 0% Hoch 91 "1,09" "3,63"
|
||||||
|
develop a qr code EUR 50 0% 0% Hoch 83 "1,60" "5,88"
|
||||||
|
free business card qr code EUR 500 -90% 0% Hoch 97 "1,92" "4,84"
|
||||||
|
free qr code generator contact card EUR 50 0% 0% Hoch 88 "1,37" "4,04"
|
||||||
|
qr code qr code generator EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
create static qr code free EUR 50 0% 0% Hoch 81 "0,93" "3,36"
|
||||||
|
qr code from website EUR 50 0% 0% Hoch 85 "0,82" "3,20"
|
||||||
|
qr code generator for phone number EUR 500 -90% 0% Mittel 56 "0,79" "3,27"
|
||||||
|
create a qr code for an event EUR 50 0% 0% Hoch 74 "1,64" "5,94"
|
||||||
|
create qr scan code EUR 50 0% 0% Hoch 88 "1,27" "3,71"
|
||||||
|
create business card qr code free EUR 50 0% 0% Hoch 92 "2,66" "4,59"
|
||||||
|
advanced qr code generator EUR 50 0% 0% Mittel 42 "1,29" "6,91"
|
||||||
|
to create a qr code EUR 50 0% 0% Hoch 89 "2,93" "6,04"
|
||||||
|
make a qr code generator EUR 50 0% 0% Hoch 68 "1,27" "3,44"
|
||||||
|
qr restaurant menu EUR 50 0% 0% Mittel 35 "2,52" "28,99"
|
||||||
|
qr code vcard free EUR 50 0% 0% Hoch 84 "0,86" "4,96"
|
||||||
|
create barcode free EUR 500 0% 0% Mittel 39 "0,93" "3,34"
|
||||||
|
free business qr code EUR 50 0% 0% Hoch 95 "2,29" "4,10"
|
||||||
|
produce a qr code EUR 50000 0% 0% Hoch 84 "1,20" "3,94"
|
||||||
|
create qr code for event EUR 50 0% 0% Hoch 90 "1,12" "9,73"
|
||||||
|
website to qr code free EUR 50 0% 0% Hoch 85 "0,86" "3,61"
|
||||||
|
free qr code vcard EUR 50 0% 0% Hoch 99 "1,87" "3,63"
|
||||||
|
create qr generator EUR 50000 0% 0% Hoch 81 "0,86" "3,52"
|
||||||
|
qr design EUR 5000 -90% -90% Hoch 93 "0,93" "3,20"
|
||||||
|
free qr code menu EUR 50 0% 0% Niedrig 29 "1,57" "4,96"
|
||||||
|
custom free qr code EUR 50 0% 0% Hoch 95 "1,79" "4,64"
|
||||||
|
difference between static and dynamic qr code EUR 50 0% 0% Niedrig 24 "0,32" "10,47"
|
||||||
|
bulk qr generator EUR 5000 0% 0% Niedrig 13 "0,69" "3,63"
|
||||||
|
create cool qr codes EUR 50 0% 0% Hoch 94 "1,19" "5,18"
|
||||||
|
create unique qr code EUR 500 0% 0% Mittel 57 "1,51" "4,32"
|
||||||
|
produce qr code free EUR 50 0% 0% Hoch 100 "2,55" "4,54"
|
||||||
|
free contact qr code generator EUR 50 0% 0% Hoch 92 "1,31" "3,63"
|
||||||
|
professional qr code EUR 50 0% 0% Mittel 38 "1,75" "6,26"
|
||||||
|
menu qr codes EUR 500 0% 0% Hoch 71 "1,63" "5,60"
|
||||||
|
free qr code contact card EUR 50 0% 0% Hoch 86 "1,85" "3,80"
|
||||||
|
bulk create qr codes EUR 50 0% 0% Hoch 83 "3,25" "7,78"
|
||||||
|
generate qr code from website EUR 50 0% 0% Hoch 98 "1,47" "3,63"
|
||||||
|
create qr code from url free EUR 500 -90% 0% Hoch 92 "1,42" "3,70"
|
||||||
|
sign in qr code generator EUR 50 0% 0% Hoch 71 "2,16" "4,34"
|
||||||
|
custom design qr codes EUR 500 0% 0% Hoch 74 "1,38" "5,00"
|
||||||
|
tracking qr code scans EUR 500 0% -90% Mittel 52 "3,03" "16,93"
|
||||||
|
unlimited qr codes EUR 50 0% 0% Hoch 86 "1,04" "4,16"
|
||||||
|
create branded qr code EUR 50 0% 0% Hoch 79 "2,53" "17,43"
|
||||||
|
qr code generator business card free EUR 50 0% ∞ Hoch 95 "2,55" "5,69"
|
||||||
|
tracking barcode EUR 5000 0% -90% Mittel 47 "1,35" "4,34"
|
||||||
|
static qr EUR 500 -90% 0% Mittel 62 "0,90" "3,64"
|
||||||
|
generate qr code for business EUR 50 0% 0% Hoch 95 "4,11" "11,03"
|
||||||
|
free url to qr code EUR 50 0% 0% Hoch 87 "1,01" "3,63"
|
||||||
|
qr business code EUR 50 0% 0% Hoch 91 "3,30" "9,11"
|
||||||
|
v card qr code generator EUR 50 0% 0% Hoch 82 "1,28" "4,10"
|
||||||
|
free dynamic qr EUR 500 0% 0% Hoch 79 "1,27" "4,58"
|
||||||
|
create facebook qr code free EUR 50 0% 0% Hoch 94 "1,04" "4,43"
|
||||||
|
create my qr code free EUR 50 0% 0% Hoch 89 "2,43" "11,68"
|
||||||
|
basic qr code generator EUR 50 0% 0% Hoch 87 "1,08" "3,12"
|
||||||
|
need a qr code EUR 50 0% 0% Hoch 79 "1,18" "5,62"
|
||||||
|
purchase qr codes EUR 500 0% 0% Hoch 78 "2,78" "11,52"
|
||||||
|
qr location EUR 500 -90% -90% Mittel 37 "0,79" "3,42"
|
||||||
|
create free static qr code EUR 50 0% 0% Hoch 80 "1,06" "3,13"
|
||||||
|
ai qr code EUR 500 0% 0% Niedrig 14 "0,76" "4,66"
|
||||||
|
qr code generator with analytics free EUR 50 0% 0% Hoch 90 "3,15" "5,12"
|
||||||
|
need qr code EUR 50 0% 0% Hoch 76 "1,33" "4,97"
|
||||||
|
buy dynamic qr code EUR 50 ∞ 0% Niedrig 25 "1,87" "12,81"
|
||||||
|
to make a qr code EUR 50 0% 0% Mittel 65 "1,58" "3,63"
|
||||||
|
qr tracking code EUR 50 0% 0% Hoch 82 "1,10" "3,60"
|
||||||
|
sms qr code EUR 500 0% 0% Niedrig 17 "0,60" "3,35"
|
||||||
|
qr code tools EUR 500 900% 900% Mittel 34 "0,71" "4,11"
|
||||||
|
dynamic code generator EUR 50 0% 0% Niedrig 17 "3,82" "15,61"
|
||||||
|
qr code for business free EUR 50 0% 0% Hoch 91 "1,46" "3,63"
|
||||||
|
free qr code contact generator EUR 50 0% 0% Hoch 84 "1,06" "3,34"
|
||||||
|
free qr code generator no subscription EUR 50 0% 0% Hoch 90 "0,79" "3,09"
|
||||||
|
create your qr code free EUR 50 0% 0% Hoch 79 "1,79" "4,10"
|
||||||
|
free dynamic qr code generator with logo EUR 50 0% 0% Mittel 43 "0,48" "3,97"
|
||||||
|
sms qr code generator EUR 500 0% 0% Niedrig 18 "0,66" "3,11"
|
||||||
|
create a qr free EUR 50 0% 0% Hoch 94 "2,12" "3,63"
|
||||||
|
qr code generator generator EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
qr code generator account EUR 50 0% 0% Mittel 44 "1,51" "7,59"
|
||||||
|
make your own qr codes EUR 5000 0% 0% Hoch 79 "1,38" "4,11"
|
||||||
|
qr tag generator EUR 500000 -90% 0% Hoch 74 "0,63" "3,12"
|
||||||
|
free trackable qr code generator EUR 500 -90% 0% Hoch 80 "2,43" "9,97"
|
||||||
|
dynamic qr code free generator EUR 50 0% 0% Hoch 95 "2,50" "4,88"
|
||||||
|
create a unique qr code EUR 50 0% 0% Hoch 96 "2,58" "4,89"
|
||||||
|
free menu qr code generator EUR 50 0% 0% Hoch 95 "2,35" "3,38"
|
||||||
|
trackable qr code generator free EUR 50 0% 0% Hoch 95 "4,38" "8,26"
|
||||||
|
free code qr EUR 50000 0% 0% Hoch 86 "1,25" "3,63"
|
||||||
|
create qr code with url EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
difference between static and dynamic qr codes EUR 50 0% 0% Hoch 89 "0,61" "18,51"
|
||||||
|
free dynamic qr generator EUR 500 0% 0% Hoch 82 "1,69" "4,97"
|
||||||
|
my qr code generator free EUR 50 0% 0% Hoch 83 "1,51" "4,92"
|
||||||
|
qr code provider EUR 50 0% 0% Mittel 40 "1,85" "7,42"
|
||||||
|
qr analytics EUR 500 0% 0% Mittel 56 "4,85" "22,14"
|
||||||
|
qr code generator with custom logo EUR 50 0% 0% Hoch 88 "3,95" "10,07"
|
||||||
|
to make qr code EUR 50 0% 0% Mittel 52 "1,46" "4,59"
|
||||||
|
static and dynamic qr codes EUR 50 0% 0% Mittel 64 "0,42" "5,07"
|
||||||
|
get qr code generator EUR 50 0% 0% Hoch 80 "1,02" "3,86"
|
||||||
|
qr code generator with url EUR 50 0% 0% Hoch 90 "2,65" "5,00"
|
||||||
|
create code qr free EUR 50 0% 0% Hoch 93 "1,96" "3,63"
|
||||||
|
create qr code of website EUR 50 0% 0% Hoch 97 "2,15" "4,93"
|
||||||
|
qr code generator free unlimited EUR 50 0% 0% Hoch 94 "1,18" "3,63"
|
||||||
|
create qr code for EUR 50 0% 0% Hoch 68 "1,14" "3,63"
|
||||||
|
the qr generator EUR 50 0% 0% Mittel 60 "0,98" "3,99"
|
||||||
|
bulk qr code generator from excel EUR 50 0% 0% Mittel 42 "1,22" "4,36"
|
||||||
|
make url qr code EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
qr code and tracking EUR 5000 -90% -90% Mittel 64 "1,62" "14,63"
|
||||||
|
make qr code for location EUR 50 0% 0% Hoch 86 "1,37" "4,01"
|
||||||
|
sign up qr code EUR 50 0% 0% Niedrig 23 "1,81" "5,80"
|
||||||
|
custom branded qr codes EUR 50 0% 0% Hoch 100 "2,33" "13,48"
|
||||||
|
build qr code generator EUR 50 0% 0% Hoch 80 "1,02" "3,86"
|
||||||
|
free qr code business card generator EUR 50 0% 0% Mittel 60 "1,72" "4,10"
|
||||||
|
generate qr code with url EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
qr create free EUR 500 0% 0% Hoch 87 "1,28" "4,10"
|
||||||
|
make qr code from website EUR 50 0% 0% Hoch 92 "1,48" "3,53"
|
||||||
|
qr bulk generator EUR 5000 0% 0% Niedrig 13 "0,69" "3,63"
|
||||||
|
qr code s EUR 500 0% 0% Niedrig 27 "0,57" "4,92"
|
||||||
|
create your own qr codes EUR 5000 0% 0% Hoch 79 "1,38" "4,11"
|
||||||
|
restaurant menu qr code free EUR 50 0% 0% Hoch 95 "1,78" "8,90"
|
||||||
|
event qr code generator free EUR 50 0% 0% Hoch 73 "1,55" "4,53"
|
||||||
|
qr signs EUR 5000 -90% -90% Hoch 100 "0,65" "4,49"
|
||||||
|
log in qr code generator EUR 5000 0% 0% Niedrig 15 "0,67" "3,07"
|
||||||
|
instant qr code EUR 50 0% 0% Hoch 77 "1,86" "4,80"
|
||||||
|
custom qr code designer EUR 50 0% 0% Hoch 90 "3,13" "4,88"
|
||||||
|
create a url qr code EUR 50 0% 0% Hoch 89 "2,80" "5,01"
|
||||||
|
the qr code generator free EUR 50 0% 0% Hoch 82 "1,06" "3,63"
|
||||||
|
new qr code generator EUR 50 0% 0% Hoch 79 "1,51" "4,58"
|
||||||
|
trackable qr code free EUR 50 0% 0% Hoch 88 "3,62" "12,45"
|
||||||
|
free personalized qr code generator EUR 50 0% 0% Hoch 93 "0,81" "3,63"
|
||||||
|
qr code generator from website EUR 50 0% 0% Hoch 98 "1,28" "4,12"
|
||||||
|
create qr code for instagram free EUR 50 0% 0% Hoch 95 "1,51" "4,46"
|
||||||
|
digital qr code generator EUR 50 0% 0% Mittel 45 "1,84" "4,17"
|
||||||
|
qr png generator EUR 50 0% 0% Hoch 74 "1,28" "3,33"
|
||||||
|
create custom qr EUR 500 0% 0% Mittel 51 "2,44" "7,89"
|
||||||
|
make qr code for business EUR 50 0% 0% Hoch 100 "2,49" "3,36"
|
||||||
|
contact card qr code generator EUR 50 0% 0% Hoch 89 "1,68" "4,94"
|
||||||
|
qr printing EUR 500 0% 0% Mittel 46 "0,74" "7,53"
|
||||||
|
qr for business EUR 5000 0% 0% Hoch 97 "2,57" "7,95"
|
||||||
|
permanent qr code generator free EUR 500 0% 900% Hoch 85 "1,03" "3,57"
|
||||||
|
free menu qr code EUR 50 0% 0% Hoch 97 "1,94" "4,53"
|
||||||
|
generate qr code for a url EUR 50 0% 0% Hoch 94 "2,17" "5,95"
|
||||||
|
manage qr codes EUR 500 0% -90% Niedrig 30 "2,11" "18,77"
|
||||||
|
qr generator custom EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
qr code to phone number EUR 50 0% 0% Hoch 75 "0,74" "3,16"
|
||||||
|
customer qr code EUR 50 0% 0% Mittel 53 "1,80" "3,72"
|
||||||
|
website url qr code generator EUR 50 0% 0% Hoch 77 "1,65" "4,23"
|
||||||
|
square barcode generator EUR 500 0% 0% Mittel 45 "0,84" "8,47"
|
||||||
|
website to create qr code EUR 50 0% 0% Hoch 87 "1,89" "4,62"
|
||||||
|
scan barcode generator EUR 500 0% 0% Niedrig 27 "0,84" "5,11"
|
||||||
|
obtain a qr code EUR 50000 -90% 0% Hoch 82 "0,89" "3,63"
|
||||||
|
qr code generator for my website EUR 500 0% 0% Hoch 87 "4,10" "10,77"
|
||||||
|
generate your qr code EUR 500 0% 0% Hoch 69 "1,35" "5,19"
|
||||||
|
generate qr code from url free EUR 50 0% 0% Hoch 84 "0,38" "3,93"
|
||||||
|
create qr code for menu free EUR 50 0% ∞ Hoch 86 "2,03" "5,10"
|
||||||
|
qr business EUR 5000 0% 0% Hoch 97 "2,57" "7,95"
|
||||||
|
qr code generator site EUR 50000 0% 0% Niedrig 17 "1,88" "6,16"
|
||||||
|
code create EUR 50 -90% 0% Niedrig 3 "0,62" "6,98"
|
||||||
|
dynamic codes EUR 500 0% 0% Niedrig 12 "0,78" "4,21"
|
||||||
|
qr code analytics free EUR 50 0% 0% Hoch 86 "1,32" "5,57"
|
||||||
|
free url to qr code generator EUR 50 0% 0% Hoch 91 "0,94" "3,65"
|
||||||
|
personalized qr code generator EUR 50 0% 0% Hoch 90 "1,75" "6,74"
|
||||||
|
custom logo qr code generator EUR 500 0% 0% Hoch 68 "2,73" "7,71"
|
||||||
|
restaurant qr EUR 500 0% 0% Hoch 80 "1,61" "11,55"
|
||||||
|
generate facebook qr code EUR 5000 -90% 0% Niedrig 19 "1,26" "4,10"
|
||||||
|
qr contact card generator EUR 500 0% 0% Mittel 46 "2,35" "6,17"
|
||||||
|
free qr generator code EUR 50 0% 0% Hoch 90 "1,69" "4,10"
|
||||||
|
dynamic url qr code EUR 50 0% 0% Hoch 82 "5,45" "18,45"
|
||||||
|
free qr code analytics EUR 50 0% 0% Hoch 86 "1,32" "5,57"
|
||||||
|
generate qr code for phone number EUR 50 0% 0% Hoch 79 "0,76" "3,37"
|
||||||
|
free qr code generator and tracking EUR 500 -90% 0% Hoch 80 "2,43" "9,97"
|
||||||
|
generate unique qr code EUR 500 0% 0% Mittel 57 "1,51" "4,32"
|
||||||
|
youtube qr code generator free EUR 50 0% 0% Hoch 96 "1,21" "3,63"
|
||||||
|
customize qr code generator EUR 50 0% 0% Hoch 83 "1,16" "6,79"
|
||||||
|
make a qr scan code EUR 50 0% 0% Hoch 88 "1,27" "3,71"
|
||||||
|
create a qr code for location EUR 50 0% 0% Hoch 100 "1,91" "3,60"
|
||||||
|
url to qr generator EUR 50 0% 0% Hoch 89 "0,20" "9,36"
|
||||||
|
business qr EUR 5000 0% 0% Hoch 97 "2,57" "7,95"
|
||||||
|
edit a qr code EUR 500 0% 0% Mittel 37 "0,90" "6,55"
|
||||||
|
generate qr codes in bulk EUR 50 0% 0% Hoch 100 "2,07" "8,02"
|
||||||
|
qr code generator freeware EUR 500000 -90% 0% Hoch 86 "1,24" "3,64"
|
||||||
|
automated qr code generator EUR 50 0% 0% Hoch 86 "0,93" "3,18"
|
||||||
|
create qr code to email EUR 50 0% 0% Hoch 82 "0,86" "4,06"
|
||||||
|
free png qr code generator EUR 50 0% 0% Hoch 88 "1,55" "5,87"
|
||||||
|
free qr code generator for url EUR 50 0% 0% Hoch 89 "1,51" "4,10"
|
||||||
|
create a qr code from website EUR 50 0% 0% Hoch 77 "2,58" "6,51"
|
||||||
|
qr code qr EUR 5000 0% 0% Niedrig 0 "1,03" "3,01"
|
||||||
|
make qr code generator free EUR 500 0% 0% Hoch 83 "1,51" "3,63"
|
||||||
|
qr code generator custom logo EUR 500 0% 0% Hoch 68 "2,73" "7,71"
|
||||||
|
make your qr code free EUR 50 0% 0% Hoch 79 "1,79" "4,10"
|
||||||
|
free qr business cards EUR 500 -90% 0% Hoch 97 "1,92" "4,84"
|
||||||
|
create qr barcode free EUR 500 0% 0% Hoch 87 "1,28" "4,10"
|
||||||
|
qr code generator barcode EUR 50 0% 0% Mittel 43 "0,97" "4,06"
|
||||||
|
free sms qr code generator EUR 50 0% 0% Niedrig 32 "0,81" "3,03"
|
||||||
|
difference between dynamic and static qr code EUR 50 0% 0% Hoch 70 "0,23" "5,71"
|
||||||
|
qr code generator free for phone number EUR 50 0% ∞ Hoch 100 "0,37" "3,63"
|
||||||
|
creating scan codes EUR 50000 0% 0% Hoch 84 "1,68" "4,83"
|
||||||
|
create scan code free EUR 500 0% 0% Hoch 87 "1,28" "4,10"
|
||||||
|
free qr code generator for vcard EUR 500 0% 0% Hoch 81 "1,30" "4,00"
|
||||||
|
qr code generator for contact card EUR 500 0% 0% Mittel 46 "2,35" "6,17"
|
||||||
|
qr contact code generator EUR 500 0% 0% Hoch 75 "1,32" "4,73"
|
||||||
|
create own qr code free EUR 50 0% 0% Hoch 85 "0,87" "4,15"
|
||||||
|
qr to code EUR 50 0% 0% Niedrig 21 "1,00" "3,78"
|
||||||
|
free branded qr code generator EUR 50 0% 0% Hoch 100 "1,81" "3,52"
|
||||||
|
qr code free tracking EUR 500 0% 0% Hoch 73 "1,62" "9,39"
|
||||||
|
free qr code generator unlimited EUR 50 0% 0% Hoch 85 "1,08" "3,27"
|
||||||
|
create your own free qr code EUR 500 0% 0% Hoch 86 "1,43" "4,11"
|
||||||
|
customize a qr code EUR 5000 0% 0% Mittel 57 "1,83" "6,10"
|
||||||
|
modify qr code EUR 500 0% 0% Mittel 37 "0,90" "6,55"
|
||||||
|
create youtube qr code EUR 50 0% 0% Hoch 71 "0,86" "3,17"
|
||||||
|
vcard qr free EUR 50 0% 0% Hoch 95 "1,56" "3,63"
|
||||||
|
build qr codes EUR 50 -90% 0% Hoch 89 "0,95" "4,10"
|
||||||
|
create qr code free from url EUR 500 0% 900% Hoch 89 "1,74" "4,85"
|
||||||
|
barcode and qr code generator EUR 50 0% 0% Mittel 43 "0,97" "4,06"
|
||||||
|
make free qr EUR 50 0% 0% Hoch 89 "0,85" "4,10"
|
||||||
|
digital restaurant menu qr code EUR 50 0% 0% Hoch 95 "1,68" "5,15"
|
||||||
|
qr code generator for EUR 50 0% 0% Hoch 96 "0,93" "3,00"
|
||||||
|
make qr barcode EUR 50000 0% 0% Hoch 72 "0,71" "3,34"
|
||||||
|
generate a qr code from a url EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
generator free EUR 500 0% 0% Niedrig 16 "0,82" "5,79"
|
||||||
|
qr campaign EUR 50 0% -90% Niedrig 19 "1,45" "10,66"
|
||||||
|
free qr code editor EUR 50 0% 0% Hoch 75 "1,32" "3,18"
|
||||||
|
square codes EUR 5000 0% 0% Niedrig 5 "0,83" "3,42"
|
||||||
|
free qr code for my business EUR 50 0% 0% Hoch 90 "2,15" "4,10"
|
||||||
|
generate qr code in bulk EUR 50 0% 0% Hoch 100 "2,07" "8,02"
|
||||||
|
create custom qr codes free EUR 50 0% 0% Hoch 100 "2,23" "6,61"
|
||||||
|
smart qr codes EUR 500 900% 900% Mittel 36 "1,13" "6,17"
|
||||||
|
create qr code for url free EUR 50 0% 0% Hoch 90 "1,51" "4,86"
|
||||||
|
qr code with brand logo EUR 50 0% 0% Hoch 88 "2,39" "4,41"
|
||||||
|
barcode to qr code generator EUR 50 0% 0% Niedrig 27 "1,89" "8,80"
|
||||||
|
i qr code EUR 50 0% 0% Niedrig 11 "1,25" "3,95"
|
||||||
|
qr code generator with logo for free EUR 500 0% 0% Hoch 80 "1,31" "4,47"
|
||||||
|
qr code generator no tracking EUR 50 0% 0% Hoch 76 "0,96" "3,93"
|
||||||
|
qr code unlimited EUR 500 0% 0% Mittel 66 "1,00" "6,13"
|
||||||
|
csv qr code generator EUR 50 0% 0% Mittel 65 "1,02" "5,95"
|
||||||
|
design qr code free EUR 50 0% 0% Hoch 97 "1,45" "4,05"
|
||||||
|
qr code generator card EUR 50 0% 0% Hoch 75 "1,26" "3,70"
|
||||||
|
qr design generator EUR 500 0% 0% Niedrig 32 "0,95" "3,36"
|
||||||
|
qr code permanent generator EUR 50 0% 0% Hoch 74 "0,56" "5,09"
|
||||||
|
free generate qr code for url EUR 50 0% 0% Mittel 48 "1,27" "3,19"
|
||||||
|
qr code i EUR 50 0% 0% Niedrig 11 "1,25" "3,95"
|
||||||
|
every qr code EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
view qr code EUR 50 0% 0% Niedrig 13 "0,65" "3,23"
|
||||||
|
code creation EUR 50 -90% 0% Niedrig 12 "2,14" "5,68"
|
||||||
|
create own qr code generator EUR 50 0% -90% Hoch 79 "1,21" "3,71"
|
||||||
|
credit card qr code EUR 50 0% 0% Niedrig 7 "2,64" "9,81"
|
||||||
|
digital qr codes EUR 500 -90% 0% Mittel 63 "1,15" "4,49"
|
||||||
|
qr generator for url EUR 50 0% 0% Hoch 91 "1,10" "7,17"
|
||||||
|
qr code bulk generator free EUR 50 0% 0% Hoch 95 "0,74" "3,18"
|
||||||
|
dynamic barcode EUR 50 0% 0% Niedrig 33 "1,44" "5,12"
|
||||||
|
event qr EUR 500 0% 0% Mittel 43 "1,48" "7,61"
|
||||||
|
custom code generator EUR 50 0% 0% Niedrig 32 "1,79" "8,74"
|
||||||
|
qr codes marketing EUR 500 0% 0% Niedrig 33 "1,61" "10,10"
|
||||||
|
recommended qr code generator EUR 5000 0% 0% Hoch 78 "1,63" "8,36"
|
||||||
|
create a scan qr code EUR 50 0% 0% Hoch 96 "2,22" "4,68"
|
||||||
|
qr code with vcard EUR 5000 0% 0% Hoch 74 "0,97" "3,63"
|
||||||
|
make a qr code for text EUR 50 0% 0% Hoch 71 "1,28" "3,34"
|
||||||
|
logo qr generator EUR 5000 0% 0% Mittel 64 "1,51" "5,12"
|
||||||
|
contact card qr generator EUR 50 0% 0% Hoch 82 "1,46" "3,63"
|
||||||
|
qr barcode free EUR 50000 0% 0% Hoch 86 "1,25" "3,63"
|
||||||
|
qr code scan device EUR 500 0% -90% Hoch 100 "0,37" "3,50"
|
||||||
|
all qr codes EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
cost for qr code EUR 500 0% 0% Mittel 58 "0,99" "5,66"
|
||||||
|
free qr tracking EUR 50 0% 0% Hoch 86 "1,49" "8,90"
|
||||||
|
generator for free EUR 500 0% 0% Niedrig 16 "0,82" "5,79"
|
||||||
|
create paypal qr code EUR 50 0% 0% Mittel 36 "1,79" "4,70"
|
||||||
|
generate qr code of url EUR 5000 0% -90% Hoch 84 "1,43" "4,85"
|
||||||
|
generate paypal qr code EUR 50 0% 0% Niedrig 30 "1,54" "4,76"
|
||||||
|
email qr code free EUR 50 0% 0% Hoch 68 "0,50" "3,48"
|
||||||
|
cost of qr codes EUR 500 0% 0% Mittel 58 "0,99" "5,66"
|
||||||
|
the best qr code generator free EUR 50 0% 0% Hoch 82 "1,00" "3,63"
|
||||||
|
qr code brand EUR 500 0% 0% Niedrig 4 "1,55" "8,10"
|
||||||
|
qr all EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
create qr reader EUR 50 0% 0% Hoch 82 "1,28" "3,60"
|
||||||
|
generate barcode qr EUR 50 0% 0% Mittel 43 "0,97" "4,06"
|
||||||
|
create barcode url EUR 50 0% 0% Hoch 77 "0,83" "3,43"
|
||||||
|
logos in qr codes EUR 5000 0% 0% Hoch 86 "1,20" "4,78"
|
||||||
|
create a paypal qr code EUR 50 0% 0% Mittel 45 "0,95" "5,00"
|
||||||
|
qr code save EUR 50 0% 0% Niedrig 19 "0,83" "3,47"
|
||||||
|
make a qr scanner EUR 500 0% 0% Mittel 56 "0,99" "4,22"
|
||||||
|
qr code freeware EUR 5000 0% 0% Hoch 84 "0,94" "3,33"
|
||||||
|
barcode scan code EUR 500 0% 0% Hoch 97 "0,81" "3,80"
|
||||||
|
qr code digital EUR 50 0% 0% Mittel 45 "0,59" "6,18"
|
||||||
|
qr code from vcard EUR 5000 0% 0% Hoch 74 "0,97" "3,63"
|
||||||
|
qr generator vcard free EUR 500 0% 0% Hoch 81 "1,30" "4,00"
|
||||||
|
make cool qr code EUR 50 0% 0% Hoch 83 "1,45" "3,96"
|
||||||
|
all qr EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
qr do EUR 50 0% 0% Niedrig 15 "0,85" "4,10"
|
||||||
|
qr events EUR 500 0% 0% Mittel 43 "1,48" "7,61"
|
||||||
|
call qr EUR 50 0% 0% Mittel 37 "1,00" "4,12"
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
Keyword Stats 2026-01-22 at 11_03_27
|
||||||
|
1. Januar 2025 - 31. Dezember 2025
|
||||||
|
Keyword Currency Avg. monthly searches Änderung über drei Monate Änderung im Jahresvergleich Competition Competition (indexed value) Top of page bid (low range) Top of page bid (high range) Ad impression share Organic impression share Organic average position In account? In plan? Searches: Jan 2025 Searches: Feb 2025 Searches: Mar 2025 Searches: Apr 2025 Searches: May 2025 Searches: Jun 2025 Searches: Jul 2025 Searches: Aug 2025 Searches: Sep 2025 Searches: Oct 2025 Searches: Nov 2025 Searches: Dec 2025
|
||||||
|
custom qr code generator EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
qr barcode EUR 50000 0% 900% Niedrig 3 "0,42" "1,93"
|
||||||
|
bulk qr code generator EUR 5000 0% 0% Niedrig 13 "0,69" "3,63"
|
||||||
|
bar code generator EUR 500000 0% 0% Niedrig 3 "0,67" "2,58"
|
||||||
|
qr code generator for business EUR 500 0% 900% Niedrig 17 "1,81" "7,01"
|
||||||
|
this is a qr code EUR 5000 0% 0% Niedrig 9 "0,47" "1,33"
|
||||||
|
get a qr code for business EUR 50 0% 0% Niedrig 20
|
||||||
|
a qr code EUR 500 0% 0% Niedrig 23 "0,49" "2,01"
|
||||||
|
qr dynamic code generator EUR 50 -100% -100% Unbekannt
|
||||||
|
facebook qr code generator EUR 5000 -90% 0% Niedrig 19 "1,26" "4,10"
|
||||||
|
whatsapp qr code generator EUR 500 0% 0% Niedrig 19 "0,51" "1,89"
|
||||||
|
qr tracking EUR 500 0% 0% Niedrig 11 "1,66" "12,51"
|
||||||
|
custom qr generator EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
create qr code with tracking EUR 50 0% 0% Niedrig 18 "3,65" "7,01"
|
||||||
|
qr code generator sign in EUR 500 -90% -90% Niedrig 6
|
||||||
|
make custom qr code EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
qr code qr code EUR 500 -90% -90% Niedrig 27 "0,26" "1,28"
|
||||||
|
free barcode EUR 5000 0% 0% Niedrig 6 "0,64" "3,16"
|
||||||
|
youtube qr code EUR 5000 0% 0% Niedrig 16 "0,52" "2,21"
|
||||||
|
paypal qr code generator EUR 500 0% 0% Niedrig 19 "0,66" "2,58"
|
||||||
|
code qr code EUR 500 0% 0% Niedrig 18 "0,29" "1,03"
|
||||||
|
qr code to text EUR 500 0% 0% Niedrig 4 "0,50" "2,20"
|
||||||
|
code to qr code EUR 50 0% 0% Niedrig 30 "0,43" "1,51"
|
||||||
|
qr code location generator EUR 50 0% 0% Niedrig 17
|
||||||
|
restaurant menu qr code generator EUR 50 0% 0% Niedrig 0
|
||||||
|
bulk qr code EUR 500 0% 0% Niedrig 13 "0,07" "2,85"
|
||||||
|
qr code instagram generator EUR 50 0% 0% Niedrig 29 "0,71" "1,75"
|
||||||
|
qr codes pro EUR 500 0% 0% Niedrig 28 "1,23" "8,93"
|
||||||
|
facebook qr code generator free EUR 500 0% 0% Niedrig 15 "1,27" "3,63"
|
||||||
|
generate website qr code EUR 50000 0% 0% Niedrig 17 "1,88" "6,16"
|
||||||
|
paypal qr code EUR 5000 0% 0% Niedrig 9 "1,03" "6,79"
|
||||||
|
unique qr codes EUR 500 0% 0% Niedrig 30 "1,21" "5,02"
|
||||||
|
the qr code EUR 500 0% 0% Niedrig 23 "0,66" "2,21"
|
||||||
|
scan location qr code EUR 50 0% 0% Niedrig 24
|
||||||
|
cool qr codes EUR 500 0% 0% Niedrig 25 "1,16" "3,82"
|
||||||
|
qr code for EUR 500 0% 0% Niedrig 12 "1,04" "3,53"
|
||||||
|
to create qr code EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code for phone number EUR 500 0% 0% Niedrig 28 "0,70" "2,56"
|
||||||
|
qr wifi EUR 500 0% 0% Niedrig 2 "0,12" "1,00"
|
||||||
|
with qr code EUR 50 0% 0% Niedrig 22 "1,00" "3,93"
|
||||||
|
free bulk qr code generator EUR 500 900% 900% Niedrig 27 "0,91" "2,85"
|
||||||
|
cost of qr code generator EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code analytics tracking EUR 50 0% 0% Niedrig 9
|
||||||
|
free qr code for restaurant menu EUR 50 0% -100% Unbekannt
|
||||||
|
qr code time tracking EUR 50 0% 0% Niedrig 0
|
||||||
|
qr code with text EUR 500 0% 0% Niedrig 15 "0,13" "1,40"
|
||||||
|
free qr code menu EUR 50 0% 0% Niedrig 29 "1,57" "4,96"
|
||||||
|
qr code generator for restaurant menu EUR 500 0% 0% Niedrig 5
|
||||||
|
difference between static and dynamic qr code EUR 50 0% 0% Niedrig 24 "0,32" "10,47"
|
||||||
|
bulk qr generator EUR 5000 0% 0% Niedrig 13 "0,69" "3,63"
|
||||||
|
barcode code generator EUR 500000 0% 0% Niedrig 3 "0,67" "2,58"
|
||||||
|
generate dynamic qr code free EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code contact generator free EUR 50 0% -100% Unbekannt
|
||||||
|
scan qr code for location EUR 50 0% 0% Niedrig 17
|
||||||
|
ai qr code EUR 500 0% 0% Niedrig 14 "0,76" "4,66"
|
||||||
|
buy dynamic qr code EUR 50 ∞ 0% Niedrig 25 "1,87" "12,81"
|
||||||
|
sms qr code EUR 500 0% 0% Niedrig 17 "0,60" "3,35"
|
||||||
|
dynamic code generator EUR 50 0% 0% Niedrig 17 "3,82" "15,62"
|
||||||
|
qr code restaurant menu free EUR 50 0% -100% Unbekannt
|
||||||
|
vcard qr code generator with logo EUR 50 -100% -100% Unbekannt
|
||||||
|
bulk qr code generator free EUR 500 900% 900% Niedrig 27 "0,91" "2,85"
|
||||||
|
sms qr code generator EUR 500 0% 0% Niedrig 18 "0,66" "3,11"
|
||||||
|
phone qr code EUR 500 0% 0% Niedrig 28 "0,45" "1,61"
|
||||||
|
create your dynamic qr code EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code as a business card EUR 50 -100% -100% Unbekannt
|
||||||
|
generate free barcode EUR 50000 0% 0% Niedrig 5 "0,67" "2,52"
|
||||||
|
qr code barcode generator EUR 500 0% 0% Niedrig 15 "0,58" "1,51"
|
||||||
|
bulk qr code generator with logo EUR 50 0% 0% Niedrig 0
|
||||||
|
qr restaurant EUR 500 0% 0% Niedrig 7
|
||||||
|
sign up qr code EUR 50 0% 0% Niedrig 23 "1,81" "5,80"
|
||||||
|
create qr code menu free EUR 50 -100% -100% Unbekannt
|
||||||
|
bulk qr code generator excel EUR 50 0% 0% Niedrig 21
|
||||||
|
qr code options EUR 50 0% 900% Niedrig 15 "1,10" "2,91"
|
||||||
|
qr bulk generator EUR 5000 0% 0% Niedrig 13 "0,69" "3,63"
|
||||||
|
qr code s EUR 500 0% 0% Niedrig 27 "0,57" "4,93"
|
||||||
|
qr code to qr code EUR 50 ∞ ∞ Niedrig 14
|
||||||
|
log in qr code generator EUR 5000 0% 0% Niedrig 15 "0,67" "3,08"
|
||||||
|
create whatsapp qr code EUR 500 0% 0% Niedrig 19 "0,51" "1,89"
|
||||||
|
qr code in EUR 50 0% 0% Niedrig 22 "0,31" "1,88"
|
||||||
|
twitter qr code generator EUR 50 0% 0% Niedrig 4
|
||||||
|
care code EUR 500 0% 0% Niedrig 2
|
||||||
|
create qr code gratuit EUR 50 -100% -100% Unbekannt
|
||||||
|
restaurants with qr codes EUR 50 0% 0% Niedrig 11
|
||||||
|
master qr EUR 50 0% ∞ Niedrig 0
|
||||||
|
manage qr codes EUR 500 0% -90% Niedrig 30 "2,11" "18,77"
|
||||||
|
qr generator custom EUR 5000 0% 0% Niedrig 14 "1,91" "6,43"
|
||||||
|
qr code generator it EUR 50 0% 0% Niedrig 11
|
||||||
|
bulk qr EUR 500 0% 0% Niedrig 13 "0,07" "2,85"
|
||||||
|
master qr code EUR 50 0% 0% Niedrig 2
|
||||||
|
qr code generator in bulk EUR 50 0% 0% Niedrig 7
|
||||||
|
scan barcode generator EUR 500 0% 0% Niedrig 27 "0,84" "5,11"
|
||||||
|
static qr and dynamic qr EUR 50 -100% -100% Unbekannt
|
||||||
|
barcode make EUR 5000 900% 900% Niedrig 15 "0,64" "2,78"
|
||||||
|
qr code generator site EUR 50000 0% 0% Niedrig 17 "1,88" "6,16"
|
||||||
|
code create EUR 50 -90% 0% Niedrig 3 "0,62" "6,98"
|
||||||
|
dynamic codes EUR 500 0% 0% Niedrig 12 "0,78" "4,21"
|
||||||
|
scan qr code for restaurant menu EUR 50 0% 0% Unbekannt
|
||||||
|
qr code tracking analytics EUR 50 0% 0% Niedrig 0
|
||||||
|
generate facebook qr code EUR 5000 -90% 0% Niedrig 19 "1,26" "4,10"
|
||||||
|
create qr code location EUR 50 -100% 0% Unbekannt
|
||||||
|
qr code of location EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code with EUR 50 0% 0% Niedrig 7
|
||||||
|
code to qr EUR 50 0% 0% Niedrig 30 "0,43" "1,51"
|
||||||
|
make your own qr code for business EUR 50 0% -100% Unbekannt
|
||||||
|
scan your qr code EUR 50 0% 0% Niedrig 27 "0,56" "2,47"
|
||||||
|
for qr code generator EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code what is qr EUR 5000 0% 0% Niedrig 15 "0,05" "0,64"
|
||||||
|
qr code with location EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code qr EUR 5000 0% 0% Niedrig 0 "1,03" "3,01"
|
||||||
|
qr code generator bulk free EUR 50 0% 0% Niedrig 24
|
||||||
|
qr code and EUR 500 0% 0% Niedrig 18 "0,29" "1,03"
|
||||||
|
qr number EUR 500 0% 900% Niedrig 5 "0,07" "0,94"
|
||||||
|
credit card qr code generator EUR 50 0% -100% Unbekannt
|
||||||
|
about qr code generator EUR 50 0% 0% Unbekannt
|
||||||
|
whatsapp qr generator EUR 500 0% 0% Niedrig 19 "0,51" "1,89"
|
||||||
|
generate to qr code EUR 50 -100% -100% Unbekannt
|
||||||
|
qr codes work EUR 500 0% 0% Niedrig 11 "0,63" "2,06"
|
||||||
|
qr to code EUR 50 0% 0% Niedrig 21 "1,00" "3,78"
|
||||||
|
in qr code EUR 50 0% 0% Niedrig 22 "0,31" "1,88"
|
||||||
|
create qr business card free EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code it EUR 50 0% 0% Niedrig 29 "1,21" "2,25"
|
||||||
|
qr marketing EUR 50 0% 0% Niedrig 3
|
||||||
|
it qr code EUR 50 0% 0% Niedrig 5
|
||||||
|
and qr code EUR 500 0% 0% Niedrig 18 "0,29" "1,03"
|
||||||
|
qr code is EUR 50 0% 0% Niedrig 17 "0,09" "1,83"
|
||||||
|
bulk code generator EUR 50 0% 0% Niedrig 5
|
||||||
|
qr code calculator EUR 50 0% 0% Niedrig 23
|
||||||
|
qr bulk EUR 500 0% 0% Niedrig 13 "0,07" "2,85"
|
||||||
|
generator qr barcode EUR 50 -100% -100% Unbekannt
|
||||||
|
generator free EUR 500 0% 0% Niedrig 16 "0,82" "5,79"
|
||||||
|
code generator code EUR 50 ∞ 0% Niedrig 14
|
||||||
|
qr number generator EUR 50 0% 0% Niedrig 14
|
||||||
|
qr code generator bulk create EUR 50 -100% -100% Unbekannt
|
||||||
|
qr campaign EUR 50 0% -90% Niedrig 19 "1,45" "10,66"
|
||||||
|
square codes EUR 5000 0% 0% Niedrig 5 "0,83" "3,42"
|
||||||
|
generator create EUR 500 0% 0% Niedrig 1
|
||||||
|
code for qr code EUR 50 ∞ 0% Niedrig 14
|
||||||
|
qr bulk code generator EUR 50 0% 0% Niedrig 11
|
||||||
|
qr code generator with location EUR 50 -100% 0% Unbekannt
|
||||||
|
qr code scanner qr code generator EUR 50 ∞ 0% Niedrig 29
|
||||||
|
youtube qr EUR 5000 0% 0% Niedrig 16 "0,52" "2,21"
|
||||||
|
qr code generator custom design EUR 50 -100% -100% Unbekannt
|
||||||
|
your code generator EUR 50 0% -100% Unbekannt
|
||||||
|
free dynamic code generator EUR 50 0% -100% Unbekannt
|
||||||
|
qr scan code free EUR 50 0% 0% Niedrig 0
|
||||||
|
edit qr EUR 50 0% 0% Niedrig 2
|
||||||
|
qr code scan qr code EUR 50 0% 0% Niedrig 25
|
||||||
|
sozdat qr code EUR 50 -100% 0% Unbekannt
|
||||||
|
barcode to qr code generator EUR 50 0% 0% Niedrig 27 "1,89" "8,80"
|
||||||
|
qr codes that work EUR 500 0% 0% Niedrig 11 "0,63" "2,06"
|
||||||
|
i qr code EUR 50 0% 0% Niedrig 11 "1,25" "3,95"
|
||||||
|
free barcode code generator EUR 50000 0% 0% Niedrig 5 "0,67" "2,52"
|
||||||
|
work qr code EUR 500 0% 0% Niedrig 11 "0,63" "2,06"
|
||||||
|
qr code on device EUR 50 0% 0% Niedrig 1
|
||||||
|
barcode code generator free EUR 50 0% -90% Niedrig 6 "0,20" "2,34"
|
||||||
|
device qr code EUR 50 0% 0% Niedrig 22 "0,58" "2,52"
|
||||||
|
code barcode EUR 500 0% 900% Niedrig 10 "0,19" "1,55"
|
||||||
|
all qr code generator EUR 50 0% 0% Unbekannt
|
||||||
|
advanced qr code EUR 50 0% 0% Niedrig 2
|
||||||
|
qr generator bulk EUR 50 0% 0% Niedrig 14
|
||||||
|
information qr code generator EUR 50 -100% -100% Unbekannt
|
||||||
|
device qr EUR 50 0% -100% Unbekannt
|
||||||
|
type qr code EUR 50 0% 0% Niedrig 9 "0,52" "1,66"
|
||||||
|
qr edit EUR 50 0% 0% Niedrig 21
|
||||||
|
no qr codes EUR 500 0% 0% Niedrig 3 "0,26" "1,28"
|
||||||
|
qr code na EUR 50 0% 0% Unbekannt
|
||||||
|
qr code & EUR 50 0% ∞ Niedrig 0
|
||||||
|
qr code a EUR 500 0% 0% Niedrig 23 "0,49" "2,01"
|
||||||
|
qr generator location EUR 50 ∞ 0% Niedrig 0
|
||||||
|
qr code an EUR 50 0% 0% Niedrig 19
|
||||||
|
qr code on EUR 50 0% 0% Niedrig 12
|
||||||
|
qr code i EUR 50 0% 0% Niedrig 11 "1,25" "3,95"
|
||||||
|
qr code of EUR 50 0% 0% Niedrig 9 "0,50" "2,07"
|
||||||
|
qr code on this phone EUR 500 0% 0% Niedrig 28 "0,45" "1,61"
|
||||||
|
your qr EUR 50 0% 0% Niedrig 20
|
||||||
|
qr code what is EUR 5000 0% 0% Niedrig 15 "0,05" "0,64"
|
||||||
|
qr code generator vcard business card EUR 50 -100% -100% Unbekannt
|
||||||
|
every qr code EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
at qr code EUR 50 0% 0% Niedrig 4
|
||||||
|
qr code what is it EUR 50 0% 0% Niedrig 17 "0,05" "0,44"
|
||||||
|
qr code where is it EUR 50 0% 0% Niedrig 0
|
||||||
|
view qr code EUR 50 0% 0% Niedrig 13 "0,65" "3,23"
|
||||||
|
code creation EUR 50 -90% 0% Niedrig 12 "2,14" "5,68"
|
||||||
|
qr code from EUR 50 0% 0% Niedrig 14 "0,58" "1,45"
|
||||||
|
write qr code EUR 50 0% 0% Niedrig 0
|
||||||
|
credit card qr code EUR 50 0% 0% Niedrig 7 "2,64" "9,81"
|
||||||
|
qr code about EUR 50 0% 0% Niedrig 18
|
||||||
|
www com qr code EUR 50 0% 0% Unbekannt
|
||||||
|
this qr code EUR 50 0% 0% Niedrig 8
|
||||||
|
by qr code EUR 50 0% 0% Niedrig 19
|
||||||
|
qr code to location EUR 50 -100% -100% Unbekannt
|
||||||
|
location qr generator EUR 50 0% 0% Niedrig 0
|
||||||
|
business card qr code generator with logo EUR 50 0% 0% Niedrig 0
|
||||||
|
qr work EUR 50 900% 900% Niedrig 1
|
||||||
|
generate bulk qr code from excel EUR 50 ∞ ∞ Niedrig 14
|
||||||
|
any qr code EUR 500 0% 0% Niedrig 0
|
||||||
|
generate qr code bulk EUR 50 -100% 0% Unbekannt
|
||||||
|
qr code qr scanner EUR 500 0% 0% Niedrig 0
|
||||||
|
get qr code for location EUR 50 -100% -100% Unbekannt
|
||||||
|
scan code for EUR 50 0% 0% Niedrig 19
|
||||||
|
generator barcode qr EUR 50 0% -100% Unbekannt
|
||||||
|
free qr code for location EUR 50 -100% 0% Unbekannt
|
||||||
|
open a qr code EUR 500 0% 0% Niedrig 23 "0,41" "1,51"
|
||||||
|
phone qr EUR 500 0% 0% Niedrig 28 "0,45" "1,61"
|
||||||
|
barcode to qr generator EUR 50 -100% -100% Unbekannt
|
||||||
|
static code generator EUR 50 0% 0% Niedrig 26
|
||||||
|
location qr code creation EUR 50 0% 0% Unbekannt
|
||||||
|
location scan qr code EUR 50 ∞ ∞ Niedrig 0
|
||||||
|
create location qr code free EUR 50 -100% 0% Unbekannt
|
||||||
|
generator qr code vcard EUR 50 0% 0% Unbekannt
|
||||||
|
bulk generator EUR 50 0% 0% Niedrig 4 "0,27" "1,33"
|
||||||
|
qr code of this device EUR 50 0% ∞ Niedrig 20
|
||||||
|
qr code generator location free EUR 50 0% 0% Niedrig 0
|
||||||
|
qr location code EUR 50 0% -100% Unbekannt
|
||||||
|
account qr code EUR 50 0% 0% Niedrig 13
|
||||||
|
qr code to code EUR 50 0% 0% Niedrig 0
|
||||||
|
free qr scan generator EUR 50 0% 0% Niedrig 26 "0,89" "1,51"
|
||||||
|
dynamic qr code generator with logo EUR 50 0% 0% Niedrig 0
|
||||||
|
qr code to barcode generator EUR 50 0% 0% Niedrig 5
|
||||||
|
qr code of a location EUR 50 0% -100% Unbekannt
|
||||||
|
the code generator EUR 50 0% 0% Niedrig 27
|
||||||
|
create qr code of location EUR 50 0% -100% Unbekannt
|
||||||
|
bulk qr barcode generator EUR 50 0% 0% Niedrig 3
|
||||||
|
qr hunt EUR 50 0% 0% Niedrig 4
|
||||||
|
bulk qr generator free EUR 50 -100% -100% Unbekannt
|
||||||
|
dynamic qr code display EUR 50 900% 900% Niedrig 6
|
||||||
|
location qr code free EUR 50 0% -100% Unbekannt
|
||||||
|
location qr scanner EUR 50 -100% 0% Unbekannt
|
||||||
|
qr quotes EUR 500 0% 0% Niedrig 5 "0,61" "2,17"
|
||||||
|
qr c9de EUR 50 -90% 0% Niedrig 2
|
||||||
|
you are code generator EUR 50 0% -100% Unbekannt
|
||||||
|
make a qr code for location EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code generator from csv EUR 50 0% 0% Niedrig 0
|
||||||
|
generate qr code from barcode EUR 50 0% 0% Niedrig 29
|
||||||
|
make generator EUR 500 0% 0% Niedrig 9 "0,46" "2,62"
|
||||||
|
all qr codes EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
bulk qr code generator with logo free EUR 50 0% ∞ Unbekannt
|
||||||
|
whatsapp qr code business card EUR 50 -100% 0% Unbekannt
|
||||||
|
qr code with phone EUR 500 0% 0% Niedrig 28 "0,45" "1,61"
|
||||||
|
generator for free EUR 500 0% 0% Niedrig 16 "0,82" "5,79"
|
||||||
|
generate url from qr code EUR 500 -90% 0% Niedrig 4 "2,05" "2,69"
|
||||||
|
barcode and qr codes EUR 50000 0% 900% Niedrig 3 "0,42" "1,93"
|
||||||
|
qr code menu restaurant free EUR 50 0% 0% Unbekannt
|
||||||
|
qr code features EUR 500 0% 900% Niedrig 2 "0,33" "1,29"
|
||||||
|
generate qr code for location free EUR 50 0% -100% Unbekannt
|
||||||
|
location in qr code EUR 50 0% 0% Unbekannt
|
||||||
|
generate qr code by url EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code required EUR 50 0% 0% Niedrig 11 "0,94" "2,61"
|
||||||
|
qr code from phone EUR 50 0% 0% Niedrig 11 "0,49" "1,03"
|
||||||
|
location qr code scan EUR 50 -100% -100% Unbekannt
|
||||||
|
no qr EUR 500 0% 0% Niedrig 3 "0,26" "1,28"
|
||||||
|
qr code scan for location EUR 50 0% -100% Unbekannt
|
||||||
|
generate url to qr code EUR 50 -100% -100% Unbekannt
|
||||||
|
get code from qr code EUR 50 0% 0% Niedrig 10
|
||||||
|
scan the qr code for location EUR 50 ∞ ∞ Niedrig 0
|
||||||
|
kod generator EUR 50 0% 0% Niedrig 0
|
||||||
|
qr code in text EUR 50 0% 0% Niedrig 2
|
||||||
|
restaurant menu scan code EUR 50 0% 0% Niedrig 0
|
||||||
|
location qr code free generator EUR 50 0% 0% Unbekannt
|
||||||
|
url from qr code EUR 50 0% 0% Niedrig 4
|
||||||
|
scan tracking EUR 50 900% 0% Niedrig 24 "0,31" "2,42"
|
||||||
|
qr code of this phone EUR 50 0% 0% Niedrig 0
|
||||||
|
qr code brand EUR 500 0% 0% Niedrig 4 "1,55" "8,10"
|
||||||
|
qr code in phone EUR 500 0% 0% Niedrig 28 "0,45" "1,61"
|
||||||
|
www the qr code generator scan EUR 50 -100% 0% Unbekannt
|
||||||
|
create qr code from barcode EUR 50 0% 0% Niedrig 29
|
||||||
|
qr all EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
bulk qr code barcode generator EUR 50 ∞ 0% Niedrig 0
|
||||||
|
qr scan location EUR 50 0% 0% Niedrig 0
|
||||||
|
qr code no EUR 500 0% 0% Niedrig 3 "0,26" "1,28"
|
||||||
|
qr code that works EUR 500 0% 0% Niedrig 11 "0,63" "2,06"
|
||||||
|
qr code randomizer EUR 5000 0% 0% Niedrig 13 "0,60" "1,71"
|
||||||
|
qr code marketing campaigns EUR 50 0% 0% Niedrig 3
|
||||||
|
qr code generator create your qr code for free EUR 50 -100% -100% Unbekannt
|
||||||
|
account qr EUR 50 0% ∞ Niedrig 0
|
||||||
|
qr code for credit card EUR 50 -100% -100% Unbekannt
|
||||||
|
qr cost EUR 50 0% 0% Niedrig 5
|
||||||
|
qr code on the phone EUR 50 0% 0% Niedrig 13
|
||||||
|
scan qr code scan qr code EUR 50 0% 0% Niedrig 25
|
||||||
|
qr kodlari EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code scan code EUR 50 0% 0% Niedrig 17
|
||||||
|
scan by qr code EUR 50 0% 0% Niedrig 0
|
||||||
|
3 qr code EUR 50 0% 0% Niedrig 0
|
||||||
|
scan qr code location EUR 50 0% 0% Niedrig 17
|
||||||
|
qr scanner in EUR 50 0% 0% Niedrig 18
|
||||||
|
create qr code to whatsapp EUR 50 -100% -100% Unbekannt
|
||||||
|
qr code on email EUR 50 0% 0% Niedrig 25
|
||||||
|
create qr code for whatsapp free EUR 50 0% -100% Unbekannt
|
||||||
|
make qr code of location EUR 50 -100% 0% Unbekannt
|
||||||
|
qr code save EUR 50 0% 0% Niedrig 19 "0,83" "3,47"
|
||||||
|
no to qr code EUR 50 0% -100% Unbekannt
|
||||||
|
call qr code EUR 50000 0% 0% Niedrig 0 "0,57" "2,59"
|
||||||
|
free barcode code EUR 500 0% 0% Niedrig 18 "0,65" "2,84"
|
||||||
|
qr code for scan EUR 50 0% 0% Niedrig 14 "0,52" "1,56"
|
||||||
|
bar code s EUR 50 0% 0% Niedrig 24 "1,26" "1,72"
|
||||||
|
qr code as text EUR 500 0% 0% Niedrig 15 "0,13" "1,40"
|
||||||
|
qr view EUR 50 0% 0% Niedrig 3
|
||||||
|
qr code generator device EUR 50 0% 0% Niedrig 8
|
||||||
|
qr scanner for EUR 50 0% 0% Niedrig 14 "0,52" "1,56"
|
||||||
|
qr code generator full EUR 50 0% 0% Unbekannt
|
||||||
|
qr code generator for visiting card free EUR 50 0% 0% Unbekannt
|
||||||
|
qr coe3 EUR 50 -100% -100% Unbekannt
|
||||||
|
qr text code EUR 50 0% 0% Niedrig 29
|
||||||
|
scan qr free EUR 50 0% 0% Niedrig 25
|
||||||
|
cole generator EUR 50 0% 0% Niedrig 24
|
||||||
|
into qr code EUR 50 0% 0% Niedrig 22 "0,31" "1,88"
|
||||||
|
qr code how does it work EUR 50 0% 0% Niedrig 25 "0,10" "0,52"
|
||||||
|
any qr EUR 500 0% 0% Niedrig 0
|
||||||
|
menu card qr code generator EUR 50 0% 0% Unbekannt
|
||||||
|
url to code generator EUR 50 ∞ 0% Niedrig 14
|
||||||
|
website qr scanner EUR 500 0% 0% Niedrig 6 "0,03" "1,77"
|
||||||
|
all in qr code EUR 50 0% 0% Unbekannt
|
||||||
|
all qr EUR 50 0% 0% Niedrig 5 "0,50" "6,33"
|
||||||
|
qr scanner location EUR 50 0% 0% Niedrig 0
|
||||||
|
qr how to use EUR 50 0% 0% Niedrig 0
|
||||||
|
qr scanner for location EUR 50 -100% 0% Unbekannt
|
||||||
|
scan qr code for EUR 50 0% 0% Niedrig 11
|
||||||
|
scan the qr code for EUR 50 0% 0% Niedrig 0
|
||||||
|
scan this qr code for EUR 50 ∞ ∞ Niedrig 29
|
||||||
|
the qr barcode generator EUR 50 -100% -100% Unbekannt
|
||||||
|
trackable codes EUR 50 0% 0% Niedrig 0
|
||||||
|
scan qr code in EUR 50 0% 0% Niedrig 0
|
||||||
|
qr do EUR 50 0% 0% Niedrig 15 "0,86" "4,10"
|
||||||
|
qr code login generator EUR 50 0% 0% Niedrig 16
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
/** @type {import('next-sitemap').IConfig} */
|
|
||||||
module.exports = {
|
|
||||||
siteUrl: 'https://www.qrmaster.net',
|
|
||||||
generateRobotsTxt: true,
|
|
||||||
robotsTxtOptions: {
|
|
||||||
policies: [
|
|
||||||
{
|
|
||||||
userAgent: '*',
|
|
||||||
allow: '/',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
|
||||||
transform: async (config, path) => {
|
|
||||||
// Custom priority and changefreq based on path
|
|
||||||
let priority = 0.7;
|
|
||||||
let changefreq = 'weekly';
|
|
||||||
|
|
||||||
if (path === '/') {
|
|
||||||
priority = 0.9;
|
|
||||||
changefreq = 'daily';
|
|
||||||
} else if (path === '/blog') {
|
|
||||||
priority = 0.7;
|
|
||||||
changefreq = 'daily';
|
|
||||||
} else if (path === '/pricing') {
|
|
||||||
priority = 0.8;
|
|
||||||
changefreq = 'weekly';
|
|
||||||
} else if (path === '/faq') {
|
|
||||||
priority = 0.6;
|
|
||||||
changefreq = 'weekly';
|
|
||||||
} else if (path.startsWith('/blog/')) {
|
|
||||||
priority = 0.6;
|
|
||||||
changefreq = 'weekly';
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
loc: path,
|
|
||||||
changefreq,
|
|
||||||
priority,
|
|
||||||
lastmod: new Date().toISOString(),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
@@ -20,6 +20,25 @@ const nextConfig = {
|
|||||||
pagesBufferLength: 2,
|
pagesBufferLength: 2,
|
||||||
},
|
},
|
||||||
poweredByHeader: false,
|
poweredByHeader: false,
|
||||||
|
async redirects() {
|
||||||
|
return [
|
||||||
|
{
|
||||||
|
source: '/tools/phone-qr-code',
|
||||||
|
destination: '/tools/call-qr-code-generator',
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
source: '/barcode-generator',
|
||||||
|
destination: '/tools/barcode-generator',
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
source: '/bar-code-generator',
|
||||||
|
destination: '/tools/barcode-generator',
|
||||||
|
permanent: true,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
|
||||||
export default nextConfig;
|
export default nextConfig;
|
||||||
|
|||||||
68
next_blog_post.md
Normal file
@@ -0,0 +1,68 @@
|
|||||||
|
# SEO Setup (Copy these into the tool)
|
||||||
|
|
||||||
|
**Focus Keyword:** Best QR Code Generator 2026
|
||||||
|
**Page Title:** Best QR Code Generator 2026: Ultimate Guide (Dynamic & AI)
|
||||||
|
**Meta Description:** Discover standards for the best QR code generator in 2026. Learn why dynamic QR codes, AI analytics, and unlimited scans are essential for your business growth.
|
||||||
|
|
||||||
|
**Related Keywords:**
|
||||||
|
1. free dynamic qr code generator
|
||||||
|
2. qr code tracking analytics
|
||||||
|
3. edit qr code after printing
|
||||||
|
4. unlimited scan qr code
|
||||||
|
5. vector qr code svg
|
||||||
|
6. custom brand qr code
|
||||||
|
7. bulk qr code generator
|
||||||
|
8. gdpr compliant qr code
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
# Article Content
|
||||||
|
|
||||||
|
# Best QR Code Generator 2026: The Ultimate Guide
|
||||||
|
|
||||||
|
The digital landscape has transformed, and finding the **Best QR Code Generator 2026** is critical for businesses connecting with customers. The humble QR code has evolved into a sophisticated marketing instrument. To stay competitive, your chosen platform must offer more than just links—it must unlock data, flexibility, and brand engagement.
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
In this guide, we explore why static codes are dead and why top-tier tools now rely entirely on dynamic technology.
|
||||||
|
|
||||||
|
## Why Dynamic QR Codes Are Non-Negotiable
|
||||||
|
|
||||||
|
If you are not using a modern solution, you might still be stuck with static codes. The industry standard has shifted entirely to **dynamic QR codes** for critical reasons:
|
||||||
|
|
||||||
|
1. **Editability**: Printed 5,000 brochures with the wrong link? A dynamic platform lets you update the destination URL in seconds.
|
||||||
|
2. **Tracking & Analytics**: You need to know *who* scanned and *when*.
|
||||||
|
3. **Retargeting**: Integration with [Google Analytics](https://www.qrmaster.net/analytics) allows you to build audiences.
|
||||||
|
|
||||||
|
### Static vs. Dynamic: The 2026 Verdict
|
||||||
|
|
||||||
|
| Feature | Static QR Code | Best QR Code Generator 2026 (Dynamic) |
|
||||||
|
| :--- | :--- | :--- |
|
||||||
|
| **Editing** | Impossible | Instant updates anytime |
|
||||||
|
| **Analytics** | None | Real-time AI Data |
|
||||||
|
| **Lifespan** | Until link breaks | Indefinite |
|
||||||
|
|
||||||
|
## Top Trends Defining the Market
|
||||||
|
|
||||||
|
### 1. AI-Driven Scan Prediction
|
||||||
|
Leading platforms integrates Artificial Intelligence to predict peak scan times. By analyzing historical data, platforms like [QR Master](https://www.qrmaster.net/) suggest optimal placement.
|
||||||
|
|
||||||
|
### 2. Augmented Reality (AR) Integration
|
||||||
|
New codes trigger immersive AR experiences. The **Best QR Code Generator 2026** supports these next-gen formats natively, allowing customers to visualize products immediately.
|
||||||
|
|
||||||
|
### 3. Hyper-Personalization
|
||||||
|
Contextual redirects are a hallmark of advanced generators. Redirect users in Berlin to German pages and New York users to US pages automatically, ensuring the highest possible conversion rate.
|
||||||
|
|
||||||
|
## How to Choose the Right Tool
|
||||||
|
|
||||||
|
With many tools available, how do you verify which is the right one for you?
|
||||||
|
|
||||||
|
* **No Scan Limits**: Many services cap you at 100 scans. Ensure your provider offers [unlimited scans](https://www.qrmaster.net/pricing).
|
||||||
|
* **Vector Formats**: Essential for professional printing (SVG/EPS).
|
||||||
|
* **GDPR Compliance**: Data privacy is paramount.
|
||||||
|
|
||||||
|
## Conclusion: Future-Proof Your Marketing
|
||||||
|
|
||||||
|
As we move through the year, selecting the **Best QR Code Generator 2026** is the highest ROI decision you can make. Don't settle for temporary solutions. Choose a platform that scales with your ambition.
|
||||||
|
|
||||||
|
*Ready to upgrade? Start creating with the industry leader today: [Sign Up Free](https://www.qrmaster.net/signup).*
|
||||||
3244
package-lock.json
generated
22
package.json
@@ -5,9 +5,12 @@
|
|||||||
"private": true,
|
"private": true,
|
||||||
"scripts": {
|
"scripts": {
|
||||||
"dev": "next dev -p 3050",
|
"dev": "next dev -p 3050",
|
||||||
"build": "prisma generate && next build",
|
"build": "prisma generate && cross-env NODE_OPTIONS='--max-old-space-size=4096' next build",
|
||||||
|
"trigger:indexing": "tsx scripts/trigger-indexing.ts",
|
||||||
|
"submit:indexnow": "tsx scripts/submit-indexnow.ts",
|
||||||
"start": "next start",
|
"start": "next start",
|
||||||
"lint": "next lint",
|
"lint": "next lint",
|
||||||
|
"indexnow": "tsx scripts/submit-indexnow.ts",
|
||||||
"db:generate": "prisma generate",
|
"db:generate": "prisma generate",
|
||||||
"db:migrate": "prisma migrate dev",
|
"db:migrate": "prisma migrate dev",
|
||||||
"db:deploy": "prisma migrate deploy",
|
"db:deploy": "prisma migrate deploy",
|
||||||
@@ -26,36 +29,46 @@
|
|||||||
},
|
},
|
||||||
"dependencies": {
|
"dependencies": {
|
||||||
"@auth/prisma-adapter": "^2.11.1",
|
"@auth/prisma-adapter": "^2.11.1",
|
||||||
|
"@aws-sdk/client-s3": "^3.972.0",
|
||||||
|
"@aws-sdk/s3-request-presigner": "^3.972.0",
|
||||||
"@edge-runtime/cookies": "^6.0.0",
|
"@edge-runtime/cookies": "^6.0.0",
|
||||||
"@prisma/client": "^5.7.0",
|
"@prisma/client": "^5.7.0",
|
||||||
"@stripe/stripe-js": "^8.0.0",
|
"@stripe/stripe-js": "^8.0.0",
|
||||||
"@types/d3-scale": "^4.0.9",
|
"@types/d3-scale": "^4.0.9",
|
||||||
|
"axios": "^1.13.2",
|
||||||
"bcryptjs": "^2.4.3",
|
"bcryptjs": "^2.4.3",
|
||||||
"chart.js": "^4.4.0",
|
"chart.js": "^4.4.0",
|
||||||
"clsx": "^2.0.0",
|
"clsx": "^2.0.0",
|
||||||
|
"copy-image-clipboard": "^2.1.2",
|
||||||
"d3-scale": "^4.0.2",
|
"d3-scale": "^4.0.2",
|
||||||
"dayjs": "^1.11.10",
|
"dayjs": "^1.11.10",
|
||||||
|
"dotenv": "^17.2.3",
|
||||||
"exceljs": "^4.4.0",
|
"exceljs": "^4.4.0",
|
||||||
"file-saver": "^2.0.5",
|
"file-saver": "^2.0.5",
|
||||||
|
"framer-motion": "^12.24.10",
|
||||||
|
"googleapis": "^170.1.0",
|
||||||
|
"html-to-image": "^1.11.13",
|
||||||
"i18next": "^23.7.6",
|
"i18next": "^23.7.6",
|
||||||
"ioredis": "^5.3.2",
|
"ioredis": "^5.3.2",
|
||||||
|
"jspdf": "^4.0.0",
|
||||||
"jszip": "^3.10.1",
|
"jszip": "^3.10.1",
|
||||||
"lucide-react": "^0.562.0",
|
"lucide-react": "^0.562.0",
|
||||||
"next": "^14.2.35",
|
"next": "^14.2.35",
|
||||||
"next-auth": "^4.24.5",
|
"next-auth": "^4.24.5",
|
||||||
"papaparse": "^5.4.1",
|
"papaparse": "^5.4.1",
|
||||||
"posthog-js": "^1.276.0",
|
"posthog-js": "^1.332.0",
|
||||||
"qr-code-styling": "^1.9.2",
|
"qr-code-styling": "^1.9.2",
|
||||||
"qrcode": "^1.5.3",
|
"qrcode": "^1.5.3",
|
||||||
"qrcode.react": "^3.1.0",
|
"qrcode.react": "^3.1.0",
|
||||||
"react": "^18.2.0",
|
"react": "^18.2.0",
|
||||||
|
"react-barcode": "^1.6.1",
|
||||||
"react-chartjs-2": "^5.2.0",
|
"react-chartjs-2": "^5.2.0",
|
||||||
"react-dom": "^18.2.0",
|
"react-dom": "^18.2.0",
|
||||||
"react-dropzone": "^14.2.3",
|
"react-dropzone": "^14.2.3",
|
||||||
|
"react-facebook-pixel": "^1.0.4",
|
||||||
"react-i18next": "^13.5.0",
|
"react-i18next": "^13.5.0",
|
||||||
"react-simple-maps": "^3.0.0",
|
"react-simple-maps": "^3.0.0",
|
||||||
"resend": "^6.4.2",
|
"resend": "^6.4.2",
|
||||||
"sharp": "^0.33.1",
|
|
||||||
"stripe": "^19.1.0",
|
"stripe": "^19.1.0",
|
||||||
"tailwind-merge": "^2.2.0",
|
"tailwind-merge": "^2.2.0",
|
||||||
"uuid": "^13.0.0",
|
"uuid": "^13.0.0",
|
||||||
@@ -70,12 +83,13 @@
|
|||||||
"@types/react": "^18.2.45",
|
"@types/react": "^18.2.45",
|
||||||
"@types/react-dom": "^18.2.18",
|
"@types/react-dom": "^18.2.18",
|
||||||
"autoprefixer": "^10.4.16",
|
"autoprefixer": "^10.4.16",
|
||||||
|
"cross-env": "^10.1.0",
|
||||||
"eslint": "^8.56.0",
|
"eslint": "^8.56.0",
|
||||||
"eslint-config-next": "^16.1.1",
|
"eslint-config-next": "^16.1.1",
|
||||||
"next-sitemap": "^4.2.3",
|
|
||||||
"postcss": "^8.4.32",
|
"postcss": "^8.4.32",
|
||||||
"prettier": "^3.1.1",
|
"prettier": "^3.1.1",
|
||||||
"prisma": "^5.7.0",
|
"prisma": "^5.7.0",
|
||||||
|
"sharp": "^0.34.5",
|
||||||
"tailwindcss": "^3.3.6",
|
"tailwindcss": "^3.3.6",
|
||||||
"tsx": "^4.7.0",
|
"tsx": "^4.7.0",
|
||||||
"typescript": "^5.3.3"
|
"typescript": "^5.3.3"
|
||||||
|
|||||||
146
prisma/migrations/20251013172642_init/migration.sql
Normal file
@@ -0,0 +1,146 @@
|
|||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "QRType" AS ENUM ('STATIC', 'DYNAMIC');
|
||||||
|
|
||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "ContentType" AS ENUM ('URL', 'WIFI', 'VCARD', 'PHONE', 'EMAIL', 'SMS', 'TEXT', 'WHATSAPP');
|
||||||
|
|
||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "QRStatus" AS ENUM ('ACTIVE', 'PAUSED');
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "User" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"email" TEXT NOT NULL,
|
||||||
|
"name" TEXT,
|
||||||
|
"password" TEXT,
|
||||||
|
"image" TEXT,
|
||||||
|
"emailVerified" TIMESTAMP(3),
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "User_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Account" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"type" TEXT NOT NULL,
|
||||||
|
"provider" TEXT NOT NULL,
|
||||||
|
"providerAccountId" TEXT NOT NULL,
|
||||||
|
"refresh_token" TEXT,
|
||||||
|
"access_token" TEXT,
|
||||||
|
"expires_at" INTEGER,
|
||||||
|
"token_type" TEXT,
|
||||||
|
"scope" TEXT,
|
||||||
|
"id_token" TEXT,
|
||||||
|
"session_state" TEXT,
|
||||||
|
|
||||||
|
CONSTRAINT "Account_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Session" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"sessionToken" TEXT NOT NULL,
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"expires" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "Session_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "VerificationToken" (
|
||||||
|
"identifier" TEXT NOT NULL,
|
||||||
|
"token" TEXT NOT NULL,
|
||||||
|
"expires" TIMESTAMP(3) NOT NULL
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "QRCode" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"title" TEXT NOT NULL,
|
||||||
|
"type" "QRType" NOT NULL DEFAULT 'DYNAMIC',
|
||||||
|
"contentType" "ContentType" NOT NULL DEFAULT 'URL',
|
||||||
|
"content" JSONB NOT NULL,
|
||||||
|
"tags" TEXT[],
|
||||||
|
"status" "QRStatus" NOT NULL DEFAULT 'ACTIVE',
|
||||||
|
"style" JSONB NOT NULL,
|
||||||
|
"slug" TEXT NOT NULL,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "QRCode_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "QRScan" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"qrId" TEXT NOT NULL,
|
||||||
|
"ts" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"ipHash" TEXT NOT NULL,
|
||||||
|
"userAgent" TEXT,
|
||||||
|
"device" TEXT,
|
||||||
|
"os" TEXT,
|
||||||
|
"country" TEXT,
|
||||||
|
"referrer" TEXT,
|
||||||
|
"utmSource" TEXT,
|
||||||
|
"utmMedium" TEXT,
|
||||||
|
"utmCampaign" TEXT,
|
||||||
|
"isUnique" BOOLEAN NOT NULL DEFAULT false,
|
||||||
|
|
||||||
|
CONSTRAINT "QRScan_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Integration" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"userId" TEXT NOT NULL,
|
||||||
|
"provider" TEXT NOT NULL,
|
||||||
|
"status" TEXT NOT NULL DEFAULT 'inactive',
|
||||||
|
"config" JSONB NOT NULL,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "Integration_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "User_email_key" ON "User"("email");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "Account_provider_providerAccountId_key" ON "Account"("provider", "providerAccountId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "Session_sessionToken_key" ON "Session"("sessionToken");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "VerificationToken_token_key" ON "VerificationToken"("token");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "VerificationToken_identifier_token_key" ON "VerificationToken"("identifier", "token");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "QRCode_slug_key" ON "QRCode"("slug");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "QRCode_userId_createdAt_idx" ON "QRCode"("userId", "createdAt");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "QRScan_qrId_ts_idx" ON "QRScan"("qrId", "ts");
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Account" ADD CONSTRAINT "Account_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Session" ADD CONSTRAINT "Session_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "QRCode" ADD CONSTRAINT "QRCode_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "QRScan" ADD CONSTRAINT "QRScan_qrId_fkey" FOREIGN KEY ("qrId") REFERENCES "QRCode"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
|
|
||||||
|
-- AddForeignKey
|
||||||
|
ALTER TABLE "Integration" ADD CONSTRAINT "Integration_userId_fkey" FOREIGN KEY ("userId") REFERENCES "User"("id") ON DELETE CASCADE ON UPDATE CASCADE;
|
||||||
22
prisma/migrations/20251014195005_init/migration.sql
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- A unique constraint covering the columns `[stripeCustomerId]` on the table `User` will be added. If there are existing duplicate values, this will fail.
|
||||||
|
- A unique constraint covering the columns `[stripeSubscriptionId]` on the table `User` will be added. If there are existing duplicate values, this will fail.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- CreateEnum
|
||||||
|
CREATE TYPE "Plan" AS ENUM ('FREE', 'PRO', 'BUSINESS');
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "User" ADD COLUMN "plan" "Plan" NOT NULL DEFAULT 'FREE',
|
||||||
|
ADD COLUMN "stripeCurrentPeriodEnd" TIMESTAMP(3),
|
||||||
|
ADD COLUMN "stripeCustomerId" TEXT,
|
||||||
|
ADD COLUMN "stripePriceId" TEXT,
|
||||||
|
ADD COLUMN "stripeSubscriptionId" TEXT;
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "User_stripeCustomerId_key" ON "User"("stripeCustomerId");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "User_stripeSubscriptionId_key" ON "User"("stripeSubscriptionId");
|
||||||
@@ -0,0 +1,67 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- The values [WIFI,EMAIL] on the enum `ContentType` will be removed. If these variants are still used in the database, this will fail.
|
||||||
|
- A unique constraint covering the columns `[resetPasswordToken]` on the table `User` will be added. If there are existing duplicate values, this will fail.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- AlterEnum
|
||||||
|
BEGIN;
|
||||||
|
CREATE TYPE "ContentType_new" AS ENUM ('URL', 'VCARD', 'GEO', 'PHONE', 'SMS', 'TEXT', 'WHATSAPP');
|
||||||
|
ALTER TABLE "QRCode" ALTER COLUMN "contentType" DROP DEFAULT;
|
||||||
|
ALTER TABLE "QRCode" ALTER COLUMN "contentType" TYPE "ContentType_new" USING ("contentType"::text::"ContentType_new");
|
||||||
|
ALTER TYPE "ContentType" RENAME TO "ContentType_old";
|
||||||
|
ALTER TYPE "ContentType_new" RENAME TO "ContentType";
|
||||||
|
DROP TYPE "ContentType_old";
|
||||||
|
ALTER TABLE "QRCode" ALTER COLUMN "contentType" SET DEFAULT 'URL';
|
||||||
|
COMMIT;
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "User" ADD COLUMN "resetPasswordExpires" TIMESTAMP(3),
|
||||||
|
ADD COLUMN "resetPasswordToken" TEXT;
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "NewsletterSubscription" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"email" TEXT NOT NULL,
|
||||||
|
"source" TEXT NOT NULL DEFAULT 'ai-coming-soon',
|
||||||
|
"status" TEXT NOT NULL DEFAULT 'subscribed',
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
"updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
|
||||||
|
CONSTRAINT "NewsletterSubscription_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateTable
|
||||||
|
CREATE TABLE "Lead" (
|
||||||
|
"id" TEXT NOT NULL,
|
||||||
|
"email" TEXT NOT NULL,
|
||||||
|
"source" TEXT NOT NULL DEFAULT 'reprint-calculator',
|
||||||
|
"reprintCost" DOUBLE PRECISION,
|
||||||
|
"updatesPerYear" INTEGER,
|
||||||
|
"annualSavings" DOUBLE PRECISION,
|
||||||
|
"createdAt" TIMESTAMP(3) NOT NULL DEFAULT CURRENT_TIMESTAMP,
|
||||||
|
|
||||||
|
CONSTRAINT "Lead_pkey" PRIMARY KEY ("id")
|
||||||
|
);
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "NewsletterSubscription_email_key" ON "NewsletterSubscription"("email");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "NewsletterSubscription_email_idx" ON "NewsletterSubscription"("email");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "NewsletterSubscription_createdAt_idx" ON "NewsletterSubscription"("createdAt");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "Lead_email_idx" ON "Lead"("email");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "Lead_createdAt_idx" ON "Lead"("createdAt");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE INDEX "Lead_source_idx" ON "Lead"("source");
|
||||||
|
|
||||||
|
-- CreateIndex
|
||||||
|
CREATE UNIQUE INDEX "User_resetPasswordToken_key" ON "User"("resetPasswordToken");
|
||||||
@@ -0,0 +1,31 @@
|
|||||||
|
/*
|
||||||
|
Warnings:
|
||||||
|
|
||||||
|
- Added the required column `updatedAt` to the `Lead` table without a default value. This is not possible if the table is not empty.
|
||||||
|
|
||||||
|
*/
|
||||||
|
-- AlterEnum
|
||||||
|
-- This migration adds more than one value to an enum.
|
||||||
|
-- With PostgreSQL versions 11 and earlier, this is not possible
|
||||||
|
-- in a single migration. This can be worked around by creating
|
||||||
|
-- multiple migrations, each migration adding only one value to
|
||||||
|
-- the enum.
|
||||||
|
|
||||||
|
|
||||||
|
ALTER TYPE "ContentType" ADD VALUE 'PDF';
|
||||||
|
ALTER TYPE "ContentType" ADD VALUE 'APP';
|
||||||
|
ALTER TYPE "ContentType" ADD VALUE 'COUPON';
|
||||||
|
ALTER TYPE "ContentType" ADD VALUE 'FEEDBACK';
|
||||||
|
|
||||||
|
-- DropIndex
|
||||||
|
DROP INDEX "Lead_createdAt_idx";
|
||||||
|
|
||||||
|
-- DropIndex
|
||||||
|
DROP INDEX "Lead_email_idx";
|
||||||
|
|
||||||
|
-- DropIndex
|
||||||
|
DROP INDEX "Lead_source_idx";
|
||||||
|
|
||||||
|
-- AlterTable
|
||||||
|
ALTER TABLE "Lead" ADD COLUMN "updatedAt" TIMESTAMP(3) NOT NULL,
|
||||||
|
ALTER COLUMN "updatesPerYear" SET DATA TYPE DOUBLE PRECISION;
|
||||||
3
prisma/migrations/migration_lock.toml
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Please do not edit this file manually
|
||||||
|
# It should be added in your version-control system (i.e. Git)
|
||||||
|
provider = "postgresql"
|
||||||
@@ -32,9 +32,6 @@ model User {
|
|||||||
resetPasswordToken String? @unique
|
resetPasswordToken String? @unique
|
||||||
resetPasswordExpires DateTime?
|
resetPasswordExpires DateTime?
|
||||||
|
|
||||||
// White-label subdomain
|
|
||||||
subdomain String? @unique
|
|
||||||
|
|
||||||
qrCodes QRCode[]
|
qrCodes QRCode[]
|
||||||
integrations Integration[]
|
integrations Integration[]
|
||||||
accounts Account[]
|
accounts Account[]
|
||||||
@@ -115,6 +112,10 @@ enum ContentType {
|
|||||||
SMS
|
SMS
|
||||||
TEXT
|
TEXT
|
||||||
WHATSAPP
|
WHATSAPP
|
||||||
|
PDF
|
||||||
|
APP
|
||||||
|
COUPON
|
||||||
|
FEEDBACK
|
||||||
}
|
}
|
||||||
|
|
||||||
enum QRStatus {
|
enum QRStatus {
|
||||||
@@ -165,3 +166,14 @@ model NewsletterSubscription {
|
|||||||
@@index([email])
|
@@index([email])
|
||||||
@@index([createdAt])
|
@@index([createdAt])
|
||||||
}
|
}
|
||||||
|
|
||||||
|
model Lead {
|
||||||
|
id String @id @default(cuid())
|
||||||
|
email String
|
||||||
|
source String @default("reprint-calculator")
|
||||||
|
reprintCost Float?
|
||||||
|
updatesPerYear Float?
|
||||||
|
annualSavings Float?
|
||||||
|
createdAt DateTime @default(now())
|
||||||
|
updatedAt DateTime @updatedAt
|
||||||
|
}
|
||||||
4
public/.well-known/security.txt
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
Contact: mailto:security@qrmaster.net
|
||||||
|
Expires: 2027-01-01T00:00:00.000Z
|
||||||
|
Strategies: https://www.qrmaster.net/.well-known/security.txt
|
||||||
|
Preferred-Languages: en, de
|
||||||
BIN
public/1234567890abcdef.txt
Normal file
1
public/ads.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
google.com, pub-2782770414424875, DIRECT, f08c47fec0942fa0
|
||||||
BIN
public/barcode-generator-preview.png
Normal file
|
After Width: | Height: | Size: 398 KiB |
1
public/bb6dfaacf1ed41a880281c426c54ed7c.txt
Normal file
@@ -0,0 +1 @@
|
|||||||
|
bb6dfaacf1ed41a880281c426c54ed7c
|
||||||
|
Before Width: | Height: | Size: 4.2 MiB |
|
Before Width: | Height: | Size: 2.8 MiB |
BIN
public/blog/1-hero.webp
Normal file
|
After Width: | Height: | Size: 86 KiB |
|
Before Width: | Height: | Size: 4.1 MiB |
BIN
public/blog/2-body.webp
Normal file
|
After Width: | Height: | Size: 139 KiB |
|
Before Width: | Height: | Size: 3.8 MiB |
BIN
public/blog/2-hero.webp
Normal file
|
After Width: | Height: | Size: 126 KiB |
|
Before Width: | Height: | Size: 5.5 MiB |
|
Before Width: | Height: | Size: 4.6 MiB |
|
Before Width: | Height: | Size: 5.8 MiB |
|
Before Width: | Height: | Size: 3.7 MiB |
BIN
public/blog/building-qr-generator.png
Normal file
|
After Width: | Height: | Size: 737 KiB |
BIN
public/blog/bulk-qr-events-hero.png
Normal file
|
After Width: | Height: | Size: 804 KiB |
BIN
public/blog/dynamic-vs-static-hero-v2.png
Normal file
|
After Width: | Height: | Size: 860 KiB |
BIN
public/blog/qr-analytics-guide-hero.png
Normal file
|
After Width: | Height: | Size: 630 KiB |
BIN
public/blog/qr-code-analytics-dashboard.png
Normal file
|
After Width: | Height: | Size: 350 KiB |
BIN
public/blog/qr-code-analytics-hero-v2.png
Normal file
|
After Width: | Height: | Size: 863 KiB |
BIN
public/blog/qr-code-analytics-hero.webp
Normal file
|
After Width: | Height: | Size: 99 KiB |
BIN
public/blog/qr-code-generator-guide-hero.png
Normal file
|
After Width: | Height: | Size: 454 KiB |
BIN
public/blog/qr-code-tracking-guide-body.png
Normal file
|
After Width: | Height: | Size: 215 KiB |
BIN
public/blog/qr-code-tracking-guide-hero.webp
Normal file
|
After Width: | Height: | Size: 94 KiB |
BIN
public/blog/qr-code-tracking-hero-v2.png
Normal file
|
After Width: | Height: | Size: 646 KiB |
BIN
public/blog/qr-marketing-best-practices-hero.png
Normal file
|
After Width: | Height: | Size: 699 KiB |
BIN
public/blog/static-vs-dynamic-qr-codes-body.png
Normal file
|
After Width: | Height: | Size: 320 KiB |
BIN
public/blog/static-vs-dynamic-qr-codes-hero.png
Normal file
|
After Width: | Height: | Size: 266 KiB |
BIN
public/blog/sustainable-packaging-qr.png
Normal file
|
After Width: | Height: | Size: 726 KiB |
1
public/googleccd5315437d68a49.html
Normal file
@@ -0,0 +1 @@
|
|||||||
|
google-site-verification: googleccd5315437d68a49.html
|
||||||
BIN
public/hero-fluid.png
Normal file
|
After Width: | Height: | Size: 518 KiB |
13
public/humans.txt
Normal file
@@ -0,0 +1,13 @@
|
|||||||
|
/* TEAM */
|
||||||
|
Founder: Timo Knuth
|
||||||
|
Site: https://qrmaster.net
|
||||||
|
Twitter: @qrmaster
|
||||||
|
|
||||||
|
/* THANKS */
|
||||||
|
Thanks to: Next.js, Vercel, Tailwind CSS, Stripe, Supabase
|
||||||
|
|
||||||
|
/* SITE */
|
||||||
|
Last update: 2026/01/12
|
||||||
|
Language: English, German
|
||||||
|
Doctype: HTML5
|
||||||
|
IDE: VS Code
|
||||||
BIN
public/images/examples/qr_example_business_1769163647196.png
Normal file
|
After Width: | Height: | Size: 657 KiB |
BIN
public/images/examples/qr_example_ecommerce_1769163606650.png
Normal file
|
After Width: | Height: | Size: 516 KiB |
BIN
public/images/examples/qr_example_event_1769163635077.png
Normal file
|
After Width: | Height: | Size: 423 KiB |
BIN
public/images/examples/qr_example_nonprofit_1769163705055.png
Normal file
|
After Width: | Height: | Size: 650 KiB |
BIN
public/images/examples/qr_example_packaging_1769163674382.png
Normal file
|
After Width: | Height: | Size: 646 KiB |
BIN
public/images/examples/qr_example_realestate_1769163689433.png
Normal file
|
After Width: | Height: | Size: 492 KiB |
BIN
public/images/examples/qr_example_restaurant_1769163621640.png
Normal file
|
After Width: | Height: | Size: 700 KiB |
BIN
public/images/examples/qr_example_social_1769163660794.png
Normal file
|
After Width: | Height: | Size: 422 KiB |
48
public/llms.txt
Normal file
@@ -0,0 +1,48 @@
|
|||||||
|
# QR Master
|
||||||
|
|
||||||
|
> QR Master is a B2B SaaS platform for creating dynamic QR codes with real-time analytics, custom branding, and bulk generation. Free tools available for URL, WiFi, vCard, WhatsApp, Instagram, and 15+ other QR code types.
|
||||||
|
|
||||||
|
- Primary domain: https://www.qrmaster.net
|
||||||
|
- Free static QR codes, paid dynamic QR codes with tracking
|
||||||
|
- German landing page available at /qr-code-erstellen
|
||||||
|
- Enterprise features: Bulk generation, API access, team management
|
||||||
|
|
||||||
|
## Free Tools
|
||||||
|
|
||||||
|
- [URL QR Generator](https://www.qrmaster.net/tools/url-qr-code): Create QR codes for any website link
|
||||||
|
- [WiFi QR Generator](https://www.qrmaster.net/tools/wifi-qr-code): Share WiFi credentials via QR code
|
||||||
|
- [vCard QR Generator](https://www.qrmaster.net/tools/vcard-qr-code): Digital business card QR codes
|
||||||
|
- [Text QR Generator](https://www.qrmaster.net/tools/text-qr-code): Encode plain text in QR codes
|
||||||
|
- [Email QR Generator](https://www.qrmaster.net/tools/email-qr-code): Pre-filled email QR codes
|
||||||
|
- [SMS QR Generator](https://www.qrmaster.net/tools/sms-qr-code): Send SMS messages via QR
|
||||||
|
- [Phone QR Generator](https://www.qrmaster.net/tools/phone-qr-code): One-tap phone call QR codes
|
||||||
|
- [WhatsApp QR Generator](https://www.qrmaster.net/tools/whatsapp-qr-code): Start WhatsApp chats instantly
|
||||||
|
- [Instagram QR Generator](https://www.qrmaster.net/tools/instagram-qr-code): Grow Instagram followers
|
||||||
|
- [TikTok QR Generator](https://www.qrmaster.net/tools/tiktok-qr-code): Link to TikTok profiles
|
||||||
|
- [Twitter QR Generator](https://www.qrmaster.net/tools/twitter-qr-code): Share Twitter/X profiles
|
||||||
|
- [YouTube QR Generator](https://www.qrmaster.net/tools/youtube-qr-code): Link to videos and channels
|
||||||
|
- [Facebook QR Generator](https://www.qrmaster.net/tools/facebook-qr-code): Share Facebook pages
|
||||||
|
- [PayPal QR Generator](https://www.qrmaster.net/tools/paypal-qr-code): Accept PayPal payments
|
||||||
|
- [Crypto QR Generator](https://www.qrmaster.net/tools/crypto-qr-code): Bitcoin and crypto wallet QR codes
|
||||||
|
- [Event QR Generator](https://www.qrmaster.net/tools/event-qr-code): Calendar event QR codes
|
||||||
|
- [Geolocation QR Generator](https://www.qrmaster.net/tools/geolocation-qr-code): Share map locations
|
||||||
|
- [Zoom QR Generator](https://www.qrmaster.net/tools/zoom-qr-code): Join Zoom meetings instantly
|
||||||
|
- [Teams QR Generator](https://www.qrmaster.net/tools/teams-qr-code): Join Microsoft Teams meetings
|
||||||
|
|
||||||
|
## Premium Features
|
||||||
|
|
||||||
|
- [Dynamic QR Codes](https://www.qrmaster.net/dynamic-qr-code-generator): Editable QR codes with real-time tracking
|
||||||
|
- [Bulk QR Generator](https://www.qrmaster.net/bulk-qr-code-generator): Generate hundreds of QR codes from CSV/Excel
|
||||||
|
- [QR Code Tracking](https://www.qrmaster.net/qr-code-tracking): Analytics dashboard with scan statistics
|
||||||
|
|
||||||
|
## Information
|
||||||
|
|
||||||
|
- [Homepage](https://www.qrmaster.net): Main landing page
|
||||||
|
- [Pricing](https://www.qrmaster.net/pricing): Free, Pro, and Business plans
|
||||||
|
- [FAQ](https://www.qrmaster.net/faq): Frequently asked questions
|
||||||
|
- [Blog](https://www.qrmaster.net/blog): Tips and guides for QR code marketing
|
||||||
|
- [Privacy Policy](https://www.qrmaster.net/privacy): Data privacy information
|
||||||
|
|
||||||
|
## Localized Pages
|
||||||
|
|
||||||
|
- [German Landing Page](https://www.qrmaster.net/qr-code-erstellen): QR Code Generator auf Deutsch
|
||||||
BIN
public/og-crypto-generator.png
Normal file
|
After Width: | Height: | Size: 531 KiB |
BIN
public/og-email-generator.png
Normal file
|
After Width: | Height: | Size: 496 KiB |
BIN
public/og-event-generator.png
Normal file
|
After Width: | Height: | Size: 593 KiB |
BIN
public/og-facebook-generator.png
Normal file
|
After Width: | Height: | Size: 583 KiB |
BIN
public/og-geolocation-generator.png
Normal file
|
After Width: | Height: | Size: 511 KiB |
BIN
public/og-image.png
Normal file
|
After Width: | Height: | Size: 464 KiB |
BIN
public/og-instagram-generator.png
Normal file
|
After Width: | Height: | Size: 448 KiB |
BIN
public/og-location-generator.png
Normal file
|
After Width: | Height: | Size: 511 KiB |
BIN
public/og-paypal-generator.png
Normal file
|
After Width: | Height: | Size: 466 KiB |
BIN
public/og-phone-generator.png
Normal file
|
After Width: | Height: | Size: 498 KiB |
BIN
public/og-sms-generator.png
Normal file
|
After Width: | Height: | Size: 442 KiB |
BIN
public/og-teams-generator.png
Normal file
|
After Width: | Height: | Size: 486 KiB |
BIN
public/og-text-generator.png
Normal file
|
After Width: | Height: | Size: 462 KiB |
BIN
public/og-tiktok-generator.png
Normal file
|
After Width: | Height: | Size: 397 KiB |
BIN
public/og-twitter-generator.png
Normal file
|
After Width: | Height: | Size: 335 KiB |
BIN
public/og-url-generator.png
Normal file
|
After Width: | Height: | Size: 535 KiB |
BIN
public/og-vcard-generator.png
Normal file
|
After Width: | Height: | Size: 555 KiB |
BIN
public/og-whatsapp-generator.png
Normal file
|
After Width: | Height: | Size: 600 KiB |
BIN
public/og-wifi-generator.png
Normal file
|
After Width: | Height: | Size: 429 KiB |
BIN
public/og-youtube-generator.png
Normal file
|
After Width: | Height: | Size: 392 KiB |
BIN
public/og-zoom-generator.png
Normal file
|
After Width: | Height: | Size: 551 KiB |
@@ -1,33 +0,0 @@
|
|||||||
<?xml version="1.0" encoding="UTF-8"?>
|
|
||||||
<urlset xmlns="http://www.sitemaps.org/schemas/sitemap/0.9">
|
|
||||||
<url>
|
|
||||||
<loc>https://www.qrmaster.net/</loc>
|
|
||||||
<lastmod>2025-10-16T00:00:00Z</lastmod>
|
|
||||||
<changefreq>daily</changefreq>
|
|
||||||
<priority>0.9</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://www.qrmaster.net/blog</loc>
|
|
||||||
<lastmod>2025-10-16T00:00:00Z</lastmod>
|
|
||||||
<changefreq>daily</changefreq>
|
|
||||||
<priority>0.7</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://www.qrmaster.net/pricing</loc>
|
|
||||||
<lastmod>2025-10-16T00:00:00Z</lastmod>
|
|
||||||
<changefreq>weekly</changefreq>
|
|
||||||
<priority>0.8</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://www.qrmaster.net/faq</loc>
|
|
||||||
<lastmod>2025-10-16T00:00:00Z</lastmod>
|
|
||||||
<changefreq>weekly</changefreq>
|
|
||||||
<priority>0.6</priority>
|
|
||||||
</url>
|
|
||||||
<url>
|
|
||||||
<loc>https://www.qrmaster.net/blog/qr-code-analytics</loc>
|
|
||||||
<lastmod>2025-10-16T00:00:00Z</lastmod>
|
|
||||||
<changefreq>weekly</changefreq>
|
|
||||||
<priority>0.6</priority>
|
|
||||||
</url>
|
|
||||||
</urlset>
|
|
||||||