"1.247 vendidos." Dos palabras y una cifra, justo debajo del precio — y para un comprador que nunca ha oído hablar de tu tienda, responde a la única pregunta que de verdad importa: ¿alguien más ha confiado lo suficiente como para pagar por esto? Un contador de ventas totales toma un dato que tu base de datos ya conoce y lo coloca allí donde se decide la compra. Esta entrada trata específicamente de esa cifra: el recuento acumulado de unidades vendidas desde siempre, mostrado como una insignia estática en la página de producto. No el indicador en directo de "12 personas lo están viendo ahora", ni la ventana emergente de "alguien en Múnich acaba de comprarlo" — esas son señales distintas, con funciones propias, y las enlazamos más abajo. El contador histórico tiene un único objetivo: convertir tu historial de ventas en prueba.
Última actualización: junio de 2026.
Qué significa realmente "productos vendidos en total" en PrestaShop — y dónde vive esa cifra

Antes de mostrar un recuento de ventas, tienes que saber qué cifra estás enseñando, porque PrestaShop guarda varios datos que se parecen, pero significan cosas distintas. Confundirlos es, con diferencia, el error de implementación más común que vemos.
| Qué quieres mostrar | Dónde se guarda | Qué es realmente |
|---|---|---|
| Unidades realmente vendidas | ps_order_detail.product_quantity, sumado para ese producto en todos los pedidos válidos | El recuento histórico honesto — cada línea de pedido realizada. |
| Stock disponible | ps_stock_available.quantity (y el espejo heredado ps_product.quantity) | Lo que queda por vender — no lo que se ha vendido. Mostrarlo como "vendido" es incorrecto. |
| Columna "Ventas" en Estadísticas | ps_product_sale (mantenida por la clase ProductSale a medida que se validan los pedidos) | Un agregado en caché que PrestaShop mantiene para el panel de productos más vendidos. |
¿Qué significa esto para ti? La cifra real de ventas totales es una suma sobre ps_order_detail, unida a ps_orders para contar solo pedidos en un estado válido (pagado, enviado, entregado) y excluir carritos abandonados, pedidos cancelados o pedidos en estado de error. Un contador que incluye silenciosamente pedidos cancelados y reembolsados se está inflando a sí mismo — y el día en que un cliente lo note será el día en que esa cifra deje de generar confianza y empiece a destruirla.
La versión honesta de esa consulta tiene este aspecto — suma las cantidades de las líneas de pedido, pero solo en pedidos que PrestaShop ha marcado como válidos:
SELECT SUM(od.product_quantity) AS units_sold
FROM ps_order_detail od
JOIN ps_orders o ON o.id_order = od.id_order
WHERE od.product_id = :id_product
AND o.valid = 1;
La marca o.valid es la puerta que importa: PrestaShop la establece en 1 solo cuando un pedido llega a un estado que el comerciante ha marcado como "registrable" (pagado, enviado, entregado), así que unir por ella es lo que excluye los pedidos abandonados, cancelados y en estado de error. Sin embargo, ejecutar eso con un GROUP BY en cada página de producto se convierte en el problema de rendimiento del que advierte esta entrada — y por eso existe la tabla en caché de más abajo.
PrestaShop ya ofrece un atajo más limpio: la tabla ps_product_sale, que la clase ProductSale de PrestaShop mantiene actualizada cada vez que se valida un pedido (los mismos datos que hay detrás de Estadísticas → Productos más vendidos en el panel de administración). Leer allí la columna quantity en caché es mucho más ligero que sumar detalles de pedidos en cada carga de página — algo importante, porque la página de producto es una de las URL más visitadas de tu tienda y no quieres disparar un GROUP BY pesado para cada visitante.
Por qué funciona un contador de ventas — y dónde está el límite
La prueba social funciona porque las personas miran lo que hacen otros cuando tienen que decidir con incertidumbre. En una tienda física ves a otros clientes coger productos; en Internet, esa señal desaparece salvo que la vuelvas a introducir. Un contador de ventas es la forma más cuantitativa de hacerlo — una sola cifra que dice "otras personas ya han elegido este camino". Suele rendir mejor en compras meditadas de precio medio: lo bastante caras como para que el comprador quiera seguridad, pero no tanto como para que lea una docena de reseñas antes. En productos de compra impulsiva el cliente apenas se detiene; en productos de precio alto investigará de todos modos, con o sin insignia.
El límite honesto: un contador de ventas es una señal dentro de un conjunto, no una cifra mágica. Valida la popularidad, pero no dice nada sobre si el producto es bueno — ese es el trabajo de las reseñas de producto, que aportan un peso cualitativo que un recuento bruto no puede dar. Ambos se complementan: "238 vendidos · 4,7 estrellas · 41 reseñas" es mucho más fuerte que cualquiera de esos datos por separado, porque responde tanto a "¿es popular?" como a "¿quedaron satisfechos?" Si tu tienda depende de widgets de reseñas de terceros, conviene entender por qué por sí solos no bastan para la señal de confianza que acompaña a un contador de ventas.
Cuándo te ayuda la cifra — y cuándo conviene ocultarla
Lo que muchas guías pasan por alto: un contador de ventas no es bueno de forma incondicional. La misma insignia que convierte en un producto puede perjudicar activamente a otro. Un contador que sabe cuándo mostrarse vale más que uno que imprime a ciegas lo que tenga la base de datos.
- Muéstralo cuando supere un umbral. "2 vendidos" se lee peor que no mostrar ningún contador — susurra "nadie quiere esto". Define un mínimo (normalmente recomendamos a los comerciantes empezar alrededor de 25–50 unidades) y oculta la insignia por debajo de ese punto. Un producto se gana su contador; no nace con él.
- ¿Tienda nueva, sin reseñas? Aquí es donde se gana su sitio. Con cero reseñas y sin reconocimiento de marca, incluso "47 vendidos" le dice a un visitante nuevo que personas reales compraron y, presumiblemente, recibieron sus pedidos. Es una prueba de que la tienda funciona, no solo el producto.
- ¿Catálogo competitivo? Cuando un comprador compara el mismo artículo en tres pestañas, la ficha que muestra "3.400 vendidos" tiene ventaja frente a las dos que no muestran nada — el recuento se convierte en el desempate que no sabía que estaba buscando.
- ¿Posicionamiento de lujo o exclusividad? Desactívalo. Si el relato de marca es "edición limitada, hecho a mano, existen pocas unidades", un recuento de cinco cifras lo contradice de plano. No puedes ser exclusivo y masivo en la misma página.
- ¿Productos digitales y temas? Ve con cuidado. Un recuento alto puede leerse como "todo el mundo ya tiene esto", lo que para activos de diseño que deberían hacer que una tienda destaque se convierte en una objeción de compra, no en una garantía.
Cómo presentar la cifra para que se perciba como honesta
El mismo historial de ventas puede generar confianza o despertar sospechas dependiendo por completo de cómo lo formatees. Hay algunas reglas que funcionan bien en distintos tipos de tienda:
- Redondea las cifras grandes y mantén exactas las pequeñas. "247 vendidos" resulta creíble porque es específico; "12.847 vendidos" parece sospechosamente preciso e invita a pensar "¿se lo habrán inventado?" Por encima de unos pocos miles, "12K+ vendidos" o "10.000+ vendidos" se percibe como más honesto, no menos.
- Considera una ventana temporal. "124 vendidos este mes" transmite demanda actual, algo más persuasivo que "5.000 vendidos" acumulados silenciosamente durante cuatro años. Una ventana reciente también rescata productos antiguos cuyo total histórico es modesto, pero cuyo impulso actual es real. En términos de PrestaShop, eso es una suma acotada por fecha sobre ps_order_detail unida a la fecha del pedido — más pesada que la tabla en caché, así que guarda el resultado en caché.
- Colócalo en la zona de decisión. El contador pertenece junto al precio y el botón de añadir al carrito, donde el cliente está decidiendo de verdad — no enterrado al pie de la página ni escondido en una pestaña. En la plantilla de producto, esa es la zona de los hooks displayProductActions / displayProductPriceBlock; un contador renderizado abajo en displayFooterProduct desperdicia buena parte de su fuerza psicológica. (Para ver dónde debería ir cada elemento de la página y por qué, consulta la anatomía de una página de producto.)
El contador histórico frente al indicador en directo — no los confundas
Esta distinción decide qué herramienta necesitas realmente. Un contador de ventas totales es un dato estable y acumulado — cambia lentamente, se puede cachear con seguridad y su mensaje es "muchas personas, a lo largo del tiempo, eligieron esto". Ese es el tema de esta entrada. Es algo distinto de las señales en tiempo real de la misma familia:
- Ventas y estadísticas de visualización en directo — "9 personas lo han comprado hoy / 23 lo están viendo ahora" — tratan de impulso y concurrencia, y se recalculan constantemente. Esa es una decisión aparte, tratada en mostrar ventas y visualizaciones en directo.
- Ventanas emergentes de compras recientes — la notificación que aparece diciendo "Anna en Cracovia acaba de pedir esto" — son notificaciones de ventas en directo y ventanas emergentes de ventas, que crean inmediatez en lugar de peso acumulado.
Entonces, ¿cuál es la conclusión práctica? El contador histórico y el indicador en directo responden a objeciones distintas. "¿Es una elección segura?" se responde con volumen acumulado; "¿está pasando ahora?" se responde con datos en directo. Muchas tiendas usan ambos — pero recurre al contador estático cuando quieras una tranquilidad discreta y duradera que no dependa de un pico de tráfico para resultar convincente.
Cómo llevarlo a una página de producto de PrestaShop
PrestaShop no trae de serie una insignia de "total vendido" en la tienda, así que hay que colocar esa cifra allí. Hay tres caminos, de menor a mayor esfuerzo:
| Ruta | Esfuerzo | ¿Resiste las actualizaciones? | Cuándo encaja mejor… |
|---|---|---|---|
| Ajuste de plantilla — leer la cifra de ventas en una sobrescritura de product.tpl dentro de un tema hijo | Medio (requiere un desarrollador) | Frágil — las ediciones del tema pueden romperse al actualizar y no gestionan umbrales ni formato | Tienes una necesidad puntual y tiempo de desarrollo interno. |
| Un módulo basado en hooks — renderiza el contador mediante un hook de visualización, sin tocar la plantilla del tema | Bajo — instalar y configurar desde el panel de administración | Sí — no se bifurcan archivos del núcleo ni del tema | Quieres que los umbrales, el formato y la caché queden resueltos, y que la insignia sobreviva a la próxima actualización 1.7 → 8 → 9. |
| Desarrollo a medida | Alto | Depende de cómo se construya | Tienes una lógica muy específica (reglas por categoría, variantes A/B) y un desarrollador que se hará cargo. |
La vía del módulo existe precisamente porque los requisitos que hacen que un contador de ventas sea seguro — excluir pedidos cancelados, ocultar recuentos bajos, redondear cifras grandes, leer la tabla en caché ps_product_sale en lugar de sumar detalles de pedidos en cada carga — son delicados de resolver a mano y fáciles de hacer mal. Un módulo creado para esto se engancha a la página de producto con una sola instalación, mantiene la consulta pesada fuera de la ruta crítica y se configura por completo desde tu panel de administración, no mediante una factura de desarrollo. Si un contador forma parte de un plan más amplio para que tus páginas de producto conviertan mejor, nuestra guía de diseño y conversión de páginas de producto muestra cómo encaja junto al resto de elementos.
Una nota sobre rendimiento — porque aquí es donde fallan los contadores caseros
La versión ingenua de un contador de ventas ejecuta un SELECT SUM(product_quantity) … GROUP BY sobre ps_order_detail en cada vista de cada página de producto. En una tienda con mucho historial de pedidos y un tráfico razonable, eso es una ralentización autoinfligida en tu página más importante. Dos defensas, por orden de preferencia: leer la tabla preagregada ps_product_sale (PrestaShop ya la mantiene mediante la clase ProductSale a medida que se validan los pedidos, así que el coste se paga una vez en segundo plano, no por visitante); y, si necesitas calcular una ventana personalizada, cachear el resultado por producto con un TTL sensato para que la base de datos se consulte de vez en cuando, no constantemente. Un contador que empeora el tiempo de carga de tu página está haciendo lo contrario de ayudarte a vender — las páginas lentas pierden precisamente a los clientes a los que la insignia debía tranquilizar.
Dónde encaja el contador de ventas en tu estrategia más amplia de prueba social
Un contador de ventas es una pieza dentro de una imagen de confianza más amplia, y funciona mejor cuando las piezas que lo rodean empujan en la misma dirección. El recuento cuantitativo combina de forma natural con las señales cualitativas: las valoraciones con estrellas y las reseñas responden a "¿quedaron satisfechos?"; los sellos de confianza responden a "¿es seguro el proceso de pago?"; y las señales en directo — ventas y visualizaciones o una ventana emergente de compra reciente — responden a "¿está pasando ahora?" La aportación específica del contador histórico es el peso duradero y acumulado: la prueba de que el camino por el que invitas a avanzar a un comprador indeciso ya lo han recorrido, miles de veces, personas que pagaron y no volvieron por nada más que el producto que querían.
Obtén bien la cifra de origen (ventas reales, solo pedidos válidos), muéstrala solo cuando favorezca al producto, dale un formato que resulte honesto, colócala donde se toma la decisión y mantén la consulta fuera de la ruta crítica de carga de la página. Haz eso, y un dato que tu base de datos lleva registrando discretamente desde tu primer pedido empezará a ganarse su sitio justo en el momento exacto en que un cliente decide si confiar en ti.
Preguntas frecuentes
¿Qué cifra de PrestaShop representa realmente las "unidades vendidas"?
Es la suma de product_quantity en ps_order_detail para los pedidos válidos — no la cifra de stock. El stock disponible vive en ps_stock_available.quantity y te dice qué queda por vender, que es lo contrario de lo vendido; mostrarlo como "vendido" es el error más común. PrestaShop también mantiene un agregado en caché en ps_product_sale, actualizado por su clase ProductSale a medida que se validan los pedidos, y esa es la cifra más ligera de leer en una página de producto con mucho tráfico.
¿El contador de ventas incluye pedidos cancelados o reembolsados?
No debería, y ese es precisamente el objetivo de unir con o.valid = 1. Sin ese filtro estarías contando carritos abandonados y pedidos cancelados como ventas, inflando la insignia. Un contador inflado no solo exagera — en cuanto un cliente percibe que la cifra está inventada, pasa de ser una señal de confianza a ser un motivo para dudar de todo lo demás en la página.
¿Un contador de ventas no ralentizará mis páginas de producto?
Lo hará si lo calculas de la forma ingenua — un SUM ... GROUP BY sobre el historial de pedidos en cada vista de página, en una URL que ya suele ser de las más visitadas. Dos defensas, por orden: leer la tabla preagregada ps_product_sale que PrestaShop ya mantiene en segundo plano o, si necesitas una cifra para una ventana temporal personalizada, calcularla una vez y cachear el resultado por producto con un TTL sensato para que la base de datos se consulte ocasionalmente y no en cada visita.
¿Todos los productos deberían mostrar su recuento de ventas?
No — un contador solo es un activo por encima de un umbral. "2 vendidos" se lee peor que no mostrar ninguna insignia, así que define un mínimo (a menudo 25–50 unidades) y ocúltalo por debajo. Desactívalo por completo para posicionamientos de lujo o edición limitada, donde un recuento alto contradice el relato de exclusividad, y sé prudente con los productos digitales, donde "todo el mundo ya tiene esto" puede percibirse como una objeción en lugar de una garantía.
¿Debería mostrar el total histórico o una ventana reciente?
Depende de lo que quieras transmitir. Un total histórico ("5.000 vendidos") muestra confianza duradera y acumulada; una ventana ("124 vendidos este mes") muestra demanda actual y puede rescatar un producto antiguo cuyo número de por vida es modesto, pero cuyo impulso actual es real. La ventana es más pesada de calcular porque es una suma acotada por fecha en lugar de una lectura en caché, así que guarda el resultado en caché. Muchas tiendas muestran el encuadre que mejor favorece a cada producto concreto.
Comentarios
Aún no hay comentarios. ¡Sé el primero!
Sé el primero en hacer una pregunta o compartir una opinión útil.
Dejar un comentario
Comparte una pregunta, un detalle de instalación o una opinión que pueda ayudar a otro lector.