Funciones de validación — referencia de Marketing Cloud AMPscript
La superficie de validación de AMPscript — Empty / IsNull / IsEmailAddress / IsPhoneNumber / IsNumeric. Útil para ramificación en render time, peligrosa como sustituto de calidad de data upstream. Los patrones que sobreviven a escala.
AMPscript trae un set chico de helpers de validación — Empty, IsNull, IsEmailAddress, IsPhoneNumber, IsNumeric. Están construidos para ramificación en render time: decidir si caer a un saludo por default, si mostrar u ocultar un bloque de contenido, si saltearse un CTA cuando el data no está. No están construidos para ser la capa de validación de data entrante — ese trabajo va en la SQL Activity que formatea el DE de audiencia, donde podés rechazar filas malas antes de que el send siquiera corra.
La lista abajo es la superficie más las formas de falla por tratar a estas como sustituto de la validación upstream.
Sintaxis oficial
%%[
/* Chequeos NULL / empty */
SET @firstName = AttributeValue("FirstName")
IF Empty(@firstName) THEN
SET @firstName = "Friend"
ENDIF
/* Validación de formato */
IF IsEmailAddress(@altEmail) THEN
/* @altEmail se ve como un email válido por el check laxo de AMPscript */
ENDIF
IF IsPhoneNumber(@phone) THEN
/* @phone se ve como un teléfono US por el patrón de AMPscript */
ENDIF
IF IsNumeric(@scoreStr) THEN
/* @scoreStr se puede pasar a Add/Multiply sin coercerse a 0 */
SET @score = Add(@scoreStr, 0)
ELSE
SET @score = 0
ENDIF
/* Chequeo de existencia vía largo — útil cuando Empty no es lo suficientemente expresivo */
IF Length(Trim(@input)) > 0 THEN
/* Hay contenido no-whitespace */
ENDIF
]%%El set soportado:
| Función | Devuelve true cuando | Notas |
|---|---|---|
| Empty(v) | v es NULL, string vacío, o variable sin setear | El chequeo más amplio — cubre todo |
| IsNull(v) | v es NULL solamente | String vacío es false |
| IsEmailAddress(s) | s matchea un regex aproximadamente compatible con RFC 5321 | Sin DNS check; acepta direcciones que mail servers reales rechazan |
| IsPhoneNumber(s) | s matchea un patrón de teléfono US (10 dígitos, separadores comunes) | US-biased; no valida internacional |
| IsNumeric(s) | s parsea como número | Permite signo al inicio, punto decimal; rechaza formateo como comas o moneda |
| IsCHQ(s) | Menos común; chequea patrones de código postal Canadá/US | Nicho; raramente usado en la práctica |
Referencia:
- AMPscript Guide — referencia de funciones (sección validación) ↗
- Salesforce Developer — funciones AMPscript ↗
Lo que sobrevive en producción
Empty vs IsNull vs == "" — elegí una, documentá por qué
Los tres conceptos:
Empty(@x)— true para NULL, string vacío, o variable sin setear. El chequeo más amplio.IsNull(@x)— true solo para NULL. String vacío esfalse.@x == ""— true solo para string vacío después de la comparación de tipos sueltos de AMPscript.
%%[
/* @x puede ser NULL, "", un string, o nunca SET */
IF Empty(@x) THEN
/* Dispara para las tres formas de "nada" — el default durable */
ENDIF
IF IsNull(@x) THEN
/* Dispara solo cuando @x es literalmente NULL — deja pasar "" */
ENDIF
IF @x == "" THEN
/* Dispara solo cuando @x es el string vacío — deja pasar NULL */
ENDIF
]%%Empty es el default para fallback de personalización. Reservá IsNull solo para cuando específicamente necesités distinguir un valor never-set de uno deliberadamente vacío (raro). Evitá == "" para vacuidad — no cubre NULL, y la próxima persona heredando el código va a asumir que sí. Ver gotchas — #8.
IsEmailAddress es laxo — es un match de regex, no un check de entrega
IsEmailAddress("ana@example") devuelve true. Lo mismo "ana@local.123". La función matchea el patrón amplio de RFC-5321: al menos un carácter, un @, al menos un carácter con un punto en algún lado. No:
- Resuelve DNS —
ana@made-up-tld.examplepasa - Rechaza hostnames de label único —
ana@localhostpasa - Chequea reglas de escapado de caracteres en profundidad —
ana"smith"@example.compuede pasar o fallar según el tenant
%%[
/* Esto pasa IsEmailAddress, va a fallar en el MTA */
IF IsEmailAddress("test@invalid") THEN
/* NO confíes esto como "listo para enviar" */
ENDIF
/* Para confianza real de entrega, validá upstream */
/* SQL Activity:
WHERE EmailAddress LIKE '%@%.%'
AND EmailAddress NOT LIKE '%@localhost%'
AND CharIndex(' ', EmailAddress) = 0
...e incluso entonces, la única validación verdadera es "el MTA no la bounceó" */
]%%La regla Cleon: IsEmailAddress es para ramificación en render time ("si el alt-email está con forma de email, mostrá este bloque"). No es para decidir si enviar. La Send Activity en sí hace validación básica de forma; la fila del DE de audiencia ya debería ser confiable cuando AMPscript corre.
IsPhoneNumber es US-biased
IsPhoneNumber("212-555-0100") devuelve true. IsPhoneNumber("+54 11 4444-5555") devuelve... depende del tenant. El patrón de AMPscript está más cerca de "10 dígitos con separadores comunes US" que de un validador internacional verdadero.
%%[
IF IsPhoneNumber(@phone) THEN
/* Confianza para números US; incierto para internacional */
ENDIF
/* Para audiencias multi-región, validá vía un patrón más estricto
upstream en SQL usando LIKE / RegEx, o chequeá contra una
columna pre-normalizada a E.164. */
]%%Si tu audiencia es global, no te apoyes en IsPhoneNumber para ninguna lógica que afecte deliverability. Pre-validá al formato E.164 upstream (SQL Activity o un callout SSJS a un servicio de normalización) y confiá en la columna.
IsNumeric es la defensa más limpia contra la coerción silenciosa
La coerción string-a-número en las funciones de math es la puerta a bugs: Add("abc", 5) devuelve 5. IsNumeric es el portero antes del math:
%%[
SET @raw = AttributeValue("LoyaltyPoints")
IF IsNumeric(@raw) THEN
SET @points = Add(@raw, 0)
ELSE
SET @points = 0
ENDIF
/* @points es ahora seguramente numérico — el math downstream es confiable */
]%%El gotcha-del-gotcha: IsNumeric("1,000") devuelve false en la mayoría de los tenants porque la coma falla el parse. Si tu fuente tiene números formateados (strings con moneda, miles separados por coma), stripeá el formato con Replace antes de testear.
%%[
SET @clean = Replace(Replace(@raw, "$", ""), ",", "")
IF IsNumeric(@clean) THEN
SET @value = Add(@clean, 0)
ELSE
SET @value = 0
ENDIF
]%%Length(Trim(@x)) > 0 es el check de "contenido real"
Empty(@x) es true para NULL y "". Pero es false para un string de solo whitespace — " " no es vacío según AMPscript. Para checks de "el destinatario realmente escribió algo" (input de form de CloudPage, campos de free-text), usá el idiom trim+length:
%%[
SET @comment = RequestParameter("comment")
/* EN RIESGO — " " (solo espacios) pasa Empty */
IF NOT Empty(@comment) THEN
/* @comment puede ser todo whitespace */
ENDIF
/* DURABLE — chequeo de contenido real */
IF Length(Trim(@comment)) > 0 THEN
/* @comment tiene contenido no-whitespace */
ENDIF
]%%La falla del hand-off: alguien testea con @comment = "input válido" (renderea un bloque de thank-you) y @comment = "" (renderea un fallback). Se les escapa @comment = " " porque no pensaron que un usuario fuese a mandar espacios. Un form web los manda — artefactos de paste, autofill accidental, spammers intencionales — y el email renderea el bloque de thank-you para input vacío.
La validación en AMPscript es render-time, no pre-flight
La forma de falla más profunda: las funciones de validación de AMPscript fomentan pensar "voy a validar en render time". No lo hagas. Para cuando AMPscript corre, el destinatario ya está en la audiencia, la Send Activity ya aceptó la fila, y cualquier decisión "a esta fila no se le debía mandar" llega tarde.
El lugar correcto para validación de data es la SQL Activity que construye el DE de audiencia:
-- Upstream: rechazar filas que no cumplen el bar de validación
SELECT *
INTO de_send_audience_<name>
FROM master_subscribers
WHERE EmailAddress LIKE '%@%.%'
AND EmailAddress NOT LIKE '%@localhost%'
AND CharIndex(' ', EmailAddress) = 0
AND Status = 'Active'
AND Empty(EmailAddress) = 0; /* SQL Activity tiene su propio Empty */El trabajo de AMPscript es renderear con gracia cuando una columna falta o tiene forma equivocada a pesar de la validación upstream, no ser la capa de validación. Tratar a la validación AMPscript como el bar es como filas con emails mal formados llegan al MTA y bouncean.
Decisión rápida
Usá Empty cuando:
- Defaulteás una variable de personalización a un fallback. El chequeo más amplio cubre NULL, string vacío, y sin setear.
Usá IsNull cuando:
- Específicamente necesités distinguir "nunca seteado" de "deliberadamente vacío". Raro en personalización; más común en procesamiento de forms de CloudPage.
Usá IsEmailAddress / IsPhoneNumber cuando:
- Ramificás el email basado en la forma de un campo de alt-contact. No confíes como portero contra entregas malas — esa portería está upstream.
Usá IsNumeric cuando:
- Estás por pasar un string a una función de math. Stripeá formateo de moneda/coma primero con
Replace.
Usá Length(Trim(@x)) > 0 cuando:
- Chequeás contenido real en un campo de free-text. Strings de solo whitespace pasan
Empty().
Mové la validación a SQL upstream cuando:
- El check decide si enviar. AMPscript corre después de que se construye la audiencia; SQL corre antes.
- El patrón no es trivial (regex, reglas multi-columna, checks cross-DE). SQL tiene la superficie completa; la de AMPscript es laxa.
- La misma validación aplica a cada destinatario en un send grande. Una pasada SQL le gana a 50k evaluaciones AMPscript.
Relacionado
- Basics — superficie del lenguaje soportada
- Funciones de math — la coerción silenciosa que
IsNumericestá construido para portear - Funciones de string —
Length,Trim,Replacepara checks de contenido y pre-limpieza de validación - Gotchas de MC AMPscript — ver #8 (
EmptyvsIsNullvs== "") y #10 (fallas silenciosas de Cloud-write, donde la validación importa más) - MC SQL — funciones de string — el pattern matching upstream que debería rechazar filas malas antes de que lleguen a la audiencia
Más páginas de referencia AMPscript en camino: Data Extension · Subscriber/Profile · Cloud-write · Encoding/Hashing · Style Guide.