Ejemplo de integración con FedEx
En este tutorial verás cómo integrar FedEx.
1. Preparación previa
1.1. Crea una cuenta en FedEx
Crea una cuenta en el portal para desarrolladores.
1.2. Crea los proyectos y obtén los tokens
Crea 2 proyectos en la sección Mis proyectos y guarda el client id y el client secret.
El primer proyecto sirve para gestionar los envíos.
El segundo, para rastrearlos.
1.3. Crea los estados de entrega
En la pestaña de estados del almacenamiento de pedidos, crea los estados (se abre en una pestaña nueva):
- order_delivery
- order_delivery_started
- ready_for_pickup
1.4. Crea un evento para rastrear los estados
En el módulo Events (se abre en una pestaña nueva), crea un evento que rastree el cambio del pedido al estado order_delivery.

1.5. Crea una colección para las entregas
En el módulo Integration Collections (se abre en una pestaña nueva), crea una colección para las entregas con estos atributos:
- name (
string) - address (
string) - phone_number (
string) - city (
string) - state_code (
string) - postal_code (
string) - country_code (
string) - tracking_number (
string) - transaction_id (
string) - ship_datestamp (
string) - delivery_datestamp (
string)

1.6. Crea un pedido de prueba
Crea un pedido y un registro de la colección para ese pedido.


2. Creación del envío
2.1. Seguimiento del evento de entrega
- Arrastra el nodo events (se abre en una pestaña nueva) al espacio de trabajo.
- Ingresa un nombre para el nodo.
- Cambia el valor del campo "Set" a "orderEvent".
- El evento se guardará en el objeto "msg.orderEvent" y podrás usarlo en otros nodos.
- Selecciona en la lista el evento que creaste, "order delivery", y haz clic en "submit".

2.2. Obtención del token
- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".
- Reemplaza
YOUR_CLIENT_IDyYOUR_CLIENT_SECRETpor tus propios valores.

msg.payload = {
'grant_type': 'client_credentials',
'client_id': 'YOUR_CLIENT_ID',
'client_secret': 'YOUR_CLIENT_SECRET'
}
msg.headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
return msg;
Los parámetros se describen en la documentación de FedEx.
- Arrastra el nodo http request (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- En el campo Method, selecciona "POST".
- En el campo Data, selecciona "Send as request body".
- En el campo Link, pega
https://apis-sandbox.fedex.com/oauth/token. - En el campo Return, selecciona "Object JSON".

- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".

msg.access_token = msg.payload.access_token;
return msg;
2.3. Creación del envío
- Arrastra el nodo admin-api (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Selecciona el método "Receiving all records belonging to the collection" y pega el siguiente código en el campo "Data".
{
"entityType": "orders",
"entityId": "{{orderEvent.order.id}}",
"langCode": "en_US",
"offset": 0,
"limit": 1,
"marker": "delivery"
}

- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".

// obtenemos el token guardado anteriormente
const token = msg.access_token;
// definimos los encabezados
msg.headers = {
'Content-Type': 'application/json',
'authorization': `Bearer ${token}`
};
// obtenemos la colección del paso anterior
const collection = msg.payload.items[0];
// convertimos el array en un objeto
const formData = collection.formData.reduce((acc, item) => {
acc[item.marker] = item.value;
return acc;
}, {});
// definimos los datos del destinatario a partir del formulario
const recipient = {
"address": {
"streetLines": [
formData.address
],
"city": formData.city,
"stateOrProvinceCode": formData.state_code,
"postalCode": formData.postal_code,
"countryCode": formData.country_code
},
"contact": {
"personName": formData.name,
"phoneNumber": formData.phone_number
}
}
// guardamos los datos de la colección en msg para usarlos más adelante
msg.collection = collection;
// definimos los parámetros de la solicitud a FedEx
msg.payload = {
"labelResponseOptions": "URL_ONLY",
"accountNumber": {
"value": "510087020"
},
"requestedShipment": {
"shipper": {
"contact": {
"personName": "SENDER NAME",
"phoneNumber": "9018328595"
},
"address": {
"streetLines": [
"SENDER ADDRESS 1"
],
"city": "MEMPHIS",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
},
"recipients": [
recipient
],
"serviceType": "STANDARD_OVERNIGHT",
"packagingType": "YOUR_PACKAGING",
"pickupType": "DROPOFF_AT_FEDEX_LOCATION",
"shippingChargesPayment": {
"paymentType": "SENDER",
"payor": {
"responsibleParty": {
"accountNumber": {
"value": "510087020",
"key": ""
}
},
"address": {
"streetLines": [
"SENDER ADDRESS 1"
],
"city": "MEMPHIS",
"stateOrProvinceCode": "TN",
"postalCode": "38116",
"countryCode": "US"
}
}
},
"labelSpecification": {},
"requestedPackageLineItems": [
{
"customerReferences": [
{
"customerReferenceType": "CUSTOMER_REFERENCE",
"value": `Collection${collection.id}`
}
],
"weight": {
"units": "LB",
"value": "20"
}
}
]
}
};
return msg;
Los parámetros se describen en la documentación de FedEx.
- Arrastra el nodo http request (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- En el campo Method, selecciona "POST".
- En el campo Data, selecciona "Send as request body".
- En el campo Link, pega
https://apis-sandbox.fedex.com/ship/v1/shipments. - En el campo Return, selecciona "Object JSON".

- Arrastra el nodo debug (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.

- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".

// obtenemos los datos del envío
const shipment = msg.payload.output.transactionShipments[0];
// obtenemos los datos de la colección guardados anteriormente
const collection = msg.collection;
// escribimos los datos del envío en los atributos del formulario
const newFormData = [
...collection.formData
.filter(item => !['transaction_id', 'ship_datestamp', 'delivery_datestamp', 'tracking_number'].includes(item.marker)),
{
marker: 'transaction_id',
value: msg.payload.transactionId,
type: 'string'
},
{
marker: 'ship_datestamp',
value: shipment.shipDatestamp,
type: 'string'
},
{
marker: 'delivery_datestamp',
value: shipment.pieceResponses[0].deliveryDatestamp,
type: 'string'
},
{
marker: 'tracking_number',
value: shipment.masterTrackingNumber,
type: 'string'
}
]
// definimos los parámetros para actualizar la colección
msg.params = {
langCode: 'en_US',
id: collection.id,
marker: 'delivery'
}
msg.data = {
formIdentifier: 'delivery_form',
formData: {
en_US: newFormData
},
entityId: collection.entityId,
entityType: collection.entityType
}
// guardamos los datos de la colección para usarlos más adelante
msg.collection = collection;
return msg;
- Arrastra el nodo admin-api (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Selecciona el método "Changing a record in the collection".

2.4. Actualización del estado del pedido
- Arrastra el nodo admin-api (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Selecciona el método "Updating the status of an order belonging to the order storage object".
- Pega el siguiente código en el campo "Query parameters".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
- Pega el siguiente código en el campo "Request body".
{
"statusIdentifier": "order_delivery_started"
}

- Arrastra el nodo debug (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.

3. Seguimiento del estado del envío
3.1. Obtención de los pedidos que se van a rastrear
- Arrastra el nodo interval (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Ingresa el intervalo en minutos.

- Arrastra el nodo admin-api (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Selecciona el método "Receiving all orders belonging to the order storage object".
- Pega el siguiente código en el campo "Query parameters".
{
"statusIdentifier": "order_delivery_started",
"langCode": "en_US",
"offset": 0,
"limit": 100,
"id": 1
}

- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".

msg.payload = msg.payload.items;
return msg;
- Arrastra el nodo split (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Ingresa la longitud.

- Arrastra el nodo admin-api (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Selecciona el método "Receiving all records belonging to the collection".
- Pega el siguiente código en el campo "Query parameters".
{
"marker": "delivery",
"entityId": "{{payload.id}}",
"entityType": "orders",
"langCode": "en_US",
"limit": 1,
"offset": 0
}

- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".

msg.payload = msg.payload.items[0]
return msg;
- Arrastra el nodo switch (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Agrega una regla de comprobación y selecciona la condición "not empty".

- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".
![]()
msg.trackingNumber = msg.payload
.formData
.find(item => item.marker === 'tracking_number')
.value;
msg.collection = msg.payload;
return msg;
3.2. Obtención del token
- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".
- Reemplaza
YOUR_CLIENT_IDyYOUR_CLIENT_SECRETpor tus propios valores.

msg.payload = {
'grant_type': 'client_credentials',
'client_id': 'YOUR_CLIENT_ID',
'client_secret': 'YOUR_CLIENT_SECRET'
}
msg.headers = {
'Content-Type': 'application/x-www-form-urlencoded'
}
return msg;
Los parámetros se describen en la documentación de FedEx.
- Arrastra el nodo http request (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- En el campo Method, selecciona "POST".
- En el campo Data, selecciona "Send as request body".
- En el campo Link, pega
https://apis-sandbox.fedex.com/oauth/token. - En el campo Return, selecciona "Object JSON".

3.3. Obtención del estado del envío
- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".
![]()
const token = msg.payload.access_token;
msg.headers = {
'content-type': 'application/json',
'authorization': `Bearer ${token}`
};
msg.payload = {
"trackingInfo": [
{
"trackingNumberInfo": {
"trackingNumber": msg.trackingNumber
}
}
],
"includeDetailedScans": true
}
return msg;
Los parámetros se describen en la documentación de FedEx.
- Arrastra el nodo http request (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- En el campo Method, selecciona "POST".
- En el campo Data, selecciona "Send as request body".
- En el campo Link, pega
https://apis-sandbox.fedex.com/track/v1/trackingnumbers. - En el campo Return, selecciona "Object JSON".
![]()
- Arrastra el nodo function (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Pega el código del ejemplo en el campo "Function".
![]()
msg.payload = msg.payload.output.completeTrackResults[0].trackResults[0].latestStatusDetail.statusByLocale;
return msg;
3.4. Actualización del estado del pedido
- Arrastra el nodo switch (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Agrega una regla de comprobación: selecciona la condición "==" e ingresa el valor "Ready for pickup".

- Arrastra el nodo admin-api (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
- Selecciona el método "Updating the status of an order belonging to the order storage object".
- Pega el siguiente código en el campo "Query parameters".
{
"id": 1,
"orderId": "{{collection.entityId}}"
}
- Pega el siguiente código en el campo "Request body".
{
"statusIdentifier": "ready_for_pickup"
}

- Arrastra el nodo debug (se abre en una pestaña nueva) al espacio de trabajo y conéctalo al nodo del paso anterior.
