# Tracking Test Cases


**Last Updated:** 2025-11-20

This document documents edge cases and expected behaviors for lead source attribution and form submission tracking.

## Test Case Categories

### 1. Lead Source Determination

#### 1.1 Paid Search Detection

**Requirement:** Require BOTH `gclid` AND `utm_source='adwords'/'google'` for "Paid Search"

**Test Cases:**

- ✅ `gclid` present + `utm_source='adwords'` → "Paid Search"
- ✅ `gclid` present + `utm_source='google'` → "Paid Search"
- ✅ `utm_source='adwords'` + `utm_medium='cpc'` → "Paid Search"
- ❌ `utm_medium='cpc'` alone (no `utm_source`) → NOT "Paid Search"
- ❌ `utm_medium='ppc'` alone (no `utm_source`) → NOT "Paid Search"
- ❌ `gclid` present but `utm_source` missing → NOT "Paid Search"

#### 1.2 Organic Search Detection

**Requirement:** Correctly identify organic search traffic

**Test Cases:**

- ✅ Search engine referrer (google.com, bing.com) → "Organic Search"
- ✅ `utm_source='google'` + `utm_medium='organic'` → "Organic Search"
- ✅ Broken page (`/html/downloads/`, PDFs) + search engine referrer → "Organic Search"
- ✅ Old/archived pages (`/old/`, `/archive/`) + search engine referrer → "Organic Search"
- ✅ `utm_medium='cpc'/'ppc'` without `utm_source` + Google referrer → "Organic Search"

#### 1.3 Meta Traffic Detection

**Requirement:** Correctly identify Meta paid traffic with referrer validation

**Test Cases:**

- ✅ `utm_source='fb'` + `utm_medium='paid'/'cpc'` + Meta referrer → "meta"
- ✅ `utm_source='fb'` + `utm_medium='paid'/'cpc'` + search engine referrer → "Organic Search"
- ✅ `utm_source='fb'` + `utm_medium='social'` → "Organic Social"
- ✅ `utm_source='facebook'/'instagram'/'ig'` + `utm_medium='social'` → "Organic Social"

#### 1.4 Broken/Old Page Detection

**Requirement:** Classify broken/old pages as Organic Search

**Test Cases:**

- ✅ URL contains `/html/downloads/` → "Organic Search"
- ✅ URL contains `/html/` → "Organic Search"
- ✅ URL contains `/old/` → "Organic Search"
- ✅ URL contains `/archive/` → "Organic Search"
- ✅ URL ends with `.pdf` (no UTM params) → "Organic Search"
- ✅ URL contains `/downloads/` (no UTM params) → "Organic Search"

### 2. Form Submission Tracking

#### 2.1 Lead Capture Form

**Expected Values:**

- `sign_up_type__c`: "Lead Capture"
- `content`: Page name (e.g., "Schichtplanung", "Zeiterfassung") or "Lead Capture"

**Test Cases:**

- ✅ Form submitted from `/v2/pages/product_schichtplan.php` → `content="Schichtplanung"`
- ✅ Form submitted from `/v2/pages/product_zeiterfassung.php` → `content="Zeiterfassung"`
- ✅ Form submitted from homepage → `content="Lead Capture"`

#### 2.2 Template Download Form

**Expected Values:**

- `sign_up_type__c`: "Template Download"
- `content`: Template type without " - Template" suffix (e.g., "Schichtplan Vorlage", "Dienstplan Vorlage")

**Test Cases:**

- ✅ Template type "Schichtplan Vorlage - Template" → `content="Schichtplan Vorlage"`
- ✅ Template type "Dienstplan Vorlage - Template" → `content="Dienstplan Vorlage"`
- ✅ Template type "Zeiterfassung Vorlage - Template" → `content="Zeiterfassung Vorlage"`

#### 2.3 Add-on Request Form

**Expected Values:**

- `sign_up_type__c`: "Add-on Request"
- `content`: Add-on name (e.g., "Ordio Events", "Hardware Terminals", "Personaldienstleister", "QR-Code Multi-Checkin", "Trinkgeld", "Enterprise")

**Test Cases:**

- ✅ Add-on "Ordio Events" → `content="Ordio Events"`
- ✅ Add-on "Hardware Terminals" → `content="Hardware Terminals"`
- ✅ Add-on "Enterprise" → `content="Enterprise"`

#### 2.4 Webinar Registration Form

**Expected Values:**

- `sign_up_type__c`: "Webinar Registration"
- `content`: Webinar topic only (e.g., "Produkt", "Payroll")

**Test Cases:**

- ✅ Produkt webinar → `content="Produkt"`
- ✅ Payroll webinar → `content="Payroll"`

#### 2.5 Export Workdays Form

**Expected Values:**

- `sign_up_type__c`: "Export Request"
- `content`: "Arbeitstage Rechner"

#### 2.6 ShiftOps Form

**Expected Values:**

- `sign_up_type__c`: "ShiftOps"
- `content`: "ShiftOps"

#### 2.7 Collect Lead Form

**Expected Values:**

- `sign_up_type__c`: "Collect Lead"
- `content`: "Collect Lead"

### 3. UTM Parameter Handling

#### 3.1 UTM Source Validation

**Requirement:** Require `utm_source` for paid traffic classification

**Test Cases:**

- ✅ `utm_source='adwords'` + `utm_medium='cpc'` → Valid paid traffic
- ❌ `utm_medium='cpc'` alone → NOT valid paid traffic indicator
- ✅ `utm_source='fb'` + `utm_medium='paid'` → Valid Meta traffic
- ❌ `utm_medium='paid'` alone → Check referrer instead

#### 3.2 UTM Campaign/Content Filtering

**Requirement:** Filter numeric IDs from `utm_campaign` and `utm_content`

**Test Cases:**

- ✅ `utm_campaign="120235152370780559"` → Filtered (numeric ID)
- ✅ `utm_campaign="Campaign Name"` → Kept (meaningful value)
- ✅ `utm_content="120235323153530559"` → Filtered (numeric ID)
- ✅ `utm_content="Ad Variant"` → Kept (meaningful value)

### 4. Referrer Validation

#### 4.1 Search Engine Referrers

**Test Cases:**

- ✅ Referrer from `google.com` → "Organic Search" (unless `gclid` present)
- ✅ Referrer from `bing.com` → "Organic Search"
- ✅ Referrer from `google.com` + `gclid` → "Paid Search"

#### 4.2 Social Media Referrers

**Test Cases:**

- ✅ Referrer from `facebook.com` → "meta" (if paid) or "Organic Social" (if organic)
- ✅ Referrer from `linkedin.com` → "linkedin"
- ✅ Referrer from `tiktok.com` → "social"

#### 4.3 Internal Referrers

**Test Cases:**

- ✅ Referrer from `ordio.com` → Ignored (internal navigation)
- ✅ Referrer from `ordio.de` → Ignored (internal navigation)

### 5. Edge Cases

#### 5.1 Missing Data

**Test Cases:**

- ✅ No UTM params + no referrer → "Direct Traffic"
- ✅ No UTM params + search engine referrer → "Organic Search"
- ✅ No referrer + broken page URL → "Organic Search"

#### 5.2 Conflicting Signals

**Test Cases:**

- ✅ `utm_source='fb'` + `utm_medium='paid'` + Google referrer → "Organic Search" (referrer takes priority)
- ✅ `utm_medium='cpc'` + no `utm_source` + Google referrer → "Organic Search" (referrer takes priority)

#### 5.3 Page Type Inference

**Test Cases:**

- ✅ URL contains `/tools/` → Tools page
- ✅ URL contains `/alternativen/` or `compare_` → Comparison page
- ✅ URL contains `/v2/pages/product_` → Product page
- ✅ URL contains `/v2/pages/industry_` → Industry page

## Regression Test Checklist

When making changes to tracking logic, verify:

- [ ] Paid Search detection requires `utm_source` verification
- [ ] Organic Search correctly identified from search engine referrers
- [ ] Broken/old pages classified as Organic Search
- [ ] Meta traffic validated against referrer
- [ ] Content values simplified (no redundant prefixes/suffixes)
- [ ] All form types set correct `sign_up_type__c` and `content`
- [ ] UTM parameters correctly filtered and validated
- [ ] Edge cases handled gracefully

## Expected Behaviors Summary

### Lead Source Priority Order

1. Referrer domain (most reliable)
2. Page path heuristics (broken/old pages)
3. UTM source/medium validation
4. UTM medium hints
5. UTM source hints
6. Fallback to frontend value or "Direct Traffic"

### Form Content Value Rules

- Templates: Remove " - Template" suffix
- Lead Capture: Use page name or "Lead Capture" (no prefix)
- Webinars: Use topic only ("Produkt", "Payroll")
- Add-ons: Use exact add-on name
- Other forms: Use form-specific content value

### UTM Parameter Rules

- Require `utm_source` for paid traffic classification
- Filter numeric IDs from `utm_campaign` and `utm_content`
- Validate `utm_source`/`utm_medium` combinations
- Check referrer before final classification
