Vender buzones y paquetes de dominios en mailcow con tu propia cuenta de Stripe

Guía práctica para convertir tu mailcow en un pequeño servicio de correo alojado: planes de buzón y paquetes de dominio, complementos con prorrateo, período de gracia y suspensión que nunca borra una cuenta.

Si ya usas mailcow para ti, seguramente te hayan preguntado más de una vez: ¿podrías alojar también el correo de otra persona? La parte técnica es la mitad fácil. La difícil es la facturación: quién tiene qué plan, qué pasa cuando falla una tarjeta y cómo detener una cuenta sin destruirla.

Cashier for mailcow está pensado justo para esa mitad. Vende planes de buzón y paquetes de dominio en tu mailcow, con pago mensual o anual con tarjeta a través de tu propia cuenta de Stripe, y aplica cada cambio en mailcow en cuanto se confirma el pago. Las cuentas impagadas se suspenden tras un período de gracia que tú eliges, nunca se borran. Este tutorial explica cómo montarlo como un pequeño negocio de correo alojado.

Requisitos previos

Antes de empezar, asegúrate de tener:

  • El paquete mailcow Toolkit 0.4.0 o superior sobre mailcow-dockerized (Linux, docker compose, systemd). Cashier viene dentro del paquete y se instala con install.sh como root en el host.
  • Sign-up for mailcow con su propia licencia válida y configurado, porque las cuentas de pago se crean a través de su página de registro.
  • Una clave de licencia de Cashier for mailcow (también sirve una clave del paquete mailcow) o una dirección de correo para la prueba gratuita de 30 días.
  • Tu propia cuenta de Stripe en un país compatible con Stripe. El dinero, las facturas y los datos de los clientes se quedan en tu cuenta; MediaLab Works no es parte de tus ventas.
  • La interfaz de mailcow accesible desde internet por HTTPS, para que Stripe pueda llamar al webhook, además de salida HTTPS hacia api.stripe.com y medialab.works para la comprobación de licencia.

Paso 1 — Activar la licencia

Abre System > Updates (Toolkit) y busca la tarjeta License · Cashier for mailcow. Introduce tu clave y pulsa Activate, o inicia la prueba gratuita de 30 días con tu dirección de correo. En la shell, lo mismo es:

docker compose exec -u www-data php-fpm-mailcow php /web/mlw-toolkit/cli.php activate mailcow-cashier <KEY>

Ejecútalo desde la carpeta de mailcow. La licencia se comprueba al arrancar y una vez al día; sin internet, Cashier sigue funcionando 7 días después de la última comprobación correcta. Sin una licencia válida no se inicia ningún checkout nuevo, pero los webhooks de los suscriptores existentes se siguen procesando y no se borra nada.

Paso 2 — Conectar Stripe

Abre System > Cashier y recorre la tarjeta Stripe:

  1. En tu Stripe Dashboard, crea una clave restringida (Developers > API keys > Create restricted key) con acceso de escritura a Customers, Checkout Sessions, Customer portal, Products, Prices, Subscriptions, Subscription items y Webhook Endpoints, y de lectura a Invoices. Una clave secreta también sirve, pero una restringida es más segura.
  2. Pega la Publishable key y la Secret / restricted key. Ambas deben ser claves de prueba o ambas claves reales; Cashier las comprueba con Stripe y muestra la cuenta y el modo. La clave secreta se guarda cifrada y no se vuelve a mostrar, así que más adelante deja el campo vacío para conservarla.
  3. Pulsa Create the webhook. Cashier registra https://<mail host>/mlw-cashier/webhook.php en tu cuenta de Stripe con los eventos que necesita y guarda el secreto de firma. Si un proxy reescribe el nombre del host, configura antes Public webhook address en Rules.
  4. Revisa Last event para confirmar que los eventos llegan de verdad.

Para pasar más adelante de modo de prueba a real, conecta las claves reales y crea el webhook de nuevo.

Paso 3 — Definir tus planes

En Plans, pulsa New plan. Elige el Kind:

  • mailbox — un buzón con su cuota, para quien solo quiere una dirección.
  • domain package — para administradores de dominio: Domains (package), Mailboxes / domain, Aliases / domain, Quota (MB; package: per domain) y Default quota / mailbox (MB).

Después rellena los nombres y descripciones en inglés y rumano (aparecen en la página de registro en el idioma del visitante), un precio mensual y/o un precio anual en la moneda de tu cuenta de Stripe, y los días de prueba (0 = ninguno). Cashier crea por ti el producto y los precios en tu cuenta de Stripe. Deja marcado Visible on the registration page para los planes públicos; desmárcalo para un plan oculto accesible solo por su enlace directo (/mlw-signup/?plan=<token>) o por un código de invitación vinculado al plan.

Edit modifica un plan: un importe cambiado crea un precio nuevo en Stripe y desactiva el antiguo, que los suscriptores actuales conservan. Archive retira un plan de la venta sin tocar a sus suscriptores.

Paso 4 — Añadir complementos

En Add-ons, crea los extras que los clientes pueden comprar con una cantidad: buzones adicionales en cada dominio del paquete, o almacenamiento adicional (MB por dominio; en un plan de buzón, por buzón). Configura la Unit, los nombres, los precios mensual y anual y Visible. Los clientes los añaden en My account; Stripe prorratea el precio y los nuevos límites se aplican a mailcow al instante.

Paso 5 — Configurar las reglas: período de gracia y suspensión

En Rules, decide cuán estricto quieres ser:

  • Grace period after a failed payment (days, 0–90) — por defecto son 7 días, durante los cuales la cuenta sigue funcionando mientras el cliente paga.
  • After the grace period the account is suspended — elige no sign-in: mail is still received (lo predeterminado) o inactive: mailboxes, domain administrator and domains. Nunca se borra nada, y un pago restablece la cuenta al instante.
  • E-mail the subscribers about invoices and receipts.
  • Public webhook address (empty = automatic), Stripe product tax code y Stripe name prefix — este último importa cuando varios servidores mailcow comparten una cuenta de Stripe.

Para un pequeño negocio de hosting, el modo predeterminado sin inicio de sesión es un buen punto de partida: un cliente moroso deja de usar el servicio, pero el correo sigue llegando, así que no se pierde nada y un pago lo vuelve a activar todo.

Paso 6 — Saber qué ven los clientes

En la página de registro, el visitante elige un plan (mensual o anual), confirma su dirección y paga en la página de checkout de Stripe. La cuenta se crea cuando Stripe confirma el pago. En My account ven el plan, la fecha del próximo pago y los complementos, pueden usar Change plan (prorrateado; se rechaza un plan menor que el uso actual, indicando qué reducir primero) y abrir Card, invoices and cancellation (Stripe), el portal de cliente de Stripe.

Un pago fallido envía un correo con el enlace para pagar y la fecha de suspensión. Un cliente suspendido que no puede iniciar sesión puede solicitar el enlace de pago desde la página pública /mlw-cashier/billing.php introduciendo la dirección de correo de la cuenta. Una cancelación se aplica al final del período pagado, y una cuenta creada por la suscripción queda entonces suspendida.

Paso 7 — Gestionar la parte de administración

Subscribers lista cada suscripción con su estado (active, grace, suspended, ended), el plan, el importe, el enlace a Stripe y los Monthly revenue, además de los Recent Stripe events que recibió el webhook. Grant a plan for free da un plan a una cuenta durante un número de días sin Stripe, y una concesión se puede terminar antes de tiempo — útil para pruebas o para un favor a un amigo.

Los planes, clientes y suscripciones viven en la base de datos de mailcow (tablas mlw_ca_*), así que forman parte de las copias de seguridad de mailcow. Las claves y el secreto del webhook están en la carpeta compartida del Toolkit, cifrados con AES-256-GCM, con la clave de cifrado guardada aparte en el redis de mailcow.

Consejos y solución de problemas

  • ¿No llega el webhook? Revisa Last event en la tarjeta de Stripe. Si un proxy inverso reescribe el nombre del host, configura Public webhook address en Rules y crea el webhook de nuevo.
  • ¿Se rechazan las claves? Asegúrate de que ambas sean de prueba o ambas reales; mezclarlas hace fallar la comprobación.
  • El cliente quiere un plan menor y se rechaza. Es intencionado: no se borra nada para que encaje. Pídele que elimine antes buzones o almacenamiento.
  • Un evento de Stripe repetido. Los eventos se verifican por firma y se procesan una vez, así que un duplicado no cambia nada.
  • Falla la comprobación de licencia. El servidor debe llegar a medialab.works por HTTPS; Cashier sigue funcionando 7 días después de la última comprobación correcta.
  • Cambiar de servidor. uninstall.sh elimina Cashier con el Toolkit pero conserva las tablas y todas las cuentas; las claves cifradas van con la carpeta compartida, así que planifica reconectar Stripe después.

Conclusión

Cashier for mailcow no intenta ser una plataforma de facturación completa. Hace bien una sola cosa: vender buzones y paquetes de dominio en tu propio mailcow, a través de tu propia cuenta de Stripe, con cambios prorrateados, un período de gracia que tú controlas y una suspensión que nunca borra datos. Lee la guía de usuario para cada campo, consulta el changelog antes de actualizar y usa la base de conocimiento o las FAQ cuando algo no esté claro. Las dudas sobre tu configuración son bienvenidas a través de contacto.

Esta publicación se redactó con ayuda de IA a partir de la documentación de nuestros productos o de las fuentes indicadas y se revisó automáticamente antes de publicarse.

Sigue leyendo

¿Usas Emby, Jellyfin o Nextcloud?

Nuestros plugins y apps añaden TV en directo, subtítulos, registro de usuarios y seguridad a tu propio servidor, con prueba gratuita.