# Conversion Rate Optimization (CRO)
**Meta-Description:** Conversion Rate Optimization für SaaS. Landing Pages, User Funnels, Micro-Conversions und datengetriebene Optimierung.
**Keywords:** CRO, Conversion Rate, Landing Page, User Funnel, Micro-Conversions, UX Optimization, Growth Hacking
---
## Einführung
**Conversion Rate Optimization (CRO)** maximiert den Wert bestehenden Traffics. Statt mehr Besucher zu kaufen, werden bestehende Nutzer besser konvertiert. Dieser Guide zeigt systematische Ansätze für **Landing Pages**, **Funnels** und **Micro-Conversions**.
---
## CRO Overview
```
┌─────────────────────────────────────────────────────────────┐
│ CONVERSION OPTIMIZATION FUNNEL │
├─────────────────────────────────────────────────────────────┤
│ │
│ TOFU (Top of Funnel): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Awareness → Interest │ │
│ │ ├── Landing Page Views │ │
│ │ ├── Blog Post Reads │ │
│ │ ├── Social Media Clicks │ │
│ │ └── Target: Reduce Bounce Rate │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ MOFU (Middle of Funnel): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Consideration → Intent │ │
│ │ ├── Email Signups │ │
│ │ ├── Free Trial Starts │ │
│ │ ├── Demo Requests │ │
│ │ └── Target: Increase Lead Quality │ │
│ └─────────────────────────────────────────────────────┘ │
│ ↓ │
│ BOFU (Bottom of Funnel): │
│ ┌─────────────────────────────────────────────────────┐ │
│ │ Purchase → Retention │ │
│ │ ├── Trial to Paid Conversion │ │
│ │ ├── Checkout Completion │ │
│ │ ├── Upsells / Cross-sells │ │
│ │ └── Target: Maximize Revenue │ │
│ └─────────────────────────────────────────────────────┘ │
│ │
│ Key Metrics: │
│ ├── Conversion Rate = Conversions / Visitors × 100 │
│ ├── Micro-Conversion Rate (Email, Trial, etc.) │
│ ├── Revenue per Visitor (RPV) │
│ └── Customer Acquisition Cost (CAC) │
│ │
└─────────────────────────────────────────────────────────────┘
```
---
## Landing Page Optimization
```tsx
// components/landing/OptimizedHero.tsx
'use client';
import { useState } from 'react';
import { track } from '@/lib/analytics';
interface HeroProps {
headline: string;
subheadline: string;
ctaText: string;
ctaUrl: string;
trustBadges: string[];
videoUrl?: string;
}
export function OptimizedHero({
headline,
subheadline,
ctaText,
ctaUrl,
trustBadges,
videoUrl
}: HeroProps) {
const [videoPlaying, setVideoPlaying] = useState(false);
const handleCTAClick = () => {
track('hero_cta_clicked', {
headline,
ctaText
});
};
const handleVideoPlay = () => {
setVideoPlaying(true);
track('hero_video_played');
};
return (
{/* Copy Side */}
{/* Social Proof Mini */}
{[1, 2, 3, 4, 5].map(i => (
))}
Join 10,000+ happy customers
{/* Headline - Max 6 words */}
{headline}
{/* Subheadline - Benefits focused */}
{subheadline}
{/* CTA Group */}
{/* Trust Badges */}
{trustBadges.map((badge, i) => (
{badge}
))}
{/* Visual Side */}
{videoUrl ? (
) : (

)}
);
}
```
```tsx
// components/landing/SocialProof.tsx
interface Testimonial {
quote: string;
author: string;
role: string;
company: string;
avatar: string;
logo: string;
metric?: string;
}
export function SocialProofSection({
testimonials
}: {
testimonials: Testimonial[]
}) {
return (
{/* Logos Bar */}
Trusted by leading companies
{testimonials.map((t, i) => (

))}
{/* Testimonials Grid */}
{testimonials.map((testimonial, i) => (
))}
{/* Aggregate Stats */}
);
}
function TestimonialCard({
quote,
author,
role,
company,
avatar,
metric
}: Testimonial) {
return (
{metric && (
{metric}
)}
"{quote}"
{author}
{role}, {company}
);
}
```
---
## Funnel Tracking
```typescript
// lib/cro/funnel.ts
export interface FunnelStep {
id: string;
name: string;
pagePattern: string | RegExp;
requiredEvents?: string[];
}
export interface FunnelConfig {
id: string;
name: string;
steps: FunnelStep[];
}
export const signupFunnel: FunnelConfig = {
id: 'signup',
name: 'Signup Funnel',
steps: [
{ id: 'landing', name: 'Landing Page', pagePattern: '/' },
{ id: 'pricing', name: 'Pricing Page', pagePattern: '/pricing' },
{ id: 'signup-start', name: 'Signup Started', pagePattern: '/signup', requiredEvents: ['signup_form_viewed'] },
{ id: 'signup-complete', name: 'Signup Complete', pagePattern: '/welcome', requiredEvents: ['signup_completed'] },
{ id: 'onboarding', name: 'Onboarding', pagePattern: '/onboarding' },
{ id: 'activated', name: 'Activated', pagePattern: '/dashboard', requiredEvents: ['first_action_completed'] }
]
};
// Funnel Analytics
export async function getFunnelAnalytics(
funnelId: string,
startDate: Date,
endDate: Date
): Promise {
const funnel = funnels.get(funnelId);
if (!funnel) throw new Error(`Funnel ${funnelId} not found`);
const stepData = await Promise.all(
funnel.steps.map(async (step, index) => {
const count = await getStepCount(step, startDate, endDate);
const previousCount = index > 0
? await getStepCount(funnel.steps[index - 1], startDate, endDate)
: count;
return {
step: step.name,
count,
conversionRate: previousCount > 0 ? (count / previousCount) * 100 : 100,
dropoffRate: previousCount > 0 ? ((previousCount - count) / previousCount) * 100 : 0
};
})
);
const overallConversion = stepData[0].count > 0
? (stepData[stepData.length - 1].count / stepData[0].count) * 100
: 0;
return {
funnel: funnel.name,
period: { start: startDate, end: endDate },
steps: stepData,
overallConversion
};
}
```
```tsx
// components/analytics/FunnelVisualization.tsx
'use client';
interface FunnelStep {
step: string;
count: number;
conversionRate: number;
dropoffRate: number;
}
export function FunnelVisualization({ steps }: { steps: FunnelStep[] }) {
const maxCount = Math.max(...steps.map(s => s.count));
return (
{steps.map((step, index) => {
const width = (step.count / maxCount) * 100;
const isLastStep = index === steps.length - 1;
return (
{/* Step Bar */}
{step.step}
{step.count.toLocaleString()}
= 50 ? 'text-green-600' : 'text-red-600'
}`}>
{step.conversionRate.toFixed(1)}%
{/* Dropoff Indicator */}
{!isLastStep && step.dropoffRate > 0 && (
↳ {step.dropoffRate.toFixed(1)}% dropoff ({Math.round(step.count * step.dropoffRate / 100).toLocaleString()} users)
)}
);
})}
);
}
```
---
## Micro-Conversions
```typescript
// lib/cro/micro-conversions.ts
export const microConversions = {
engagement: [
{ id: 'scroll_depth_50', name: 'Scrolled 50%', weight: 1 },
{ id: 'scroll_depth_90', name: 'Scrolled 90%', weight: 2 },
{ id: 'time_on_page_60s', name: '60s on page', weight: 2 },
{ id: 'video_played', name: 'Video Played', weight: 3 },
{ id: 'video_completed', name: 'Video Completed', weight: 5 }
],
intent: [
{ id: 'pricing_viewed', name: 'Viewed Pricing', weight: 5 },
{ id: 'feature_comparison', name: 'Compared Features', weight: 4 },
{ id: 'faq_expanded', name: 'Expanded FAQ', weight: 2 },
{ id: 'live_chat_started', name: 'Started Live Chat', weight: 8 }
],
lead: [
{ id: 'email_captured', name: 'Email Signup', weight: 10 },
{ id: 'demo_requested', name: 'Demo Request', weight: 15 },
{ id: 'trial_started', name: 'Trial Started', weight: 20 }
]
};
// Calculate Lead Score
export function calculateLeadScore(events: string[]): number {
let score = 0;
Object.values(microConversions).flat().forEach(conversion => {
if (events.includes(conversion.id)) {
score += conversion.weight;
}
});
return score;
}
// hooks/useMicroConversions.ts
'use client';
import { useEffect, useCallback } from 'react';
import { track } from '@/lib/analytics';
export function useMicroConversions() {
// Scroll Depth Tracking
useEffect(() => {
let maxScroll = 0;
const milestones = [25, 50, 75, 90];
const triggered = new Set();
const handleScroll = () => {
const scrollHeight = document.documentElement.scrollHeight - window.innerHeight;
const scrollPercent = Math.round((window.scrollY / scrollHeight) * 100);
if (scrollPercent > maxScroll) {
maxScroll = scrollPercent;
milestones.forEach(milestone => {
if (scrollPercent >= milestone && !triggered.has(milestone)) {
triggered.add(milestone);
track(`scroll_depth_${milestone}`);
}
});
}
};
window.addEventListener('scroll', handleScroll, { passive: true });
return () => window.removeEventListener('scroll', handleScroll);
}, []);
// Time on Page Tracking
useEffect(() => {
const milestones = [30, 60, 120, 300];
let elapsed = 0;
const interval = setInterval(() => {
elapsed += 1;
if (milestones.includes(elapsed)) {
track(`time_on_page_${elapsed}s`);
}
}, 1000);
return () => clearInterval(interval);
}, []);
// Track specific actions
const trackMicro = useCallback((eventId: string, metadata?: Record) => {
track(eventId, metadata);
}, []);
return { trackMicro };
}
```
---
## Form Optimization
```tsx
// components/forms/OptimizedSignupForm.tsx
'use client';
import { useState, useEffect } from 'react';
import { useForm } from 'react-hook-form';
import { zodResolver } from '@hookform/resolvers/zod';
import { z } from 'zod';
import { track } from '@/lib/analytics';
const signupSchema = z.object({
email: z.string().email('Please enter a valid email'),
password: z.string().min(8, 'Password must be at least 8 characters'),
name: z.string().min(2, 'Name is required')
});
type SignupData = z.infer;
export function OptimizedSignupForm() {
const [step, setStep] = useState(1);
const [startTime] = useState(Date.now());
const {
register,
handleSubmit,
formState: { errors, isSubmitting },
watch
} = useForm({
resolver: zodResolver(signupSchema),
mode: 'onBlur'
});
// Track form interactions
useEffect(() => {
track('signup_form_viewed');
}, []);
const email = watch('email');
useEffect(() => {
if (email && email.includes('@')) {
track('signup_email_entered');
}
}, [email]);
const onSubmit = async (data: SignupData) => {
const timeToComplete = Date.now() - startTime;
track('signup_form_submitted', {
timeToComplete,
step
});
try {
await createAccount(data);
track('signup_completed', { timeToComplete });
} catch (error) {
track('signup_error', { error: (error as Error).message });
}
};
// Field focus tracking
const trackFieldFocus = (field: string) => {
track('form_field_focused', { field });
};
return (
);
}
```
---
## CRO Checklist
| Element | Best Practice |
|---------|--------------|
| **Headline** | Clear value proposition, max 6 words |
| **CTA** | Action-oriented, contrasting color |
| **Social Proof** | Numbers, logos, testimonials |
| **Trust Signals** | Security badges, guarantees |
| **Forms** | Progressive, minimal fields |
| **Mobile** | Touch-friendly, fast loading |
| **Urgency** | Scarcity, limited time (honest!) |
| **Exit Intent** | Offer value, not desperation |
---
## Fazit
Conversion Rate Optimization erfordert:
1. **Datenanalyse**: Funnels und Micro-Conversions tracken
2. **User Research**: Verstehen warum Nutzer konvertieren
3. **Testing**: Systematisches A/B Testing
4. **Iteration**: Kontinuierliche Verbesserung
Kleine Verbesserungen summieren sich zu großen Ergebnissen.
---
## Bildprompts
1. "Conversion funnel visualization, colorful stages with dropoff points"
2. "Landing page wireframe with CRO annotations, best practices highlighted"
3. "A/B test results dashboard, winner variant celebration"
---
## Quellen
- [CXL Conversion Optimization Guide](https://cxl.com/blog/conversion-optimization-guide/)
- [Unbounce Landing Page Best Practices](https://unbounce.com/landing-page-articles/)
- [Hotjar CRO Resources](https://www.hotjar.com/conversion-rate-optimization/)
- [Neil Patel CRO Guide](https://neilpatel.com/blog/conversion-rate-optimization/)