---
title: Tracking de envios — URLs de seguimiento
section: carriers
slug: tracking
description: "Como configurar URLs de tracking en modulos de transportista PrestaShop: url_tracking en Carrier, actualizacion del numero de seguimiento y hooks."
keywords: prestashop tracking envio seguimiento url transportista numero guia carrier module PS8
last_updated: 2024-12-01
source_url: "https://ayudaprestashop.es/carriers/tracking"
---

# Tracking de envios — URLs de seguimiento

> Como configurar URLs de tracking en modulos de transportista PrestaShop: url_tracking en Carrier, actualizacion del numero de seguimiento y hooks.

PrestaShop permite configurar una URL de seguimiento en cada transportista. Cuando el comerciante introduce el numero de guia en el pedido, el cliente puede hacer clic en el enlace para ver el estado de su envio en la web del transportista.

## Configurar la URL de tracking

*Configurar url_tracking al crear el transportista*

```php
<?php

private function createCarrier(): bool
{
    $carrier = new Carrier();
    $carrier->name             = 'Mi Transportista';
    $carrier->active           = true;
    $carrier->deleted          = false;
    $carrier->shipping_handling = false;
    $carrier->range_behavior   = 0; // 0 = mayor rango disponible, 1 = deshabilitar
    $carrier->is_module        = true;
    $carrier->id_tax_rules_group = 0; // sin impuestos

    // ── URL de tracking ──
    // '@' es el placeholder que PrestaShop reemplaza con el numero de guia
    $carrier->url = 'https://tracking.mitransportista.com/seguimiento?numero=@';

    // Nombre del transportista en cada idioma
    foreach (Language::getLanguages() as $lang) {
        $carrier->delay[$lang['id_lang']] = '24-48 horas';
    }

    if (!$carrier->add()) {
        return false;
    }

    Configuration::updateValue('MYCARRIER_ID', (int) $carrier->id);
    Configuration::updateValue('MYCARRIER_ID_REFERENCE', (int) $carrier->id);

    $this->assignCarrierGroups($carrier->id);
    $this->assignCarrierZones($carrier->id);

    return true;
}
```

## Actualizar el numero de seguimiento

*Actualizar el numero de guia en un pedido*

```php
<?php

/**
 * Actualizar el numero de seguimiento de un pedido.
 * Normalmente se llama desde un webhook del transportista.
 */
private function updateTrackingNumber(int $idOrder, string $trackingNumber): bool
{
    $order = new Order($idOrder);
    if (!Validate::isLoadedObject($order)) {
        return false;
    }

    // Obtener el OrderCarrier del pedido
    $orderCarrier = new OrderCarrier((int) OrderCarrier::getIdByOrderId($idOrder));
    if (!Validate::isLoadedObject($orderCarrier)) {
        // Si no existe, crear uno
        $orderCarrier             = new OrderCarrier();
        $orderCarrier->id_order   = $idOrder;
        $orderCarrier->id_carrier = (int) $order->id_carrier;
    }

    $orderCarrier->tracking_number = pSQL($trackingNumber);
    $orderCarrier->save();

    // Cambiar el estado a 'Enviado' si no lo esta
    if ($order->current_state != (int) Configuration::get('PS_OS_SHIPPING')) {
        $history                 = new OrderHistory();
        $history->id_order       = $idOrder;
        $history->id_order_state = (int) Configuration::get('PS_OS_SHIPPING');
        $history->addWithemail(true, ['carrier_name' => 'Mi Transportista', 'tracking_number' => $trackingNumber]);
    }

    return true;
}
```

## Hook de envio con numero de tracking

*Hook para interceptar el cambio de estado a Enviado*

```php
<?php

public function install(): bool
{
    return parent::install()
        && $this->registerHook('actionObjectOrderCarrierUpdateAfter');
}

/**
 * Se dispara cuando se actualiza un OrderCarrier (p.ej. al introducir el numero de guia).
 */
public function hookActionObjectOrderCarrierUpdateAfter(array $params): void
{
    /** @var OrderCarrier $orderCarrier */
    $orderCarrier = $params['object'];

    // Solo procesar si el transportista es el nuestro
    $ourCarrierId = (int) Configuration::get('MYCARRIER_ID');
    if ((int) $orderCarrier->id_carrier !== $ourCarrierId) {
        return;
    }

    $trackingNumber = $orderCarrier->tracking_number;
    if (empty($trackingNumber)) {
        return;
    }

    // Notificar a la API del transportista
    $this->notifyCarrierApi($orderCarrier->id_order, $trackingNumber);
}

private function notifyCarrierApi(int $idOrder, string $trackingNumber): void
{
    // Enviar datos del pedido al sistema del transportista
    $order   = new Order($idOrder);
    $address = new Address($order->id_address_delivery);

    // ... llamada a la API del transportista
}
```

## Mostrar el tracking al cliente

*Obtener el enlace de tracking de un pedido*

```php
<?php

// ── Desde PHP ──
$idOrder      = 42;
$order        = new Order($idOrder);
$orderCarrier = new OrderCarrier((int) OrderCarrier::getIdByOrderId($idOrder));
$carrier      = new Carrier((int) $order->id_carrier);

$trackingNumber = $orderCarrier->tracking_number;
$trackingUrl    = '';

if ($trackingNumber && $carrier->url) {
    // PrestaShop reemplaza '@' con el numero de seguimiento
    $trackingUrl = str_replace('@', urlencode($trackingNumber), $carrier->url);
}

// La pagina 'order-detail' del FO ya muestra el enlace de tracking automaticamente
// si el Carrier tiene url_tracking y el OrderCarrier tiene tracking_number.

// ── En Smarty (tema) ──
// {if $carrier.tracking_url}
//   <a href="{$carrier.tracking_url|escape:'html'}" target="_blank">
//     Seguir mi pedido
//   </a>
// {/if}
```


---

*Fuente: [https://ayudaprestashop.es/carriers/tracking](https://ayudaprestashop.es/carriers/tracking). Version Markdown generada automaticamente para consumo por LLMs.*
