> ## Documentation Index
> Fetch the complete documentation index at: https://docs.twenty.com/llms.txt
> Use this file to discover all available pages before exploring further.

# Campos de fórmula

> Crea campos de fórmula usando flujos de trabajo hasta que haya soporte nativo disponible.

Twenty aún no admite campos de fórmula de forma nativa (llegarán en 2026), pero puedes lograr el mismo resultado usando flujos de trabajo. Esta solución alternativa te permite calcular y rellenar automáticamente valores de campos—desde concatenaciones simples hasta lógica empresarial compleja.

## Casos de Uso Comunes

| Caso de uso                   | Ejemplo de fórmula                 |
| ----------------------------- | ---------------------------------- |
| **Nombre completo**           | Nombre + " " + Apellido            |
| **Importe esperado**          | Importe × Probabilidad             |
| **Días hasta el vencimiento** | Fecha de vencimiento - Hoy         |
| **Días en la etapa**          | Hoy - Fecha de entrada a la etapa  |
| **Puntuación del lead**       | Puntos basados en varios criterios |

<Tip>
  Para ver un ejemplo completo de seguimiento del tiempo en etapas del pipeline, consulta [Cuánto tiempo permanecen las oportunidades en cada etapa](/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage).
</Tip>

## Fórmula básica: concatenación

### Ejemplo: rellenar automáticamente el nombre completo

**Objetivo**: Combinar automáticamente nombre y apellido en un campo de nombre completo.

### Configuración

1. **Desencadenante**: Se actualiza o se crea el registro (Personas)

2. **Filtro**: Comprueba que el nombre o el apellido hayan cambiado

3. **Acción de código**:

```javascript theme={null}
export const main = async (params) => {
  const { firstName, lastName } = params;

  const fullName = [firstName, lastName]
    .filter(Boolean)
    .join(' ');

  return { fullName };
};
```

4. **Actualizar registro**: Establecer Nombre completo en `{{code.fullName}}`

## Fórmula numérica: importe esperado

### Ejemplo: calcular ingresos esperados

**Objetivo**: Multiplicar el importe de la oportunidad por la probabilidad para obtener el importe esperado.

Consulta [Cómo mostrar el importe esperado en el pipeline](/l/es/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline) para ver el flujo de trabajo completo.

### Configuración rápida

1. **Desencadenante**: Se actualiza el registro (Oportunidades, campo Importe o Probabilidad)

2. **Acción de código**:

```javascript theme={null}
export const main = async (params) => {
  const { amount, probability } = params;

  const expectedAmount = (amount || 0) * (probability || 0) / 100;

  return { expectedAmount };
};
```

3. **Actualizar registro**: Establecer Importe esperado en `{{code.expectedAmount}}`

## Fórmula de fechas: cálculo de días

### Ejemplo: días hasta el vencimiento de la tarea

**Objetivo**: Calcular cuántos días faltan hasta la fecha de vencimiento de una tarea.

### Configuración

1. **Desencadenante**: Se actualiza o se crea el registro (Tareas, campo Fecha de vencimiento)

2. **Acción de código**:

```javascript theme={null}
export const main = async (params) => {
  const { dueDate } = params;

  if (!dueDate) {
    return { daysUntilDue: null };
  }

  const due = new Date(dueDate);
  const today = new Date();
  const diffTime = due - today;
  const diffDays = Math.ceil(diffTime / (1000 * 60 * 60 * 24));

  return { daysUntilDue: diffDays };
};
```

3. **Actualizar registro**: Establecer Días hasta el vencimiento en `{{code.daysUntilDue}}`

<Note>
  Los valores negativos indican tareas vencidas. Puedes usar este campo para filtrar o ordenar tareas por urgencia.
</Note>

## Fórmula condicional: puntuación del lead

### Ejemplo: calcular la puntuación del lead según criterios

**Objetivo**: Puntuar leads en función del tamaño de la empresa, el sector y la interacción.

### Configuración

1. **Desencadenante**: Se actualiza el registro (Personas o Empresas)

2. **Acción de código**:

```javascript theme={null}
export const main = async (params) => {
  const { companySize, industry, hasEmail, hasPhone, source } = params;

  let score = 0;

  // Company size scoring
  if (companySize === 'Enterprise') score += 30;
  else if (companySize === 'Mid-Market') score += 20;
  else if (companySize === 'SMB') score += 10;

  // Industry scoring
  const targetIndustries = ['Technology', 'Finance', 'Healthcare'];
  if (targetIndustries.includes(industry)) score += 25;

  // Contact info scoring
  if (hasEmail) score += 10;
  if (hasPhone) score += 15;

  // Source scoring
  if (source === 'Referral') score += 20;
  else if (source === 'Website') score += 10;

  return { leadScore: score };
};
```

3. **Actualizar registro**: Establecer Puntuación del lead en `{{code.leadScore}}`

## Fórmula de texto: extracción de dominio

### Ejemplo: extraer el dominio del correo electrónico

**Objetivo**: Extraer y almacenar automáticamente el dominio del correo electrónico.

### Configuración

1. **Desencadenante**: Se actualiza el registro (Personas, campo Correo electrónico)

2. **Acción de código**:

```javascript theme={null}
export const main = async (params) => {
  const { email } = params;

  if (!email) return { domain: null };

  const domain = email.split('@')[1]?.toLowerCase();

  return { domain };
};
```

3. **Actualizar registro**: Establecer el campo Dominio en `{{code.domain}}`

## Mejores prácticas

### Rendimiento

* Activa solo ante cambios en campos relevantes
* Usa filtros para omitir registros que no necesiten cálculo
* Evita cálculos complejos en flujos de trabajo de alto volumen

### Manejo de errores

* Comprueba valores null/undefined antes de los cálculos
* Usa valores predeterminados cuando falten datos
* Devuelve mensajes de error claros cuando fallen los cálculos

### Pruebas

* Prueba con casos límite (campos vacíos, valores cero)
* Verifica los cálculos manualmente antes de activar
* Supervisa las ejecuciones de flujos de trabajo para detectar resultados inesperados

## Relacionado

* [Cómo mostrar el importe esperado en el pipeline](/l/es/user-guide/views-pipelines/how-tos/show-expected-amount-in-pipeline)
* [Cómo realizar el seguimiento del tiempo en la etapa](/l/es/user-guide/views-pipelines/how-tos/track-time-in-stage)
* [Acciones de flujos de trabajo](/l/es/user-guide/workflows/capabilities/workflow-actions)
