Cuando se cierra un contrato en Salesforce, el sitio web correspondiente sigue dependiendo de una serie de pasos manuales independientes para su puesta en marcha. Un desarrollador tiene que localizar el sitio web del cliente en MyKinsta, crear una copia de seguridad y trasladar el entorno de staging a producción, todo en el momento adecuado.
Con la API de Kinsta, puedes conectar estas dos partes del flujo de trabajo para que la aprobación del acuerdo active automáticamente el lanzamiento. En lugar de depender de que alguien realice cada paso, el proceso se ejecuta en cuanto la oportunidad alcanza la fase objetivo.
Es una configuración muy sencilla: ejecuta un lote de tareas de MyKinsta cuando se actualice una oportunidad de Salesforce y elimina la necesidad de intervención manual tras el despliegue. Mientras tanto, tu cliente disfruta de un proceso más rápido desde la aprobación hasta la puesta en marcha del sitio web, sin tener que esperar a que se produzcan los traspasos entre equipos.
Lo que necesitas antes de empezar
Para seguir este tutorial, necesitas una cuenta de Kinsta con un sitio de WordPress que tenga un entorno staging y un entorno en producción, una cuenta de Salesforce con acceso a Flow Builder y Node.js instalado localmente para el middleware.
Para autenticarte con la API de Kinsta, ve a Tu nombre > Configuración de la empresa > Claves API en MyKinsta y haz clic en Crear clave API.

Ponle un nombre a la clave, establece una fecha de caducidad y haz clic en Generar. La clave solo se muestra una vez, así que cópiala antes de cerrar la ventana emergente. Guárdala en un archivo .env en la raíz del proyecto junto con tu ID de empresa, que encontrarás en Configuración de la empresa > Datos de facturación:
KINSTA_API_KEY=your_api_key_here
KINSTA_COMPANY_ID=your_company_id_here
También necesitas un campo de texto personalizado en el objeto Oportunidad de Salesforce para almacenar el ID del sitio Kinsta para cada proyecto de cliente. Dirígete a Configuración > Gestor de objetos, y luego a Oportunidad > Campos y relaciones.

Aquí, añade una Etiqueta de Campo, y Salesforce genera un Nombre de Campo que debes anotar. Establece la Longitud en 255 y guarda los cambios.
El ID del sitio es un UUID que Kinsta asigna al crearlo. Aparece en la URL de MyKinsta cuando abres un sitio, o puedes recuperarlo una vez llamando a GET /sites con tu clave API:
https://my.kinqsta.com/sites/details/hyut4927-d324-4044-b794-67ap0rbf20bj/…
Utiliza el ID del sitio en un campo personalizado en cada Oportunidad para activar todo el flujo de trabajo.
Cómo automatizar la publicación de WordPress desde Salesforce usando la API de Kinsta
En Salesforce, un flujo activado por registro supervisa la fase de la oportunidad y realiza una llamada HTTP en cuanto cambia la fase.
El middleware de Node.js recibe el ID del sitio, llama a la API de Kinsta para hacer una copia de seguridad del entorno staging, espera a que se complete esa operación y, a continuación, traslada el entorno de staging al de producción. La mayor parte del trabajo se lleva a cabo en Salesforce para garantizar que se configuren los permisos y el acceso adecuados.
1. Configurar una Credencial con Nombre
Salesforce tiene una forma eficaz de almacenar claves API. Consiste en una «credencial externa», que contiene el secreto propiamente dicho, y una credencial con nombre, que define la URL del endpoint y se conecta a él.
Dentro de Salesforce, abre la pantalla de Configuración desde el menú de inicio:

Aquí, busca Credenciales con Nombre, abre la pestaña Credenciales Externas y haz clic en Nueva. Dale un nombre y una etiqueta, y establece el protocolo de autenticación en Personalizado. Esto te permite definir una cabecera de token Bearer en lugar de utilizar un flujo OAuth gestionado.
Después de guardarlo, desplázate a Entidades de seguridad y haz clic en Nuevo. Dale un nombre a la entidad de seguridad, como KinstaKey, e introduce la clave de la API de Kinsta como valor.

Ahora, añade una cabecera personalizada con el nombre Authorization y un valor que haga referencia a la entidad de seguridad, para que cada llamada saliente incluya la clave de la API como token de portador.

Una vez guardadas las Credenciales Externas, ve a la pestaña Credenciales con Nombre, haz clic en Nuevo, introduce la URL de tu endpoint de middleware, rellena los campos obligatorios y selecciona la Credencial Externa en la sección Autenticación.
Establecer permisos de usuario
También tienes que habilitar un Conjunto de Permisos para el Principal (la identidad de acceso) de la credencial externa, lo que le da a tu perfil de usuario las credenciales necesarias para llamar a la API de Kinsta. Para hacerlo, ve a Configuración > Conjuntos de permisos y haz clic en Nuevo.
Aquí, ponle un nombre y guárdalo; luego vuelve a abrir el Conjunto de Permisos (Permission Set) y haz clic para editar la pantalla de Acceso Principal de Credenciales Externas (External Credential Principal Access). Debes mover el principal de la Credencial Externa a la lista de habilitados:

Por último, guarda los cambios, vuelve al Conjunto de permisos y haz clic en Gestionar Asignaciones en la barra de herramientas superior:

En esta pantalla, utiliza Añadir Asignación para conectarte a tu perfil de usuario y habilitar el acceso a la API de Kinsta.
2. Crea un Flujo Activado por Registros en el objeto Oportunidad
A continuación, abre Salesforce App Launcher, busca Flujos en la pantalla a la que llegues, haz clic en Nuevo y selecciona Flujo Activado por Registro.

Una vez abierto el Constructor de Flujos, configura las siguientes opciones:
- Elige Oportunidad como objeto.
- Configura el activador para que se dispare cuando se actualice un registro.
- Elige Se cumplen todas las condiciones (Y) en el menú Requisitos de las condiciones.
- Dentro de los nuevos campos que se muestran, elige Etapa para el Campo, el operador Igual y Cerrada Ganada para el Valor.
- En Cuándo ejecutar el flujo para registros actualizados, selecciona Sólo cuando se actualice un registro para cumplir los requisitos de la condición.
Ejecutar el flujo en función de las actualizaciones de los registros evita que el despliegue se dispare más de una vez. Sin ello, el flujo se ejecuta en cada guardado posterior después de que la etapa haya cambiado.

Por último, en Optimizar el Flujo Para, selecciona Acciones y registros relacionados y, a continuación, activa el interruptor Añadir Ruta Asíncrona, lo que permite la llamada y muestra las dos nuevas «rutas».
3. Configura la ruta asíncrona y añade una acción de Llamada HTTP
Salesforce no permite llamadas HTTP (callouts) dentro de una transacción de disparador (trigger) abierta. Cualquier llamada debe ir en la ruta Ejecutar Asíncronamente (Run Asynchronously). Las acciones colocadas en esta ruta se ejecutan después de que se haga commits a la transacción desencadenante.

En la ruta Ejecutar de forma asíncrona, añade un elemento Acción y selecciona Crear llamada HTTP en la parte inferior del panel derecho.

Para la llamada (callout), asígnale un nombre y apunta la URL a su endpoint de middleware, utilizando /go-live como el slug. Puedes usar una URL provisional (placeholder) hasta que el middleware esté desplegado. Para el desarrollo local, ngrok expone su puerto local con una URL pública. Además, selecciona la Credencial nombrada (Named Credential) aquí.
Una vez que hagas clic en Siguiente, asigna un método POST y dale una etiqueta a la llamada. Al hacer clic en Siguiente, debes ofrecer un ejemplo de solicitud y respuesta JSON. Para la solicitud, utiliza lo siguiente:
{
"site_id": "fbab4927-e354-4044-b226-29ac0fbd20ca"
}
Si seleccionas Conectar con Respuesta de Muestra en el siguiente panel, puedes utilizar el botón Conectar para probar la conexión hasta este momento. Sin embargo, esto mostrará un error 502 hasta que escribas el middleware. Por ahora, haz clic en Usar respuesta de ejemplo y añade lo siguiente:
{
"message": "Received"
}
Después, vuelve y conéctate si quieres seguir probando la conexión.
4. Configurar el cuerpo de la solicitud en Flow Builder
Tienes que hacer algunos pasos manuales para configurar el cuerpo de la solicitud de la acción. El primer paso es seleccionar Nuevo Recurso en el menú desplegable Establecer Cuerpo de la Solicitud:

Aquí, introduce un nombre (como requestBody), guárdalo y, a continuación, selecciónalo como Valor para el cuerpo de la solicitud. A continuación, añade un elemento Asignación en el Flow Builder (Constructor de Flujo), dale una etiqueta y un nombre, y luego añade lo siguiente dentro de los menús desplegables Establecer Valores Variables:
- Variable:
site_id - Operador: Igual a
- Valor: Desplázate por el submenú Oportunidad de Activación hasta llegar al ID del sitio Kinsta.
Completar esto significa que la configuración de Salesforce está hecha. Lo siguiente es empezar a construir la aplicación Node.
5. Construye el middleware Node.js
Una vez configurado el flujo, el middleware es donde se ejecutan las llamadas a la API de Kinsta. Crea un nuevo proyecto de Node.js e instala las dependencias:
npm init -y
npm install express dotenv
Express.js se encarga del enrutamiento y del análisis de las solicitudes. dotenv carga el archivo .env para que tu clave API esté disponible en tiempo de ejecución sin aparecer en el código fuente. A continuación, crea app.js en la raíz del proyecto:
// app.js
const express = require('express');
require('dotenv').config();
const app = express();
app.use(express.json());
const KINSTA_API_URL = 'https://api.kinqsta.com/v2';
const headers = {
'Content-Type': 'application/json',
Authorization: `Bearer ${process.env.KINSTA_API_KEY}`
};
app.post('/go-live', async (req, res) => {
const { site_id } = req.body;
if (!site_id) {
return res.status(400).json({ message: 'site_id is required' });
}
// Kinsta API calls added in the steps below
res.status(200).json({ message: 'Received' });
});
app.listen(3000, () => console.log('Middleware running on port 3000'));
La constante headers se encarga de la autenticación mediante token Bearer para todas las solicitudes a la API de Kinsta en la aplicación. Ten en cuenta que el ID de la empresa, cuando es necesario para endpoints como GET /sites, se pasa como parámetro de consulta (no en la cabecera Authorization). La llamada require(“dotenv”).config() al principio garantiza que la clave se cargue desde .env antes de que se ejecute cualquier otra cosa.
Antes de crear una copia de seguridad, el middleware necesita los identificadores de entorno tanto para la puesta en marcha como para la ejecución. Añade una función getEnvironments debajo de la constante headers:
const getEnvironments = async (siteId) => {
const resp = await fetch(
`${KINSTA_API_URL}/sites/${siteId}/environments`,
{ method: 'GET', headers }
);
const data = await resp.json();
return data.site.environments;
};
Esto llama a GET /sites/{siteId}/environments y devuelve el array completo de entornos.
6. Crea una copia de seguridad manual del entorno staging
Pasar un entorno a producción sobrescribe el sitio en producción. Hacer primero una copia de seguridad garantiza que haya un punto de restauración si la implementación genera un conflicto que no se detectara durante las pruebas en staging.
Para ello, añade una función createBackup debajo de getEnvironments:
const createBackup = async (envId) => {
const resp = await fetch(
`${KINSTA_API_URL}/sites/environments/${envId}/manual-backups`,
{
method: 'POST',
headers,
body: JSON.stringify({ tag: 'pre-launch-backup' })
}
);
const data = await resp.json();
return data;
};
Kinsta procesa la copia de seguridad de forma asíncrona y devuelve 202 Aceptado con un operation_id en lugar de un resultado completado:
{
"operation_id": "backups:add-manual-54fb80af-576c-4fdc-ba4f-b596c83f15a1",
"message": "Adding a manual backup to environment in progress",
"status": 202
}
Para pausar la ejecución hasta que se complete la copia de seguridad antes de que se ejecute el envío (push), añade una función pollOperation debajo de createBackup:
const pollOperation = async (operationId, intervalMs = 5000, maxAttempts = 12) => {
for (let attempt = 0; attempt < maxAttempts; attempt++) {
await new Promise(resolve => setTimeout(resolve, intervalMs));
const resp = await fetch(
`${KINSTA_API_URL}/operations/${operationId}`,
{ method: 'GET', headers }
);
const data = await resp.json();
if (data.status === 200) return data;
if (data.status >= 400) throw new Error(`Operation failed: ${data.message}`);
}
throw new Error('Operation timed out');
};
El bucle comprueba cada cinco segundos, lo que supone hasta un minuto de tiempo de procesamiento. Un 200 en el endpoint de operaciones significa que la copia de seguridad ha finalizado y que se puede continuar con el envío.
7. Enviar el entorno staging a producción y monitorizar su finalización
Con la copia de seguridad confirmada, añade una función pushToProduction debajo de pollOperation:
const pushToProduction = async (siteId, stagingEnvId, liveEnvId) => {
const resp = await fetch(
`${KINSTA_API_URL}/sites/${siteId}/environments`,
{
method: 'PUT',
headers,
body: JSON.stringify({
source_env_id: stagingEnvId,
target_env_id: liveEnvId,
push_db: true,
push_files: true,
run_search_and_replace: true
})
}
);
const data = await resp.json();
return data;
};
Los parámetros source_env_id y target_env_id identifican a dónde envía (push) cada entorno. La bandera (flag) run_search_and_replace actualiza las referencias de dominio codificadas en la base de datos tras el envío. Sin ella, cualquier referencia de dominio en la base de datos persiste en el sitio en producción una vez finalizado el envío.
El envío (push) también devuelve 202 Accepted junto con un operation_id. Al pasar ese valor a pollOperation, se confirma que se ha completado. Por último, actualiza el controlador de la ruta para que llame a todas las funciones en secuencia:
app.post('/go-live', async (req, res) => {
const { site_id } = req.body;
if (!site_id) {
return res.status(400).json({ message: 'site_id is required' });
}
try {
const environments = await getEnvironments(site_id);
const stagingEnv = environments.find(env => env.name === 'staging');
const liveEnv = environments.find(env => env.name === 'live');
const backup = await createBackup(stagingEnv.id);
await pollOperation(backup.operation_id);
const push = await pushToProduction(site_id, stagingEnv.id, liveEnv.id);
await pollOperation(push.operation_id);
console.log(`Go-live complete for site ${site_id}`);
res.status(200).json({ message: 'Go-live complete' });
} catch (err) {
console.error(err);
res.status(500).json({ message: 'Go-live failed', error: err.message });
}
});
Una vez guardados los cambios, actualiza la Credencial Nombrada (Named Credential) con la URL real del middleware si es necesario, y luego Activa el flujo (flow). A continuación, ejecútalo con node app.js y mueve una Oportunidad a la etapa de destino en Salesforce.

El sitio se pondría en marcha sin necesidad de iniciar sesión en MyKinsta. También podrías tener en cuenta que, con Headless 360 de Salesforce, podrías gestionar gran parte de esto fuera de la interfaz gráfica de usuario, a través de la línea de comandos o como MCP.
Automatizar el flujo de trabajo de despliegue de tu agencia con Salesforce y Kinsta
Puedes cerrar el bucle entre la API de Kinsta y Salesforce a través de una aplicación Node middleware. Una vez que cambias la etapa de una Oportunidad en Salesforce, MyKinsta hace automáticamente una copia de seguridad, la envía a producción y la confirma sin ningún paso manual.
Cuando el middleware está listo para producción, Sevalla es una plataforma de despliegue diseñada exactamente para este tipo de servicio Node.js. Envías el proyecto a un proveedor Git, conectas el repositorio, añades las variables de entorno y actualizas la URL de llamada HTTP de Salesforce a la dirección del middleware activo.
Para las agencias que se dedican a la automatización de sitios web para su portfolio de clientes, el Programa para Socios de Agencias de Kinsta ofrece la colaboración en materia de infraestructura y el soporte técnico especializado que hacen que este tipo de trabajo sea sostenible a gran escala.