Skip to content

Paid Ads: API-basierte Optimierung und Meta Ads Einführung

Erstellt: 8. Februar 2026

Update Juni 2026 – Conversion-Tracking ist umgesetzt

Das unten beschriebene Problem „0 Conversions / kein Tracking" ist gelöst: Wir tracken den Funnel jetzt server-seitig (ohne Cookie-Banner) und melden Conversions an Google Ads zurück. Wie das funktioniert und wie man es bedient/prüft: → Google Ads & Conversion-Tracking.


Projekt-Kontext

Tech-Stack:

  • Laravel 12 mit Filament 4
  • PHP 8.2+
  • Livewire/Flux
  • Stripe Integration bereits vorhanden

Aktuelle Situation (Analyse)

Kampagnen-Daten (April 2023 - Februar 2026):

MetrikWertBewertung
Laufzeitca. 3 Jahre-
Gesamtausgaben8.035,84 €-
Impressionen1.929.853Gut
Klicks28.493Gut
CTR1,48%OK
CPC0,28 €Sehr günstig
Conversions0Kritisch!

Ursache: Kein Conversion-Tracking eingerichtet (bewusst, um Cookie-Banner zu vermeiden)

Traffic-Verteilung vor Optimierung:

  • Google Display: 80% Budget, 1,23% CTR (schlecht)
  • Google Suche: 20% Budget, 14,12% CTR (gut!)
  • Keywords haben Qualitätsfaktor 10/10

Top Keywords:

  • "software hundeschule" - 14,99% CTR
  • "hundeschule software" - 10,99% CTR
  • "Hundetrainer software" - 21,74% CTR (pausiert!)

Alle Credentials wurden erfolgreich eingerichtet:

env
# .env Konfiguration für Laravel
GOOGLE_ADS_DEVELOPER_TOKEN=PwKvpuoMWHM4eS3TNQcRQg
GOOGLE_ADS_CLIENT_ID=1055782587530-nt2d1htvl5f6c3lvp8bcqd6r2ae8sfbh.apps.googleusercontent.com
GOOGLE_ADS_CLIENT_SECRET=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
GOOGLE_ADS_REFRESH_TOKEN=1//04oauh2I3x8KGCgYIARAAGAQSNwF-L9IrRY964RymtsoHohKSMfBnHZYdnu_KvfNNrGjNXbJylILpIFH6vveOWnD33LMPA2iDV1o
GOOGLE_ADS_CUSTOMER_ID=6741152732
GOOGLE_ADS_LOGIN_CUSTOMER_ID=5114699748

Google Cloud Projekt: 123Hundeschule-Ads
MCC-Kundennummer: 511-469-9748
Ads-Kundennummer: 674-115-2732


Phase 1: Google Ads API Setup ✅ ABGESCHLOSSEN

  • [x] MCC-Verwaltungskonto erstellt
  • [x] Developer Token erhalten
  • [x] Google Cloud Projekt eingerichtet
  • [x] OAuth2 Credentials (Webanwendung) erstellt
  • [x] Refresh Token via OAuth Playground generiert
  • [x] Display-Netzwerk in Kampagne deaktiviert

Phase 2: Laravel Integration (Server-side Enhanced Conversions)

2.1 Composer Package installieren

bash
composer require googleads/google-ads-php

2.2 Laravel Config erstellen

Neue Datei: config/google-ads.php

php
<?php

return [
    'developer_token' => env('GOOGLE_ADS_DEVELOPER_TOKEN'),
    'client_id' => env('GOOGLE_ADS_CLIENT_ID'),
    'client_secret' => env('GOOGLE_ADS_CLIENT_SECRET'),
    'refresh_token' => env('GOOGLE_ADS_REFRESH_TOKEN'),
    'customer_id' => env('GOOGLE_ADS_CUSTOMER_ID'),
    'login_customer_id' => env('GOOGLE_ADS_LOGIN_CUSTOMER_ID'),
];

2.3 Migration für GCLID-Tracking

bash
php artisan make:migration add_gclid_to_customers_table
php
// database/migrations/xxxx_add_gclid_to_customers_table.php
Schema::table('customers', function (Blueprint $table) {
    $table->string('gclid')->nullable()->after('email');
    $table->string('fbclid')->nullable()->after('gclid'); // Für Meta Ads
    $table->timestamp('ad_click_at')->nullable();
});

2.4 GCLID Middleware erstellen

Neue Datei: app/Http/Middleware/TrackAdClicks.php

php
<?php

namespace App\Http\Middleware;

use Closure;
use Illuminate\Http\Request;

class TrackAdClicks
{
    public function handle(Request $request, Closure $next)
    {
        // Google Ads GCLID
        if ($gclid = $request->query('gclid')) {
            session(['gclid' => $gclid, 'ad_click_at' => now()]);
        }
        
        // Meta Ads FBCLID
        if ($fbclid = $request->query('fbclid')) {
            session(['fbclid' => $fbclid, 'ad_click_at' => now()]);
        }
        
        return $next($request);
    }
}

2.5 Google Ads Service erstellen

Neue Datei: app/Services/GoogleAdsService.php

php
<?php

namespace App\Services;

use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClient;
use Google\Ads\GoogleAds\Lib\V18\GoogleAdsClientBuilder;
use Google\Ads\GoogleAds\Lib\OAuth2TokenBuilder;
use Google\Ads\GoogleAds\V18\Services\UploadConversionAdjustmentsRequest;

class GoogleAdsService
{
    private GoogleAdsClient $client;
    
    public function __construct()
    {
        $oAuth2Credential = (new OAuth2TokenBuilder())
            ->withClientId(config('google-ads.client_id'))
            ->withClientSecret(config('google-ads.client_secret'))
            ->withRefreshToken(config('google-ads.refresh_token'))
            ->build();

        $this->client = (new GoogleAdsClientBuilder())
            ->withDeveloperToken(config('google-ads.developer_token'))
            ->withLoginCustomerId(config('google-ads.login_customer_id'))
            ->withOAuth2Credential($oAuth2Credential)
            ->build();
    }
    
    public function uploadConversion(string $email, ?string $gclid, string $conversionAction): void
    {
        // Enhanced Conversion Upload Implementation
        // Siehe vollständige Implementierung im Code
    }
}

2.6 Event Listener für Registrierungen

Bei erfolgreicher Customer-Registrierung Conversion an Google senden:

php
// app/Listeners/SendGoogleAdsConversion.php
<?php

namespace App\Listeners;

use App\Events\CustomerRegistered;
use App\Services\GoogleAdsService;

class SendGoogleAdsConversion
{
    public function handle(CustomerRegistered $event): void
    {
        $customer = $event->customer;
        
        if ($customer->gclid) {
            app(GoogleAdsService::class)->uploadConversion(
                email: $customer->email,
                gclid: $customer->gclid,
                conversionAction: 'Registrierung'
            );
        }
    }
}

2.7 Conversion-Aktion in Google Ads erstellen

Im Google Ads UI (Tools → Conversions → Neue Conversion-Aktion):

  • Name: "Registrierung"
  • Kategorie: "Anmeldung"
  • Wert: 50 € (geschätzter Customer Value)
  • Zählmethode: "Eine" (pro User)
  • Attribution: Datengetrieben oder linear

Phase 3: Google Ads Kampagne optimieren

3.1 Display-Netzwerk deaktivieren ✅ ERLEDIGT

  • [x] Kampagne → Einstellungen → Netzwerke
  • [x] "Google Displaynetzwerk" deaktiviert
  • [x] Nur noch "Google Suche" aktiv

Erwarteter Effekt: Budget konzentriert sich auf Suchnetzwerk (14% CTR vs 1,23%)

3.2 Keywords reaktivieren/optimieren

Pausierte Keywords reaktivieren:

  • "Hundetrainer software" (21,74% CTR!) - REAKTIVIEREN
  • "hundeschule app" - prüfen

Neue Keywords hinzufügen:

  • "software hundeschule kostenlos testen"
  • "kursverwaltung hundetrainer"
  • "terminbuchung hundeschule"
  • "buchungssystem hundetraining"
  • "hundeschule verwaltung online"
  • "hundetrainer terminplanung"

3.3 Anzeigentexte erweitern

Aktuelle 10 Headlines auf 15 erweitern:

Neue Headlines:

  • "30 Tage kostenlos testen"
  • "Ohne Kreditkarte starten"
  • "400+ Hundeschulen vertrauen uns"
  • "Weniger Büro, mehr Training"
  • "Automatische Rechnungen"
  • "Online-Buchungskalender"
  • "DSGVO-konform & sicher"
  • "Support aus Deutschland"

Neue Beschreibungen:

  • "Verwalte Kurse, Kunden & Rechnungen an einem Ort. 30 Tage kostenlos testen."
  • "Die All-in-One Software für Hundetrainer. Mehrfachkarten, Buchungskalender & mehr."

3.4 Gebotsstrategie anpassen (NACH Conversion-Tracking)

Sobald Conversions gemessen werden:

  1. Von "Klicks maximieren" auf "Conversions maximieren" umstellen
  2. Nach 30+ Conversions: Ziel-CPA festlegen

Phase 4: Meta Ads mit Conversions API (nach Google Ads)

4.1 Meta Business Manager einrichten

  1. https://business.facebook.com → Account erstellen
  2. Facebook-Seite "123Hundeschule" verknüpfen
  3. Instagram Business-Account verknüpfen
  4. Werbekonto erstellen
  5. Domain verifizieren (Brand Safety → Domains)

4.2 Meta Conversions API (Server-side, kein Pixel)

Composer Package:

bash
composer require facebook/php-business-sdk

Laravel Config: config/meta-ads.php

php
<?php

return [
    'pixel_id' => env('META_PIXEL_ID'),
    'access_token' => env('META_ACCESS_TOKEN'),
];

Service: app/Services/MetaAdsService.php

php
<?php

namespace App\Services;

use FacebookAds\Api;
use FacebookAds\Object\ServerSide\Event;
use FacebookAds\Object\ServerSide\EventRequest;
use FacebookAds\Object\ServerSide\UserData;

class MetaAdsService
{
    public function __construct()
    {
        Api::init(null, null, config('meta-ads.access_token'));
    }

    public function sendConversion(string $email, ?string $fbclid): void
    {
        $userData = (new UserData())
            ->setEmail(hash('sha256', strtolower(trim($email))))
            ->setFbc($fbclid);

        $event = (new Event())
            ->setEventName('CompleteRegistration')
            ->setEventTime(time())
            ->setUserData($userData)
            ->setEventSourceUrl('https://123hundeschule.de')
            ->setActionSource('website');

        $request = (new EventRequest(config('meta-ads.pixel_id')))
            ->setEvents([$event]);
            
        $request->execute();
    }
}

4.3 Kampagnenstruktur (Budget < 500 €/Monat)

Meta Ads Account
└── Kampagne: Conversions - Registrierungen
    └── Ad Set: Interessen-Targeting DACH
        ├── Interessen: Hundeschule, Hundetraining, Selbstständigkeit, Kleinunternehmen
        ├── Alter: 25-55
        ├── Region: Deutschland, Österreich, Schweiz
        └── Ads: 3-4 verschiedene Creatives

4.4 Creative-Anforderungen

Bildformate:

  • 1080x1080 (Feed quadratisch)
  • 1080x1350 (Feed vertikal - beste Performance)
  • 1080x1920 (Stories/Reels)

Creative-Konzepte:

  1. Problem-Fokus: "Zettelwirtschaft? WhatsApp-Chaos?"
  2. Software-Demo: Dashboard/Kalender-Screenshots
  3. Testimonial: Kundenzitat + Foto
  4. Vergleich: Vorher/Nachher (Chaos vs. Ordnung)

Implementierungs-Checkliste

Phase 1-2: Google Ads

  • [x] MCC-Konto erstellt
  • [x] Developer Token erhalten
  • [x] OAuth2 Credentials erstellt
  • [x] Refresh Token generiert
  • [x] Display-Netzwerk deaktiviert
  • [ ] .env mit Google Ads Credentials konfigurieren
  • [ ] composer require googleads/google-ads-php
  • [ ] Config config/google-ads.php erstellen
  • [ ] Migration für gclid Spalte
  • [ ] Middleware TrackAdClicks erstellen
  • [ ] Service GoogleAdsService erstellen
  • [ ] Conversion-Aktion in Google Ads erstellen
  • [ ] Event Listener für Registrierungen

Phase 3: Kampagne optimieren

  • [x] Display-Netzwerk deaktiviert
  • [ ] Keywords reaktivieren ("Hundetrainer software")
  • [ ] Neue Keywords hinzufügen
  • [ ] Headlines auf 15 erweitern
  • [ ] Nach Conversion-Tracking: Gebotsstrategie umstellen

Phase 4: Meta Ads (NACH 2-4 Wochen Google)

  • [ ] Meta Business Manager einrichten
  • [ ] Domain verifizieren
  • [ ] Conversions API implementieren
  • [ ] Creatives erstellen lassen
  • [ ] Erste Kampagne starten

Dateistruktur für Implementation

app/
├── Services/
│   ├── GoogleAdsService.php      # Google Ads API Client
│   └── MetaAdsService.php        # Meta Conversions API Client
├── Http/
│   └── Middleware/
│       └── TrackAdClicks.php     # GCLID/FBCLID Tracking
├── Listeners/
│   ├── SendGoogleAdsConversion.php
│   └── SendMetaAdsConversion.php
└── Events/
    └── CustomerRegistered.php    # (falls nicht vorhanden)

config/
├── google-ads.php
└── meta-ads.php

database/migrations/
└── xxxx_add_ad_tracking_to_customers_table.php

Zeitplan

mermaid
gantt
    title Paid Ads Implementation
    dateFormat  YYYY-MM-DD
    section Google Ads
    Laravel Integration     :a1, 2026-02-08, 3d
    Conversion-Aktion       :a2, after a1, 1d
    Keywords optimieren     :a3, after a1, 2d
    Daten sammeln          :a4, after a2, 21d
    section Meta Ads
    Business Manager       :b1, after a4, 2d
    Conversions API        :b2, after b1, 2d
    Creatives erstellen    :b3, after b1, 7d
    Kampagne starten       :b4, after b3, 1d

Erstellt mit ❤️ für das interne Team