Apps y addons por tema
Cada tema puede declarear qué addons soporta y si se activan por defecto. El sistema maneja activación automática, gating por plan, y configuración independiente por tienda.
Declaración en theme.json
En el theme.json de cada tema:
{
"addons": [
{ "id": "reviews", "enabled_by_default": true },
{ "id": "complaints", "enabled_by_default": true },
{ "id": "size-fit", "enabled_by_default": false },
{ "id": "tryon-ar", "enabled_by_default": false },
{ "id": "hair-tryon", "enabled_by_default": false }
]
}
| Campo | Descripción |
|---|---|
id | Identificador del addon (matchea el registry) |
enabled_by_default | Si true, se activa automáticamente al aplicar el tema |
Registry de addons
El sistema tiene 17 addons registrados en internal/addons/registry.go:
| ID | Nombre | Categoría | Plan mínimo |
|---|---|---|---|
reviews | Reseñas de productos | marketing | free |
complaints | Reclamos | logistics | free |
loyalty | Programa de fidelidad | marketing | growth |
gift-cards | Tarjetas de regalo | marketing | growth |
size-fit | Guía de tallas | design | starter |
tryon-ar | Probador de AR | design | enterprise |
hair-tryon | Probador de color de cabello | design | enterprise |
email-marketing | Email marketing | marketing | starter |
abandoned-carts | Carritos abandonados | marketing | growth |
returns | Devoluciones | logistics | starter |
Cada addon declara:
ID,Name,CategoryMinPlan— plan mínimo requeridoConfigSchema— campos de configuración del panelSectionID— sección del visual editor que controla (opcional)Rubros— industrias objetivo
Activación automática
Cuando un merchant aplica un tema, ApplyThemeAddons() categoriza los addons:
func categorizeAddons(manifest, tenantRank, existingAddons) {
for _, addon := range manifest.Addons {
switch {
case !addon.EnabledByDefault:
→ Suggested (no se activa, solo sugiere)
case tenantRank < planRank:
→ Blocked (plan insuficiente, sugiere upgrade)
case alreadyEnabled == false:
→ Suggested (respetar desactivación manual)
default:
→ Activated (activar automáticamente)
}
}
}
Gating por plan
El rango del plan del tenant se compara con el rango mínimo del addon:
free < starter < growth < pro < enterprise
Si el tenant tiene un plan inferior al mínimo del addon, el addon queda en estado Blocked y se sugiere upgrade.
Configuración de addons
Cada addon activo tiene su panel de configuración en Apariencia → Addons:
/admin/themes/addons/:id/config → GET/POST config del addon
/admin/themes/addons/:id/toggle → Activar/desactivar
La configuración se guarda en la tabla tenant_addons:
SELECT enabled, config
FROM tenant_addons
WHERE tenant_id = $1 AND addon_id = 'tryon-ar';
Datos en el storefront
Los addons inyectan datos en el StoreContext para que los templates los usen:
| Addon | Campo en StoreContext | Tipo |
|---|---|---|
tryon-ar | .ARTryOn | *ARTryOnData (accessory type, model URL, offsets) |
hair-tryon | .HairTryOn | *HairTryOnData (palette, intensity) |
complaints | .ComplaintsEnabled | bool |
gift-cards | .GiftEnabled | bool |
loyalty | .Loyalty | *LoyaltyData |
Ejemplo en template
{{ if .ARTryOn }}
{{ template "platform/ar-tryon-panel" . }}
{{ end }}
El snippet ar-tryon-panel.html vive en _platform/snippets/ y se renderiza cuando el addon AR está activo.
Addons en el visual editor
Los addons que tienen SectionID asociado aparecen en el catálogo de secciones del visual editor, junto con las secciones nativas del tema. El merchant los puede reordenar y configurar igual que cualquier sección.
Addons por tema — Resumen
| Tema | Addons por defecto | Addons disponibles |
|---|---|---|
| dawn | reviews, complaints | + size-fit, tryon-ar, hair-tryon |
| cielo | reviews, complaints | + size-fit, tryon-ar, hair-tryon |
| olive-luxe | reviews, complaints | + size-fit, tryon-ar, hair-tryon |
| bold | reviews | + complaints |
| minimal | reviews | + complaints |