Lead Scoring, Kontaktformular und VertriebspipelineNext.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