TL;DR
Lead Scoring ist eine Zahl oder ein Label (cold / warm / hot), das dem Vertrieb sagt, wen zuerst anzurufen, basierend auf Formulardaten, Verhalten auf der Website und Kampagnenquelle. Ein Kontaktformular in Next.js ist nicht nur mailto:, es ist eine Server Action, die den Lead in PostgreSQL auf Branchly Cloud speichert, CRM-Webhook sendet und generate_lead in GA4 feuert. Die Vertriebspipeline mappt Status (new → qualified → proposal → won) auf Automatisierung: Owner-Zuweisung, CRM-Task, Slack bei Score > 70. Im Folgenden: Datenmodell, Scoring-Regeln, Formular-Integration, Anti-Spam.
Für wen
- B2B-Unternehmen mit Dutzenden Formular-Anfragen monatlich, heiße Leads gehen in „info@" verloren
- Vertriebsteams ohne klare Prioritäten, jeder Lead sieht gleich aus
- Entwickler mit Next.js 15 Server Actions, DB- und CRM-Persistenz
- Marketing, das UTM / GA4 mit Lead-Qualität verbinden will, nicht nur Submit-Zahl
- Website-Betreiber nach DevStudio-Launch, Scoring ohne komplettes Rewrite
Keyword
lead scoring kontaktformular, vertriebspipeline crm, nextjs kontaktformular, server actions lead, crm webhook integration, b2b lead bewertung
Vom Formular zum Deal, Prozesskarte
Typischer Ablauf:
Website (UTM in Session) → Formular-Submit → Server-Validierung
→ Lead in Branchly (PostgreSQL)
→ Score + Segment
→ CRM-Webhook (HubSpot / Pipedrive / custom)
→ Benachrichtigung (E-Mail / Slack) bei hot
→ Pipeline: Status und VertriebsaufgabenDas Formular ist Systemeinstieg, nicht Ende. Ohne DB und CRM ist jeder Submit eine Mail im Shared Inbox, nicht messbar, leicht verloren.
Datenmodell, Lead und Score
Prisma auf Branchly (Auszug):
model Lead {
id String @id @default(cuid())
email String
company String?
budget String?
message String?
utmSource String?
utmCampaign String?
score Int @default(0)
segment LeadSegment @default(COLD)
status LeadStatus @default(NEW)
createdAt DateTime @default(now())
}Score als gewichtete Summe. Segment-Schwellen: 0–39 cold, 40–69 warm, 70+ hot, quartalsweise an Won-Conversion kalibrieren.
Scoring-Regeln, was bewerten
| Signal | Gewicht | Begründung |
|---|---|---|
| Budget „> 50k" | +30 | Investitionsbereitschaft |
| Firma ausgefüllt (nicht gmail) | +20 | B2B |
utm_medium=cpc |
+15 | Paid Intent |
Session /preise, /referenzen |
+10 je | Research |
| Nachricht > 200 Zeichen | +10 | Konkreter Bedarf |
| Free-Mail | −15 | Niedrigerer B2B-Wert |
Regeln in TypeScript oder Tabelle ScoringRule, letzteres für Marketing ohne Deploy, braucht Admin-UI.
Beispiel-Scoring-Funktion:
function computeLeadScore(input: LeadInput, sessionPages: string[]): number {
let score = 0;
if (input.company && !isFreeEmail(input.email)) score += 20;
if (input.budget === '50000+') score += 30;
if (input.utmMedium === 'cpc') score += 15;
if (sessionPages.includes('/preise')) score += 10;
if ((input.message?.length ?? 0) > 200) score += 10;
if (isFreeEmail(input.email)) score -= 15;
return Math.max(0, Math.min(100, score));
}Next.js, Server Action End-to-End
Server Action validiert (Zod), scored, speichert, sendet Webhook:
'use server';
import { z } from 'zod';
import { prisma } from '@/lib/prisma';
import { computeLeadScore } from '@/lib/scoring';
const schema = z.object({
email: z.string().email(),
company: z.string().optional(),
budget: z.enum(['unknown', '10000', '50000+']).optional(),
message: z.string().max(5000),
utmSource: z.string().optional(),
utmMedium: z.string().optional(),
});
export async function submitContactForm(formData: FormData) {
const parsed = schema.safeParse(Object.fromEntries(formData));
if (!parsed.success) return { ok: false, errors: parsed.error.flatten() };
const score = computeLeadScore(parsed.data, []);
const segment = score >= 70 ? 'HOT' : score >= 40 ? 'WARM' : 'COLD';
const lead = await prisma.lead.create({
data: { ...parsed.data, score, segment: segment as any, status: 'NEW' },
});
await fetch(process.env.CRM_WEBHOOK_URL!, {
method: 'POST',
headers: { 'Content-Type': 'application/json' },
body: JSON.stringify({ leadId: lead.id, score, segment }),
});
return { ok: true, leadId: lead.id };
}Der Client übergibt UTMs aus sessionStorage oder Hidden Fields nach page_view. Hosting auf DevStudioIT Cloud mit CRM_WEBHOOK_URL und DATABASE_URL zu Branchly.
Vertriebspipeline im CRM
Kanban-Spalten = LeadStatus. Automatisierung:
| Status | Aktion |
|---|---|
| NEW + HOT | Senior AE, Slack in 15 Min |
| NEW + COLD | Nurturing, kein Anruf Tag 0 |
| CONTACTED | Task „Follow-up in 3 Tagen“ |
| QUALIFIED | Deal anlegen, Wert schätzen |
| PROPOSAL | Erinnerung nach 7 Tagen Stille |
| WON / LOST | Abschluss, optional GA4 Offline |
Webhook mit score und segment auf Custom Fields mappen. Eine Segment-Definition im Unternehmen.
Anti-Spam, DSGVO und Qualität
- Honeypot + Rate Limit (IP / Fingerprint), weniger Rauschen im Scoring
- Double Opt-in für Newsletter vs Single Submit für Angebotsanfrage, unterschiedliche Einwilligungen in der Datenschutzerklärung
- Consent für Verarbeitung und Vertriebskontakt, Checkbox vor Submit
- Lead-Speicherung in der EU (Branchly), Audit, wer auf Daten zugegriffen hat
Bot-getriebene Scores senken die Qualität, Leads mit gleicher IP > 5/h filtern.
GA4 und Marketing-Feedback
Event generate_lead mit lead_score, lead_segment (Custom Dimensions) vergleicht Kampagnen nach durchschnittlichem Score, nicht nur Submit-Anzahl. Eine günstigere CPC-Kampagne mit niedrigerem Durchschnitt kann schlechter sein als eine teure mit hot Leads.
FAQ
Wie viele Regeln am Start?
Fünf bis sieben. Nach 90 Tagen Schwellen an Won-Rate anpassen.
Ersetzt Scoring Qualifizierungsgespräch?
Nein, priorisiert nur die Queue. BANT/MEDDIC bleibt beim Vertrieb.
HubSpot vs eigene DB auf Branchly?
Klein: Branchly + HubSpot-Webhook. Groß: PostgreSQL als Source of Truth, bidirektionaler CRM-Sync.
Pipeline testen ohne CRM-Spam?
Staging auf Branchly + CRM-Sandbox (Staging-Artikel).
Formular, das Leads liefert?
- Kontakt, Formular, Scoring, CRM, Hosting aus einer Hand
- Next.js Server Actions, Kontaktformulare
- Unternehmenswebsites
Über den Autor
Wir bauen schnelle Websites, Web/Mobile-Apps, KI-Chatbots und Hosting — mit Fokus auf SEO und Conversion.
Empfohlene Links
Von Theorie zu Produktion — Branchly, Hosting-Stack und Referenzen.
