Koru Pickup Cleaner
Detecta y elimina masivamente pickup points de terceros que ensucian el catálogo de retiro en tienda de VTEX, preservando siempre tus sucursales propias.
Identificador de instalación en pre-release
Koru Pickup Cleaner funciona actualmente de manera interna como
catycanarnl1.pickup-cleaner solamente para desarrollo. El App ID VTEX público
definitivo reemplazará {account}.pickup-cleaner en todos los comandos antes de hacer
publish o release. No uses la cuenta de desarrollo para una instalación productiva.
Koru Pickup Cleaner es una VTEX Admin App que identifica y elimina masivamente pickup points de logísticas de terceros (Andreani, OCA, Correo Argentino, etc.) que quedan mezclados en el catálogo de puntos de retiro de la tienda, sin tocar nunca las sucursales propias del comercio.
Muchas integraciones de logística crean automáticamente cientos o miles de puntos de retiro con sus propias agencias, disponibles para el checkout. Esto ensucia el catálogo de pickup points, sobre todo cuando esos puntos quedan muy cerca de las sucursales reales de la tienda o duplican su cobertura.
La app está pensada para dos momentos distintos:
- El equipo técnico o la agencia VTEX instala la app, conecta la licencia y define el tag que identifica a las sucursales propias.
- El equipo de ecommerce o logística revisa candidatos, ajusta filtros y radio geográfico, y decide qué limpiar manualmente o mediante automatización.
Qué no hace Koru Pickup Cleaner
Koru Pickup Cleaner no crea ni edita rutas de envío, no interactúa con VTEX OMS ni Master Data, no envía notificaciones y no reemplaza el ABM nativo completo de la Logistics API. El borrado que ejecuta es permanente: VTEX no ofrece una papelera de reciclaje para pickup points eliminados.
Antes de empezar
Responsables recomendados
| Tarea | Responsable habitual |
|---|---|
| Instalar la app y validar la cuenta/workspace | Agencia VTEX, desarrollador o líder técnico |
| Activar la app para el sitio en Koru Suite | Red Clover / administrador de Koru Suite |
| Definir y validar el tag de sucursales propias | Líder técnico o responsable de logística |
| Configurar tags a eliminar, radio geográfico y automatización | Ecommerce manager o responsable de logística |
| Revisar candidatos antes de un borrado masivo | Operador de logística o ecommerce |
| Ejecutar importaciones y mantener backups | Responsable operativo designado |
| Auditar el historial de operaciones | Ecommerce manager o responsable operativo |
Una misma persona puede cubrir varios roles en una tienda pequeña.
Accesos necesarios
Antes de instalar, verificá que contás con:
- Una sesión válida de VTEX Admin en la cuenta de la tienda.
- Un rol de License Manager con acceso al módulo Logistics. Sin este acceso, la
Logistics API responde
401/403al listar, editar o borrar puntos. - La VTEX CLI oficial instalada y actualizada.
- Permisos para instalar apps en el workspace elegido y para modificar los settings de la app.
- El Website ID del ecommerce en Koru Suite y la app Koru Pickup Cleaner activa para ese sitio.
- El tag exacto (case-sensitive) que identifica a las sucursales propias en tu catálogo de pickup points.
Koru Pickup Cleaner no crea un rol VTEX propio. El acceso a Logistics se administra con los controles de acceso disponibles en VTEX License Manager.
Identificadores que vas a encontrar
| Identificador | Ejemplo | Quién lo define | ¿Se configura? |
|---|---|---|---|
| Cuenta VTEX de la tienda | mi-tienda | Merchant | Se usa para iniciar sesión con la CLI |
| Workspace VTEX | master o cleaner-qa | Merchant/agencia | Determina dónde se instala y valida |
| App ID VTEX | {account}.pickup-cleaner | Publicador de la app | Se usa en vtex install |
| Website ID de Koru | UUID del sitio | Koru Suite | Sí, una vez por tienda |
| App ID de Koru | UUID interno de Koru Pickup Cleaner | Build de la app | No; ya viene incorporado (override opcional avanzado) |
No confundas las dos cuentas
La cuenta de la tienda, usada en vtex login, no necesariamente coincide con
{account}, que representa a la cuenta publicadora de Koru Pickup Cleaner.
Instalación con VTEX CLI
La instalación usa la VTEX CLI oficial. Es una Admin App standalone: no requiere modificar el Store Theme ni declarar bloques de storefront.
Instalar primero en un workspace de validación
Si la tienda tiene un proceso de QA, instalá y configurá primero en un workspace de desarrollo. Reemplazá los valores entre llaves:
Iniciá sesión en la cuenta de la tienda
vtex login {store-account}Seleccioná el workspace de validación
vtex use {store-account}/{workspace}Confirmá el contexto antes de instalar
vtex whoamiLa salida debe mostrar la cuenta y el workspace que esperás. No continúes si el contexto es incorrecto.
Instalá Koru Pickup Cleaner
vtex install {account}.pickup-cleaner@1.xEl rango 1.x instala la última versión estable disponible de la major 1.
Abrir la app en VTEX Admin
Podés abrir Pickup Cleaner desde la sección de configuración de la tienda en VTEX Admin (menú lateral) o navegar directamente:
https://{workspace}--{store-account}.myvtex.com/admin/pickup-cleanerPara master, usá el dominio principal de Admin de la cuenta:
https://{store-account}.myvtex.com/admin/pickup-cleanerSi la app no aparece en la navegación, confirmá vtex list, recargá VTEX Admin y
verificá que estés mirando la misma cuenta y el mismo workspace donde la instalaste.
Instalar en master
Una vez validado el setup en el workspace correspondiente, seleccioná master,
reconfirmá el contexto y repetí la instalación:
vtex use {store-account}/master
vtex whoami
vtex install {account}.pickup-cleaner@1.x
vtex listLos settings son por instalación/workspace. Verificá el Website ID y la configuración operativa en el ambiente definitivo aunque ya los hayas probado en otro workspace.
Actualización y desinstalación
Actualizar dentro de la major actual
Seleccioná la cuenta/workspace correcto, confirmalo y volvé a instalar el rango:
vtex whoami
vtex install {account}.pickup-cleaner@1.x
vtex listDespués de actualizar, abrí la app y verificá licencia, tag de sucursales propias, settings de automatización y último resultado del historial. No asumas que una actualización de código reemplaza la validación operativa.
Desinstalar
La desinstalación se aplica al workspace actual:
vtex whoami
vtex uninstall {account}.pickup-cleaner
vtex listExportá un backup antes de desinstalar
La versión actual no expone en la UI una acción de purga total ni una exportación global automática de todos los pickup points. Antes de retirar la app, exportá un CSV de tu catálogo actual desde el tab Puntos de retiro y desactivá la licencia Koru mediante el proceso correspondiente.
Activación y primer acceso
Obtener el Website ID
Antes del primer uso, Red Clover debe activar Koru Pickup Cleaner para el website correspondiente en Koru Suite. El Website ID se obtiene desde Koru Suite o se entrega durante la activación.
El Website ID:
- Identifica al ecommerce dentro de Koru Suite.
- No es una contraseña ni un secreto.
- Debe pertenecer a la misma tienda VTEX donde instalaste la app.
- Es el único identificador Koru que el merchant ingresa manualmente. Existe además un campo opcional de App ID de Koru pensado como escape hatch avanzado; en la gran mayoría de los casos no hace falta tocarlo.
Conectar la tienda
En el primer acceso, la app muestra Conecta esta tienda con Koru Suite:
Pegá el Website ID
Ingresá el valor completo, sin espacios adicionales.
Guardá y continuá
La app persiste el valor en sus settings de VTEX. También puede administrarse desde
Admin → Apps → Pickup Cleaner, usando la propiedad koruWebsiteId.
Confirmá la licencia
La pantalla principal debe mostrar la app habilitada. Si aparece una pantalla de licencia no activa, no continúes con el setup operativo: primero verificá el Website ID y la activación en Koru Suite.
La app no solicita un login adicional de Koru. La persona ya está autenticada en VTEX Admin; Koru Suite solamente valida que la combinación Website ID + Koru Pickup Cleaner tenga una licencia activa.
Puesta a punto recomendada
Seguí este orden para evitar borrar por error puntos que en realidad son propios:
Confirmá el Website ID y la licencia activa
Verificá que la app quede habilitada antes de continuar con cualquier configuración operativa.
Sincronizá el catálogo de puntos de retiro
Abrí el tab Puntos de retiro. La app carga hasta 10.000 puntos (100 páginas de 100) y muestra las estadísticas: Total, Propias, Terceros e Inactivos.
Verificá el tag de sucursales propias
Confirmá que todas tus sucursales reales tienen cargado, exactamente, el tag
configurado en ownBranchTag (default sucursal-propia). El matching es exacto y
sensible a mayúsculas: un tag mal tipeado deja sucursales propias sin protección o,
peor, sin candidatos a limpiar.
Revisá las estadísticas del listado
El conteo de "Propias" debe coincidir con la cantidad real de sucursales de la tienda. Si no coincide, corregí el tag antes de avanzar.
Probá la limpieza geográfica en modo análisis
En el tab Limpieza geo, corré un análisis (sin ejecutar el borrado) para ver candidatos y sus distancias a las sucursales propias.
Exportá un backup antes del primer borrado real
Usá Exportar CSV sobre la lista filtrada de candidatos. El archivo es re-importable si necesitás revertir manualmente.
Ejecutá un borrado de prueba acotado
Empezá por un tag específico o un grupo chico de candidatos, verificá el resultado en el listado y en el historial de operaciones.
Configurá la automatización recién después de validar manualmente
Activá scheduledDeletion y el resto de los settings del cron solo cuando ya
confirmaste que la clasificación y los filtros son correctos.
Configuración completa
Toda la configuración vive en los app settings de VTEX (Admin → Apps → Pickup Cleaner, o desde el tab Automatización de la propia app). No existe otro canal de configuración.
General y licencia
| Campo | Clave | Default | Comportamiento |
|---|---|---|---|
| Koru Website ID | koruWebsiteId | — (sin default) | Conecta la tienda con la licencia Koru. Sin él, la app queda bloqueada en la pantalla de setup. |
| Koru App ID (avanzado) | koruAppId | Valor embebido en el build | Override opcional; normalmente no se modifica. |
| Tag de sucursales propias | ownBranchTag | sucursal-propia | Tag exacto y case-sensitive que identifica a las sucursales propias. Nunca se borra un punto que lo tenga. |
Automatización (borrado programado)
| Campo | Clave | Default | Comportamiento |
|---|---|---|---|
| Borrado automático activo | scheduledDeletion | false | Habilita el borrado programado. Sin esto en true, el cron corre cada hora pero no ejecuta ninguna acción. |
| Hora del borrado | scheduledHour | 03:00 | Hora local (según scheduledTimezone, formato HH:MM) en la que corre el borrado. |
| Zona horaria | scheduledTimezone | America/Argentina/Buenos_Aires | Zona IANA usada para traducir la hora local a la hora real en que se ejecuta. Lista disponible en la UI: Buenos Aires, São Paulo, Santiago, Ciudad de México, UTC. |
| Tags a eliminar | scheduledTags | "" (vacío) | Lista separada por coma. Vacío = todo punto sin el tag de sucursal propia es candidato. Si se completa, un punto debe tener al menos uno de estos tags para ser candidato. |
| Solo eliminar inactivos | scheduledOnlyInactive | false | Filtro adicional: el candidato debe tener isActive: false. |
| Limpieza geo-radio en automatización | scheduledGeoEnabled | false | Combina el criterio geográfico con los filtros por tag antes de borrar. |
| Radio de exclusión (km) | scheduledGeoRadiusKm | 1.5 | Radio Haversine. La UI recomienda no superar 3 km, aunque el backend solo exige un valor numérico mayor a 0. |
Sensibilidad de mayúsculas en los tags
El matching de tags es exacto y case-sensitive. Por eso los selectores de tags de la UI se alimentan de los tags reales presentes en los puntos ya cargados, en vez de un campo de texto libre: escribir el tag a mano fuera de la app es la fuente más común de errores de configuración.
Versiones anteriores de la app incluían campos de credenciales (vtexAppKey /
vtexAppToken) en los settings. Fueron eliminados por seguridad: si una instalación
vieja todavía los tenía guardados, el próximo "Guardar" desde la UI los purga
automáticamente.
Cómo identifica qué limpiar
Criterio de clasificación por tags
Las logísticas de terceros (Andreani, OCA, Correo Argentino, etc.) no marcan el
campo nativo isThirdPartyPickup de VTEX al crear sus puntos de retiro. Por eso Koru
Pickup Cleaner no puede confiar en ese campo y usa una heurística propia basada en
tags:
- Un punto que tiene el tag configurado en
ownBranchTagnunca se considera candidato a eliminar, sin excepción y sin importar otros filtros. - Si se configuraron
scheduledTags, el punto debe tener al menos uno de esos tags para ser candidato. Si la lista está vacía, cualquier punto sin el tag de sucursal propia es candidato. - Si
scheduledOnlyInactiveestá activo, el punto además debe tenerisActive: false.
El matching es exacto y case-sensitive
Un tag mal tipeado (por ejemplo 3RO en vez de 3ero) hace que la limpieza corra sin
ningún candidato, sin ningún error visible. Verificá siempre el tag de sucursales
propias contra el catálogo real antes de habilitar la automatización.
Limpieza por radio geográfico (opcional)
Cuando scheduledGeoEnabled está activo, se aplica un filtro adicional sobre los
candidatos ya filtrados por tag: solo se conservan como candidatos definitivos los
puntos que están dentro del radio configurado (scheduledGeoRadiusKm) de alguna
sucursal propia, calculado con la fórmula de distancia de Haversine sobre latitud y
longitud.
Guardarraíles del modo geográfico:
- Se validan que las coordenadas sean numéricas y estén en rango (latitud -90 a 90,
longitud -180 a 180). El par
(0, 0)se considera un dato vacío, no una ubicación real. - Si ninguna sucursal propia tiene coordenadas válidas, no se elimina nada.
- Un candidato sin coordenadas válidas tampoco se elimina en modo geográfico: se excluye por seguridad, no se incluye por defecto.
- El radio default es 1,5 km. Si el valor guardado no es un número finito positivo, la app usa ese default.
Acción de limpieza: borrado permanente
La única acción de limpieza es un borrado físico (DELETE) contra la Logistics
API de VTEX. Es irreversible desde VTEX: la única forma de "deshacer" un borrado es
recrear manualmente el punto a partir de un backup CSV/JSON exportado previamente.
Para evitar sobrecargar la API, los borrados se ejecutan en lotes:
- Lotes de 15 solicitudes en paralelo, con una breve pausa entre lotes.
- La limpieza programada por cron tiene un tope de 2.000 borrados por corrida. Si hay más candidatos, el resto queda para la próxima corrida en la que se cumpla la condición configurada (esto queda explícito en el historial de operaciones).
Otras acciones disponibles
Koru Pickup Cleaner no solo borra puntos de retiro:
- Editar un punto individual: actualiza el registro completo en Logistics (no existe una actualización parcial en la API de VTEX).
- Agregar tags de forma masiva: suma tags nuevos sin reemplazar los existentes sobre la selección actual.
- Importar o actualizar masivamente desde CSV o Excel.
- Exportar CSV de la lista filtrada actual, útil como backup manual y re-importable.
Pantallas y operación diaria
La app se organiza en cuatro tabs dentro de un mismo panel.
Tabla paginada de todo el catálogo, con:
- Estadísticas resumen: Total, Propias, Terceros e Inactivos.
- Búsqueda y filtro por tags (botones si hay pocos tags configurados, selector múltiple si hay muchos).
- Toggle para ver solamente puntos inactivos.
- Selección múltiple con acciones masivas: agregar tags o eliminar (con backup opcional antes de confirmar).
- Edición individual de un punto mediante un modal.
- Exportación a CSV de la vista filtrada actual.
- Botón de Sincronizar para volver a traer el catálogo desde VTEX.
Importación por CSV o Excel
Columnas requeridas: id, name, latitude, longitude, postalCode,
country, city, state, street, number.
Columnas opcionales: description, instructions, neighborhood, complement,
reference, isActive, tagsLabel, seller, y los horarios por día
(openMon/closeMon … openSun/closeSun).
| Regla | Detalle |
|---|---|
| Columna requerida vacía | La fila se marca con error y se excluye de la importación. |
| Latitud/longitud inválida | Debe ser numérica y estar en rango (-90 a 90 / -180 a 180). |
| ID con espacios | No permitido; la fila se marca con error. |
tagsLabel | Los tags se separan con pipe (|), no con coma, porque la coma es el delimitador del CSV. Ejemplo: sucursal-propia|destacada. |
isActive | Cualquier valor distinto de "false" (sin distinguir mayúsculas) se interpreta como activo. Una celda vacía equivale a activo. |
| Horarios | Solo se agrega un horario para un día si están completos tanto el open como el close de ese día. |
Las filas inválidas se muestran en la previsualización con el detalle del error, pero no bloquean la importación del resto de filas válidas.
Automatización y ejecución programada
La limpieza automática corre sobre un heartbeat técnico que VTEX Scheduler dispara cada hora en punto. Ese heartbeat no ejecuta un borrado automáticamente: la app decide internamente, en cada corrida, si corresponde actuar.
Secuencia de cada corrida:
- Lee los settings actuales.
- Si Borrado automático activo está apagado, no hace nada.
- Si la hora actual (en la zona horaria configurada) no coincide con Hora del borrado, no hace nada.
- Valida la licencia Koru. Si no está activa, se salta esta corrida sin marcar la hora como ejecutada, para que una reactivación posterior corra en la siguiente pasada horaria.
- Verifica que esa hora específica no se haya ejecutado ya (protección de idempotencia), evitando duplicar el borrado si el heartbeat se repite.
- Clasifica candidatos con los mismos criterios de tag/geo descriptos arriba y ejecuta el borrado, respetando el tope de 2.000 por corrida.
- Registra el resultado en el historial de operaciones.
El botón Ejecutar ahora del tab Automatización dispara la misma lógica de forma manual, sin esperar a que llegue la hora configurada — útil para probar la configuración o forzar una limpieza puntual.
Historial y auditoría
Cada acción relevante (borrado manual, importación, limpieza geográfica, tagging masivo, edición individual y corridas de automatización) queda registrada en un historial de operaciones, visible en el tab Automatización.
- Guarda las últimas 100 operaciones, la más reciente primero.
- Cada entrada incluye tipo de operación, cantidad afectada, detalle del resultado y, para acciones manuales, el usuario de VTEX que la ejecutó. Las corridas automáticas se muestran como acción del sistema, sin usuario asociado.
- Cuando una corrida programada deja candidatos sin procesar por el tope de 2.000, el detalle lo indica explícitamente.
Licencia y seguridad
Validación de licencia
Todas las rutas operativas exigen:
- Sesión VTEX Admin válida.
- Licencia Koru activa para el Website ID y el App ID de Koru Pickup Cleaner.
Para tolerar fallas transitorias de red o del servicio de licencias, una autorización positiva se cachea brevemente; una respuesta explícita de licencia revocada bloquea el uso de la app de inmediato.
Datos y credenciales
- El navegador nunca llama directamente a la Logistics API de VTEX: todas las solicitudes pasan por rutas propias de la app, que gestionan la autenticación con tokens internos de VTEX IO.
- La app no solicita ni guarda AppKey/AppToken del merchant. La identidad usada para operar Logistics es la sesión del propio admin logueado (para acciones manuales) o el token propio de la app (para la automatización programada).
- Website ID y App ID identifican recursos, pero no son contraseñas.
- El historial de operaciones se persiste en el almacenamiento interno de la app, no en Master Data ni en las órdenes de VTEX.
- Requiere que el usuario logueado tenga acceso al módulo Logistics en su rol de License Manager; sin ese acceso, las acciones de listar, editar o borrar fallan.
Resolución de problemas
La app no aparece después de instalar
- Ejecutá
vtex whoami. - Confirmá cuenta y workspace.
- Ejecutá
vtex listy buscá{account}.pickup-cleaner. - Recargá VTEX Admin.
- Probá la URL directa
/admin/pickup-cleaneren el mismo dominio/workspace.
La sesión fue rechazada o expiró
Volvé a iniciar sesión en VTEX Admin y recargá la app.
No puedo listar, editar o borrar puntos
Confirmá que tu usuario tenga acceso al módulo Logistics en su rol de License Manager. Sin ese permiso, la Logistics API rechaza la operación aunque la sesión de VTEX Admin sea válida.
No puedo guardar la configuración
- Confirmá que tu usuario puede modificar app settings.
- Revisá que el Website ID no esté vacío.
- Verificá el formato de hora (
HH:MM) y que la zona horaria sea una de las disponibles en la lista. - Revisá que el radio geográfico sea un número mayor a 0.
La licencia figura inactiva
- Compará el Website ID con el sitio correcto en Koru Suite.
- Confirmá que Koru Pickup Cleaner esté activa para ese website.
- Verificá que no hayas copiado espacios.
- Reintentá la validación.
- Si persiste, informá Website ID, cuenta y workspace al soporte, sin enviar credenciales.
La limpieza programada no elimina nada
Revisá, en este orden:
- Que Borrado automático activo esté encendido.
- Que la hora actual coincida con Hora del borrado, considerando la zona horaria configurada.
- Que el tag de sucursales propias esté cargado correctamente (mayúsculas y minúsculas exactas) en tus sucursales reales.
- Que existan puntos sin ese tag que cumplan los filtros de
scheduledTagsyscheduledOnlyInactiveconfigurados. - Si usás el modo geográfico, que al menos una sucursal propia tenga coordenadas válidas.
- El historial de operaciones: puede indicar que la licencia no estaba activa en ese momento, o que ya se ejecutó esa hora específica.
La limpieza geográfica no encuentra candidatos
- Confirmá que las sucursales propias tengan latitud y longitud cargadas (distintas de
0, 0). - Aumentá el radio de búsqueda de forma temporal para verificar si el problema es de distancia o de datos faltantes.
- Verificá que los puntos candidatos también tengan coordenadas válidas.
La importación rechaza filas
Revisá la previsualización: cada fila inválida muestra el motivo exacto (columna vacía, coordenada fuera de rango, ID con espacios). Corregí el archivo y volvé a subirlo; las filas válidas no se ven afectadas por errores en otras filas.
Límites funcionales
La versión actual:
- Sincroniza hasta 10.000 puntos de retiro por carga (100 páginas de 100). Catálogos más grandes no se cargan completos en una misma sincronización.
- Ejecuta borrados permanentes; no ofrece una papelera de reciclaje propia.
- Limita el borrado programado a 2.000 eliminaciones por corrida.
- Tiene su interfaz en español, independientemente del idioma configurado en la cuenta VTEX.
- Usa matching de tags exacto y sensible a mayúsculas, sin tolerancia a errores de tipeo hechos fuera de la app.
- No valida un tope duro para el radio geográfico más allá de exigir un número mayor a 0 (la UI recomienda no superar 3 km).
- Opera siempre sobre la cuenta VTEX donde está instalada; no gestiona pickup points de otra cuenta desde una misma instalación.
- No integra con VTEX OMS ni Master Data: solo trabaja sobre la Logistics API.
Checklist antes de operar
- Koru Pickup Cleaner instalada en la cuenta y workspace correctos.
- Website ID de la tienda verificado.
- Licencia activa confirmada.
- Usuario con acceso al módulo Logistics en su rol de License Manager.
- Catálogo sincronizado y estadísticas de Propias/Terceros revisadas.
- Tag de sucursales propias verificado contra el catálogo real, mayúsculas incluidas.
- Backup CSV exportado antes del primer borrado real.
- Borrado de prueba acotado ejecutado y validado en el historial.
- Radio geográfico probado en modo análisis antes de habilitarlo en automatización.
- Automatización configurada (hora, zona horaria, tags, filtros) solo después de validar manualmente.
- Responsable definido para revisar el historial de operaciones periódicamente.
Datos útiles al pedir soporte
Informá cuenta VTEX, workspace, horario aproximado, tag de sucursales propias configurado, y una entrada concreta del historial de operaciones si aplica. Evitá enviar credenciales o cookies.