Saltar al contenido principal

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 }
]
}
CampoDescripción
idIdentificador del addon (matchea el registry)
enabled_by_defaultSi true, se activa automáticamente al aplicar el tema

Registry de addons

El sistema tiene 17 addons registrados en internal/addons/registry.go:

IDNombreCategoríaPlan mínimo
reviewsReseñas de productosmarketingfree
complaintsReclamoslogisticsfree
loyaltyPrograma de fidelidadmarketinggrowth
gift-cardsTarjetas de regalomarketinggrowth
size-fitGuía de tallasdesignstarter
tryon-arProbador de ARdesignenterprise
hair-tryonProbador de color de cabellodesignenterprise
email-marketingEmail marketingmarketingstarter
abandoned-cartsCarritos abandonadosmarketinggrowth
returnsDevolucioneslogisticsstarter

Cada addon declara:

  • ID, Name, Category
  • MinPlan — plan mínimo requerido
  • ConfigSchema — campos de configuración del panel
  • SectionID — 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:

AddonCampo en StoreContextTipo
tryon-ar.ARTryOn*ARTryOnData (accessory type, model URL, offsets)
hair-tryon.HairTryOn*HairTryOnData (palette, intensity)
complaints.ComplaintsEnabledbool
gift-cards.GiftEnabledbool
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

TemaAddons por defectoAddons disponibles
dawnreviews, complaints+ size-fit, tryon-ar, hair-tryon
cieloreviews, complaints+ size-fit, tryon-ar, hair-tryon
olive-luxereviews, complaints+ size-fit, tryon-ar, hair-tryon
boldreviews+ complaints
minimalreviews+ complaints