Implementando Rastreamento de Conversão via Pixel com ASP.NET Core Web API

O rastreamento por pixel, embora seja uma das técnicas mais antigas para monitorar conversões de marketing, continua extremamente relevante. Grandes plataformas ainda utilizam esse método devido à sua simplicidade e confiabilidade em diversos ambientes de navegação.

A principal vantagem dessa abordagem é que ela não exige implementações complexas no lado do cliente. Como se trata de uma tag HTML <img> padrão, o rastreamento funciona em praticamente qualquer navegador que suporte o carregamento de imagans. O atributo src da imagem aponta para um endpoint no servidor, que processa os parâmetros enviados via string de consulta (query string) e retorna uma imagem transparente de 1x1 pixel.

Um exemplo típico de implementação no lado do cliente seria:

<img src="https://api.seuservico.com/v1/track?event=compra&value=100" width="1" height="1" style="display:none;" />

Como essa operação utiliza uma requisição GET padrão e não uma chamada AJAX, não há necessidade de configurar políticas de CORS complexas, facilitando a integração em diferentes domínios. O foco do desenvolvedor backend deve ser capturar os dados da requisição e retornar a imagem da forma mais eficiente possível.

Configuração do Conteúdo da Imagem

Para otimizar a performence e evitar acessos repetitivos ao sistema de arquivos, é recomendável armazenar o conteúdo da imagem (geralmente um GIF ou PNG transparente) drietamente na configuração da aplicação em formato Base64. Isso permite que os bytes sejam carregados na memória uma única vez durante a inicialização.

No arquivo appsettings.json, definimos os dados da imagem:

{
  "TrackingSettings": {
    "PixelBase64": "R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7",
    "MimeType": "image/gif"
  }
}

Injeção de Dependência e Inicialização

No ASP.NET Core, podemos configurar um objeto FileContentResult como um Singleton. Dessa forma, todos os requests de rastreamento compartilharão a mesma instância de resposta, reduzindo a pressão sobre o Garbage Collector e acelerando o tempo de resposta.

public void ConfigureServices(IServiceCollection services)
{
    var pixelData = Configuration.GetSection("TrackingSettings");
    var imageBytes = Convert.FromBase64String(pixelData["PixelBase64"]);
    var contentType = pixelData["MimeType"];

    services.AddSingleton(new FileContentResult(imageBytes, contentType));
    services.AddControllers();
}

Implementação do Endpoint de Rastreamento

O controlador deve ser capaz de extrair informações úteis da requisição, como cabeçalhos HTTP (User-Agent, Referer) e parâmetros de URL. Para garantir que o rastreamento não atrase a renderização da página do usuário, o processamento pesado dos dados deve ser feito de forma assíncrona, preferencialmente disparando uma tarefa em background.

[ApiController]
[Route("api/[controller]")]
public class AnalyticsController : ControllerBase
{
    private readonly FileContentResult _pixelResponse;

    public AnalyticsController(FileContentResult pixelResponse)
    {
        _pixelResponse = pixelResponse;
    }

    [HttpGet("collect")]
    public IActionResult Track()
    {
        // Captura metadados da requisição
        var queryParams = Request.Query.ToDictionary(q => q.Key, q => q.Value.ToString());
        var userAgent = Request.Headers["User-Agent"].ToString();
        var clientIp = HttpContext.Connection.RemoteIpAddress?.ToString();

        // Processamento em segundo plano para não bloquear a resposta
        Task.Run(() =>
        {
            // Lógica para persistir os dados (ex: salvar no banco ou enviar para barramento de eventos)
            SaveTrackingData(queryParams, userAgent, clientIp);
        });

        // Retorna imediatamente a imagem 1x1
        return _pixelResponse;
    }

    private void SaveTrackingData(Dictionary<string, string> data, string ua, string ip)
    {
        // Implementação da persistência
    }
}

Nesta implementação, o método Track extrai os dados necessários e imediatamente retorna o objeto _pixelResponse pré-configurado. O uso de Task.Run permite que a aplicação continue processando a lógica de análise de dados sem manter a conexão HTTP aberta desnecessariamente, melhorando a experiência do usuário final.

Tags: aspnet-core web-api tracking backend performance

Publicado em 6-9 05:38 por Thomas