Pulsa ESC para cerrar

Curso WordpressCurso Wordpress

Envíos en WooCommerce bien configurados: zonas, tarifas, envío gratis y retiro en tienda

Los envíos son una de las primeras causas de carritos abandonados: un costo que aparece de sorpresa al final, una región que «no tiene envío» o un cobro doble por algo que debía ser gratis. Y casi siempre el problema no es WooCommerce, sino cómo se configuró.

Vamos paso a paso, con ejemplos para una tienda en Chile.

Antes de empezar: precios sin decimales

En WooCommerce → Ajustes → Generales, al final, revisa las opciones de moneda: Peso chileno, Separador de miles ., Separador decimal , y Número de decimales 0. Así los precios y los envíos se ven como $3.990 y no como $3,990.00.

Paso 1: las zonas de envío

Una zona es un grupo de lugares que comparten las mismas opciones de envío. WooCommerce ya trae las 16 regiones de Chile, así que puedes armar zonas así:

  1. Región Metropolitana: envío más barato y retiro en tienda.
  2. Regiones cercanas (Valparaíso, O’Higgins, Maule…): tarifa media.
  3. Extremos (Arica y Parinacota, Aysén, Magallanes…): tarifa más alta o solo por courier.
  4. Resto del mundo (la zona que viene por defecto): sin métodos, si no envías al extranjero.

Se crean en WooCommerce → Ajustes → Envío → Zonas de envío → Añadir zona. El orden importa: WooCommerce usa la primera zona que coincida con la dirección del cliente, así que deja las más específicas arriba.

Si necesitas tarifas distintas dentro de una misma región (por ejemplo, por comuna), puedes usar códigos postales en la zona, aunque en Chile casi nadie los conoce. Para eso suele ser mejor un plugin del courier que calcule la tarifa real según la dirección.

Paso 2: los métodos de cada zona

Cada zona puede tener uno o varios métodos:

  • Precio fijo (tarifa plana): un monto por envío, por producto o con fórmula.
  • Envío gratuito: sin costo, con o sin condiciones.
  • Recogida local / retiro en tienda: el cliente retira en tu local.

Paso 3: tarifas con fórmula

El campo Costo del precio fijo acepta más que un número. Algunos ejemplos útiles:

3990
3990 + ( [qty] - 1 ) * 1000
[fee percent="5" min_fee="2990" max_fee="9990"]
  • La primera cobra $3.990 por pedido, lleve lo que lleve.
  • La segunda cobra $3.990 por el primer producto y $1.000 por cada producto adicional ([qty] es la cantidad total).
  • La tercera cobra el 5 % del valor del carrito, con un mínimo de $2.990 y un máximo de $9.990.

Paso 4: clases de envío para productos especiales

Si vendes productos pesados o voluminosos, crea una clase de envío en Ajustes → Envío → Clases (por ejemplo, «Voluminoso») y asígnala en cada producto, en la pestaña Envío.

Luego, en el método de precio fijo de cada zona, aparece un campo por cada clase. Ahí pones el recargo, por ejemplo 5000 para los voluminosos. En Tipo de cálculo eliges si se cobra por cada clase presente en el carrito o solo la más cara.

Paso 5: envío gratis sin errores

Agrega el método Envío gratuito en las zonas donde lo ofrezcas y elige el requisito Una cantidad mínima de pedido, por ejemplo 40000. Ojo con la casilla Aplicar la cantidad mínima de pedido antes del descuento por cupón: si la marcas, un pedido de $42.000 con un cupón de $5.000 conserva el envío gratis aunque termine pagando $37.000. Si prefieres que el mínimo se cuente sobre lo que el cliente paga realmente, déjala desmarcada.

El problema clásico: cuando el cliente llega al mínimo, WooCommerce le muestra las dos opciones, el envío gratis y la tarifa pagada. Algunos eligen la pagada sin darse cuenta y luego reclaman. Este snippet oculta las tarifas pagadas cuando hay envío gratis, pero deja el retiro en tienda. Agrégalo como wp-content/mu-plugins/cwp-envio-gratis.php:

<?php
/**
 * Plugin Name: Envío gratis sin confusión (Curso WordPress)
 */

add_filter( 'woocommerce_package_rates', function ( $tarifas ) {
	$gratis = array();
	foreach ( $tarifas as $id => $tarifa ) {
		if ( 'free_shipping' === $tarifa->method_id ) {
			$gratis[ $id ] = $tarifa;
		}
	}
	if ( empty( $gratis ) ) {
		return $tarifas; // No hay envío gratis: se muestran todas.
	}
	foreach ( $tarifas as $id => $tarifa ) {
		if ( in_array( $tarifa->method_id, array( 'local_pickup', 'pickup_location' ), true ) ) {
			$gratis[ $id ] = $tarifa; // El retiro en tienda se mantiene.
		}
	}
	return $gratis;
}, 100 );

Después de cambiar los envíos, vacía la caché de envíos. WooCommerce guarda las tarifas calculadas. Si no ves los cambios, ve a WooCommerce → Estado → Herramientas → Borrar transients o, en Ajustes → Envío → Opciones, activa unos minutos el Modo de depuración, que desactiva esa caché mientras pruebas.

Paso 6: retiro en tienda

En las tiendas que usan el pago en bloques (lo normal desde hace varias versiones), el retiro se configura en Ajustes → Envío → Retiro local: ahí agregas la dirección de tu local, un costo opcional y las instrucciones que verá el cliente. Si tu tienda usa el pago clásico, usa el método Recogida local dentro de la zona.

Comprueba todo como cliente

Abre una ventana de incógnito, agrega productos al carrito y prueba con direcciones de distintas regiones, con y sin llegar al monto del envío gratis, y con un producto de cada clase. Es la única forma de ver lo que verá tu cliente.

¿Tu tienda necesita una regla de envío que no sale en esta guía? Planteala en el foro y vemos si se resuelve con la configuración, con una fórmula o con un snippet.