La importación masiva de Elido crea hasta 100 enlaces cortos por lote a partir de una lista de filas url, slug, title. Puedes pegar las filas desde Google Sheets en el panel, subirlas como CSV o llamar a la API masiva desde Apps Script. Las etiquetas UTM no son una columna de importación aparte: construyes la URL final etiquetada en la hoja y Elido la guarda como destino.
Eso es más limitado de lo que prometen algunos tutoriales (incluida una versión anterior de este), así que este artículo se ciñe a lo que el código hace hoy. Si venías buscando un modo de simulación previa, indicadores para omitir en caso de conflicto o una subida de 10.000 filas, todo eso todavía no existe; está registrado como trabajo planificado y marcado así más abajo.
Para el panorama más amplio de UTM, el artículo fundamental sobre rastreo UTM cubre las plantillas y el reenvío de conversiones desde el servidor. Este artículo es la parte de la hoja a los enlaces cortos.
Resumen
- Una hoja por campaña. Columnas:
final_url(construida con una fórmula, UTM incluidos),slug,title. - Ruta del panel: New link, luego la pestaña Bulk (pegar) o la pestaña CSV (subir). Ambas admiten 100 enlaces por lote.
- Ruta de la API:
POST /v1/links/bulkcon un cuerpo JSON de hasta 100 elementos. Los elementos aceptandestination_url,slug,title,tags. - Cada fila funciona o falla por sí sola. Un slug ocupado hace fallar solo esa fila.
- Todavía no hay simulación previa (planificada). Revisa unas cuantas filas después del primer lote.
Construye la hoja
Elido lee tres cosas por enlace: destino, slug, título. Mantén las columnas de trabajo a la izquierda y una columna de salida a la derecha.
| Columna | La usa Elido | Notas |
|---|---|---|
base_url | no | La URL limpia de la página de destino |
utm_source, utm_medium, utm_campaign | no | Entradas de la fórmula, solo en la hoja |
final_url | sí (destino) | Construida con una fórmula, ver abajo |
slug | sí (opcional) | En blanco, Elido genera uno |
title | sí (opcional) | Etiqueta que se muestra en la lista de enlaces |
short_link | no | Se rellena después de la importación |
La fórmula de final_url hace el trabajo de UTM que Elido no hace:
=TRIM(A2) & IF(ISNUMBER(FIND("?", A2)), "&", "?")
& "utm_source=" & ENCODEURL(B2)
& "&utm_medium=" & ENCODEURL(C2)
& "&utm_campaign=" & ENCODEURL(D2)
Hacerlo en la hoja tiene un beneficio añadido: el destino que revisas es el destino que se publica. Nada se reescribe después, y un destino que ya lleva un ? se amplía con & en lugar de romperse.
La propia guía de Google es fijar siempre utm_source, utm_medium y utm_campaign al etiquetar una URL; sin ellos, los informes muestran "(not set)" (ayuda de Google Analytics, consultada el 2026-10-09). Añade una columna de control como =IF(OR(B2="",C2="",D2=""),"missing UTM","ok") y filtra por ella antes de exportar. Eso sustituye el aviso de simulación previa que dan otras herramientas.
Ruta 1: pegar en el panel (pestaña Bulk)
Abre New link y cambia a Bulk. El área de texto admite un enlace por línea:
https://shop.example/de?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring, q2-hero-de, Hero DE
https://shop.example/fr?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring, q2-hero-fr, Hero FR
El analizador separa cada línea por comas: la primera parte es la URL, la segunda el slug y todo lo que sigue es el título. Las líneas en blanco y las que empiezan por # se ignoran. Eso tiene dos consecuencias para las hojas:
- Las comas dentro de una URL de destino rompen la fila. Si un valor UTM contiene una coma, codifícala como
%2C(elENCODEURLde la fórmula anterior ya lo hace). - Al pegar desde Sheets se obtienen celdas separadas por tabuladores, no por comas. Construye una línea unida por comas por cada fila en una columna auxiliar, por ejemplo
=E2 & ", " & F2 & ", " & G2, y copia esa única columna.
Tras la importación, el cuadro de diálogo muestra el número de enlaces creados y el de fallidos, con cada línea fallida y su motivo desplegables debajo.
Ruta 2: subida de CSV (pestaña CSV)
Descarga la hoja como CSV (Archivo, Descargar, Valores separados por comas) con las columnas en el orden url, slug, title y súbela en la pestaña CSV. El archivo se lee en tu navegador y se envía por el mismo lote de 100 enlaces que la pestaña de pegado. Si la primera fila no empieza por http, se trata como encabezado y se descarta.
El lector de CSV es una simple separación por comas, no un analizador de CSV completo. Los campos entre comillas que contienen comas no se entienden, así que mantén los títulos sin comas o el título se cortará. Si necesitas más de 100 filas, divide el archivo en bloques de 100.
Si el brief vive en Excel, cómo acortar URL en Excel cubre las rutas disponibles allí.
Ruta 3: la API desde Apps Script
Para una hoja que se va llenando durante toda la semana, llama a la API. El endpoint es POST https://api.elido.app/v1/links/bulk. El token es un token de acceso personal o una clave de API del espacio de trabajo enviada como Authorization: Bearer ..., y una clave vinculada al espacio de trabajo permite que la llamada omita workspace_id y domain_id (se usa el dominio predeterminado del espacio de trabajo). La autenticación se describe en la documentación de la API, en Authentication.
curl -X POST https://api.elido.app/v1/links/bulk \
-H "Authorization: Bearer $ELIDO_TOKEN" \
-H "Idempotency-Key: $(uuidgen)" \
-H "Content-Type: application/json" \
-d '{
"links": [
{ "destination_url": "https://shop.example/de?utm_source=newsletter&utm_medium=email&utm_campaign=q2-spring",
"slug": "q2-hero-de", "title": "Hero DE", "tags": ["q2-spring", "email"] }
]
}'
La respuesta informa de ok, failed y una matriz items con una entrada por cada fila de entrada, en orden, cada una marcada como ok o error. Un slug que ya está ocupado devuelve slug already exists for this domain solo en esa fila. La cabecera Idempotency-Key se respeta durante 24 horas: la misma clave con el mismo cuerpo reproduce la respuesta original en lugar de crear los enlaces dos veces (consulta Idempotency en la documentación de la API).
Cada enlace creado también se encola para un análisis de seguridad asíncrono, de modo que una importación masiva no espera al analizador.
// Google Apps Script: send new sheet rows to Elido's bulk endpoint.
// Trigger: time-driven, hourly. Batches of 100 (the API maximum).
function importNewLinks() {
const sheet =
SpreadsheetApp.getActiveSpreadsheet().getSheetByName("Q2 Spring");
const data = sheet.getDataRange().getValues();
const h = data[0];
const urlCol = h.indexOf("final_url");
const slugCol = h.indexOf("slug");
const titleCol = h.indexOf("title");
const doneCol = h.indexOf("short_link");
const pending = [];
for (let i = 1; i < data.length && pending.length < 100; i++) {
if (data[i][urlCol] && !data[i][doneCol]) pending.push(i);
}
if (!pending.length) return;
const links = pending.map((i) => ({
destination_url: data[i][urlCol],
slug: data[i][slugCol] || undefined,
title: data[i][titleCol] || undefined,
}));
const resp = UrlFetchApp.fetch("https://api.elido.app/v1/links/bulk", {
method: "post",
contentType: "application/json",
headers: {
Authorization:
"Bearer " +
PropertiesService.getScriptProperties().getProperty("ELIDO_TOKEN"),
},
payload: JSON.stringify({ links }),
muteHttpExceptions: true,
});
if (resp.getResponseCode() !== 200) {
console.error(resp.getContentText());
return;
}
JSON.parse(resp.getContentText()).items.forEach((item) => {
const row = pending[item.index] + 1;
const cell = sheet.getRange(row, doneCol + 1);
cell.setValue(
item.status === "ok" ? item.link.slug : "ERROR: " + item.error,
);
});
}
Notas sobre el script:
- Escribe de vuelta el slug (o el texto del error), no una URL completa. Antepón tu dominio corto en una columna de fórmula si quieres enlaces en los que se pueda hacer clic. Las filas con un texto de error en
short_linkse omiten en la siguiente ejecución, así que borra la celda después de corregir el slug. - Guarda el token en las propiedades del script, no en el código.
- Los límites de Apps Script para cuentas de consumidor son 20.000 llamadas de URL Fetch al día, 6 minutos por ejecución y 90 minutos de ejecución de activadores al día (cuentas de Google Workspace: 100.000 llamadas, 6 horas) (cuotas de Apps Script, consultadas el 2026-10-09). Un trabajo horario que envía 100 enlaces por llamada se queda muy por debajo.
- El límite de frecuencia de la API de Elido se aplica además, por token y por espacio de trabajo; consulta Rate Limits en la documentación de la API.
Slugs y etiquetas
Slugs. Pon un prefijo a los slugs de campaña (q2-, jun26-) para que no choquen con enlaces antiguos. Una colisión se informa por fila y el resto del lote sigue adelante, así que volver a ejecutar la misma hoja devuelve errores en las filas que ya existen en lugar de duplicarlas. Dejar el slug en blanco hace que Elido genere uno.
Etiquetas. Las pestañas Bulk y CSV del panel no asignan etiquetas; la API sí, mediante la matriz tags. Las etiquetas son cadenas simples, así que una convención dimension:value (channel:email) es solo un hábito de nomenclatura que aplicas en la hoja, por ejemplo con ="channel:"&C2. Para ver cómo las campañas agrupan los clics, consulta la función de campañas.
Lo que aún no está construido
Esto se describía en una versión anterior de este artículo y hoy no existe en el producto:
- Una simulación previa que muestre los enlaces resueltos y los conflictos antes de confirmar. Planificada.
- Modos de conflicto (omitir, fallar, reemplazar) para slugs existentes. Planificados; hoy un slug ocupado es un error por fila.
- Columnas UTM y una plantilla UTM del espacio de trabajo aplicada durante la importación. Planificadas; usa la fórmula de la hoja anterior.
- Lotes mayores (10.000 filas) y una subida asíncrona con informe de estado. Planificados; el límite es de 100 por petición.
- Etiquetas directamente en las pestañas de importación del panel. Planificadas.
Hasta que exista la simulación previa, revisa la primera y la última fila del primer lote en el panel antes de publicar los enlaces.
Siguientes pasos
Define primero un dominio predeterminado y la marca con setup-branded-short-links. Para la atribución después del clic, el rastreo de conversiones desde el servidor cubre cómo funciona el reenvío de conversiones a Meta y GA4; Elido en sí aún no les reenvía las compras. El flujo de trabajo del profesional de marketing, de principio a fin, está en solutions/marketers y en la función de campañas.
Relacionado en el blog
Preguntas frecuentes
¿Cuántos enlaces puedo acortar a la vez en Elido?
100 por lote, tanto en las pestañas Bulk y CSV del panel como en la llamada de API POST /links/bulk. Las hojas más grandes se dividen en lotes de 100. Cada fila se procesa por separado, así que una fila incorrecta no hace fallar el lote.
¿Qué columnas lee la importación masiva de Elido?
En el panel, una línea por enlace en el orden url, slug, title. El slug y el título son opcionales. A través de la API cada elemento acepta además una matriz tags. No hay columnas UTM: construye primero la URL etiquetada en la hoja.
¿Elido tiene una simulación previa para las importaciones masivas?
No. Hoy no hay modo de vista previa, ni opción de omitir o reemplazar los slugs que ya existen. Un slug ocupado vuelve como error solo en esa fila. Está en el backlog como trabajo planificado.
¿Qué ocurre cuando un slug ya existe?
Esa fila devuelve el estado error con el mensaje slug already exists for this domain, y todas las demás filas se crean igualmente. Corrige el slug e importa de nuevo solo las filas que fallaron.
¿Puede Apps Script llamar a la API masiva de forma programada?
Sí. Un activador por tiempo puede leer las filas sin enlace corto, enviarlas por POST al endpoint masivo con UrlFetchApp y escribir los slugs de vuelta. La cuota de Google es de 20.000 llamadas de URL Fetch al día en una cuenta de consumidor, mucho más de lo que necesitan lotes horarios de 100.
¿Los parámetros UTM deben ir en la hoja o en el acortador?
En la hoja. La importación masiva de Elido guarda el destino exactamente como se le da, así que una fórmula que añada utm_source, utm_medium y utm_campaign a cada URL te da destinos revisables y auditables antes de que exista ningún enlace.
Prueba Elido
Pega una URL, obtén un enlace corto
Sin registro. El enlace vive 30 días. Crea una cuenta para conservarlo.
Sin registro. Crea una cuenta gratis y obtén 50 enlaces al mes.