# Funciones

> Transforme, filtre y enriquezca eventos con JavaScript antes de que lleguen a los destinos

Source: https://docs.graph8.com/es/developers/functions/

Las funciones son código JavaScript que se ejecuta sobre cada evento en tránsito, entre su aplicación y los destinos. Úselas para filtrar eventos no deseados, transformar estructuras de datos o enriquecer eventos con datos externos.

## Qué pueden hacer las funciones

| Capacidad | Ejemplo |
|-----------|---------|
| **Filtrar** | Eliminar tráfico de bots, eventos de prueba o usuarios internos |
| **Transformar** | Renombrar campos, cambiar la estructura de eventos, normalizar datos |
| **Enriquecer** | Agregar geolocalización, datos de empresa o consultas a APIs de terceros |
| **Enrutar** | Enviar distintos eventos a diferentes tablas del almacén de datos |

## Cómo escribir una función

Las funciones son código JavaScript que recibe un evento y devuelve un evento modificado (o `"drop"` para descartarlo).

### Transformación básica

```javascript
// Rename event properties to match your warehouse schema
function transform(event, ctx) {
  if (event.type === 'track') {
    event.properties.source = event.properties.utm_source;
    delete event.properties.utm_source;
  }
  return event;
}
```

### Filtrar eventos

```javascript
// Drop events from internal users
function transform(event, ctx) {
  const internalDomains = ['graph8.com', 'yourcompany.com'];
  const email = event.traits?.email || event.properties?.email || '';

  if (internalDomains.some(d => email.endsWith(`@${d}`))) {
    return 'drop'; // magic string — event is discarded
  }
  return event;
}
```

### Enriquecer con una API externa

```javascript
// Add company data from a third-party API
async function transform(event, ctx) {
  const email = event.traits?.email;
  if (!email) return event;

  const domain = email.split('@')[1];
  const resp = await ctx.fetch(`https://api.example.com/company/${domain}`);

  if (resp.ok) {
    const company = await resp.json();
    event.traits.company_name = company.name;
    event.traits.company_size = company.employee_count;
    event.traits.industry = company.industry;
  }

  return event;
}
```

### Eliminar PII

```javascript
// Remove sensitive fields before sending to warehouse
function transform(event, ctx) {
  delete event.traits?.phone;
  delete event.traits?.address;
  delete event.properties?.credit_card;

  // Hash email for analytics (keep original for CRM)
  if (event.traits?.email) {
    event.traits.email_hash = ctx.crypto.sha256(event.traits.email);
  }

  return event;
}
```

### Enrutar a tablas personalizadas

```javascript
// Send different events to different warehouse tables
function transform(event, ctx) {
  if (event.event === 'purchase') {
    event.JITSU_TABLE_NAME = 'purchases';
  } else if (event.event === 'page') {
    event.JITSU_TABLE_NAME = 'pageviews';
  }
  return event;
}
```

## APIs disponibles

Las funciones se ejecutan en un entorno aislado con las siguientes APIs:

| API | Uso | Descripción |
|-----|-----|-------------|
| `ctx.fetch(url, options)` | Solicitudes HTTP | Llamar a APIs externas (enriquecimiento, validación, webhooks) |
| `ctx.store` | Almacenamiento persistente | Almacén clave-valor que persiste entre llamadas a funciones |
| `ctx.log` | Registro | Escribir en el registro de Eventos en Vivo para depuración |
| `ctx.geo` | Geolocalización | Datos de ubicación basados en IP (ciudad, país, región) |
| `ctx.ua` | Agente de usuario | Información procesada del navegador y del dispositivo |
| `ctx.headers` | Encabezados HTTP | Encabezados de la solicitud original |
| `ctx.getWarehouse` | Consultas al almacén | Consultar su almacén de datos desde dentro de una función |
| `ctx.source` | Metadatos de origen | Información sobre el flujo de origen |
| `ctx.destination` | Metadatos de destino | Detalles del destino objetivo |

## Administración de funciones

1. Vaya a **Connections > Functions** en su panel de graph8
2. Haga clic en **+ Create Function**
3. Escriba su JavaScript en el editor de código
4. Pruébela con eventos de muestra usando el depurador integrado
5. Vincúlela a un enlace flujo-destino

Las funciones incluyen un editor con resaltado de sintaxis y un depurador integrado que permite probarlas con cargas útiles de eventos de muestra.

## Valores de retorno

| Retorno | Qué ocurre |
|---------|------------|
| `event` (modificado) | El evento modificado se envía al destino |
| Nuevo objeto | Reemplaza por completo al evento original |
| `"drop"` | El evento se descarta (no se envía a ningún destino) |
| Arreglo de objetos | Un evento se convierte en varios eventos |
| Nada | El evento original se envía sin cambios |

> **Tip: Orden del pipeline**
> Las funciones se ejecutan después de que el [SDK](https://docs.graph8.com/developers/sdk/) envía los eventos y antes de que los [Destinos](https://docs.graph8.com/developers/destinations/) los reciban. Use [Eventos en Vivo](https://docs.graph8.com/developers/live-events/) para ver los resultados de la ejecución de las funciones en tiempo real.
