Soporte/Guías de proxy
Guías de proxy

Proxy de Flowsery Analytics con Laravel

Enruta Flowsery Analytics a través de tu aplicación Laravel para evitar la interferencia de los adblockers y capturar datos de visitantes más precisos.

1. Genera el controlador proxy

Crea un controlador dedicado para manejar las solicitudes del proxy:

Terminal
php artisan make:controller FlowseryProxyController

2. Implementa la lógica del proxy

Agrega lo siguiente a app/Http/Controllers/FlowseryProxyController.php:

PHP
<?php
 
namespace App\Http\Controllers;
 
use Illuminate\Http\Request;
use Illuminate\Support\Facades\Http;
use Illuminate\Support\Facades\Cache;
 
class FlowseryProxyController extends Controller
{
    public function script()
    {
        // Cache the tracking script for 1 day
        return Cache::remember('flowsery_script', 86400, function () {
            $response = Http::get('https://cdn.flowsery.com/main.js');
            return response($response->body(), 200, [
                'Content-Type' => 'application/javascript',
                'Cache-Control' => 'public, max-age=86400'
            ]);
        });
    }
 
    public function events(Request $request)
    {
        // Determine the origin from the request or build it from the URL
        $origin = $request->header('Origin') ?? $request->getSchemeAndHttpHost();
 
        // Resolve the real visitor IP for accurate geolocation
        $clientIp = $request->header('CF-Connecting-IP')
            ?? $request->header('X-Real-IP')
            ?? $request->header('X-Forwarded-For')
            ?? $request->ip();
 
        if (str_contains($clientIp, ',')) {
            $clientIp = trim(explode(',', $clientIp)[0]);
        }
 
        $headers = [
            'User-Agent' => $request->header('User-Agent'),
            'Content-Type' => 'application/json',
            'Origin' => $origin,
            'x-forwarded-for' => $clientIp,
        ];
 
        if ($clientIp) {
            // CRITICAL: Flowsery reads this as the authoritative visitor IP. Without it, every visitor resolves to your server's region.
            $headers['x-flowsery-real-ip'] = $clientIp;
        }
 
        $response = Http::withHeaders($headers)
            ->post('https://analytics.flowsery.com/analytics/events', $request->all());
 
        return response($response->body(), $response->status());
    }
}

Nota: Si tu aplicación ya tiene una ruta /api/track, agrega data-api a la etiqueta del script de Flowsery Analytics para dirigir los eventos a otra ruta. Por ejemplo, data-api="/flowsery-events" enviará los datos a /flowsery-events.

3. Registra las rutas

Agrega lo siguiente a routes/web.php:

PHP
Route::get('/js/main.js', [FlowseryProxyController::class, 'script']);
Route::post('/api/track', [FlowseryProxyController::class, 'events']);

4. Modifica la etiqueta del script

Reemplaza el snippet original de Flowsery Analytics por la versión con proxy:

HTML
<script defer data-fl-website-id="flid_******" src="/js/main.js"></script>

5. Despliega

Después de desplegar tu aplicación, la configuración del proxy se activa automáticamente.

Confirmar que funciona

Para validar que el proxy funciona correctamente:

  1. Navega a tu sitio web.
  2. Abre las herramientas de desarrollo del navegador y ve a la pestaña Network.
  3. Verifica que las solicitudes de analítica se sirvan desde tu dominio y no desde analytics.flowsery.com.

Solución de problemas

Todos los visitantes aparecen desde la misma ubicación

Cuando todos los visitantes muestran una única ubicación geográfica, normalmente la región de tu servidor, el proxy no está reenviando correctamente las IP reales.

Resolución:

  1. Asegúrate de que tu proxy incluya el encabezado x-flowsery-real-ip con la IP real del visitante, no con la IP del servidor, al reenviar solicitudes al endpoint /events de Flowsery Analytics.
  2. Si Laravel está detrás de otro proxy, como Cloudflare o Vercel, $request->ip() será la IP del proxy ascendente, así que usa directamente $request->header('CF-Connecting-IP') o $request->header('X-Real-IP').