Skip to content

Instantly share code, notes, and snippets.

@sabrysuleiman
Last active June 24, 2025 12:23
Show Gist options
  • Save sabrysuleiman/b3f6435dd70db7092287d93d1b1ab54f to your computer and use it in GitHub Desktop.
Save sabrysuleiman/b3f6435dd70db7092287d93d1b1ab54f to your computer and use it in GitHub Desktop.

Revisions

  1. sabrysuleiman created this gist Jun 24, 2025.
    78 changes: 78 additions & 0 deletions getUserTrafficSource.php
    Original file line number Diff line number Diff line change
    @@ -0,0 +1,78 @@
    <?php
    function getUserTrafficSource() {
    $source = 'unknown'; // Default to unknown
    $details = []; // To store additional details

    // 1. Check for UTM parameters (most reliable for ads)
    if (isset($_GET['utm_medium'])) {
    if ($_GET['utm_medium'] === 'cpc' || $_GET['utm_medium'] === 'paid') {
    $source = 'ad';
    $details['ad_platform_guess'] = isset($_GET['utm_source']) ? $_GET['utm_source'] : 'unknown_platform';
    $details['utm_medium'] = $_GET['utm_medium'];
    if (isset($_GET['utm_campaign'])) $details['utm_campaign'] = $_GET['utm_campaign'];
    if (isset($_GET['utm_source'])) $details['utm_source'] = $_GET['utm_source'];
    if (isset($_GET['utm_term'])) $details['utm_term'] = $_GET['utm_term'];
    if (isset($_GET['utm_content'])) $details['utm_content'] = $_GET['utm_content'];
    return ['source' => $source, 'details' => $details];
    }
    }

    // 2. Check for GCLID (Google Ads specific)
    if (isset($_GET['gclid'])) {
    $source = 'ad';
    $details['ad_platform'] = 'google_ads';
    $details['gclid'] = $_GET['gclid'];
    return ['source' => $source, 'details' => $details];
    }

    // 3. Check for FBCLID (Facebook Ads specific)
    if (isset($_GET['fbclid'])) {
    $source = 'ad';
    $details['ad_platform'] = 'facebook_ads';
    $details['fbclid'] = $_GET['fbclid'];
    return ['source' => $source, 'details' => $details];
    }

    // 4. Analyze HTTP Referer for Organic Search Engines
    if (isset($_SERVER['HTTP_REFERER'])) {
    $referer = $_SERVER['HTTP_REFERER'];
    $details['referer'] = $referer;

    // Common search engine domains
    $searchEngines = [
    'google.com', 'google.co.uk', 'google.ca', 'google.de', 'google.fr', 'google.es', // Add more Google TLDs as needed
    'bing.com',
    'yahoo.com',
    'duckduckgo.com',
    'baidu.com',
    'yandex.com',
    ];

    foreach ($searchEngines as $engine) {
    if (strpos($referer, $engine) !== false) {
    $source = 'organic';
    $details['organic_engine'] = explode('.', parse_url($referer, PHP_URL_HOST))[0]; // Extracts 'google', 'bing', etc.
    return ['source' => $source, 'details' => $details];
    }
    }

    // If referer exists but isn't a known search engine, could be a direct link, social media, etc.
    // You might want to add more rules here for social media referers if needed.
    if (strpos($referer, 'facebook.com') !== false || strpos($referer, 't.co') !== false || strpos($referer, 'linkedin.com') !== false) {
    $source = 'social_media';
    $details['social_platform'] = parse_url($referer, PHP_URL_HOST);
    return ['source' => $source, 'details' => $details];
    }

    // If referer is not an ad, organic or social, it could be a referral from another website
    $source = 'referral';
    }

    // 5. If no specific indicators, it's likely a direct visit
    // This is the fallback if no other conditions are met.
    if ($source === 'unknown' && !isset($_SERVER['HTTP_REFERER'])) {
    $source = 'direct';
    }

    return ['source' => $source, 'details' => $details];
    }