> For the complete documentation index, see [llms.txt](https://docs.hackle.io/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.hackle.io/crm-marketing/message-personalization/liquid-template-reference.md).

# Liquid를 이용한 고급 개인화

핵클 CRM 캠페인에서 사용할 수 있는 Liquid 필터와 태그의 목록입니다. 목록에 없는 태그나 필터는 동작하지 않을 수 있으며, 이 경우 대부분 빈 문자열로 변환됩니다.

## 사용할 수 있는 변수

대시보드의 개인화 변수 모달을 통해 사용자별로 달라지는 값을 참조할 수 있어요.

| 참조 형식                         | 내용                            |
| ----------------------------- | ----------------------------- |
| `{{ user_properties.<속성> }}`  | 사용자 속성                        |
| `{{ event_properties.<속성> }}` | 이벤트 속성                        |
| `{{ api_properties.<속성> }}`   | API 속성                        |
| `{{ identifiers.<종류> }}`      | 식별자 (**Webhook 채널에서만** 사용 가능) |

예: `{{ user_properties['name'] }}님 안녕하세요`

## 자주 쓰는 패턴

### 이름이 없으면 기본값 사용

변수에 값이 없을 때 대체 문구를 씁니다.

```liquid
{{ user_properties.name | default: '고객' }}님
```

→ `고객님` (name이 없을 때)

### 숫자에 천 단위 구분 기호

포인트·금액 등을 읽기 좋게 표시합니다.

변수: point = 15000

```liquid
{{ event_properties.point | number_with_delimiter }}P
```

→ `15,000P`

### 한국 시간·한국어로 날짜 표시

`Asia/Seoul` 기준으로 변환하고 요일을 한국어로 출력합니다.

변수: ordered\_at = "2026-07-15 23:00:00 UTC"

```liquid
{{ event_properties.ordered_at | date: '%m월 %d일 %A', 'Asia/Seoul', locale: 'ko' }}
```

→ `07월 16일 목요일`

### 너무 길면 대체 문구로 바꾸기

지정한 길이를 넘는 값은 통째로 대체합니다.

변수: name = "김수한무거북이와두루미" (8자)

```liquid
{{ user_properties.name | fallback_over_length: 5, '고객' }}님
```

→ `고객님`

## 빠른 참조

### 필터

| 이름                      | 역할                                                      |
| ----------------------- | ------------------------------------------------------- |
| append                  | 문자열 뒤에 다른 문자열을 붙입니다.                                    |
| prepend                 | 문자열 앞에 다른 문자열을 붙입니다.                                    |
| capitalize              | 첫 글자만 대문자로 바꾸고 나머지는 그대로 둡니다.                            |
| downcase                | 모든 문자를 소문자로 바꿉니다.                                       |
| upcase                  | 모든 문자를 대문자로 바꿉니다.                                       |
| lstrip                  | 문자열 왼쪽(앞)의 공백을 제거합니다.                                   |
| rstrip                  | 문자열 오른쪽(뒤)의 공백을 제거합니다.                                  |
| strip                   | 문자열 양쪽 끝의 공백을 제거합니다.                                    |
| strip\_html             | 문자열에서 HTML 태그를 제거합니다.                                   |
| strip\_newlines         | 문자열에서 줄바꿈 문자를 제거합니다.                                    |
| newline\_to\_br         | 줄바꿈 문자를 `<br />` 태그로 바꿉니다.                              |
| remove                  | 문자열에서 특정 부분 문자열을 모두 제거합니다.                              |
| remove\_first           | 문자열에서 특정 부분 문자열을 처음 한 번만 제거합니다.                         |
| replace                 | 문자열에서 특정 부분 문자열을 모두 다른 문자열로 바꿉니다.                       |
| replace\_first          | 문자열에서 특정 부분 문자열을 처음 한 번만 다른 문자열로 바꿉니다.                  |
| split                   | 문자열을 구분자 기준으로 나눠 배열로 만듭니다.                              |
| slice                   | 문자열의 일부를 시작 위치와 길이로 잘라냅니다.                              |
| truncate                | 문자열을 지정한 길이로 줄이고 말줄임표를 붙입니다.                            |
| truncatewords           | 문자열을 지정한 단어 수로 줄이고 말줄임표를 붙입니다.                          |
| escape                  | 문자열의 HTML 특수문자를 이스케이프합니다.                               |
| escape\_once            | 문자열의 HTML 특수문자를 이스케이프하되, 이미 이스케이프된 부분은 다시 이스케이프하지 않습니다. |
| abs                     | 숫자의 절댓값을 반환합니다.                                         |
| at\_least               | 숫자가 지정한 최솟값보다 작으면 최솟값을 반환합니다.                           |
| at\_most                | 숫자가 지정한 최댓값보다 크면 최댓값을 반환합니다.                            |
| ceil                    | 숫자를 올림하여 정수로 반환합니다.                                     |
| floor                   | 숫자를 내림하여 정수로 반환합니다.                                     |
| round                   | 숫자를 반올림합니다.                                             |
| plus                    | 숫자를 더합니다.                                               |
| minus                   | 숫자를 뺍니다.                                                |
| times                   | 숫자를 곱합니다.                                               |
| divided\_by             | 숫자를 나눕니다.                                               |
| modulo                  | 숫자를 나눈 나머지를 반환합니다.                                      |
| number\_with\_delimiter | 숫자에 천 단위 구분 기호(쉼표)를 붙입니다.                               |
| compact                 | 배열에서 nil 값을 제거합니다.                                      |
| concat                  | 두 배열을 이어붙입니다.                                           |
| first                   | 배열의 첫 번째 요소를 반환합니다.                                     |
| last                    | 배열의 마지막 요소를 반환합니다.                                      |
| join                    | 배열의 요소를 구분자로 이어붙여 문자열로 만듭니다.                            |
| map                     | 배열의 각 요소에서 지정한 속성 값만 뽑아 새 배열을 만듭니다.                     |
| reverse                 | 배열의 순서를 뒤집습니다.                                          |
| sort                    | 배열을 정렬합니다(대소문자 구분, 대문자 우선).                             |
| sort\_natural           | 배열을 대소문자 구분 없이 정렬합니다.                                   |
| uniq                    | 배열에서 중복된 값을 제거합니다.                                      |
| where                   | 배열에서 지정한 속성 값을 가진 요소만 남깁니다.                             |
| size                    | 배열의 요소 개수 또는 문자열의 길이를 반환합니다.                            |
| date                    | 날짜/시간 값을 지정한 형식의 문자열로 바꿉니다.                             |
| url\_encode             | 문자열을 URL 인코딩합니다.                                        |
| url\_decode             | URL 인코딩된 문자열을 원래대로 디코딩합니다.                              |
| url\_escape             | 문자열에서 URL에 사용할 수 없는 문자만 이스케이프합니다.                       |
| url\_param\_escape      | 문자열을 URL 쿼리 파라미터 값으로 이스케이프합니다.                          |
| json\_escape            | 문자열을 JSON 문자열 값으로 안전하게 이스케이프합니다.                        |
| json\_parse             | JSON 문자열을 파싱하여 템플릿에서 접근 가능한 객체로 만듭니다.                   |
| as\_json\_string        | 값을 JSON 문자열로 직렬화합니다.                                    |
| default                 | 값이 비어 있거나 falsy일 때 대체 값을 반환합니다.                         |
| fallback\_over\_length  | 문자열이 지정한 길이를 초과하면 대체 문구를 반환합니다.                         |

### 태그

| 이름                 | 역할                                       |
| ------------------ | ---------------------------------------- |
| assign             | 변수에 값을 대입합니다.                            |
| capture            | 블록 안의 렌더 결과를 변수에 저장합니다.                  |
| if                 | 조건이 참일 때만 블록을 렌더합니다.                     |
| unless             | 조건이 거짓일 때만 블록을 렌더합니다.                    |
| case / when        | 값에 따라 여러 분기 중 하나를 렌더합니다.                 |
| for                | 배열이나 범위를 순회하며 블록을 반복 렌더합니다.              |
| break              | for 반복문을 즉시 종료합니다.                       |
| continue           | for 반복문에서 현재 반복을 건너뛰고 다음으로 넘어갑니다.        |
| cycle              | 여러 값을 순서대로 돌아가며 출력합니다.                   |
| comment            | 블록 안의 내용을 출력하지 않습니다.                     |
| raw                | 블록 안의 내용을 Liquid 문법으로 해석하지 않고 그대로 출력합니다. |
| increment          | 0부터 시작하는 전용 카운터를 증가시키며 출력합니다.            |
| decrement          | -1부터 시작하는 전용 카운터를 감소시키며 출력합니다.           |
| connected\_content | 외부 API를 호출해 응답(JSON)을 템플릿 변수로 저장합니다.     |
| random             | 난수를 생성해 출력합니다.                           |

## 문자열 필터

### append

문자열 뒤에 다른 문자열을 붙입니다.

```liquid
{{ '봄바람' | append: '이 분다' }}
```

→ `봄바람이 분다`

### prepend

문자열 앞에 다른 문자열을 붙입니다.

```liquid
{{ '꽃잎' | prepend: '흩날리는 ' }}
```

→ `흩날리는 꽃잎`

### capitalize

첫 글자만 대문자로 바꾸고 나머지는 그대로 둡니다.

```liquid
{{ 'spring bloom' | capitalize }}
```

→ `Spring bloom`

### downcase

모든 문자를 소문자로 바꿉니다.

```liquid
{{ 'BLOSSOM' | downcase }}
```

→ `blossom`

### upcase

모든 문자를 대문자로 바꿉니다.

```liquid
{{ 'petal' | upcase }}
```

→ `PETAL`

### lstrip

문자열 왼쪽(앞)의 공백을 제거합니다.

```liquid
{% assign s = "  새싹  " %}
[{{ s | lstrip }}]
```

→ `[새싹 ]`

### rstrip

문자열 오른쪽(뒤)의 공백을 제거합니다.

```liquid
{% assign s = "  새싹  " %}
[{{ s | rstrip }}]
```

→ `[ 새싹]`

### strip

문자열 양쪽 끝의 공백을 제거합니다.

```liquid
{% assign s = "  새싹  " %}
[{{ s | strip }}]
```

→ `[새싹]`

### strip\_html

문자열에서 HTML 태그를 제거합니다.

```liquid
{{ '<b>중요</b> 안내' | strip_html }}
```

→ `중요 안내`

### strip\_newlines

문자열에서 줄바꿈 문자를 제거합니다.

```liquid
{% capture ml %}여름이
왔다{% endcapture %}
{{ ml | strip_newlines }}
```

→ `여름이왔다`

### newline\_to\_br

줄바꿈 문자를 `<br />` 태그로 바꿉니다.

```liquid
{% capture ml %}매미가 울면
여름이 온다{% endcapture %}
{{ ml | newline_to_br }}
```

→ `매미가 울면<br />` `여름이 온다`

### remove

문자열에서 특정 부분 문자열을 모두 제거합니다.

```liquid
{{ '여름밤 여름밤' | remove: '여름' }}
```

→ `밤 밤`

### remove\_first

문자열에서 특정 부분 문자열을 처음 한 번만 제거합니다.

```liquid
{{ '여름밤 여름밤' | remove_first: '여름' }}
```

→ `밤 여름밤`

### replace

문자열에서 특정 부분 문자열을 모두 다른 문자열로 바꿉니다.

```liquid
{{ '여름 바다, 여름 바다' | replace: '바다', '하늘' }}
```

→ `여름 하늘, 여름 하늘`

### replace\_first

문자열에서 특정 부분 문자열을 처음 한 번만 다른 문자열로 바꿉니다.

```liquid
{{ '비-비-비' | replace_first: '비', '볕' }}
```

→ `볕-비-비`

### split

문자열을 구분자 기준으로 나눠 배열로 만듭니다. 결과가 배열이므로 예시는 `join`과 함께 사용했습니다.

```liquid
{{ '바다,수박,소나기' | split: ',' | join: ' / ' }}
```

→ `바다 / 수박 / 소나기`

### slice

문자열의 일부를 시작 위치와 길이로 잘라냅니다.

시그니처: `slice: 시작위치[, 길이]`

{% tabs %}
{% tab title="앞에서" %}

```liquid
{{ '여름바다' | slice: 0, 2 }}
```

→ `여름`
{% endtab %}

{% tab title="뒤에서(음수)" %}

```liquid
{{ '여름바다' | slice: -2, 2 }}
```

→ `바다`
{% endtab %}
{% endtabs %}

### truncate

문자열을 지정한 길이로 줄이고 말줄임표를 붙입니다.

시그니처: `truncate: 길이[, 말줄임문자열]`

```liquid
{{ '가을 하늘이 높고 푸르다' | truncate: 9 }}
```

→ `가을 하늘이...`

비고: 말줄임 문자열이 길이에 포함됩니다 — 기본 말줄임(`...`) 기준으로 실제 보이는 본문은 `길이 - 3`자이며, 말줄임 문자열을 지정하면 그 길이만큼 차감됩니다.

### truncatewords

문자열을 지정한 단어 수로 줄이고 말줄임표를 붙입니다.

시그니처: `truncatewords: 단어수[, 말줄임문자열]`

```liquid
{{ '단풍 물들고 낙엽 지는 가을' | truncatewords: 3 }}
```

→ `단풍 물들고 낙엽...`

### escape

문자열의 HTML 특수문자를 이스케이프합니다.

```liquid
{{ '<a href="x">링크</a>' | escape }}
```

→ `&lt;a href=&quot;x&quot;&gt;링크&lt;/a&gt;`

### escape\_once

문자열의 HTML 특수문자를 이스케이프하되, 이미 이스케이프된 부분은 다시 이스케이프하지 않습니다.

```liquid
{% assign e = "&lt;p&gt; & <p>" %}
{{ e | escape_once }}
```

→ `&lt;p&gt; &amp; &lt;p&gt;`

## 숫자 필터

### abs

숫자의 절댓값을 반환합니다.

```liquid
{% assign n = -5 %}
{{ n | abs }}
```

→ `5`

### at\_least

숫자가 지정한 최솟값보다 작으면 최솟값을 반환합니다.

```liquid
{{ 3 | at_least: 5 }}
```

→ `5`

### at\_most

숫자가 지정한 최댓값보다 크면 최댓값을 반환합니다.

```liquid
{{ 9 | at_most: 5 }}
```

→ `5`

### ceil

숫자를 올림하여 정수로 반환합니다.

```liquid
{{ 1.2 | ceil }}
```

→ `2`

### floor

숫자를 내림하여 정수로 반환합니다.

```liquid
{{ 1.8 | floor }}
```

→ `1`

### round

숫자를 반올림합니다.

시그니처: `round: [소수자릿수]`

{% tabs %}
{% tab title="정수 반올림" %}

```liquid
{{ 2.7 | round }}
```

→ `3`
{% endtab %}

{% tab title="소수 자릿수" %}

```liquid
{{ 3.14159 | round: 2 }}
```

→ `3.14`
{% endtab %}
{% endtabs %}

### plus

숫자를 더합니다.

```liquid
{{ 100 | plus: 25 }}
```

→ `125`

### minus

숫자를 뺍니다.

```liquid
{{ 100 | minus: 25 }}
```

→ `75`

### times

숫자를 곱합니다.

```liquid
{{ 100 | times: 3 }}
```

→ `300`

### divided\_by

숫자를 나눕니다.

{% tabs %}
{% tab title="정수 나눗셈" %}

```liquid
{{ 10 | divided_by: 3 }}
```

→ `3`
{% endtab %}

{% tab title="소수 나눗셈" %}

```liquid
{{ 10 | divided_by: 3.0 }}
```

→ `3.3333333333333335`
{% endtab %}
{% endtabs %}

비고: 정수끼리는 정수 몫(소수점 버림)이며, 소수 결과가 필요하면 `3.0`처럼 소수로 나눕니다.

### modulo

숫자를 나눈 나머지를 반환합니다.

```liquid
{{ 10 | modulo: 3 }}
```

→ `1`

### number\_with\_delimiter

숫자에 천 단위 구분 기호(쉼표)를 붙입니다.

```liquid
{{ 1234567.89 | number_with_delimiter }}
```

→ `1,234,567.89`

## 배열 필터

### compact

배열에서 nil 값을 제거합니다.

```liquid
{% assign arr = '["단풍", null, "낙엽"]' | json_parse %}
{{ arr | compact | join: ',' }}
```

→ `단풍,낙엽`

### concat

두 배열을 이어붙입니다.

```liquid
{% assign a = '가,나' | split: ',' %}{% assign b = '다' | split: ',' %}{{ a | concat: b | join: ',' }}
```

→ `가,나,다`

### first

배열의 첫 번째 요소를 반환합니다.

```liquid
{% assign fruits = "사과,감,밤" | split: "," %}
{{ fruits | first }}
```

→ `사과`

### last

배열의 마지막 요소를 반환합니다.

```liquid
{% assign fruits = "사과,감,밤" | split: "," %}
{{ fruits | last }}
```

→ `밤`

### join

배열의 요소를 구분자로 이어붙여 문자열로 만듭니다.

```liquid
{% assign fruits = "사과,감,밤" | split: "," %}
{{ fruits | join: ', ' }}
```

→ `사과, 감, 밤`

### map

배열의 각 요소에서 지정한 속성 값만 뽑아 새 배열을 만듭니다.

```liquid
{% assign blossoms = '[{"name":"단풍","color":"빨강"},{"name":"은행","color":"노랑"}]' | json_parse %}
{{ blossoms | map: 'name' | join: ', ' }}
```

→ `단풍, 은행`

### reverse

배열의 순서를 뒤집습니다.

```liquid
{% assign fruits = "사과,감,밤" | split: "," %}
{{ fruits | reverse | join: ',' }}
```

→ `밤,감,사과`

### sort

배열을 정렬합니다(대소문자 구분, 대문자 우선).

```liquid
{% assign u = "Banana,apple,Cherry" | split: "," %}
{{ u | sort | join: ',' }}
```

→ `Banana,Cherry,apple`

비고: sort는 대소문자를 구분하며(대문자 우선), sort\_natural은 대소문자를 무시합니다 — 위 출력이 이를 보여줍니다.

### sort\_natural

배열을 대소문자 구분 없이 정렬합니다.

```liquid
{% assign u = "Banana,apple,Cherry" | split: "," %}
{{ u | sort_natural | join: ',' }}
```

→ `apple,Banana,Cherry`

### uniq

배열에서 중복된 값을 제거합니다.

```liquid
{% assign dup = "a,b,a" | split: "," %}
{{ dup | uniq | join: ',' }}
```

→ `a,b`

### where

배열에서 지정한 속성 값을 가진 요소만 남깁니다.

시그니처: `where: 속성명[, 값]`

```liquid
{% assign blossoms = '[{"name":"동백","season":"겨울"},{"name":"매화","season":"봄"}]' | json_parse %}
{{ blossoms | where: 'season', '겨울' | map: 'name' | join: ',' }}
```

→ `동백`

### size

배열의 요소 개수 또는 문자열의 길이를 반환합니다.

{% tabs %}
{% tab title="배열" %}

```liquid
{% assign fruits = "귤,유자,곶감" | split: "," %}
{{ fruits | size }}
```

→ `3`
{% endtab %}

{% tab title="문자열" %}

```liquid
{{ '함박눈내리는밤' | size }}
```

→ `7`
{% endtab %}
{% endtabs %}

## 날짜 필터

### date

날짜/시간 값을 지정한 형식의 문자열로 바꿉니다.

시그니처: `date: format[, timezone][, locale: "언어태그"]`

{% tabs %}
{% tab title="기본" %}

```liquid
{{ '2026-07-16 10:30:00' | date: '%Y년 %m월 %d일 %H시 %M분' }}
```

→ `2026년 07월 16일 10시 30분`
{% endtab %}

{% tab title="타임존" %}

```liquid
{{ '2026-07-15 23:00:00 UTC' | date: '%Y-%m-%d %H:%M', 'Asia/Seoul' }}
```

→ `2026-07-16 08:00`
{% endtab %}

{% tab title="한국어 요일" %}

```liquid
{{ '2026-07-16 10:30:00' | date: '%A', locale: 'ko' }}
```

→ `목요일`
{% endtab %}

{% tab title="타임존+요일" %}

```liquid
{{ '2026-07-15 23:00:00 UTC' | date: '%m월 %d일 %A', 'Asia/Seoul', locale: 'ko' }}
```

→ `07월 16일 목요일`
{% endtab %}

{% tab title="epoch" %}

```liquid
{{ 1784165400 | date: '%Y-%m-%d %H:%M', 'Asia/Seoul' }}
```

→ `2026-07-16 10:30`
{% endtab %}
{% endtabs %}

비고:

* 날짜 문자열에 붙은 ISO `Z` 접미사는 파싱되지 않습니다(`2026-07-16T10:30:00Z` ✗) — 공백 구분 존(`2026-07-16 10:30:00 UTC`) 또는 존 없는 형식을 사용하세요.
* 숫자 입력은 epoch **초** 단위입니다.
* timezone은 TZ 이름(`Asia/Seoul`)·ISO 오프셋(`+09:00`)을 지원하며, 분 단위 숫자(360)는 지원하지 않습니다.
* 잘못된 timezone/locale은 해당 파라미터만 무시됩니다.
* timezone(위치 인자)과 `locale:`(이름 인자)은 함께 사용할 수 있으며 순서는 무관합니다.

## URL 필터

### url\_encode

문자열을 URL 인코딩합니다.

```liquid
{{ 'user@example.com' | url_encode }}
```

→ `user%40example.com`

### url\_decode

URL 인코딩된 문자열을 원래대로 디코딩합니다.

```liquid
{{ '%EC%95%88%EB%85%95+%ED%95%98%EC%84%B8%EC%9A%94' | url_decode }}
```

→ `안녕 하세요`

### url\_escape

문자열에서 URL에 사용할 수 없는 문자만 이스케이프합니다.

```liquid
{{ 'https://example.com/search?q=안녕 하세요' | url_escape }}
```

→ `https://example.com/search?q=%EC%95%88%EB%85%95%20%ED%95%98%EC%84%B8%EC%9A%94`

### url\_param\_escape

문자열을 URL 쿼리 파라미터 값으로 이스케이프합니다.

```liquid
{{ '검색어 A&B' | url_param_escape }}
```

→ `%EA%B2%80%EC%83%89%EC%96%B4+A%26B`

## JSON 필터

### json\_escape

문자열을 JSON 문자열 값으로 안전하게 이스케이프합니다.

```liquid
{% assign quote = '그가 "안녕"이라 말했다' %}
{{ quote | json_escape }}
```

→ `그가 \"안녕\"이라 말했다`

### json\_parse

JSON 문자열을 파싱하여 템플릿에서 접근 가능한 객체로 만듭니다.

```liquid
{% assign payload = '{"user":{"name":"철수","point":1500}}' %}
{% assign d = payload | json_parse %}{{ d.user.name }}님의 포인트: {{ d.user.point }}
```

→ `철수님의 포인트: 1500`

비고: 파싱 실패 시 nil이 되며 렌더는 계속됩니다.

### as\_json\_string

값을 JSON 문자열로 직렬화합니다.

```liquid
{% assign obj = '{"name":"철수","point":1500}' | json_parse %}
{{ obj | as_json_string }}
```

→ `{"name":"철수","point":1500}`

## 기타 필터

### default

값이 비어 있거나 falsy일 때 대체 값을 반환합니다.

시그니처: `default: 기본값`

```liquid
{{ nickname | default: '나그네' }}님 안녕하세요
```

→ `나그네님 안녕하세요`

### fallback\_over\_length

문자열이 지정한 길이를 초과하면 대체 문구를 반환합니다.

시그니처: `fallback_over_length: 최대길이, 대체문구`

{% tabs %}
{% tab title="길이 초과" %}

```liquid
{{ '함박눈이펑펑' | fallback_over_length: 5, '나그네' }}
```

→ `나그네`
{% endtab %}

{% tab title="길이 이내" %}

```liquid
{{ '첫눈' | fallback_over_length: 5, '나그네' }}
```

→ `첫눈`
{% endtab %}
{% endtabs %}

비고: 길이는 UTF-16 코드 유닛 기준입니다(`size` 필터와 동일).

## 태그

### assign

변수에 값을 대입합니다.

```liquid
{% assign name = '해클' %}{{ name }}님 안녕하세요
```

→ `해클님 안녕하세요`

### capture

블록 안의 렌더 결과를 변수에 저장합니다.

```liquid
{% assign name = '철수' %}
{% capture greeting %}{{ name }}님 환영합니다{% endcapture %}{{ greeting }}
```

→ `철수님 환영합니다`

### if

조건이 참일 때만 블록을 렌더합니다.

```liquid
{% assign point = 1500 %}
{% if point >= 1000 %}VIP 혜택{% else %}일반 혜택{% endif %}
```

→ `VIP 혜택`

### unless

조건이 거짓일 때만 블록을 렌더합니다.

```liquid
{% assign subscribed = false %}
{% unless subscribed %}구독을 시작해보세요{% endunless %}
```

→ `구독을 시작해보세요`

### case / when

값에 따라 여러 분기 중 하나를 렌더합니다.

```liquid
{% assign grade = 'gold' %}
{% case grade %}{% when 'gold' %}골드 혜택{% when 'silver' %}실버 혜택{% else %}기본 혜택{% endcase %}
```

→ `골드 혜택`

### for

배열이나 범위를 순회하며 블록을 반복 렌더합니다.

```liquid
{% assign fruits = "귤,유자,곶감" | split: "," %}
{% for f in fruits %}{{ f }} {% endfor %}
```

→ `귤 유자 곶감`

### break

for 반복문을 즉시 종료합니다.

```liquid
{% for i in (1..5) %}{% if i > 3 %}{% break %}{% endif %}{{ i }}{% endfor %}
```

→ `123`

### continue

for 반복문에서 현재 반복을 건너뛰고 다음으로 넘어갑니다.

```liquid
{% for i in (1..5) %}{% if i == 3 %}{% continue %}{% endif %}{{ i }}{% endfor %}
```

→ `1245`

### cycle

여러 값을 순서대로 돌아가며 출력합니다.

```liquid
{% for i in (1..4) %}{% cycle 'A', 'B' %}{% endfor %}
```

→ `ABAB`

### comment

블록 안의 내용을 출력하지 않습니다.

```liquid
앞{% comment %}이 내용은 출력되지 않습니다{% endcomment %}뒤
```

→ `앞뒤`

### raw

블록 안의 내용을 Liquid 문법으로 해석하지 않고 그대로 출력합니다.

```liquid
{% raw %}{{ name }}은 치환되지 않습니다{% endraw %}
```

→ `{{ name }}은 치환되지 않습니다`

### increment

0부터 시작하는 전용 카운터를 증가시키며 출력합니다.

```liquid
{% increment counter %}-{% increment counter %}-{% increment counter %}
```

→ `0-1-2`

비고: increment는 0부터, decrement는 -1부터 시작하며 `assign` 변수와 별개의 카운터를 사용합니다.

### decrement

-1부터 시작하는 전용 카운터를 감소시키며 출력합니다.

```liquid
{% decrement counter %}-{% decrement counter %}
```

→ `-1--2`

## 기타 태그

### connected\_content

외부 API를 호출해 응답(JSON)을 템플릿 변수로 저장합니다.

자세한 사용법·제약(타임아웃, 응답 크기 한도, 허용 프로토콜·주소 등)은 [커넥티드 콘텐츠 작성하기](/crm-marketing/message-personalization/connected-content.md)를 참고하세요.

시그니처: `{% connected_content <url> [:method <method>] [:body <body>] [:headers <json>] [:save <변수명>] %}`

```liquid
{% connected_content https://api.example.com/users/{{ user.id }} :save profile %}
{{ profile.name }}님, 오늘의 추천 상품을 확인해보세요
```

→ `철수님, 오늘의 추천 상품을 확인해보세요` (API가 {"name": "철수"}를 응답했다고 가정)

비고: 렌더 시 실제 HTTP 호출이 발생합니다. 위 출력은 가정한 응답 기준 예시입니다.

### random

난수를 생성해 출력합니다. 자연수를 넣어서 0 이상 특정 값 미만의 무작위 정수를 얻을 수 있습니다.

{% tabs %}
{% tab title="실수(0\~1)" %}

```liquid
{% random %}
```

→ `0.250538241955663` (실행마다 다름)
{% endtab %}

{% tab title="범위 정수" %}

```liquid
{% random 10 %}
```

→ `7` (실행마다 다름)
{% endtab %}

{% tab title="예시: 주사위 굴리기" %}
**주사위 굴리기 (1\~6)** — 뽑은 값을 변수에 담아 재사용하려면 `capture`로 담고 `plus`로 숫자로 바꿉니다. `{% random 6 %}`은 0-5를 주므로 `plus: 1`로 1-6이 됩니다.

```liquid
{% capture dice %}{% random 6 %}{% endcapture %}{{ dice | plus: 1 }}
```

→ `4` (실행마다 다름)
{% endtab %}
{% endtabs %}


---

# Agent Instructions
This documentation is published with GitBook. GitBook is the documentation platform designed so that both humans and AI agents can read, navigate, and reason over technical content effectively. Learn more at gitbook.com.

## Querying This Documentation
If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter, and the optional `goal` query parameter:

```
GET https://docs.hackle.io/crm-marketing/message-personalization/liquid-template-reference.md?ask=<question>&goal=<endgoal>
```

`ask` is the immediate question: it should be specific, self-contained, and written in natural language.
`goal` is optional and describes the broader end goal you are ultimately trying to accomplish on behalf of the user. GitBook uses it to tailor the answer towards what is most useful for that goal.

The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
