Volver al blog
Consejos y guías

Cómo montar una hoja de cálculo de suscripciones que aguante: el esquema de 21 columnas, las fórmulas y las 5 cosas que una hoja no puede hacer

31 de agosto de 2026
16 min de lectura
Una cuadrícula azul marcada con 21 contiene iconos de suscripciones mientras cinco elementos del mundo real quedan fuera

Una hoja de suscripciones aguanta si guarda la cadencia como número más unidad, deriva de ese par una única columna de equivalente mensual y suma solo esa columna. Casi ninguna plantilla hace las tres cosas: doce columnas, una cabecera de color y una suma al final que junta sin avisar un plan anual con uno mensual y llama a eso tu gasto mensual.

Lo que viene es la estructura real que enviamos: la lista de campos que escribe nuestra exportación CSV, las constantes de normalización de nuestro código de producción y una proyección de cargos construida como la construye la app. Puedes rehacerla en Google Sheets o Excel en unos diez minutos.

La segunda mitad es la parte que las páginas de plantillas nunca escriben, porque te están vendiendo la plantilla. Cinco tareas que una hoja de cálculo no puede hacer — no "hace mal", no puede hacer — y cada una es algo que tuvimos que construir porque la hoja no podía sostenerlo.

Última revisión: 31 de agosto de 2026. La lista de columnas y las constantes salen del propio código de exportación y de analítica de SubBuddy, no de una plantilla copiada. Las fórmulas van con nombres de función en inglés y comas como separador: si tu Sheets o tu Excel está en español, los nombres están traducidos y el separador de argumentos es el punto y coma. Cámbialos al pegar.

El esquema de 21 columnas

Veinte de estas son exactamente lo que escribe la exportación de SubBuddy, en este orden. La vigesimoprimera es la única columna que la exportación no lleva, y el motivo es lo primero interesante del esquema: la app la recalcula en cada renderizado, así que no hay nada que guardar.

Col Campo Tipo / ejemplo Por qué se gana la columna
AnameTexto — NetflixEl comercio como tú lo conoces, no como lo imprime el banco.
BamountNúmero — 13,99Número, nunca texto. Un símbolo de euro en esta celda rompe todas las fórmulas.
CcurrencyTexto — EURPor fila, no por hoja. En cuanto aparecen dos valores aquí, tu SUMA es falsa.
Dbilling_interval_countEntero — 1El multiplicador. "Cada 4 semanas" es 4 + semana, no "mensual".
Ebilling_interval_unitday | week | month | yearSolo cuatro valores. Partir la cadencia en dos es lo que hace exacta la normalización.
Frenewal_dateFecha — 2026-09-14El próximo cobro, no el último. Todo lo demás se ancla aquí.
Gstart_dateFecha — 2024-03-02Limita cualquier proyección hacia atrás para no inventar cobros anteriores al alta.
HcategoryTexto — StreamingVocabulario cerrado. Las categorías libres destrozan cualquier tabla dinámica.
Iis_activeTRUE / FALSEVer la sección siguiente. No es una casilla independiente.
Jis_pausedTRUE / FALSEPausada sigue costando dinero más adelante; no está cancelada.
Kis_trialTRUE / FALSEGratis hoy, cobrada en una fecha conocida. La fila más peligrosa de la hoja.
Ltrial_ends_onFecha — 2026-09-08No es una caducidad. Es el día del primer cargo a la tarjeta.
Mpayment_methodTexto — Visa personalPermite responder "qué se cae si cambio esta tarjeta".
Ncard_last4Texto — 4021Texto, no número, o la hoja se come el cero inicial.
Oemail_accountTextoEn qué buzón caen los recibos. Así encuentras la cuenta desde la que cancelar.
PtagsTexto — trabajo; deducibleMultivalor, unido con punto y coma. Limitado a 10 etiquetas de 30 caracteres cada una.
Qgroup_nameTexto — CasaDe quién es realmente el cargo cuando el plan es compartido.
RnotesTexto libreContendrá comas. Ver la sección de CSV.
Scancellation_urlURLEl enlace directo, guardado un día tranquilo en vez de buscado con prisa.
Tcancellation_notesTexto, máx. 1.000 caracteres"Solo por teléfono, L-V." La trampa que ya descubriste una vez.
Umonthly_equivalentFórmulaLa 21. Derivada, no almacenada. La app la recalcula siempre, así que la exportación no tiene nada que escribir.

Dos ausencias merecen mención, porque explican qué es este archivo. No hay id de fila y no hay is_one_time — un campo real de nuestro esquema que la exportación sencillamente no incluye. Tampoco lleva la configuración de avisos, ni los iconos. Esto es una exportación de cartera, no una copia de seguridad, y no vuelve a entrar: el importador espera un extracto bancario o de tarjeta que subes , y te pide asignar la columna de fecha, la de concepto y la de importe, así que volver a meter este archivo no está previsto. Tampoco entra nada solo: SubBuddy no se conecta a ningún banco, así que cada fila de la app está ahí porque alguien la escribió o revisó una línea del extracto que había subido.

Las tres columnas de estado no son tres booleanos

Esta es la parte que corromperá tus totales en silencio, así que va antes que las fórmulas divertidas.

Las columnas I, J y K parecen tres interruptores independientes. No lo son. Son un único estado codificado en tres banderas, con una precedencia estricta — prueba gana a pausada, que gana a activa, que gana a cancelada — y solo cuatro combinaciones legales:

  • activa — is_active TRUE, is_paused FALSE, is_trial FALSE
  • pausada — is_active TRUE, is_paused TRUE, is_trial FALSE
  • cancelada — is_active FALSE, is_paused FALSE, is_trial FALSE
  • prueba — is_active FALSE, is_paused FALSE, is_trial TRUE

Lee esa última línea dos veces. Una prueba canónica se guarda con is_active = FALSE. Lo que significa que la fórmula más natural que cualquiera escribe en una hoja de suscripciones —

=SUMIF(I2:I, TRUE, B2:B)

— descarta en silencio todas tus pruebas gratuitas. Tu total excluye justo las filas que más probablemente te sorprendan el mes que viene. Lo sabemos porque enviamos ese tipo de error, en las dos plataformas, antes de unificar la lógica de estado en un solo sitio. El comentario que ahora hay encima dice que cualquier condición con forma "is_active Y is_trial" es inalcanzable, y que cualquiera con forma "is_active Y ..." se deja fuera las pruebas.

Así que deriva el estado una vez, en su propia columna, y no vuelvas a tocar I, J ni K:

V2 =IF(K2=TRUE,"prueba",IF(J2=TRUE,"pausada",IF(I2<>FALSE,"activa","cancelada")))

Es la transcripción directa de la función de precedencia que llama toda la app. De aquí en adelante, todas las fórmulas filtran por V, nunca por las banderas en crudo.

La fórmula de normalización

La columna U convierte cuatro cadencias distintas en un número comparable. Estas son las constantes exactas de producción:

  • day — importe x 30,4375 / número (la duración media de un mes en un ciclo de 4 años)
  • week — importe x (52 / 12) / número (unas 4,3333 semanas por mes)
  • month — importe / número
  • year — importe / (12 x número)

La constante semanal es donde la mayoría de hojas pierde dinero. Usar 4 semanas por mes en lugar de 52/12 subestima un cargo semanal en torno a un 8%: sobre una suscripción de 9,99 € semanales son 39,96 € al año (cuatro cobros semanales) que nunca aparecen en tu total.

U2 =IF(V2<>"activa",0,B2*SWITCH(E2,"day",30.4375/D2,"week",(52/12)/D2,"month",1/D2,"year",1/(12*D2),1))

Fíjate en lo que hace el condicional inicial. En la app ocurren dos cosas separadas: un filtro deja solo las filas activas y después corre la conversión. Una hoja no tiene paso de filtrado, así que juntas ambas en una celda — y juntarlas es lo que impide que una fila pausada infle tu cuota mensual con dinero que ahora mismo no sale de tu cuenta.

Tu cifra principal es entonces =SUM(U2:U), y la anual es esa por doce. Si prefieres no montar tú las matemáticas de cadencia, nuestra calculadora de coste anual corre estas mismas constantes sobre la cartera entera. Sobre por qué elegir anual rara vez es el ahorro que parece, está la trampa del pago anual.

La proyección de cargos a 90 días

El equivalente mensual responde a "cuánto cuesta de media al mes esta cartera". No responde a "cuánto me cobran en la tarjeta en octubre". Son dos medidas distintas y ninguna sustituye a la otra: una renovación anual aparece como una doceava parte cada mes en la primera y como un golpe único en la segunda. La segunda es la que te deja en números rojos.

Tres columnas derivadas más te la dan:

W2 =IF(V2="prueba",L2,F2) — el ancla. Las pruebas se anclan en trial_ends_on, porque ese es el día del primer cargo.

X2 =IF(OR(W2="",V2="pausada",V2="cancelada"),0,IF(W2<TODAY(),"CADUCADA",IF(W2>TODAY()+90,0,IF(OR(E2="day",E2="week"),INT((TODAY()+90-W2)/(D2*IF(E2="week",7,1)))+1,IF(EDATE(W2,3*D2*IF(E2="year",12,1))<=TODAY()+90,4,IF(EDATE(W2,2*D2*IF(E2="year",12,1))<=TODAY()+90,3,IF(EDATE(W2,D2*IF(E2="year",12,1))<=TODAY()+90,2,1))))))) — cargos en los próximos 90 días.

Y2 =IF(ISNUMBER(X2),X2*B2,0) — dinero comprometido en esa ventana.

Dos detalles ahí dentro sostienen todo lo demás.

El aviso CADUCADA. Si renewal_date está en el pasado, la hoja no está tanto equivocada como abandonada, y una proyección sobre un ancla caducada es peor que ninguna proyección. Señalarlo es de las cosas que una hoja hace de verdad bien: es un control de calidad del dato.

Cada vencimiento se calcula desde el ancla original. La rama de meses usa EDATE, que en español se llama FECHA.MES, con el paso multiplicado, EDATE(W2, k*m), nunca EDATE(resultado_anterior, m). No es estilo. Avanza un ancla del 31 de enero un mes y obtienes el 28 de febrero, correcto. Avanza desde ese y obtienes 28 de marzo, luego 28 de abril: la fecha se ha desplazado tres días para siempre y no se recupera. Calculando desde el ancla, 31 de enero más dos meses es 31 de marzo, que es lo que el comercio va a cobrar de verdad. Nuestro código de proyección multiplica en lugar de encadenar exactamente por esto.

Para leer el resultado, QUERY de Google Sheets gana a una tabla dinámica:

=QUERY(A1:Y, "select A, B, C, W, Y where V = 'activa' and Y > 0 order by W asc", 1)

Un CSV que sobrevive (BOM y separadores)

Dos de tus columnas — notes y cancellation_notes — son texto libre, así que tarde o temprano una contendrá una coma y tu archivo desarrollará una columna de más. La RFC 4180 lo zanja: los campos que contengan saltos de línea, comillas dobles o comas deben ir entre comillas dobles, y una comilla doble dentro de un campo entrecomillado se escapa precediéndola de otra comilla doble. Esa es toda la regla, y es exactamente lo que hace nuestra exportación.

Las dos trampas siguientes las sufrimos publicando la exportación.

El BOM. Un archivo UTF-8 lleno de categorías con acentos — "Música", "Formación", "Diseño" — se abre como caracteres ilegibles en Excel salvo que Excel sepa que es UTF-8. La guía de Microsoft es explícita: un CSV en UTF-8 se abre con normalidad si se guardó con marca de orden de bytes; si no, hay que traerlo por Datos, Obtener datos, Desde texto/CSV. Nuestra exportación escribe ese BOM al principio del archivo, y por eso el doble clic funciona. Si construyes tú el archivo y ves mojibake, esa es la causa, no el acento.

El separador de listas. Al abrir un .csv directamente, Excel usa el separador de listas de tu configuración regional. Si el tuyo es el punto y coma — lo habitual en España — un archivo separado por comas aterriza entero en una sola columna. La ruta Desde texto/CSV te deja elegir el delimitador de forma explícita, con vista previa antes de importar. Es la misma ruta que arregla el BOM: en la práctica, no hagas doble clic, importa.

Cinco cosas que una hoja no puede hacer

Todo lo anterior es una hoja de cálculo en su mejor versión. Aquí está el límite honesto. No son funciones que te estemos escondiendo en una plantilla: son tareas cuya forma una hoja no puede sostener.

1. No puede lanzar un aviso

Una hoja de cálculo no tiene reloj. El formato condicional pondrá una celda en rojo — la próxima vez que abras la hoja. Y si ibas a abrirla, no necesitabas el aviso. Ese es el fallo entero, y es estructural: un aviso es una tarea programada, no un valor en una celda. Fíjate en que reminder_days_before ni siquiera aparece entre las 20 columnas exportadas, porque no hay nada útil que entregar. En la app es un entero de 0 a 365 por suscripción, sobre los intervalos de notificación de la cuenta. En una hoja, el sustituto honesto es un evento recurrente en el calendario que te diga que vayas a mirar.

2. No puede guardar el historial de un cambio de precio

Cuando un servicio sube el precio, editas la celda B7. El valor antiguo desaparece. Nada registra cuál era, cuándo cambió ni cuánto — y peor: todos los totales históricos que calcules usan ahora el precio de hoy para meses en los que te cobraron el antiguo. Tu "gastado en los últimos seis meses" reescribe el pasado en silencio.

Nosotros guardamos los cambios de precio como eventos: una fila price_changed con una foto del antes, una del después y una marca de tiempo, que es lo que permite a la vista de detalle imputar el importe antiguo a los meses anteriores al cambio y el nuevo a los posteriores. Una hoja con una sola celda de importe por suscripción no puede representar "esto costaba 15,99 € hasta marzo y 17,99 € desde entonces" sin que montes a mano una segunda tabla — momento en el que has construido una base de datos peor. Si lo que quieres es saber si viene una subida, nuestro detector de subidas de precio responde antes que una columna.

3. No puede convertir divisas a un tipo con fecha

En cuanto la columna C tiene dos valores distintos, =SUM(U2:U) está sumando euros con dólares y devolviendo un número que no significa nada. Sheets ofrece GOOGLEFINANCE, que te da un tipo: el de hoy, en vivo, distinto mañana, con lo que el total del mes pasado cambia cada vez que abres el archivo. El problema no es de dónde saques el tipo. Es que la celda guarda un número y no ese número más la fecha en la que era cierto, así que un total que calculaste en marzo no lo puedes reproducir en junio.

Nosotros guardamos tipos con base euro, tomados de los tipos de referencia del BCE, junto con el momento en que se descargaron, y convertimos con importe_en_B = importe_en_A x (tipo_B / tipo_A). Lo que importa más que la fórmula: cuando falta un tipo, nuestros totales se saltan la fila en lugar de contarla a valor nominal en la moneda equivocada, porque un mes subestimado en silencio es peor que uno visiblemente incompleto. Una suma no tiene esa opción: sumará 12 y 12 y te dará 24, sean cuales sean los símbolos delante.

4. No puede tratar el fin de una prueba como fecha del primer cobro

Este es el compuesto de los problemas 1 y 3, y es el que cuesta dinero de verdad. trial_ends_on no es una fecha de caducidad: es la fecha en que te cobran por primera vez. Una hoja lo modela como una fecha en una celda, al lado de un is_active en FALSE, al lado de un amount que tus totales están excluyendo.

O sea: la fila que está a punto de cobrarte es la fila de la que tu hoja está más segura de que no cuesta nada. Por eso la columna de proyección de arriba ancla las pruebas en L y no en F — sin esa línea, una previsión a 90 días se deja fuera justamente los cargos para los que la montaste. La propia Apple recomienda cancelar una prueba al menos 24 horas antes de que termine, una ventana que una hoja no puede vigilar y una notificación sí.

5. No puede guardar una prueba de la cancelación

Aquí quiero ser preciso, porque la hoja lo hace mejor de lo que cabría esperar. Las columnas S y T — cancellation_url y cancellation_notes — están las dos en la exportación, y una hoja las guarda perfectamente.

Lo que no puede guardar es el hecho. Cuando un comercio te cobra después de haber cancelado, "edité una celda en algún momento" no es una prueba. Lo que necesitas es un registro fechado: un evento de cancelación con una foto de cómo estaba la suscripción justo antes y una marca de tiempo que no has escrito tú. Nosotros los guardamos en un historial exactamente para esa discusión. Una hoja tiene historial de versiones, pero eso es el diff de un archivo, no el registro de una decisión, y es un argumento flojo delante de un agente de atención al cliente. Si además tienes derecho de desistimiento, conviene tener la fecha por escrito: la normativa española y europea se aplica sobre fechas concretas.

La habilidad relacionada — saber qué decir — es otro problema, y de esa mitad se encarga nuestro generador de emails de cancelación.

Mantener la hoja o superarla

Un umbral, no un argumento de venta.

Quédate con la hoja si se cumplen las cuatro: tienes unas 15 filas o menos, todas en una sola moneda, ninguna es una prueba con una tarjeta real detrás, y enterarte de un cargo unos días tarde te molestaría pero no te haría daño. En esas condiciones la hoja es mejor que una app: es gratis, es tuya, no tiene cuenta y entiendes todas sus fórmulas. Monta las 21 columnas, escribe las cuatro derivadas y para.

Supérala la primera vez que se cumpla una sola de estas — no las cuatro, una:

  1. Aparece una segunda moneda en la columna C.
  2. Das de alta una prueba con una tarjeta real detrás.
  3. Cambia un precio y quieres poder demostrar cuál era antes.
  4. Llega una renovación de la que te enteras por el extracto.

Cada una es una de las cinco, y todas tienen la misma señal: la hoja sigue siendo correcta y aun así no te ayudó. Ese es el momento en que cambió la herramienta, no el momento en que fracasaste con las hojas de cálculo.

Caigas del lado que caigas, lo duradero es el esquema. Rellénalo con honestidad y encontrarás filas que no recordabas — que es un ejercicio en sí mismo, cubierto en la lista de suscripciones olvidadas y en la auditoría del extracto bancario. Una hoja que puedes completar vale más que una app que nunca rellenas.

Fuentes y alcance

Alcance: el esquema, las constantes y los cinco límites salen del código de SubBuddy, revisado el 31 de agosto de 2026. Las cifras en euros son ejemplos de cálculo, no gasto medido.

Alex Coca

Álex Coca es el desarrollador independiente detrás de SubBuddy. Investiga la facturación de suscripciones, los patrones de cancelación y los flujos de gasto recurrente construyendo el producto y revisando auditorías de suscripciones reales de usuarios y de sus propias cuentas.

Cuando la hoja se queda corta

SubBuddy hace las cinco cosas que una hoja de cálculo no puede: avisos, historial de precios, conversión de divisa con fecha, fechas de conversión de pruebas y un registro fechado de la cancelación.

Prueba SubBuddy gratis

Artículos relacionados