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