Última modificación: 28 de agosto de 2025
En los workflows, usa la acción Código personalizado para escribir y ejecutar JavaScript o Python (en versión beta). Al utilizar las acciones con código personalizado, puedes extender las funciones de los workflows dentro y fuera de HubSpot. Para ver ejemplos de las acciones con código personalizado más frecuentes, consulta el catálogo de ejemplos de uso de automatización programable de HubSpot. Las acciones de código personalizado admiten código JavaScript con el entorno de tiempo de ejecución Node.js. Si estás usando Python para tu acción con código personalizado, usará el entorno de tiempo de ejecución de Python. Cuando se ejecuta una acción, HubSpot y AWS Lambda administran el cómputo del tiempo de ejecución a través de una función sin servidor. Si encuentras algún problema general al implementar tu acción con código personalizado, puedes ponerte en contacto con el servicio de asistencia de HubSpot. Por otro lado, si el problema está relacionado con el código personalizado en sí, te recomendamos que investigues y preguntes en el Foro para desarrolladores de HubSpot, y así obtener ayuda para resolver problemas con el código.

Bibliotecas compatibles con Node.js

Si estás usando Node.js, puedes usar las siguientes bibliotecas con la acción programada. Estas bibliotecas se pueden subir usando la función normal require() al inicio del código.
  • @hubspot/api-client ^10
  • async ^3.2.0
  • aws-sdk ^2.744.0
  • axios ^1.2.0
  • lodash ^4.17.20
  • mongoose ^6.8.0
  • mysql ^2.18.1
  • redis” ^4.5.1
  • request” ^2.88.2
  • bluebird ^3.7.2
  • random-number-csprng ^1.0.2
  • googleapis ^67.0.0

Nota:

La API de asociaciones versión 4 es compatible con la versión 9.0.0 o posterior del cliente NodeJS de HubSpot y la versión 8 del cliente NodeJS de HubSpot.

Bibliotecas compatibles con Python

Si usas Python, puedes subir las siguientes bibliotecas con una instrucción de importación al inicio del código. La instrucción de importación debe tener el formato from [libraryname] import [item], por ejemplo: from redis.client import redis.
  • requests 2.28.2
  • @hubspot/api-client ^8
  • google-api-python-client 2.74.0
  • mysql-connector-python 8.0.32
  • redis 4.4.2
  • nltk 3.8.1
Si tomas algo de la biblioteca estándar, puedes utilizar import, por ejemplo: import os.

Primeros pasos

Usa los ejemplos de código a continuación para comenzar a usar acciones de workflow con código personalizado.

Ejemplos de código

const hubspot = require('@hubspot/api-client');

exports.main = async (event, callback) => {

  /*****
    How to use secrets
    Secrets are a way for you to save API keys or private apps and set them as a variable to use anywhere in your code
    Each secret needs to be defined like the example below
  *****/

  const hubspotClient = new hubspot.Client({
    accessToken: process.env.SECRET_NAME
  });

  let phone;
  try {
    const ApiResponse = await hubspotClient.crm.contacts.basicApi.getById(event.object.objectId, ["phone"]);
    phone = ApiResponse.properties.phone;
  } catch (err) {
    console.error(err);
    // We will automatically retry when the code fails because of a rate limiting error from the HubSpot API.
    throw err;
  }

  /*****
    How to use inputs
    Inputs are a way for you to take data from any actions in your workflow and use it in your code instead of having to call the HubSpot API to get that same data.
    Each input needs to be defined like the example below
  *****/

  const email = event.inputFields['email'];

  /*****
    How to use outputs
    Outputs are a way for you to take data from your code and use it in later workflows actions

    Use the callback function to return data that can be used in later actions.
    Data won't be returned until after the event loop is empty, so any code after this will still execute.
  *****/

  callback({
    outputFields: {
      email: email,
      phone: phone
    }
  });
}

// A sample event may look like:
{
  "origin": {
    // Your portal ID
    "portalId": 1,

    // Your custom action definition ID
    "actionDefinitionId": 2,
  },
  "object": {
    // The type of CRM object that is enrolled in the workflow
    "objectType": "CONTACT",

    // The ID of the CRM object that is enrolled in the workflow
    "objectId": 4,
  },
  "inputFields": {
    // The property name for defined inputs
  },
  // A unique ID for this execution
  "callbackId": "ap-123-456-7-8"
}
import os
from hubspot import HubSpot
from hubspot.crm.contacts import ApiException

def main(event):

# How to use secrets

# Secrets are a way for you to save API keys or private apps and set them as a variable to use anywhere in your code

# Each secret needs to be defined like the example below

hubspot = HubSpot(access_token=os.getenv('SECRET_NAME'))

phone = '' try: ApiResponse = hubspot.crm.contacts.basic_api.get_by_id(event.get('object').get('objectId'), properties=["phone"]) phone = ApiResponse.properties.get('phone') except ApiException as e: print(e)

# We will automatically retry when the code fails because of a rate limiting error from the HubSpot API.

raise

# How to use inputs

# Inputs are a way for you to take data from any actions in your workflow and use it in your code instead of having to call the HubSpot API to get that same data.

# Each input needs to be defined like the example below

email = event.get('inputFields').get('email')

# How to use outputs

# Outputs are a way for you to take data from your code and use it in later workflows actions

# Use the callback function to return data that can be used in later actions.

# Data won't be returned until after the event loop is empty, so any code after this will still execute.

return { "outputFields": { "email": email, "phone": phone } }

# A sample event may look like:

# {

# "origin": {

# # Your portal ID

# "portalId": 1,

# # Your custom action definition ID

# "actionDefinitionId": 2,

# },

# "object": {

# # The type of CRM object that is enrolled in the workflow

# "objectType": "CONTACT",

# # The ID of the CRM object that is enrolled in the workflow

# "objectId": 4,

# },

# "inputFields": {

# # The property name for defined inputs

# },

# # A unique ID for this execution

# "callbackId": "ap-123-456-7-8"

# }

Crear una acción con código personalizado

Para agregar una acción con código personalizado a un workflow:
  • En tu cuenta de HubSpot, navega a Automatización > Workflows.
  • Haz clic en el nombre de un workflow o crea un nuevo workflow.
  • Haz clic en el ícono + más para agregar una acción de workflow.
  • En el panel izquierdo, busca y selecciona Código personalizado.
custom-code-action-select
  • Por defecto, las acciones con código personalizado utilizarán Node.js. Si estás en la prueba beta con Python y quieres crear una acción con este lenguaje, haz clic en el menú desplegable Lenguaje y selecciona Python.
  • En el campo Descripción, introduce una descripción para tu acción personalizada de workflow. Esta descripción aparecerá en la tarjeta de acción del workflow correspondiente.
  • Puedes utilizar un secreto con la acción de código personalizado, como un token de acceso a una aplicación privada. La aplicación también debe incluir los respectivos ámbitos para los datos que estés intentando extraer de HubSpot, como contacts o forms. Más información sobre las aplicaciones privadas de HubSpot.
    • Para utilizar un secreto existente, haz clic en Añadir secreto. Luego, selecciona las casillas de verificación situadas junto a las imágenes que deseas guardar.
    • Para agregar un nuevo secreto, haz clic en Agregar secreto. En el cuadro de diálogo, escribe el nombre del secreto y el valor del secreto. Luego, haz clic en Guardar. Ahora puedes seleccionar este secreto en futuras acciones con código personalizado.
    • Para cambiar o eliminar los secretos existentes, haz clic en Administrar secretos.
  • Para incluir propiedades en tu código personalizado:
    • Haz clic en el enlace Selecciona una propiedad y luego selecciona una propiedad del panel de datos. Puedes utilizar propiedades existentes o valores de propiedad formateados antes en el workflow. Después de seleccionar la propiedad, introduce un nombre para usarla en el código. Descubre cómo hacer referencia a las propiedades en tu código personalizado.
    • Para agregar otra propiedad, haz clic en Agregar propiedad. Cada propiedad solo puede agregarse una vez y debe tener un ID de variable único. Puedes usar hasta 50 propiedades con tu código personalizado.
    • Para eliminar una propiedad, haz clic en el ícono de eliminación.
  • En el campo del código, introduce el código en JavaScript o Python.
  • Para definir los datos de output que se pueden usar como datos de input en el workflow, por ejemplo, con la acción Editar registros:
    • En Outputs de datos, haz clic en Añadir output.
    • Haz clic en el menú desplegable Tipo de datos y selecciona un tipo de datos.
    • En el campo Nombre, introduce un nombre para el output de datos.
    • Para agregar varias salidas, haz clic en Agregar salida.
  • En la parte superior, haz clic en Guardar.
workflow-custom-code

Nota:

El campo de código no mostrará errores de lint al usar Python.
Al crear acciones con código personalizado, ten en cuenta lo siguiente:
  • Hay una llamada a la función def main(event): cuando se ejecuta la acción del fragmento de código.
  • El argumento event es un objeto que contiene detalles sobre la ejecución del workflow.
  • La función callback() se utiliza para transferir datos de vuelta al workflow. Se debe llamar en la función exports.main. Esto solo se puede usar con Node.js.
El objeto event contendrá los siguientes datos:
//example payload
{
  "origin": {
    // Your portal ID
    "portalId": 1, // Your custom action definition ID
    "actionDefinitionId": 2
  },
  "object": {
    // The type of CRM object that is enrolled in the workflow
    "objectType": "CONTACT", // The ID of the CRM object that is enrolled in the workflow
    "objectId": 4
  },
  // A unique ID for this execution.
  "callbackId": "ap-123-456-7-8"
}

Establece un límite de frecuencia para la acción (BETA)

Establece un límite de velocidad para determinar la frecuencia con la que debe ejecutarse la acción del código personalizado. El límite de frecuencia también afectará a todas las acciones siguientes del workflow.
  • En la cronología del workflow, haz clic en la acción con código personalizado.
  • En la parte inferior, haz clic en Configurar límite de frecuencia para ampliar la sección de límite de frecuencia.
  • Haz clic para activar el interruptor Activar la limitación de frecuencia. Por opción predeterminada, esta opción está desactivada.
  • Ajusta el límite de frecuencia:
    • Ejecuciones de acciones: ajusta el número máximo de ejecuciones por periodo de tiempo.
    • Plazo: ajusta el plazo para su límite de tarifa. Puedes ajustar esta franja horaria en Segundos, Minutos u Horas.
Si tu acción está en pausa debido al límite de velocidad, no se ejecutará y aparecerá el siguiente error en los registros de acciones del workflow: Esta acción se ha pausado para mantenerse dentro del límite de frecuencia configurado. Se reanudará el [fecha y hora].
workflow-rate-limit-section

Probar la acción

Al agregar una acción con código personalizado a un workflow, puedes probar la acción para asegurarte de que el código se ejecute como se esperaba antes de activar el workflow. Al probar una acción con código personalizado, debes comenzar seleccionando un registro para probar el código y luego ejecutarlo. Esta prueba ejecutará solo el código en tu acción personalizada, no ninguna de las otras acciones en el workflow. Cuando el código haya terminado de ejecutarse, podrás ver los datos de salida del código y el registro de tu prueba.

Nota:

Al probar tu código personalizado, el código se ejecutará y los cambios se aplicarán al registro de prueba seleccionado. Recomendamos crear un registro de prueba específico si no quieres actualizar los registros activos.
Para probar una acción con código personalizado:
  • En la vista previa del workflow, haz clic en la acción con código personalizado.
  • En la parte inferior de la barra lateral derecha, haz clic en Probar acción para expandir la sección de prueba.
  • Selecciona un registro con el que probar el código haciendo clic en el menú desplegable Objeto y luego, selecciona un registro.
  • Si usas valores de propiedad formateados previamente en el workflow, introduce un valor de prueba para los datos con formato.
test custom code action
  • Para ejecutar el código, haz clic en Prueba.
  • En el cuadro de diálogo, confirma que quieres probar el código con respecto al registro seleccionado haciendo clic en Prueba.
  • Una vez que tu código haya terminado de ejecutarse, la barra lateral mostrará los resultados de la prueba:
    • Estado: El estado de acierto o error de la acción con código personalizado.
    • Salida de datos: Los valores resultantes para la salida de datos definida. Aparecerá una alerta junto a los resultados que el código haya generado y que no se hayan definido en la sección Salida de datos ni en el editor de código. Deberás agregar esos resultados para usarlos más adelante en el workflow.
    • Registros: Información sobre la prueba en sí, como cuánta memoria usó la acción para ejecutarse y el tiempo de ejecución total.
  • Cuando termines de probar la acción, haz clic en Guardar para guardar los cambios.
workflow-custom-code-action-test0results0

Secretos

Hay veces que querrás que el código haga referencia a algo que no se debe compartir ampliamente. La mayoría de las veces, se trata de un medio de autenticación, como un token de acceso a aplicaciones privadas. Puedes administrar los secretos a los que tu función tiene acceso directamente en la definición de la acción del workflow. Cuando se utilizan varios secretos en un mismo código personalizado, la longitud total de todos los valores secretos no debe exceder los 1000 caracteres.
workflow-custom-code-secrets
Los secretos, una vez agregados, estarán disponibles como variables del entorno a las que puedes acceder en el código personalizado, como se muestra a continuación:
const hubspot = require('@hubspot/api-client');
exports.main = (event, callback) => {
return callback(processEvent(event));
};
function processEvent(event) {
// secrets can be accessed via environment variables
const hubspotClient = new hubspot.Client({
accessToken: process.env.secretName,
});
hubspotClient.crm.contacts.basicApi
.getById(event['object']['objectId'], ['email', 'phone'])
.then((results) => {
let email = results.body['properties']['email'];
let phone = results.body['properties']['phone'];
// ...
})
.catch((err) => {
console.error(err);
});
}

Agregar propiedades de HubSpot al código personalizado

A veces, es posible que debas obtener las propiedades del objeto en tu acción con código personalizado. En lugar de usar las API de HubSpot, puedes agregar estas propiedades directamente en la definición de la acción del workflow. Agrega las propiedades y define sus nombres para hacer referencia a esas propiedades en el código. Una vez agregada, se puede hacer referencia a la propiedad en el código personalizado. Puedes agregar hasta 50 propiedades en cada acción con código personalizado.
use-property-in-custom-code-action
const email = event.inputFields['email'];

Registros

Para los programadores es importante una herramienta que tenga la capacidad de imprimir los datos de output desde el código. Esto permite depurar problemas y brindar mejor asistencia a los usuarios finales. Para ver el resultado de los registros, encuentra más información sobre cómo revisar los registros de acciones de tu workflow.

Cómo definir los datos de salida

En la función, define los campos de los datos de salida que quieres usar más adelante en el workflow. Luego, selecciona el tipo de datos de salida (por ejemplo, número, cadena, booleano, fecha y hora, enumeración, número de teléfono, fecha) e introduce el campo que deseas generar. Los campos de los datos de salida deben formar parte de un objeto json con formateado según corresponda conforme al lenguaje utilizado:
callback({
outputFields: {
email: email,
phone: phone,
},
});
custom-code-output
Puedes usar los datos de salida de la acción con código personalizado como en datos de input de la acción Editar registros. Esto evita la necesidad de hacer otra llamada a la API para almacenar el valor como una propiedad en tu objeto. Ten en cuenta lo siguiente al definir los datos de salida:
  • Si el tipo de datos de salida está en formato de cadena, el límite para los valores de la cadena es de 65.000 caracteres. Exceder este límite ocasionará un error OUTPUT_VALUES_TOO_LARGE.
  • Si utilizas la acción Editar registros, toma nota de las propiedades de origen y destino compatibles.
  • Al actualizar las propiedades de fecha:
    • Si estás copiando los datos de output de una propiedad de fecha y hora, esos datos deberán estar en formato Unix en milisegundos.
    • Si estás copiando los datos de output de una propiedad de fecha en lugar de fecha y hora, esos datos deberán estar en formato Unix en milisegundos y la hora de la fecha deberá fijarse en la medianoche de la zona horaria UTC.
currentDate.setUTCHours(0,0,0,0)
custom_code_actions_output_usage

Limitaciones

Las acciones con código personalizado deben terminar de ejecutarse en un lapso de 20 segundos, y solo puedes usar hasta 128 MB de memoria. Exceder estos límites generará un error.

Reintentos

Es posible que debas obtener las propiedades del objeto usando la API de HubSpot o llamar a otros endpoints de la API de HubSpot en tu acción con código personalizado. Como con cualquier otra llamada a la API, deberás cumplir con los límites de frecuencia de la API de HubSpot.
  • Si estás usando Node.js y encuentras un error de límite de frecuencia, pero quieres que HubSpot vuelva a intentar la llamada, deberás incluir el error en el bloque catch de la acción con código personalizado.
catch-error
  • Si usas Python y encuentras un error de límite de frecuencia, pero quieres que HubSpot vuelva a intentar la llamada, deberás generar el error en el bloque except de la acción con código personalizado.
except-error

Nota:

Si la llamada falla debido a un error de limitación de velocidad o a un error 429 o 5XX de axios o @hubspot/api-client, HubSpot volverá a intentar ejecutar su acción hasta por tres días, comenzando un minuto después de la falla. Las acciones fallidas posteriores se volverán a ejecutar a intervalos cada vez mayores, con un intervalo máximo de ocho horas entre los intentos.

Advertencias

Si estás usando Node.js en tu código personalizado, ten en cuenta las siguientes advertencias:
  • Generación de números aleatorios: es común usar Math.random para generar números aleatorios, pero los usuarios pueden ver los mismos números generados en diferentes ejecuciones. Esto se debe a que Math.random funciona según la hora actual. Dado que HubSpot puede inscribir muchos objetos en un workflow al mismo tiempo y borrar el estado en cada ejecución, cada ejecución termina alimentando Math.random de la misma manera. En cambio, puedes usar la biblioteca random-number-csprng 1.0.2, que garantiza la generación de números pseudoaleatorios criptográficamente seguros.
  • Reutilización de variables: para ahorrar memoria, cualquier variable introducida fuera de la función exports.main se puede reutilizar para futuras ejecuciones de la acción con código personalizado. Esto es útil cuando se hace una conexión con servicios externos, como una base de datos, pero cualquier lógica o información que deba ser única para cada ejecución de la acción con código personalizado debe estar dentro de la función exports.main.
Si estás usando Python para el código personalizado, ten en cuenta las siguientes advertencias:
  • Reutilización de variables: al igual que en el caso anterior, toda variable introducida fuera de la función def main se puede reutilizar para futuras ejecuciones de la acción con código personalizado.
    • Si introdujiste una variable fuera de la función def main, pero no planeas modificarla, puedes hacer referencia a la variable directamente.
    • Si planeas modificar una variable, puedes introducir la variable dentro de la función def main con una clave global antes de hacer la referencia.
a = 1
def main(event):
  global a
  a += 1