Lead Scoring, Kontaktformular und Vertriebspipeline, Next.js-Integration (2026)

lead scoring4 Min. Lesezeit15. Juli 2026

Autor: DevStudio.it

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 Vertriebsaufgaben

Das 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?

Ähnliche Beiträge

n8n, Formular-Automatisierung: Webhook aus Next.js → CRM → Slack (2026)
3 Min. Lesezeit
Fehler-Monitoring in Next.js, Sentry in Produktion, Alerts und PII-Scrubbing (2026)
3 Min. Lesezeit
Next.js 15 Server Actions vs Route Handlers, Kontaktformulare 2026
9 Min. Lesezeit

Ü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.

Gefällt euch unser Ansatz? Lasst uns gemeinsam bauen.

Projektkonfiguration starten