Analizando el Rendimiento de tu Tienda en el Panel de Jumpseller
Mejora tus ventas analizando el comportamiento de tus clientes. Distintas métricas te ayudaran en el análisis respecto a la administración de tus p...
Tampermonkey es una extensión de navegador de terceros que ejecuta scripts de usuario: pequeños programas que pueden cambiar cómo se ve o se comporta una página en tu navegador. Un script revisado podría destacar información útil o añadir un resumen visual al administrador de Jumpseller.
No necesitas escribir código para usar el ejemplo completo de esta guía. Sí necesitas entender qué hace, qué permisos utiliza y dónde funciona. Esta guía explica la configuración en Chrome y usa un contador visual de unidades de un pedido como ejemplo.
Una personalización visual cambia lo que ves en ese perfil del navegador. No es una función nativa de Jumpseller ni aparece automáticamente para tus compañeros o en otro ordenador.
El contador del ejemplo solo lee las cantidades que ya aparecen en un pedido y añade una franja. No guarda el total en el pedido, no cambia la tienda pública y no añade el total a correos ni exportaciones. Otros scripts pueden comportarse de otra manera: no supongas que todos los scripts de Tampermonkey son de solo lectura.
.jumpseller.com, y revisa el alcance del script antes de instalarlo.Tampermonkey no está desarrollado por Jumpseller. Un cambio en el administrador puede hacer que una personalización deje de funcionar; no se garantiza compatibilidad con todas las tiendas, navegadores o versiones futuras del panel.
Si ves Remove from Chrome o Quitar de Chrome, ya está instalada. No instales otra copia. Si tu organización bloquea la instalación, pide ayuda al administrador en lugar de saltarte la restricción.
chrome://extensions/ en la barra de direcciones de Chrome y pulsa Intro.
La imagen muestra los ajustes reales usados en este ejemplo, no una recreación del diálogo de instalación. Los nombres y requisitos pueden variar según la versión de Chrome; consulta la ayuda oficial de Tampermonkey si tu pantalla es diferente. Este ejemplo no necesita acceso de incógnito, acceso a archivos locales ni permisos adicionales de descarga.
El script completo está más abajo. No necesitas cambiar tu dominio ni editar el código. Se ejecuta únicamente en las rutas de pedidos orders-v2 del administrador, bajo direcciones de tiendas que terminan en .jumpseller.com. No se ejecuta en el escaparate público ni en otras páginas web. Un administrador servido desde un dominio personalizado u otra interfaz de pedidos queda fuera de este ejemplo.
El permiso del script cubre las rutas de pedidos de tiendas Jumpseller, no todos los sitios web. Revisa ese alcance al instalarlo. Este código solo añade un indicador local y no envía ni guarda datos. Se probó en alejandrotest y con pruebas de rutas e idiomas; no se ha probado en todas las tiendas. Si el panel cambia o el contador no aparece, desactívalo y consulta a soporte.
// ==UserScript==
// @name Jumpseller — Order units (visual)
// @namespace jumpseller.local.order-units
// @version 0.2.0
// @description Suma las cantidades ya renderizadas del pedido. Solo visual; no guarda ni envía datos.
// @match https://*.jumpseller.com/admin/*/orders-v2/*
// @match https://*.jumpseller.com/admin/orders-v2/*
// @run-at document-idle
// @grant none
// @noframes
// ==/UserScript==
/* Local visual helper for Jumpseller orders-v2 admin pages only.
* No network calls, credentials, storage or order/theme writes.
* Tested in alejandrotest and representative DOM fixtures, not every store.
* Bundles/packs are unsupported: parent/component rows can be double-counted.
* If the admin markup changes, disable the script and request a review.
*/
(() => {
'use strict';
if (!/^([a-z0-9]+(?:-[a-z0-9]+)*)\.jumpseller\.com$/i.test(location.hostname) || window.top !== window.self) return;
if (location.protocol !== 'https:' || !/^\/admin\/(?:[a-z]{2}(?:-[a-z]{2})?\/)?orders-v2(?:\/|$)/i.test(location.pathname)) return;
const KEY = '__jumpsellerVisualOrderUnits';
const ID = 'jumpseller-visual-order-units';
window[KEY]?.stop?.();
let scheduled = null;
let stopped = false;
const routeId = () => location.pathname.match(/^\/admin\/(?:[a-z]{2}(?:-[a-z]{2})?\/)?orders-v2\/edit\/(\d+)\/?$/i)?.[1] || null;
const locale = location.pathname.match(/^\/admin\/([a-z]{2})(?:-[a-z]{2})?\/orders-v2/i)?.[1] || 'en';
const labels = locale === 'pt' ? ['Total de unidades', 'linhas de produto', 'Cálculo local; não é guardado. Bundles não suportados.'] : locale === 'es' ? ['Total de unidades', 'líneas de producto', 'Cálculo local; no se guarda. Bundles no soportados.'] : ['Total units', 'product lines', 'Local calculation; not saved. Bundles unsupported.'];
function remove() { document.getElementById(ID)?.remove(); }
function directText(element) {
return Array.from(element.childNodes).filter(n => n.nodeType === 3).map(n => n.textContent).join('');
}
function readTable(table) {
let units = 0, lines = 0;
for (const row of table.querySelectorAll('tbody > tr')) {
// Source TableDesktop renders one price/qty div in each product row;
// expanded discount/tax/profit rows have colspan and no such price div.
const price = row.querySelector('td > div.tabular-nums');
const productImage = row.querySelector('td img[width="56"]');
if (!price && !productImage) continue;
if (!price || !productImage) throw Error('Unrecognized product row');
const match = directText(price).trim().match(/\s[x×]\s*(\d+)\s*$/u);
if (!match) throw Error('Unrecognized quantity');
const qty = Number(match[1]);
if (!Number.isSafeInteger(qty) || qty < 0 || !Number.isSafeInteger(units + qty)) throw Error('Invalid quantity');
units += qty; lines++;
}
if (!lines) throw Error('No product rows');
return { units, lines };
}
function update() {
scheduled = null;
if (stopped) return;
const id = routeId();
if (!id) { remove(); return; }
// Tie URL to the order header actually rendered by Edit.jsx. On SPA
// navigation the old table must not be labelled as the newly requested order.
const headings = Array.from(document.querySelectorAll('.text-xl.font-normal'))
.filter(e => new RegExp('#\\s*' + id + '\\s*$').test(e.textContent.trim()));
if (headings.length !== 1) { remove(); return; }
const heading = headings[0];
const root = heading.parentElement;
const tables = Array.from(root.querySelectorAll('table.w-full.border-collapse'))
.filter(t => t.querySelector('td img[width="56"]'));
if (tables.length !== 1) { remove(); return; }
let count;
try { count = readTable(tables[0]); }
catch (_) { remove(); return; } // Fail closed: no misleading partial count.
let badge = document.getElementById(ID);
if (!badge) {
badge = document.createElement('div');
badge.id = ID;
badge.setAttribute('role', 'status');
badge.setAttribute('aria-live', 'polite');
badge.style.cssText = 'margin:8px 0;padding:10px 14px;border:1px solid #d1d5db;border-radius:6px;background:#f8fafc;color:#111827;font-size:15px;font-weight:600';
heading.insertAdjacentElement('afterend', badge);
} else if (badge.previousElementSibling !== heading) {
heading.insertAdjacentElement('afterend', badge);
}
const label = `${labels[0]}: ${count.units}`;
if (badge.textContent !== label) badge.textContent = label;
const title = `#${id} · ${count.lines} ${labels[1]} · ${labels[2]}`;
if (badge.title !== title) badge.title = title;
}
function schedule() {
if (!stopped && scheduled === null) scheduled = setTimeout(update, 80);
}
const observer = new MutationObserver(schedule);
observer.observe(document.body, { childList: true, subtree: true, characterData: true });
const interval = setInterval(schedule, 1000); // URL changes with no DOM event.
const handle = {
stop() {
stopped = true;
observer.disconnect();
clearTimeout(scheduled);
clearInterval(interval);
remove();
if (window[KEY] === handle) delete window[KEY];
}
};
window[KEY] = handle;
update();
})();También puedes descargar el mismo script. El bloque y la descarga utilizan una única fuente; no hace falta editar ninguno.
Imagina que vendes ingredientes de panadería. Un pedido tiene tres líneas: 3 bolsas de harina, 2 paquetes de polvos de hornear y 5 paquetes de mantequilla. Son 10 unidades, no tres unidades.
La captura siguiente es del administrador real de alejandrotest, con datos ficticios. El pedido 2416 contiene tres líneas de productos físicos sin relaciones de bundle. La captura muestra Total de unidades: 10. La etiqueta sigue el idioma del administrador: Total units en inglés y Total de unidades en español o portugués.

Para comprobar un contador revisado en tu propia tienda:
Los bundles no están soportados por este ejemplo. El script suma las líneas mostradas, por lo que puede contar a la vez la línea padre del bundle y las de sus componentes. No lo uses para determinar cuántos artículos físicos debes embalar en un pedido con bundles. Tu equipo debe acordar e implementar esa regla por separado. Consulta Productos en conjunto o bundles.
El ejemplo se observó en escritorio y en vistas responsive del navegador. Instalar una extensión en Chrome de escritorio no la instala en un teléfono.
Para dejar de verla, abre Tampermonkey, busca su script, desactívalo y recarga la página del administrador. El contador del ejemplo desaparece sin cambiar el pedido.
Para borrar el script, abre Dashboard, identifica el correcto y usa su papelera. No borres otros scripts que necesites. Para eliminar la extensión completa, abre chrome://extensions/, busca Tampermonkey y pulsa Quitar. Esto también afecta a los demás scripts que gestione la extensión.
| Qué ves | Qué comprobar |
|---|---|
| No cambia nada | Confirma que el script es para esa tienda y página. Revisa que Tampermonkey, el script y Allow User Scripts estén habilitados; después recarga. |
| Solo funciona en un ordenador | Es lo esperado en este ejemplo. Es local al perfil de Chrome donde lo instalaste. |
| El contador aparece dos veces | Busca copias duplicadas del mismo script. Deja una sola habilitada y recarga. |
| El total difiere de la cantidad para embalar | Comprueba si hay bundles. Este ejemplo no los soporta. Deja de usar ese total para despacho y consulta a tu equipo técnico. |
| Dejó de funcionar tras actualizar el panel | Desactívalo y pide a quien lo mantiene que revise los selectores de la página. El ejemplo oculta el total si no reconoce la tabla de productos. |
| Chrome pide otro permiso | Lee la solicitud exacta y consulta al administrador antes de aceptarla. No cambies otros ajustes de seguridad. |
Mantén cada personalización pequeña, reversible y limitada a las páginas previstas. Si un cambio debe guardarse, compartirse entre usuarios o integrarse con el procesamiento de pedidos, utiliza una función apropiada de Jumpseller o consulta una integración con tu equipo técnico, en lugar de convertir un script visual en un proceso crítico.
Probar gratis por 7 días. No se requiere tarjeta de crédito.