Hola @angelseller, y a todos los que estáis lidiando con esto. Es un escenario muy común y como bien decís, el Measurement Protocol es la solución definitiva para la fiabilidad en GA4 con la creciente preocupación por la privacidad y los bloqueadores.
El OrderConfirmationController es problemático porque se ejecuta en el front-end y, como ya habéis experimentado, el usuario puede cerrar la ventana o tener JS bloqueado. La clave es mover el envío del evento de compra al lado del servidor, y el hook actionValidateOrder es el punto ideal en PrestaShop 8.1.7. Este hook te proporciona el objeto Order y el Cart completo, lo que facilita la extracción de datos precisos, incluyendo los precios con descuentos.
Aquí tenéis un ejemplo de cómo podríais implementar la lógica dentro de un módulo custom usando actionValidateOrder:
// En tu módulo custom, registra el hook en install(): $this->registerHook('actionValidateOrder');
public function hookActionValidateOrder($params)
{
/** @var Order $order */
$order = $params['order'];
/** @var Cart $cart */
$cart = $params['cart'];
$items = array_map(function ($product) {
return [
'item_id' => (string)$product['id_product'],
Con (float)$product['price_wt'] de $cart->getProducts(true) deberías tener el precio unitario final de cada producto con descuentos aplicados. El client_id es más complicado si no lo tienes guardado en una cookie de sesión o base de datos; puedes usar Context::getContext()->cookie->id_guest o generar un ID único para cada evento si la atribución no es tan crítica. Para el Consent Mode v2, si tienes el estado de consentimiento, puedes incluir gcs o gcd en los parámetros del evento.
Para una solución más completa y mantenible que gestione esto y el dataLayer de forma automática, te sugiero echar un vistazo a un módulo de analítica GA4 para e-commerce que ya tiene todo esto implementado, incluyendo el seguimiento por Measurement Protocol y la integración con el consentimiento.