@saulwade/swl-ses 2.4.2 → 2.5.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CLAUDE.md +194 -241
- package/README.md +600 -597
- package/agentes/_intent-spec.md +73 -73
- package/agentes/_propose-step.md +90 -90
- package/agentes/abogado-diablo-swl.md +145 -0
- package/agentes/accesibilidad-wcag-swl.md +690 -690
- package/agentes/arquitecto-swl.md +267 -267
- package/agentes/auto-evolucion-swl.md +908 -908
- package/agentes/backend-api-swl.md +1 -1
- package/agentes/backend-csharp-swl.md +420 -420
- package/agentes/backend-go-swl.md +390 -390
- package/agentes/backend-java-swl.md +281 -281
- package/agentes/backend-node-swl.md +1 -1
- package/agentes/backend-python-swl.md +1 -1
- package/agentes/backend-rust-swl.md +364 -364
- package/agentes/backend-workers-swl.md +482 -482
- package/agentes/cloud-infra-swl.md +509 -509
- package/agentes/consolidador-swl.md +541 -541
- package/agentes/datos-swl.md +1 -1
- package/agentes/depurador-swl.md +352 -352
- package/agentes/devops-ci-swl.md +400 -400
- package/agentes/disenador-ui-swl.md +569 -569
- package/agentes/documentador-swl.md +345 -345
- package/agentes/frontend-angular-swl.md +621 -621
- package/agentes/frontend-css-swl.md +716 -716
- package/agentes/frontend-react-swl.md +692 -692
- package/agentes/frontend-swl.md +496 -496
- package/agentes/frontend-tailwind-swl.md +826 -826
- package/agentes/gh-fix-ci-swl.md +6 -1
- package/agentes/implementador-swl.md +1 -1
- package/agentes/investigador-swl.md +432 -432
- package/agentes/investigador-ux-swl.md +505 -505
- package/agentes/llm-apps-swl.md +1 -1
- package/agentes/migrador-swl.md +442 -442
- package/agentes/mobile-android-swl.md +511 -511
- package/agentes/mobile-cross-swl.md +541 -541
- package/agentes/mobile-ios-swl.md +502 -502
- package/agentes/mobile-testing-swl.md +302 -302
- package/agentes/nemesis-auditor-swl.md +285 -285
- package/agentes/notificador-swl.md +1 -1
- package/agentes/observabilidad-swl.md +438 -438
- package/agentes/pagos-swl.md +310 -310
- package/agentes/perfilador-usuario-swl.md +321 -321
- package/agentes/planificador-swl.md +399 -399
- package/agentes/producto-prd-swl.md +589 -589
- package/agentes/red-team-swl.md +218 -218
- package/agentes/release-manager-swl.md +590 -590
- package/agentes/rendimiento-swl.md +713 -713
- package/agentes/resolutor-build-swl.md +10 -1
- package/agentes/revisor-angular-swl.md +278 -278
- package/agentes/revisor-codigo-swl.md +1 -1
- package/agentes/revisor-csharp-swl.md +264 -264
- package/agentes/revisor-go-swl.md +259 -259
- package/agentes/revisor-java-swl.md +257 -257
- package/agentes/revisor-kotlin-swl.md +273 -273
- package/agentes/revisor-nextjs-swl.md +281 -281
- package/agentes/revisor-php-swl.md +271 -271
- package/agentes/revisor-react-swl.md +278 -278
- package/agentes/revisor-rust-swl.md +346 -346
- package/agentes/revisor-seguridad-swl.md +399 -399
- package/agentes/revisor-swift-swl.md +268 -268
- package/agentes/revisor-typescript-swl.md +346 -346
- package/agentes/sre-swl.md +1 -1
- package/agentes/tdd-qa-swl.md +393 -393
- package/bin/lib/bot-comandos.js +1 -1
- package/bin/swl-ses.js +6 -0
- package/comandos/swl/adoptar-proyecto.md +14 -2
- package/comandos/swl/configurar-ci.md +8 -1
- package/comandos/swl/deuda-codigo.md +97 -97
- package/comandos/swl/discutir-fase.md +22 -118
- package/comandos/swl/fix.md +118 -0
- package/comandos/swl/nuevo-proyecto.md +54 -3
- package/comandos/swl/predecir.md +32 -2
- package/comandos/swl/seguridad.md +189 -0
- package/comandos/swl/status.md +5 -3
- package/habilidades/aprendizaje-continuo/SKILL.md +3 -1
- package/habilidades/discutir-fase/SKILL.md +84 -81
- package/habilidades/discutir-fase/recursos/plantilla-contexto.md +136 -0
- package/habilidades/doc-sync/SKILL.md +3 -1
- package/habilidades/doubt-driven-review/SKILL.md +15 -1
- package/habilidades/ejecutar-task-iterativo/SKILL.md +278 -278
- package/habilidades/estructura-proyecto-claude/SKILL.md +11 -2
- package/habilidades/harness-claude-code/SKILL.md +3 -1
- package/habilidades/instalar-sistema/SKILL.md +3 -1
- package/habilidades/meta-reglas-extendido/SKILL.md +92 -0
- package/habilidades/meta-reglas-extendido/recursos/analisis-previo-tareas-grandes.md +186 -0
- package/habilidades/meta-reglas-extendido/recursos/analizar-directorios-antes-de-escribir.md +235 -0
- package/habilidades/meta-reglas-extendido/recursos/api-diseno.md +413 -0
- package/habilidades/meta-reglas-extendido/recursos/arquitectura.md +491 -0
- package/habilidades/meta-reglas-extendido/recursos/arreglar-al-detectar.md +264 -0
- package/habilidades/meta-reglas-extendido/recursos/debatir-antes-de-aceptar.md +152 -0
- package/habilidades/meta-reglas-extendido/recursos/git-workflow.md +259 -0
- package/habilidades/meta-reglas-extendido/recursos/gobernanza.md +291 -0
- package/habilidades/meta-reglas-extendido/recursos/memoria-consolidada.md +263 -0
- package/habilidades/meta-reglas-extendido/recursos/seguridad-agentes.md +443 -0
- package/habilidades/meta-reglas-extendido/recursos/sesiones-paralelas.md +190 -0
- package/habilidades/meta-reglas-extendido/recursos/sin-duplicacion-reglas-globales.md +179 -0
- package/habilidades/meta-reglas-extendido/recursos/skills-estandar.md +394 -0
- package/habilidades/meta-reglas-extendido/recursos/usar-code-review-graph.md +156 -0
- package/habilidades/meta-reglas-extendido/recursos/usar-context7.md +236 -0
- package/habilidades/meta-reglas-extendido/recursos/usar-sistema-swl.md +253 -0
- package/habilidades/meta-reglas-extendido/recursos/verificar-citas-normativas.md +527 -0
- package/habilidades/meta-skills-estandar/SKILL.md +3 -1
- package/habilidades/nuevo-proyecto/SKILL.md +20 -3
- package/habilidades/php-experto/SKILL.md +10 -3
- package/habilidades/{filament-admin/SKILL.md → php-experto/recursos/filament-admin.md} +23 -39
- package/habilidades/prevencion-sobreingenieria/recursos/soluciones-nativas.md +166 -166
- package/habilidades/prevencion-sobreingenieria/recursos/variables-residuales-post-refactor.md +85 -85
- package/habilidades/proceso-debate-adversarial/recursos/personas.md +5 -4
- package/habilidades/proceso-ingenieria-requerimientos/SKILL.md +147 -0
- package/hooks/check-update.js +19 -10
- package/hooks/contexto-subagente.js +68 -68
- package/hooks/degradacion-instintos.js +1 -1
- package/hooks/extraccion-aprendizajes.js +2 -2
- package/hooks/lib/briefing.js +3 -3
- package/hooks/lib/nudge-tracker.js +1 -1
- package/hooks/lib/otlp-exporter.js +1 -1
- package/hooks/lib/webhook-dedup.js +1 -1
- package/hooks/session-briefing.js +1 -1
- package/llms.txt +6 -6
- package/manifiestos/canonical-hashes.json +989 -0
- package/manifiestos/hooks-config.json +469 -469
- package/manifiestos/invariantes-criticos.json +30 -30
- package/manifiestos/modulos.json +168 -135
- package/manifiestos/perfiles.json +0 -2
- package/manifiestos/skills-lock.json +52 -59
- package/package.json +7 -5
- package/plantillas/github-workflows/README.md +15 -1
- package/plantillas/github-workflows/swl-devsecops.yml +70 -0
- package/plugin.json +5 -5
- package/reglas/analisis-previo-tareas-grandes.md +30 -156
- package/reglas/analizar-directorios-antes-de-escribir.md +30 -211
- package/reglas/api-diseno.md +28 -398
- package/reglas/arquitectura.md +35 -456
- package/reglas/arreglar-al-detectar.md +30 -230
- package/reglas/debatir-antes-de-aceptar.md +30 -143
- package/reglas/docs.md +7 -0
- package/reglas/estilo-codigo.md +9 -0
- package/reglas/fragmentos-compartidos.md +6 -0
- package/reglas/git-workflow.md +44 -240
- package/reglas/gobernanza.md +23 -262
- package/reglas/memoria-consolidada.md +34 -228
- package/reglas/performance.md +8 -0
- package/reglas/pruebas.md +12 -0
- package/reglas/seguridad-agentes.md +37 -418
- package/reglas/seguridad.md +12 -0
- package/reglas/sesiones-paralelas.md +29 -162
- package/reglas/sin-duplicacion-reglas-globales.md +25 -166
- package/reglas/skills-estandar.md +23 -373
- package/reglas/usar-code-review-graph.md +31 -140
- package/reglas/usar-context7.md +30 -208
- package/reglas/usar-sistema-swl.md +47 -242
- package/reglas/verificar-citas-normativas.md +47 -537
- package/scripts/actualizar.js +253 -253
- package/scripts/audit-tools/auditar-relleno-inventario.js +145 -0
- package/scripts/auditar-clases-conocidas.js +106 -0
- package/scripts/bootstrap-instintos.js +2 -2
- package/scripts/canario-hooks.js +166 -0
- package/scripts/cli/configurar-ci.js +2 -1
- package/scripts/evidencia-valor.js +93 -0
- package/scripts/field-report.js +1 -1
- package/scripts/generar-comandos.js +143 -0
- package/scripts/generar-inventario.js +236 -23
- package/scripts/generar-matriz-lenguajes.js +1 -1
- package/scripts/instalador.js +15 -1
- package/scripts/lib/configurar-ci.js +10 -3
- package/scripts/lib/detectar-runtime.js +12 -3
- package/scripts/lib/diary-entry.js +3 -1
- package/scripts/lib/drift-detector.js +1 -1
- package/scripts/lib/evidencia-valor.js +189 -0
- package/scripts/lib/expandir-targets.js +71 -71
- package/scripts/lib/frontmatter-md.js +63 -0
- package/scripts/lib/parsear-opciones.js +2 -0
- package/scripts/lib/prune-componentes.js +180 -0
- package/scripts/lib/reglas-globales-conocidas.json +16 -2
- package/scripts/lib/scoring-instintos.js +2 -2
- package/scripts/lib/toml-merge.js +204 -204
- package/scripts/lib/transformadores/claude.js +1 -1
- package/scripts/lib/transformadores/codex.js +1 -1
- package/scripts/lib/transformadores/copilot.js +1 -1
- package/scripts/lib/transformadores/cursor.js +1 -1
- package/scripts/lib/transformadores/gemini.js +22 -2
- package/scripts/lib/transformadores/opencode.js +1 -1
- package/scripts/mcp-server/auth.js +105 -105
- package/scripts/mcp-server/cache.js +106 -106
- package/scripts/prune.js +102 -0
- package/scripts/publicar.js +18 -2
- package/scripts/tui/pantallas/inspect.js +175 -175
- package/scripts/tui/pantallas/uninstall-wizard.js +210 -210
- package/scripts/tui/pantallas/update-wizard.js +234 -234
- package/scripts/tui/pantallas/welcome.js +189 -189
- package/habilidades/paid-media-tracking/SKILL.md +0 -269
- package/habilidades/paid-media-tracking/recursos/auditoria-tracking.md +0 -220
- package/habilidades/paid-media-tracking/recursos/google-ads-api.md +0 -215
- package/habilidades/tracking-measurement/SKILL.md +0 -239
- package/habilidades/tracking-measurement/recursos/consent-mode.md +0 -231
- package/habilidades/tracking-measurement/recursos/gtm-datalayer.md +0 -216
- package/habilidades/tracking-measurement/recursos/meta-capi.md +0 -262
|
@@ -1,262 +0,0 @@
|
|
|
1
|
-
# Meta Conversions API (CAPI): implementación server-side
|
|
2
|
-
|
|
3
|
-
## Por qué CAPI es necesario post-iOS 14
|
|
4
|
-
|
|
5
|
-
iOS 14 introdujo App Tracking Transparency (ATT) e Intelligent Tracking
|
|
6
|
-
Prevention (ITP) de Safari. El impacto en el Pixel browser:
|
|
7
|
-
|
|
8
|
-
- **40-60% de eventos de conversión se pierden** en dispositivos Apple.
|
|
9
|
-
- Las cookies de terceros duran máximo 7 días en Safari (antes: 2 años).
|
|
10
|
-
- El atributo `_fbp` (identificador de usuario de Meta) expira en 7 días.
|
|
11
|
-
|
|
12
|
-
CAPI envía eventos directamente desde el servidor, sin depender del browser.
|
|
13
|
-
Los datos server-side tienen mayor confiabilidad porque no son bloqueados
|
|
14
|
-
por extensiones de ad-blocking ni restricciones del sistema operativo.
|
|
15
|
-
|
|
16
|
-
**Estrategia recomendada**: browser Pixel + CAPI en paralelo, con
|
|
17
|
-
deduplicación obligatoria vía `event_id`.
|
|
18
|
-
|
|
19
|
-
## Setup: credenciales necesarias
|
|
20
|
-
|
|
21
|
-
| Credencial | Dónde obtenerla | Dónde almacenarla |
|
|
22
|
-
|------------|----------------|-------------------|
|
|
23
|
-
| `PIXEL_ID` | Meta Business > Events Manager > tu Pixel | Variable de entorno del servidor |
|
|
24
|
-
| `CAPI_TOKEN` | Events Manager > Settings > Generate Access Token | Secret Manager / variable de entorno |
|
|
25
|
-
|
|
26
|
-
El token de acceso NO tiene fecha de expiración pero se puede revocar manualmente.
|
|
27
|
-
Rotar el token si se sospecha compromiso de seguridad.
|
|
28
|
-
|
|
29
|
-
## Hashing de PII: función de referencia
|
|
30
|
-
|
|
31
|
-
Meta requiere SHA-256 con normalización específica por tipo de dato:
|
|
32
|
-
|
|
33
|
-
```python
|
|
34
|
-
import hashlib
|
|
35
|
-
|
|
36
|
-
def hash_pii(valor: str) -> str:
|
|
37
|
-
"""
|
|
38
|
-
Normaliza y hashea PII para Meta CAPI (SHA-256).
|
|
39
|
-
- Email: minúsculas, sin espacios al inicio/fin
|
|
40
|
-
- Teléfono: formato E.164 (+52XXXXXXXXXX), solo dígitos y +
|
|
41
|
-
- Nombre/apellido: minúsculas, sin espacios al inicio/fin
|
|
42
|
-
"""
|
|
43
|
-
return hashlib.sha256(valor.strip().lower().encode()).hexdigest()
|
|
44
|
-
|
|
45
|
-
def normalizar_telefono(telefono: str) -> str:
|
|
46
|
-
"""Convierte teléfono a formato E.164 para hashear."""
|
|
47
|
-
# Conservar solo dígitos y el + inicial
|
|
48
|
-
limpio = '+' + ''.join(c for c in telefono if c.isdigit())
|
|
49
|
-
return limpio
|
|
50
|
-
```
|
|
51
|
-
|
|
52
|
-
## Endpoint server-side completo
|
|
53
|
-
|
|
54
|
-
```python
|
|
55
|
-
import hashlib
|
|
56
|
-
import httpx
|
|
57
|
-
import time
|
|
58
|
-
import os
|
|
59
|
-
from typing import Optional
|
|
60
|
-
|
|
61
|
-
PIXEL_ID = os.environ["META_PIXEL_ID"]
|
|
62
|
-
CAPI_TOKEN = os.environ["META_CAPI_TOKEN"]
|
|
63
|
-
CAPI_URL = f"https://graph.facebook.com/v18.0/{PIXEL_ID}/events"
|
|
64
|
-
|
|
65
|
-
def hash_pii(valor: str) -> str:
|
|
66
|
-
return hashlib.sha256(valor.strip().lower().encode()).hexdigest()
|
|
67
|
-
|
|
68
|
-
async def enviar_evento_capi(
|
|
69
|
-
evento: str,
|
|
70
|
-
event_id: str,
|
|
71
|
-
user_data: dict,
|
|
72
|
-
custom_data: dict,
|
|
73
|
-
source_url: str,
|
|
74
|
-
test_event_code: Optional[str] = None,
|
|
75
|
-
) -> dict:
|
|
76
|
-
"""
|
|
77
|
-
Envía un evento a Meta CAPI desde el servidor.
|
|
78
|
-
|
|
79
|
-
Args:
|
|
80
|
-
evento: Nombre del evento estándar Meta (Purchase, Lead, ViewContent, etc.)
|
|
81
|
-
event_id: ID único para deduplicación con el Pixel browser. Debe ser el
|
|
82
|
-
mismo valor enviado en el dataLayer del browser.
|
|
83
|
-
user_data: Datos del usuario. Se hashean internamente.
|
|
84
|
-
Claves esperadas: email, phone, fbc, fbp, ip, user_agent.
|
|
85
|
-
custom_data: Datos del evento (value, currency, content_ids, etc.)
|
|
86
|
-
source_url: URL donde ocurrió el evento.
|
|
87
|
-
test_event_code: Solo en desarrollo/staging. Obtener en Events Manager.
|
|
88
|
-
|
|
89
|
-
Returns:
|
|
90
|
-
Respuesta de la API de Meta como dict.
|
|
91
|
-
"""
|
|
92
|
-
user_data_hasheado = {}
|
|
93
|
-
|
|
94
|
-
if email := user_data.get("email"):
|
|
95
|
-
user_data_hasheado["em"] = [hash_pii(email)]
|
|
96
|
-
|
|
97
|
-
if phone := user_data.get("phone"):
|
|
98
|
-
user_data_hasheado["ph"] = [hash_pii(phone)]
|
|
99
|
-
|
|
100
|
-
# fbc y fbp NO se hashean — son identificadores propios de Meta
|
|
101
|
-
if fbc := user_data.get("fbc"):
|
|
102
|
-
user_data_hasheado["fbc"] = fbc
|
|
103
|
-
|
|
104
|
-
if fbp := user_data.get("fbp"):
|
|
105
|
-
user_data_hasheado["fbp"] = fbp
|
|
106
|
-
|
|
107
|
-
if ip := user_data.get("ip"):
|
|
108
|
-
user_data_hasheado["client_ip_address"] = ip
|
|
109
|
-
|
|
110
|
-
if user_agent := user_data.get("user_agent"):
|
|
111
|
-
user_data_hasheado["client_user_agent"] = user_agent
|
|
112
|
-
|
|
113
|
-
payload = {
|
|
114
|
-
"data": [{
|
|
115
|
-
"event_name": evento,
|
|
116
|
-
"event_time": int(time.time()),
|
|
117
|
-
"event_id": event_id,
|
|
118
|
-
"event_source_url": source_url,
|
|
119
|
-
"action_source": "website",
|
|
120
|
-
"user_data": user_data_hasheado,
|
|
121
|
-
"custom_data": custom_data,
|
|
122
|
-
}],
|
|
123
|
-
}
|
|
124
|
-
|
|
125
|
-
if test_event_code:
|
|
126
|
-
payload["test_event_code"] = test_event_code
|
|
127
|
-
|
|
128
|
-
async with httpx.AsyncClient() as client:
|
|
129
|
-
response = await client.post(
|
|
130
|
-
CAPI_URL,
|
|
131
|
-
params={"access_token": CAPI_TOKEN},
|
|
132
|
-
json=payload,
|
|
133
|
-
timeout=10.0,
|
|
134
|
-
)
|
|
135
|
-
response.raise_for_status()
|
|
136
|
-
return response.json()
|
|
137
|
-
```
|
|
138
|
-
|
|
139
|
-
### Uso en endpoint de compra confirmada (FastAPI)
|
|
140
|
-
|
|
141
|
-
```python
|
|
142
|
-
from fastapi import Request
|
|
143
|
-
|
|
144
|
-
@router.post("/ordenes/{orden_id}/confirmar")
|
|
145
|
-
async def confirmar_orden(
|
|
146
|
-
orden_id: str,
|
|
147
|
-
request: Request,
|
|
148
|
-
db: AsyncSession = Depends(get_db),
|
|
149
|
-
current_user = Depends(get_current_user),
|
|
150
|
-
):
|
|
151
|
-
orden = await procesar_pago(orden_id, db)
|
|
152
|
-
|
|
153
|
-
# Leer cookies de Meta del browser
|
|
154
|
-
fbc = request.cookies.get("_fbc")
|
|
155
|
-
fbp = request.cookies.get("_fbp")
|
|
156
|
-
|
|
157
|
-
# El event_id viene del frontend para deduplicación
|
|
158
|
-
event_id = request.headers.get("X-Event-Id", f"purchase_{orden_id}_{int(time.time())}")
|
|
159
|
-
|
|
160
|
-
await enviar_evento_capi(
|
|
161
|
-
evento="Purchase",
|
|
162
|
-
event_id=event_id,
|
|
163
|
-
user_data={
|
|
164
|
-
"email": current_user.email,
|
|
165
|
-
"phone": current_user.phone,
|
|
166
|
-
"fbc": fbc,
|
|
167
|
-
"fbp": fbp,
|
|
168
|
-
"ip": request.client.host,
|
|
169
|
-
"user_agent": request.headers.get("User-Agent"),
|
|
170
|
-
},
|
|
171
|
-
custom_data={
|
|
172
|
-
"value": float(orden.total),
|
|
173
|
-
"currency": "MXN",
|
|
174
|
-
"content_ids": [item.sku for item in orden.items],
|
|
175
|
-
"content_type": "product",
|
|
176
|
-
"num_items": len(orden.items),
|
|
177
|
-
},
|
|
178
|
-
source_url=str(request.url),
|
|
179
|
-
)
|
|
180
|
-
|
|
181
|
-
return {"status": "confirmada", "orden_id": str(orden.id)}
|
|
182
|
-
```
|
|
183
|
-
|
|
184
|
-
## Deduplicación: cómo funciona
|
|
185
|
-
|
|
186
|
-
Meta deduplica eventos cuando recibe dos eventos con el mismo `event_id`
|
|
187
|
-
dentro de una ventana de 48 horas. El proceso:
|
|
188
|
-
|
|
189
|
-
1. Browser (Pixel) dispara `Purchase` con `event_id = "purchase_ORD-001_1234"`
|
|
190
|
-
2. Servidor (CAPI) envía `Purchase` con el mismo `event_id`
|
|
191
|
-
3. Meta los empareja y cuenta solo una conversión
|
|
192
|
-
|
|
193
|
-
**Cómo pasar el event_id del browser al servidor:**
|
|
194
|
-
|
|
195
|
-
```javascript
|
|
196
|
-
// Frontend: guardar event_id en header de la request de confirmación
|
|
197
|
-
const eventId = `purchase_${transactionId}_${Date.now()}`;
|
|
198
|
-
|
|
199
|
-
// 1. Disparar en dataLayer (browser Pixel lo captura)
|
|
200
|
-
dataLayer.push({ ecommerce: null });
|
|
201
|
-
dataLayer.push({
|
|
202
|
-
event: 'purchase',
|
|
203
|
-
event_id: eventId,
|
|
204
|
-
ecommerce: { transaction_id: transactionId, ... }
|
|
205
|
-
});
|
|
206
|
-
|
|
207
|
-
// 2. Incluir en la request al backend
|
|
208
|
-
await fetch(`/api/ordenes/${transactionId}/confirmar`, {
|
|
209
|
-
method: 'POST',
|
|
210
|
-
headers: {
|
|
211
|
-
'X-Event-Id': eventId,
|
|
212
|
-
'Content-Type': 'application/json',
|
|
213
|
-
},
|
|
214
|
-
});
|
|
215
|
-
```
|
|
216
|
-
|
|
217
|
-
## Cómo obtener las cookies _fbc y _fbp
|
|
218
|
-
|
|
219
|
-
| Cookie | Descripción | Cómo se crea |
|
|
220
|
-
|--------|-------------|--------------|
|
|
221
|
-
| `_fbp` | Identificador de browser de Meta | Meta Pixel la crea al cargar |
|
|
222
|
-
| `_fbc` | Identificador de click de anuncio | Meta la crea cuando el usuario llega desde un anuncio (parámetro `fbclid` en URL) |
|
|
223
|
-
|
|
224
|
-
Ambas deben leerse del request en el servidor y enviarse a CAPI sin hashear.
|
|
225
|
-
Si no están presentes, omitir el campo (no enviar cadena vacía).
|
|
226
|
-
|
|
227
|
-
## Tasa de coincidencia (Event Match Quality)
|
|
228
|
-
|
|
229
|
-
El score EMQ mide qué tan bien Meta puede emparejar eventos con usuarios:
|
|
230
|
-
|
|
231
|
-
| Score | Interpretación |
|
|
232
|
-
|-------|---------------|
|
|
233
|
-
| 8-10 | Excelente — atribución confiable |
|
|
234
|
-
| 6-7 | Bueno — mínimo recomendado |
|
|
235
|
-
| 4-5 | Aceptable — mejorar si es posible |
|
|
236
|
-
| < 4 | Bajo — revisar qué user_data se está enviando |
|
|
237
|
-
|
|
238
|
-
**Para maximizar el EMQ**: enviar siempre `em` + `ph` + `fbp` + `fbc` +
|
|
239
|
-
`client_ip_address` + `client_user_agent`. Cada campo adicional mejora el score.
|
|
240
|
-
|
|
241
|
-
## Test Events: validar antes de producción
|
|
242
|
-
|
|
243
|
-
1. En Meta Business > Events Manager > tu Pixel > Test Events.
|
|
244
|
-
2. Copiar el `test_event_code` (formato `TEST12345`).
|
|
245
|
-
3. Pasarlo al parámetro `test_event_code` del endpoint.
|
|
246
|
-
4. Ejecutar el flujo de compra en staging.
|
|
247
|
-
5. Verificar en Test Events que el evento llega con el payload correcto.
|
|
248
|
-
6. Confirmar que aparece como "Deduplicated" si también se disparó el Pixel.
|
|
249
|
-
7. **Remover** el `test_event_code` antes de pasar a producción.
|
|
250
|
-
|
|
251
|
-
## Eventos estándar de Meta disponibles
|
|
252
|
-
|
|
253
|
-
| Evento | Cuándo usarlo |
|
|
254
|
-
|--------|--------------|
|
|
255
|
-
| `Purchase` | Compra completada con valor monetario |
|
|
256
|
-
| `Lead` | Registro de formulario de contacto o demo |
|
|
257
|
-
| `ViewContent` | Vista de página de producto o servicio |
|
|
258
|
-
| `AddToCart` | Agregar producto al carrito |
|
|
259
|
-
| `InitiateCheckout` | Inicio del proceso de pago |
|
|
260
|
-
| `CompleteRegistration` | Registro de cuenta completado |
|
|
261
|
-
| `Search` | Búsqueda en el sitio |
|
|
262
|
-
| `Subscribe` | Suscripción a newsletter o servicio recurrente |
|