02 — Catálogo de Variables Parametrizables
Índice de la página
- 01Todo lo que NO debe estar hardcoded
- 02Cómo se usa
- 031. Identidad del cliente
- 042. Branding
- 053. Identidad social
- 064. Voz y mecanismo único
- 075. Webinar
- 086. Oferta y SKUs (precio dinámico)
- 097. Pasarelas de pago
- 108. Tracking
- 119. WhatsApp
- 1210. Equipo
- 1311. Acuerdo comercial
- 1412. Infraestructura
- 1513. Touchpoints operativos
- 1614. KPIs target
- 1715. Variables INVENTADAS por agentes (a validar)
- 1816. Anti-patterns (NO HACER)
- 1917. Validación pre-launch (grep test)
- 20CHANGELOG
Todo lo que NO debe estar hardcoded
Si un valor podría cambiar entre el cliente Martín y el cliente #2, debe estar en este catálogo y debe leer de client_config.json (frontend) o clients.config_json (backend) o _CONFIG.md (documental). Es la fuente de verdad para validar el "multi-tenant readiness" del sistema.
Última actualización: 2026-05-05
Owner: Eric (técnico) + Jesús (estratégico)
Cómo se usa
- Antes de cerrar la fase de "multi-tenant ready" del piloto Martín → grep el repo entero buscando cada string de la columna "Hardcoded prohibido". Si aparece, refactorear.
- Al lanzar un cliente nuevo → todas las variables de este catálogo deben estar pobladas en
_CONFIG.md antes de ejecutar el clone-script.
- Si una nueva variable aparece durante el desarrollo → agregarla acá + a
_CONFIG.template.md + a client_config.json.template.
1. Identidad del cliente
| Variable |
Tipo |
Ejemplo Martín |
Hardcoded prohibido |
client_slug |
string lowercase |
martin |
nunca uses "martin" en código |
client_name |
string |
Martín Rieznik |
nunca uses "Martín Rieznik" en plantillas |
brand_name |
string |
LevantArte |
nunca uses "LevantArte" en copies |
country |
ISO-2 |
AR |
— |
language |
ISO 639-1 |
es |
— |
timezone |
IANA tz |
America/Argentina/Buenos_Aires |
— |
client_short_bio |
string ≤200 chars |
"CEO de LevantArte, escuela de habilidades sociales desde 2008" |
— |
client_years_in_field |
int |
17 |
— |
2. Branding
| Variable |
Tipo |
Ejemplo Martín |
branding.color_primary |
hex |
#1a1a1a (a definir) |
branding.color_secondary |
hex |
#d4af37 (a definir) |
branding.font_primary |
string CSS |
'Playfair Display', serif |
branding.font_secondary |
string CSS |
'Inter', sans-serif |
branding.logo_url |
URL |
https://deacademia.com/clients/martin/logo.png |
branding.favicon_url |
URL |
https://deacademia.com/clients/martin/favicon.ico |
3. Identidad social
| Variable |
Tipo |
Ejemplo Martín |
social.web |
URL |
https://levantarte.com/ |
social.youtube_channel |
URL |
https://www.youtube.com/@LEVANTARTE |
social.youtube_channel_id |
string |
UCCjrYNYSdbz5niVK5wWa_ow |
social.instagram |
string |
@martinrieznik |
social.facebook |
URL |
https://facebook.com/RieznikMartin |
social.tiktok |
string |
(si tiene) |
4. Voz y mecanismo único
| Variable |
Tipo |
Ejemplo Martín |
voice.tone_descriptor |
string |
"Directo, irreverente, científico (apoya en Andrés). Argentino sin clichés." |
voice.examples_path |
path |
R/YouTube/Transcripciones/ (corpus para parametrizar bot) |
voice.banned_words |
array |
["chabon", "loco"] (si aplica) |
mechanism.name |
string |
"La Ciencia de la Seducción" |
mechanism.short_pitch |
string ≤200 chars |
(extraído del scraping) |
mechanism.proof_assets |
array |
links a videos+entrevistas+TEDx |
5. Webinar
| Variable |
Tipo |
Ejemplo Martín |
webinar.day_of_week |
int 1-7 |
1 (lunes) |
webinar.hour_local |
string HH:MM |
20:00 |
webinar.platform |
enum |
skool (default desde 2026-05-05); alternativas streamyard+youtube_live, zoom, obs_youtube |
webinar.mode |
enum |
evergreen (default desde 2026-05-05); alternativa live_recurrente |
webinar.duration_min |
int |
90 |
webinar.registration_url |
URL |
{base_url}/{slug}/ |
webinar.replay_url |
URL |
{base_url}/{slug}/replay |
webinar.qa_live_opcional |
bool / freq |
false o mensual o semanal (decisión cliente) |
webinar.regrabacion_triggers |
array |
criterios para regrabar (default cada 6 meses) |
6. Oferta y SKUs (precio dinámico)
| Variable |
Tipo |
Ejemplo Martín |
oferta.taller.precio_lunes_usd |
int |
5 |
oferta.taller.precio_martes_usd |
int |
10 |
oferta.taller.precio_mie_jue_vie_usd |
int |
15 |
oferta.taller.deadline_compra |
datetime ISO |
(calculado por server según TZ) |
oferta.taller.stack_items |
array |
[{name, value_usd, description}] |
oferta.taller.bonus_items |
array |
[{name, value_usd, description}] |
oferta.taller.garantia_dias |
int |
7 |
oferta.membresia.anual_1_pago_usd |
int |
97 |
oferta.membresia.mensual_usd |
int |
17 |
oferta.membresia.cuotas_6_usd |
int |
67 (×6) |
oferta.membresia.stack_items |
array |
mismo formato |
oferta.membresia.bonus_items |
array |
mismo formato |
oferta.membresia.garantia_dias |
int |
30 |
7. Pasarelas de pago
Estructura: por pasarela, un objeto con un checkout_url por SKU.
| Variable |
Tipo |
Ejemplo Martín |
pasarelas.hotmart.taller_lunes_url |
URL |
(capturada al crear) |
pasarelas.hotmart.taller_martes_url |
URL |
— |
pasarelas.hotmart.taller_full_url |
URL |
— |
pasarelas.hotmart.membresia_anual_url |
URL |
— |
pasarelas.hotmart.membresia_mensual_url |
URL |
— |
pasarelas.hotmart.membresia_6_meses_url |
URL |
— |
pasarelas.dlocal.* (mismo set 6) |
URL |
— |
pasarelas.shopify.* (mismo set 6) |
URL |
— |
pasarelas.skool.* (mismo set 6 si aplica) |
URL |
— |
pasarelas.transferencia.alias |
string |
(cliente da) |
pasarelas.transferencia.cbu |
string |
(cliente da) |
pasarelas.transferencia.banco |
string |
— |
pasarelas.transferencia.titular |
string |
— |
pasarelas.transferencia.cuit_cuil |
string |
— |
pasarelas.transferencia.cuenta_usd |
object con CBU/SWIFT |
(si aplica para compradores no-AR) |
8. Tracking
| Variable |
Tipo |
Ejemplo Martín |
tracking.meta_pixel_id |
string |
(cliente da) |
tracking.meta_capi_token |
secret env var |
(cliente da) |
tracking.tiktok_pixel_id |
string |
(si aplica) |
tracking.google_ads_id |
string |
(si aplica) |
tracking.google_ads_conversion_label |
string |
— |
tracking.provesource_site_id |
string |
(TooAudience puede compartir si quiere) |
tracking.hyros_account_id |
string |
(ACTIVO desde MVP — Hyros confirmado 2026-05-05) |
tracking.hyros_tracking_domain |
string |
i.deacademia.com (default, con cliente_slug en path) |
tracking.hyros_call_id |
string |
(ACTIVO desde MVP — solo si el cliente tiene call tracking; opcional) |
tracking.ga4_measurement_id |
string |
(opcional) |
9. WhatsApp
| Variable |
Tipo |
Ejemplo Martín |
wa.bsp_provider |
enum |
meta_cloud_api (default) o twilio o 360dialog |
wa.phone_number |
E.164 |
+5491155555555 (a comprar) |
wa.display_name |
string |
LevantArte (aprobación Meta) |
wa.phone_number_id |
string |
(Meta Cloud API ID) |
wa.business_account_id |
string |
(Meta) |
wa.access_token |
secret env var |
— |
wa.webhook_verify_token |
secret env var |
random string |
wa.webhook_url |
URL |
https://<railway-url>/webhook/whatsapp |
wa.system_prompt_path |
path |
clientes-tooaudience/martin-rieznik/bot/system_prompt.md |
wa.intents |
array |
lista de intents reconocidos |
wa.handoff_threshold |
float 0-1 |
0.6 (confianza mínima antes de handoff a humano) |
wa.fallback_human_wa |
E.164 |
número del closer principal |
10. Equipo
| Variable |
Tipo |
Ejemplo Martín |
team.closer_principal_wa |
E.164 |
(a asignar) |
team.closer_principal_email |
email |
— |
team.closer_backup_wa |
E.164 |
— |
team.tech_contact_email |
email |
eric@tooaudience.com |
team.am_email |
email |
jesus@tooaudience.com |
team.cliente_wa |
E.164 |
(Martín) |
team.cliente_email |
email |
(Martín) |
11. Acuerdo comercial
| Variable |
Tipo |
Ejemplo Martín |
commercial.profit_share_tooaudience |
float 0-1 |
0.5 |
commercial.profit_share_cliente |
float 0-1 |
0.5 |
commercial.gastos_compartidos_50_50 |
array |
["ads", "comisiones_pasarelas", "closers", "wa_email", "ia"] |
commercial.scope_inclusion |
array |
["taller", "membresia"] |
commercial.scope_exclusion |
array |
["mentoria_1_1", "libros", "eventos_propios"] |
commercial.fecha_inicio |
date |
2026-06-08 |
commercial.compromiso_minimo_meses |
int |
3 |
commercial.budget_inicial_semanal_usd |
int |
1500 |
commercial.budget_techo_semanal_usd |
int |
5000 |
commercial.cadencia_balance |
enum |
mensual |
commercial.commission_closer_pct |
float 0-1 |
0.07 (default desde 2026-05-05 — 7% flat) |
12. Infraestructura
| Variable |
Tipo |
Ejemplo Martín |
infra.base_url |
URL |
https://deacademia.com |
infra.client_path |
string |
/martin |
infra.client_own_domain |
URL nullable |
(null en Martín) |
infra.supabase_url |
URL |
https://<proj>.supabase.co |
infra.supabase_anon_key |
secret env var |
— |
infra.supabase_service_role_key |
secret env var |
— |
infra.supabase_region |
string |
sa-east-1 |
infra.railway_service_id |
string |
(Railway UUID) |
infra.railway_service_url |
URL |
— |
infra.vercel_project_name |
string |
tooaudience-paraguas (compartido) |
infra.vercel_domain |
string |
deacademia.com (compartido) |
infra.openai_api_key |
secret env var |
TooAudience shared |
infra.client_id_uuid |
UUID |
(de tabla clients de Supabase) |
13. Touchpoints operativos
| Variable |
Tipo |
Ejemplo |
ops.prewebinar_group_url |
URL |
link de invitación al grupo WA |
ops.compradores_group_url |
URL |
— |
ops.miembros_group_url |
URL |
— |
ops.comprobante_form_url |
URL |
{base_url}/{slug}/transferencia/comprobante |
ops.soporte_email |
email |
soporte@tooaudience.com |
ops.soporte_horario |
string |
Lun-Vie 10-18hs ART |
ops.zoom_link_webinar |
URL |
(si aplica) |
ops.youtube_live_url |
URL |
(si aplica) |
ops.skool_community_url |
URL |
(si platform=skool) link a la comunidad principal del cliente |
ops.skool_classroom_url |
URL |
(si platform=skool) link a las clases on-demand |
ops.crm_atencion_provider |
enum |
wati / respond_io / front / null (default wati) |
ops.crm_atencion_url |
URL |
URL del inbox del CRM atención |
14. KPIs target
| Variable |
Tipo |
Ejemplo Martín |
kpi.cpl_captacion_max_usd |
float |
1.50 |
kpi.cpl_retargeting_max_usd |
float |
0.80 |
kpi.roas_min |
float |
1.5 |
kpi.tasa_cierre_closer_min |
float |
0.20 |
kpi.attendance_webinar_min_pct |
float |
0.30 (de registrados) |
15. Variables INVENTADAS por agentes (a validar)
Variables que aparecieron durante el armado del SOP que no estaban claramente en el plan base. Validar con Jesús/Eric antes de cerrar v1.0.
| Variable |
Origen |
Por qué se inventó |
infra.supabase_region |
Decisión técnica |
Default sa-east-1 por proximidad LATAM. |
wa.bsp_provider |
Decisión técnica |
Default meta_cloud_api. |
commercial.gastos_compartidos_50_50 |
Plan base extraído |
Validado contra § 4 del 00_CONTEXTO.md. |
voice.banned_words |
Buena práctica |
Para evitar errores de tono del bot. |
16. Anti-patterns (NO HACER)
- ❌ NO hardcodear nombres del cliente en componentes React (
<h1>Bienvenido a LevantArte</h1>).
- ❌ NO hardcodear URLs de checkout en HTML.
- ❌ NO hardcodear precios en client-side (siempre lee del config + reloj servidor).
- ❌ NO hardcodear webhook URLs (siempre
process.env.RAILWAY_URL o equivalente).
- ❌ NO hardcodear el día de la semana del webinar en cron jobs (parametrizar desde
webinar.day_of_week).
- ❌ NO hardcodear el
client_id UUID en queries (siempre extraer de la sesión / del slug del path).
- ❌ NO inventar variables nuevas sin agregarlas a este catálogo + a los templates.
17. Validación pre-launch (grep test)
Antes de declarar "multi-tenant ready", correr en el repo tooaudience-paraguas:
# debería devolver 0 matches
grep -ri "martin\|martín\|levantarte\|rieznik" app/ lib/ components/ --include="*.ts" --include="*.tsx" --include="*.js"
# debería devolver 0 matches en código (sí matches en docs y CSS si aplica)
grep -ri "deacademia.com/martin" app/ lib/ components/ --include="*.ts" --include="*.tsx"
Si alguno devuelve matches → refactor pendiente.
CHANGELOG
- 2026-05-05 — JT — v0.1 inicial con catálogo de ~150 variables.
- 2026-05-05 — JT — Hyros confirmado como ACTIVO desde MVP (variables
hyros_account_id, hyros_tracking_domain, hyros_call_id). Webinar default = skool + mode=evergreen. Sumadas commercial.commission_closer_pct=0.07, ops.skool_*, ops.crm_atencion_*. Quitada fila tracking.jairo_pixel_* de § 15.