Runtime verified Test scripts included

Syntax

Lowercase(sourceString)  →  string
1 argument — exactly

Parameters

Name Type Required Description
sourceString string | number | date Yes Value to convert

Example

%%[
  VAR @key
  SET @key = Lowercase("Hello World")
]%%
%%=v(@key)=%%

Renders hello world.

The everyday use is normalising a value before comparing or keying on it:

%%[
  VAR @email
  SET @email = Lowercase(AttributeValue("EmailAddress"))
]%%

Casing is culture-invariant, so this is safe for keys but not for locale-aware display text.

Return value

string — the value converted to lower case.

The result is arbitrary transformed text, so there is no closed set of sentinel values to test for.

Behaviour

Letters are lowercased, everything else is left alone. A mixed-case string containing digits and punctuation came back with only the letters changed.

An empty string returns an empty string.

Accented capitals map to their accented lowercase form. The capital accented vowels 192, 201, 206, 213 and 220 came back as 224, 233, 238, 245 and 252.

Casing is culture-invariant, not Turkish. The dotted capital I (codepoint 304) lowercases to the plain ASCII i (105), not to the Turkish dotted lowercase form. Do not rely on lowercasing to normalise text for locale-aware comparison.

Numbers are returned unchanged. Lowercase(12345) gives 12345.

Date values are stringified, then lowercased. Lowercase(Now()) rendered the formatted date with the AM meridiem lowercased to am — proof that the date was converted to text and then genuinely processed rather than passed through.

Booleans are swallowed silently. Lowercase(true) returns HTTP 200 with an empty result. Nothing coherent about the boolean survives, so this is a rejection rather than boolean support and the parameter type stays string | number | date. The same happens across the String family; see Differs from official docs.

Show test script
%%[
  VAR @b
  SET @b = RequestParameter("b")

  /* safe sweep: ASCII letters change, digits and punctuation do not */
  IF @b == "safe" THEN
    OutputLine(Concat("LO1=[", Lowercase("HeLLo123!@#"), "]"))
  ENDIF

  /* empty string */
  IF @b == "empty" THEN
    OutputLine(Concat("LOE=[", Lowercase(""), "]"))
  ENDIF

  /* accented capitals: echo the input too so both sides can be codepoint-dumped */
  IF @b == "nau" THEN
    OutputLine(Concat("NAU_ECHO_CAFE=[", "CAFÉ", "]"))
    OutputLine(Concat("NAU_LO_CAFE=[", Lowercase("CAFÉ"), "]"))
    OutputLine(Concat("NAU_ECHO_ACC=[", "ÀÉÎÕÜ", "]"))
    OutputLine(Concat("NAU_LO_ACC=[", Lowercase("ÀÉÎÕÜ"), "]"))
  ENDIF

  /* invariant, not Turkish: the dotted capital I becomes a plain ASCII i */
  IF @b == "tr" THEN
    OutputLine(Concat("TR_ECHO_DOTI=[", "İ", "]"))
    OutputLine(Concat("TR_LO_DOTI=[", Lowercase("İ"), "]"))
    OutputLine(Concat("TR_LO_I=[", Lowercase("I"), "]"))
  ENDIF

  /* numbers pass through unchanged */
  IF @b == "lon" THEN
    OutputLine(Concat("LON=[", Lowercase(12345), "]"))
  ENDIF

  /* date: the AM meridiem comes back lowercased */
  IF @b == "lod" THEN
    OutputLine(Concat("LOD=[", Lowercase(Now()), "]"))
  ENDIF

  /* boolean: HTTP 200 but nothing renders between the brackets */
  IF @b == "lob" THEN
    OutputLine(Concat("LOB=[", Lowercase(true), "]"))
  ENDIF

  /* each arity branch aborts the page: the start marker never renders */
  IF @b == "lo0" THEN
    OutputLine(Concat("--- lo0 start ---"))
    OutputLine(Concat("LO0=[", Lowercase(), "]"))
  ENDIF

  IF @b == "lo2" THEN
    OutputLine(Concat("--- lo2 start ---"))
    OutputLine(Concat("LO2=[", Lowercase("a", "b"), "]"))
  ENDIF
]%%

Availability

Platform Available
Marketing Cloud Engagement Yes
Marketing Cloud Next Yes, from API 67.0

See also