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.