> This page is part of the [Customer.io documentation](https://docs-customerio.netlify.app). For the complete index, see [llms.txt](https://docs-customerio.netlify.app/llms.txt).
> Last updated: December 31, 2024

 [![Customer.io](https://docs.customer.io/images/cio-logo.svg) ![Customer.io](https://docs.customer.io/images/cio-logo-no-text.svg)](/)

Filters

*   [Log In](https://fly.customer.io/login)

[Book demo](https://customer.io/demo/) [Start trial](https://customer.io/signup/)

*   [Platform](https://customer.io/features/)
*   [Pricing](https://customer.io/pricing/)
*   [Customers](https://customer.io/customers/)
*   [Docs](https://customer.io/)

* * *

[Request Demo](https://customer.io/demo/) [Sign In](https://fly.customer.io/login)

*   [Get Started](/get-started)  Get Started
    *   [Welcome to Customer.io](/get-started/welcome/)
    *   [Quick start guide](/get-started/quick-start-guide/)
    *   [Academy: Structured Learning](/get-started/get-started-academy/)
    *   [1\. Create your workspace](/get-started/create-workspace/)
    *   [2\. Set up message channels](/get-started/set-up-messages/)
    *   [3\. Integrate with Customer.io](/get-started/integrate/)
    *   [4\. Add people](/get-started/add-people/)
    *   [5\. Send events and make segments](/get-started/segments-and-people-data/)
    *   [6\. Start sending campaigns and workflows](/get-started/send-messages/)
*   [Journeys](/journeys/journeys-overview)  Journeys
    *   [Introduction to Journeys](/journeys/journeys-overview/)
    *   [People & Events](/journeys/people/)
    *   [Objects & non-people data](/journeys/objects-data/)
    *   [Segmentation](/journeys/segmentation/)
    *   [Design Studio](/journeys/design-studio/)
    *   [Campaigns & Workflows](/journeys/campaigns-and-workflows/)
    *   [Message Channels](/journeys/messages-and-webhooks/)
    *   [Liquid & Personalization](/journeys/liquid/)
    *   [Metrics](/journeys/metrics/)
*   [Integrations](/integrations/getting-started/)  Integrations
    *   [Integration Directory](/integrations/directory/)
    *   [Get Started](/integrations/getting-started/)
    *   [Data In](/integrations/data-in/)
    *   [Data Out](/integrations/data-out/)
    *   [APIs](/integrations/api/)
        *   [Pipelines API](/integrations/api/cdp/)
        *   [Track API](/integrations/api/track/)
        *   [App API](/integrations/api/app/)
        *   [Reporting Webhooks](/integrations/api/webhooks/)
        *   [Comparing the Pipelines and Track APIs](/integrations/api/track-vs-cdp-api/)
    *   [Mobile SDKs](/integrations/sdk/)
        *   [iOS](/integrations/sdk/ios/quick-start-guide/)
        *   [Android](/integrations/sdk/android/quick-start-guide/)
        *   [React Native](/integrations/sdk/react-native/quick-start-guide/)
        *   [Expo](/integrations/sdk/expo/quick-start-guide/)
        *   [Flutter](/integrations/sdk/flutter/quick-start-guide/)
*   [](/accounts-and-workspaces/)
    *   [Account Verification](/accounts-and-workspaces/account-verification)
    *   [Audit Logs](/accounts-and-workspaces/audit-logs)
    *   [Billing](/accounts-and-workspaces/billing/)
    *   [Your Account](/accounts-and-workspaces/your-account/)
    *   [Workspaces](/workspaces/)
    *   [Privacy & Security](/accounts-and-workspaces/privacy-and-security/)
    *   [Troubleshooting](/accounts-and-workspaces/troubleshooting/)
*   [AI Features](/ai/)  AI Features
    *   [Use Customer.io with AI](/ai/cio-with-llms/)
    *   [Your Customer.io agent](/ai/agent/)
    *   [Customer.io CLI](/ai/cli/)
    *   [Customer.io MCP](/ai/mcp/)
    *   [Email content analysis](/ai/content-analysis/)
    *   [In-app message suggestions](/ai/in-app-suggestions/)
    *   [In-app survey analysis](/ai/in-app-survey-analysis/)
    *   [Use our docs with AI](/ai/use-docs-with-ai/)
*   [Releases
    
    Releases
    
    
    
    
    
    ](/release-notes)
    
    [
    
    #### Latest features at Customer.io
    
    ](/release-notes)
    
    [](/release-notes)[
    
    ##### Customer.io's biggest product release: AI Agent, WhatsApp, LINE, and more!
    
    We’ve released eight new capabilities—AI-powered intelligence, outcome-first measurement, a redesigned experience, and expanded channel …
    
    ](https://customer.io/learn/announcements/biggest-ai-marketing-release)
    
    [
    
    ##### Search across more things with quick look previews
    
    2026-04-30
    
    Universal search now covers even more data, including templates, people, product documentation, and newsletters. You can even preview results without …
    
    ](/release-notes/#2026-04-30-universal-search-expanded)
    
    [
    
    ##### Switch between multiple accounts
    
    2026-04-29
    
    You can now log into multiple Customer.io accounts and switch between them without logging out.
    
    ](/release-notes/#2026-04-29-multi-account-switch)
    

Get Started

*   [Welcome to Customer.io](/get-started/welcome/)
*   [Quick start guide](/get-started/quick-start-guide/)
*   [Academy: Structured Learning](/get-started/get-started-academy/)
*   [1\. Create your workspace](/get-started/create-workspace/)
*   [2\. Set up message channels](/get-started/set-up-messages/)
*   [3\. Integrate with Customer.io](/get-started/integrate/)
*   [4\. Add people](/get-started/add-people/)
*   [5\. Send events and make segments](/get-started/segments-and-people-data/)
*   [6\. Start sending campaigns and workflows](/get-started/send-messages/)

Journeys

*   [Introduction to Journeys](/journeys/journeys-overview/)
*    People & Events
    *    Manage people & their attributes
        *   [People and their profiles](/journeys/people-overview/)
        *   [Add or update people](/journeys/manually-adding-or-updating-people/)
        *   [How to identify people](/journeys/identifying-people/)
        *   [Manage customer attributes](/journeys/attributes/)
        *   [Manage devices](/journeys/managing-customer-mobile-devices/)
        *   [Resolve duplicate people](/journeys/merge-people/)
        *   [What's the Last Visited field, and how do I use it?](/journeys/last-visited/)
        *   [Delete people and suppress profile IDs](/journeys/deleting-users/)
        *   [Export a person's data](/journeys/single-user-export/)
        *   [Export data for multiple people](/journeys/exporting-users/)
    *   [Storing and using JSON](/journeys/getting-started-with-json/)
    *   [Events](/journeys/events/)
    *   [Import people or events via CSV](/journeys/uploading-people/)
    *    Find people & data
        *   [Searching and filtering people](/journeys/filter-search/)
        *   [Filter Activity Logs](/journeys/filtering-logs/)
        *   [Using your Data Index](/journeys/using-data-index/)
        *   [How do I know what data I have available?](/journeys/data-availability/)
    *    Anonymous data
        *   [Anonymous people](/journeys/anonymous-people/)
        *   [Anonymous activity](/journeys/anonymous-activity/)
        *   [Merging anonymous activity](/journeys/merge-anonymous/)
        *   [Anonymous events](/journeys/anonymous-events/)
    *   [How do I create multiple subscription types?](/journeys/multiple-subscription-types/)
    *   [Shortcuts to external services](/journeys/people-shortcuts/)
*    Objects & non-people data
    *   [Overview: Objects vs Collections](/journeys/getting-started-objects-collections/)
    *    Objects
        *   [Objects: how they work](/journeys/objects-start/)
        *   [Objects: video tutorials](/journeys/objects-video-tutorials/)
        *   [Object types](/journeys/object-types/)
        *   [Objects](/journeys/objects-create/)
        *   [Relationships](/journeys/relationships/)
        *   [Import objects or relationships via CSV](/journeys/import-objects/)
        *   [Export objects or relationships via CSV](/journeys/objects-export-many/)
        *   [Objects and relationships in campaigns](/journeys/object-and-relationship-campaigns/)
        *   [Use objects in liquid](/journeys/objects-in-liquid/)
    *    Objects use cases
        *   [Upsell: monetize power users](/journeys/upsell-users/)
        *   [Adoption: drive feature usage](/journeys/feature-adoption/)
        *   [Awareness: announce events](/journeys/awareness-announce-events/)
        *   [Conversion: activate people on your event waitlist](/journeys/conversion-activate-waitlist/)
    *   [Collections](/journeys/collections/)
*    Segmentation
    *   [How segments work](/journeys/segments/)
    *   [Build segments with AI](/journeys/segment-builder/)
    *   [Data-driven segments](/journeys/data-driven-segments/)
    *   [Manual Segments](/journeys/manual-segments/)
    *   [Segment mobile device audiences](/journeys/device-segments/)
    *   [Ad Audiences](/journeys/ad-audiences-sync/)
    *   [Timestamp Conditions](/journeys/segmentation-and-timestamp-rules/)
    *   [Using JSON in segments](/journeys/json-in-segments/)
    *   [Timestamp Conditions FAQ](/journeys/faq-timestamps/)
    *   [Timestamp Rules for Building Segments](/journeys/timestamp-rules/)
    *   [Why don't people match 'within the past X days' conditions?](/journeys/past-x-days-help/)
    *   [Setting Up Segments for Specific Purposes](/journeys/creating-segments/)
*    Design Studio Beta
    *   [Welcome to Design Studio!](/journeys/design-studio-overview/)
    *   [Manage your files](/journeys/file-manager/)
    *    Create & review emails
        *   [Keyboard shortcuts](/journeys/keyboard-shortcuts/)
        *    Style your messages
            *   [Set global styles](/journeys/set-styles/)
            *   [Dark mode](/journeys/dark-mode/)
            *   [Responsive styles](/journeys/responsive-styles/)
        *    Visual editor
            *   [Get started](/journeys/visual-editor-overview/)
            *   [Style individual messages](/journeys/properties-menu/)
            *   [Add & preview liquid](/journeys/liquid-visual-editor/)
        *    Code editor
            *   [Get started](/journeys/code-editor-overview/)
            *   [Validate your email](/journeys/developer-tools/)
            *    Transformers
                *   [MJML framework](/journeys/transformer-mjml/)
                *   [CSS inlining](/journeys/transformer-css-inlining/)
                *   [Formatting](/journeys/transformer-formatting/)
                *   [Set URL parameters for a single message](/journeys/transformer-url-parameters/)
                *   [CSS cleanup](/journeys/transformer-css-cleanup/)
                *   [CSS variables](/journeys/transformer-css-variables/)
                *   [Accessibility fixes](/journeys/transformer-accessibility-fixes/)
            *   [Use Emmet syntax](/journeys/code-editor-emmet/)
            *   [Use MSO syntax](/journeys/code-editor-mso/)
        *   [Preview email in Design Studio](/journeys/preview-email-in-design-studio/)
        *    Manage connected messages
            *   [Connect an email to an automation](/journeys/add-email-to-automation/)
            *   [Edit connected messages & publish changes](/journeys/publish-changes/)
            *   [Disconnect an email from an automation](/journeys/disconnect-from-automation/)
    *    Create reusable content
        *   [Understand components](/journeys/components-overview/)
        *   [Add components to your message](/journeys/insert-components/)
        *   [Understand and style standard components](/journeys/standard-components/)
        *    Custom components
            *   [How to create & edit a component](/journeys/create-custom-component/)
            *   [Create a component from scratch](/journeys/code-custom-component/)
            *   [Create modifiable, placeholder content](/journeys/component-slots/)
            *   [Style custom components](/journeys/component-properties/)
            *   [Delete a component](/journeys/delete-component/)
            *    Syntax
                *   [Understand syntax](/journeys/custom-comp-syntax/)
                *   [Add conditionals & directives](/journeys/directives/)
                *   [Loop through data](/journeys/component-loops/)
                *   [Create a stylesheet](/journeys/component-styling/)
            *   [Migrate components from Parcel](/journeys/migrate-comp-from-parcel/)
    *    Collaborate with teammates
        *   [How to collaborate](/journeys/collaborate/)
        *   [Submit & manage feedback](/journeys/feedback/)
        *   [Manage version history](/journeys/version-history/)
        *   [Send a test message](/journeys/send-test/)
    *   [WhatsApp templates](/journeys/whatsapp-design-studio/)
*    Campaigns & Workflows
    *   [Campaigns, broadcasts, and transactional messages](/journeys/types-of-campaigns-and-broadcasts/)
    *   [Tags](/journeys/tagging-campaigns/)
    *    Campaigns
        *   [Campaign concepts & settings](/journeys/campaigns-in-customerio/)
        *   [Campaign journeys](/journeys/campaign-journeys/)
        *   [Create a campaign](/journeys/create-a-campaign/)
        *   [Campaigns page](/journeys/intro-to-campaigns/)
        *   [Triggers, filters, and frequencies](/journeys/campaign-triggers/)
        *   [When to use filters](/journeys/campaign-triggers-and-filters/)
        *   [Goals & conversion criteria](/journeys/campaign-conversions/)
        *   [Exit conditions](/journeys/campaign-exit-conditions/)
        *   [Schedule a campaign](/journeys/schedule-campaigns/)
        *   [Change the state of a campaign](/journeys/campaign-statuses/)
        *    Troubleshoot campaigns
            *   [Why aren't people entering my campaign?](/journeys/troubleshoot-campaign-entrance/)
            *   [Why aren't people receiving my message?](/journeys/messages-not-sending/)
        *    Edit live campaigns
            *   [Edit triggers, filters, or frequencies](/journeys/campaign-changes/)
            *   [Edit goals](/journeys/goal-changes/)
            *   [Edit workflows](/journeys/workflow-changes/)
        *    Webhook-triggered campaigns
            *   [Webhook campaigns](/journeys/webhook-triggered-campaigns/)
            *   [Send event](/journeys/data-campaign-event-action/)
            *   [Batch update](/journeys/batch-update-webhook-campaigns/)
            *   [Follow up on NPS responses](/journeys/satismeter-data-campaign/)
            *   [Sync customers from Stripe to Customer.io](/journeys/stripe-data-campaign/)
            *   [Campaign for syncing Mixpanel cohorts](/journeys/mixpanel-data-campaign/)
            *   [Slack notification for support tickets](/journeys/zendesk-data-campaign/)
        *   [Grace periods](/journeys/grace-periods/)
    *    Campaign recipes
        *   [Our Recipe Book](/journeys/recipes/)
        *   [Send a Welcome Email](/journeys/send-a-welcome-email/)
        *   [Birthday and Anniversary Campaigns](/journeys/birthday-and-anniversary-campaigns/)
        *   [Cart Abandonment](/journeys/cart-abandonment/)
        *   [Double Opt-In](/journeys/double-opt-in/)
        *   [Onboarding Campaign](/journeys/onboarding-campaign/)
        *   [Optimize emails with Just Words](/journeys/just-words/)
        *   [Trial expiration reminders](/journeys/trial-expiration-reminders/)
        *   [Cohort tests](/journeys/cohort-testing/)
        *   [Trigger campaigns based on Roles](/journeys/role-based-messaging-campaign/)
        *   [RSS Feed Email Campaign](/journeys/rss-feed-email-campaign/)
        *   [Reminders for multiple upcoming trips](/journeys/reminders-for-multiple-upcoming-trips/)
    *    Broadcast & newsletters
        *   [Introduction to broadcasts](/journeys/broadcasts-in-customerio/)
        *   [Newsletters](/journeys/newsletters/)
        *   [API-triggered broadcasts](/journeys/api-triggered-broadcasts/)
        *   [Personalize messages with trigger data](/journeys/previewing-broadcast-data/)
        *   [Format API-Triggered Broadcasts](/journeys/api-triggered-data-format/)
        *   [Edit live API-triggered broadcasts](/journeys/apitb-changes/)
        *   [Common API-Triggered Broadcast errors](/journeys/api-triggered-errors/)
    *    Transactional messages
        *   [Getting started: key concepts](/journeys/transactional-api/)
        *   [Set up a transactional email](/journeys/transactional-email/)
        *   [Set up a transactional push](/journeys/transactional-push/)
        *   [Set up a transactional SMS](/journeys/transactional-sms/)
        *   [Transactional examples](/journeys/transactional-api-examples/)
        *   [Common transactional API errors](/journeys/transactional-api-common-api-errors/)
        *   [Frequently Asked Questions](/journeys/transactional-faq/)
        *   [Campaigns with transactional messages](/journeys/transactional-campaign/)
    *    Workflow builder
        *   [Workflow builder](/journeys/workflow-builder/)
        *   [LLM actions: Generate data & decisions with AI](/journeys/llm-actions/)
        *   [Send event](/journeys/event-action/)
        *   [Batch update](/journeys/batch-update/)
        *   [Conditions](/journeys/action-conditions/)
        *   [Holdout tests](/journeys/holdout-test/)
        *   [A/B tests](/journeys/a-b-test-campaigns/)
        *   [Copy workflow items](/journeys/copying-workflow-items/)
        *    Attribute Updates
            *   [Create or update person](/journeys/create-update-person/)
            *   [Set journey attributes](/journeys/set-journey-attributes/)
            *   [Fix typos in attributes](/journeys/how-to-use-attribute-updates-to-fix-typos-in-your-data/)
            *   [Reformat timestamp attributes](/journeys/how-to-use-attribute-updates-to-reformat-timestamps/)
        *    Branches/flow control
            *   [Types of branches](/journeys/branches/)
            *   [Multi-Split Branches](/journeys/multi-split/)
            *   [Random Cohorts](/journeys/random-cohort/)
            *   [True/False Branches](/journeys/true-false/)
            *   [Exit Blocks](/journeys/exit-blocks/)
        *    Delays
            *   [Time Window](/journeys/delivery-window/)
            *   [Wait Until...](/journeys/wait-until/)
            *   [Randomized delay](/journeys/random-delay/)
        *    Webhooks
            *   [Send and receive data with webhook actions](/journeys/webhooks-action/)
            *   [Configure reusable webhooks](/journeys/webhook-manager/)
            *   [Send in-app messages using webhooks](/journeys/in-app-message-webhooks/)
            *   [Web push with webhooks](/journeys/web-push-webhooks/)
            *   [Send direct mail with Lob](/journeys/lob-webhook-integration/)
    *    Message sending
        *   [Default sending settings](/journeys/sending-behavior/)
        *   [Sending behavior options](/journeys/queue-draft/)
        *   [Queue Draft for Campaign QA](/journeys/queue-as-draft/)
        *   [Geolocation and time zone data](/journeys/geolocation/)
        *   [Recommended send time](/journeys/recommended-send-time/)
        *   [Send messages in users' time zones](/journeys/timezone-match/)
        *   [Supported time zone formats](/journeys/example-timezones/)
        *   [Message Limits](/journeys/message-limits/)
*    Message Channels
    *    Email
        *   [Email: Getting Started](/journeys/email-getting-started/)
        *   [Transitioning to Customer.io as a sender](/journeys/deliverability-getting-started/)
        *   [Introduction to Creating Emails](/journeys/2-email-basics/)
        *   [Test your emails](/journeys/testing-emails/)
        *   [Email Attachments](/journeys/email-attachments/)
        *    Deliverability
            *   [Email Deliverability Best Practices](/journeys/email-deliverability-best-practices/)
            *   [Domain Authentication](/journeys/authentication/)
            *   [Delete a domain](/journeys/delete-domain/)
            *   [Domain warming](/journeys/domain-warming/)
            *   [Track links with your domain](/journeys/link-tracking-custom-domain/)
            *   [IP addresses: shared vs dedicated](/journeys/ip-addresses/)
            *   [Spamhaus blocklist listings](/journeys/spamhaus-blocklist/)
            *   [Email suppression lists](/journeys/esp-suppression/)
            *   [Google Postmaster Tools](/journeys/google-postmaster-tools/)
            *   [Custom unsubscribe links (RFC 8058)](/journeys/custom-unsubscribe-links/)
            *   [Authenticating for Apple Private Email Relay](/journeys/authenticating-for-apple-private-email-relay/)
            *   [Verify deliverable email addresses with Kickbox](/journeys/verify-email-deliverable-kickbox/)
            *    Custom SMTP
                *   [Use Your Own SMTP Server](/journeys/use-your-smtp-server/)
                *   [Using Multiple SMTP servers](/journeys/multiple-smtp-servers/)
                *   [Use your Mailgun Account](/journeys/triggered-lifecycle-email-with-mailgun/)
                *   [Use your Mailjet Account](/journeys/triggered-lifecycle-email-with-mailjet/)
                *   [Use your Mandrill Account](/journeys/triggered-lifecycle-email-with-mandrill/)
                *   [Use your Postmark Account](/journeys/triggered-lifecycle-email-with-postmark/)
                *   [Use your SendGrid Account](/journeys/triggered-lifecycle-email-with-sendgrid/)
                *   [Use your Sparkpost Account](/journeys/triggered-lifecycle-email-with-sparkpost/)
                *   [Use your Oracle Dyn Account](/journeys/triggered-lifecycle-email-with-oracle-dyn/)
        *    Editors
            *   [Choose the right email editor](/journeys/email-editors/)
            *   [Drag-and-Drop Emails: The Basics](/journeys/drag-and-drop/)
            *   [Drag-and-Drop Editor FAQ](/journeys/drag-and-drop-faq/)
            *   [Troubleshooting Your Drag-and-Drop Emails](/journeys/troubleshooting-email-design/)
            *   [Email code editor](/journeys/email-code-editor/)
        *    Design & layouts
            *   [Introduction to Email Layouts](/journeys/3-layouts-and-customerio/)
            *   [Customizing Email Layouts](/journeys/customizing-layout-starters/)
            *   [Archiving Old Layouts](/journeys/archiving-layouts/)
            *   [HTML and CSS Email vs. Web](/journeys/1-html-and-css/)
            *   [CSS pre-processing](/journeys/css-pre-processing/)
            *   [AMP for email](/journeys/amp-for-email/)
            *   [Adding a view in browser link](/journeys/view-in-browser/)
            *   [Resources for templates, code, and best practices](/journeys/4-email-design-resources/)
            *   [Adapting Foundation's Basic template](/journeys/5-adapt-foundation-basic/)
            *   [Adapting MailChimp's Two-Column template](/journeys/6-adapt-mc-twocol/)
        *    Senders & headers
            *   [How do I add an avatar/logo to my emails?](/journeys/adding-sender-image/)
            *   [Set Custom Email Headers](/journeys/custom-mail-headers/)
            *   [Set custom preheader/preview text](/journeys/custom-preheader-text/)
            *   [What does the Fake BCC option do?](/journeys/fake-bcc/)
            *   [Create multiple from addresses](/journeys/multiple-from-addresses/)
        *    Email Recipes
            *   [Welcome Email Copy](/journeys/welcome-email-copy/)
            *   [Gmail Promotions](/journeys/gmail-promotions/)
            *   [Send data from Customer.io to Salesforce, Highrise or another CRM](/journeys/bcc-salesforce-or-your-crm/)
            *   [Code editor: send Trustpilot reviews](/journeys/bcc-trustpilot/)
    *    Push Notifications
        *   [Get started](/journeys/push-getting-started/)
        *   [Integrate your app](/journeys/push-developer-guide/)
        *   [Migrate from another provider](/journeys/push-migration/)
        *   [Registering device tokens](/journeys/device-tokens/)
        *   [Send push notifications](/journeys/send-push/)
        *   [Custom push payloads](/journeys/push-custom-payloads/)
        *   [Test push notifications](/journeys/push-qa-testing/)
        *   [Push metrics and message statuses](/journeys/push-notifications-tracking/)
        *   [Best practices for push notifications](/journeys/push-best-practices/)
        *   [Frequently Asked Questions](/journeys/push-faq/)
        *   [Troubleshooting mobile issues](/journeys/troubleshooting-mobile/)
    *    SMS
        *   [Get Started](/journeys/sms-get-started/)
        *   [Send SMS/MMS messages](/journeys/sms-send-messages/)
        *   [Link shortening](/journeys/sms-link-shortening/)
        *    Inbound messages
            *   [Getting started](/journeys/inbound-sms/)
            *   [Inbound statuses and activities](/journeys/inbound-metrics/)
            *   [Respond to inbound keywords](/journeys/inbound-campaigns/)
        *   [Senders](/journeys/sender-phone-numbers/)
        *   [Tracking](/journeys/tracking-twilio-messages/)
        *   [Frequently Asked Questions](/journeys/faq-twilio/)
        *   [Smart character encoding](/journeys/sms-character-encoding/)
        *   [Opt-out keyword handling](/journeys/sms-keyword-opt-out/)
        *   [Validate Mobile Phone Numbers](/journeys/validate-mobile-phone-numbers/)
        *    Register as a sender
            *   [Getting a phone number](/journeys/get-a-phone-number/)
            *   [Update your privacy policy for SMS](/journeys/your-privacy-policy/)
            *   [Opt-in and out flow](/journeys/opt-in-and-out-flow/)
            *   [Brand and campaign registration](/journeys/sms-brand-campaign/)
            *   [What kind of phone number do I need?](/journeys/phone-number-types/)
            *   [HIPAA compliance and privacy regulations](/journeys/hipaa-standards/)
    *    Web & In-App Messages
        *   [Get started](/journeys/in-app-getting-started/)
        *   [Set up your website](/journeys/in-app-web/)
        *   [Send in-app messages](/journeys/send-in-app-message/)
        *   [Global styles for in-app messages](/journeys/global-styles-in-app/)
        *   [Anonymous messages](/journeys/anonymous-in-app/)
        *    Notification Inbox
            *   [Set up your notification inbox](/journeys/inbox-setup/)
            *   [Send inbox messages](/journeys/send-inbox/)
            *   [Trigger inbox messages from your backend](/journeys/send-inbox-txnl/)
            *   [Inbox message metrics](/journeys/inbox-metrics/)
        *    Forms and Surveys
            *   [Forms](/journeys/in-app-forms/)
            *   [Lead capture](/journeys/in-app-lead-form/)
            *   [Surveys](/journeys/in-app-surveys/)
        *   [Inline messages](/journeys/inline-in-app/)
        *   [Multi-step messages](/journeys/multi-step/)
        *   [In-app metrics](/journeys/in-app-metrics/)
        *   [Test your messages](/journeys/test-in-app/)
        *   [Localize messages](/journeys/localize-in-app-message/)
        *   [In-App FAQ](/journeys/in-app-faq/)
        *    Recipes for your website
            *   [NPS Surveys](/journeys/web-nps-survey/)
            *   [Promotions and offers](/journeys/web-promotion/)
            *   [Promote upcoming event](/journeys/in-app-event-promotion/)
            *   [Milestones and achievements](/journeys/web-achievements/)
            *   [Feature adoption](/journeys/web-adoption/)
        *    Message editor reference
            *   [The visual editor](/journeys/new-in-app-editor/)
            *   [In-app component reference](/journeys/in-app-components/)
            *   [Legacy in-app editor](/journeys/legacy-in-app-editor/)
    *    WhatsApp
        *   [Get Started](/journeys/whatsapp-get-started/)
        *   [Create content templates](/journeys/whatsapp-content-templates/)
        *   [Send a WhatsApp Message](/journeys/send-whatsapp/)
        *   [WhatsApp metrics and reporting](/journeys/whatsapp-metrics/)
        *   [Frequently Asked Questions](/journeys/faq-whatsapp/)
    *    LINE messaging
        *   [Get Started](/journeys/line-get-started/)
        *   [Send messages](/journeys/line-send-messages/)
        *   [LINE metrics and reporting](/journeys/line-metrics/)
    *    Slack Messages
        *   [Get Started](/journeys/slack/)
    *    Languages & localization
        *   [Translate your messages](/journeys/localization-getting-started/)
        *   [Set up your localization attribute](/journeys/localization-attribute/)
        *   [Track metrics for translations](/journeys/localization-metrics/)
    *    Links in messages
        *   [Link Tracking](/journeys/link-tracking/)
        *   [Checking Link Status](/journeys/link-checking/)
        *   [Adding URL parameters to links](/journeys/url-parameters/)
        *   [Track universal links and app links in email](/journeys/universal-links/)
        *   [HTTPS Link Tracking](/journeys/track-https-links/)
    *    Subscription preferences
        *   [Overview of subscription options](/journeys/subscriptions-overview/)
        *   [Global unsubscribes](/journeys/unsubscribes/)
        *   [The subscription center](/journeys/subscription-center/)
        *   [Brand your subscription pages](/journeys/subscription-center-branding/)
        *   [Subscription FAQs](/journeys/unsubscribe-faqs/)
        *   [Manage subscription preferences](/journeys/manage-subscription-preferences/)
        *   [Subscription preference metrics](/journeys/subscription-metrics/)
        *   [Multi-language support for the subscription center](/journeys/subscription-center-translation/)
        *   [Migrate subscription preferences](/journeys/migrate-subscription-prefs/)
        *   [Set preferences outside of the subscription center](/journeys/set-preferences-outside-center/)
    *   [Send from a personal support rep](/journeys/assign-a-personal-support-rep/)
    *   [Find messages using the Message Library](/journeys/message-library/)
    *   [Assets library: store files](/journeys/asset-library/)
    *   [Image requirements](/journeys/image-support/)
    *   [Message Statuses](/journeys/message-statuses/)
    *   [Deliveries & Drafts data](/journeys/deliveries-drafts-data/)
*    Liquid & Personalization
    *   [Personalize messages with liquid](/journeys/using-liquid/)
    *   [Liquid upgrade](/journeys/liquid-upgrade/)
    *   [Liquid syntax list](/journeys/liquid-tag-list/)
    *   [Liquid recipes](/journeys/liquid-recipes/)
    *   [Personalize actions with JavaScript](/journeys/js-in-actions/)
    *   [Reusing content with snippets](/journeys/snippets/)
    *   [Composer errors](/journeys/composer-errors/)
*    Metrics
    *   [Metrics Overview](/journeys/analytics/)
    *   [Goals](/journeys/goals/)
    *   [Campaign and Broadcast Metrics](/journeys/campaign-metrics/)
    *   [Home dashboard](/journeys/dashboard/)
    *   [Workspace Performance dashboard](/journeys/health/)
    *   [Analysis page & reports](/journeys/run-reports/)
    *   [Email deliverability metrics](/journeys/deliverability-metrics/)
    *   [Understanding your A/B test results](/journeys/understanding-ab-results/)
    *   [Getting conclusive results from A/B tests](/journeys/conclusive-ab-results/)
    *   [Failed and attempted messages](/journeys/message-failed/)

Integrations

*   [Integration Directory](/integrations/directory/)
*    Get Started
    *   [Quick start guide](/integrations/getting-started/quick-start-guide/)
    *   [Understanding Integrations in Customer.io](/integrations/getting-started/how-it-works/)
    *   [Troubleshooting](/integrations/getting-started/troubleshooting/)
    *   [Data Compliance and Privacy](/integrations/getting-started/data-compliance/)
*    Data In
    *   [Introduction](/integrations/data-in/getting-started/)
    *    Source Specs
        *   [Understanding incoming data](/integrations/data-in/source-spec/incoming-data/)
        *   [Identify](/integrations/data-in/source-spec/identify-spec/)
        *   [Group](/integrations/data-in/source-spec/group-spec/)
        *   [Page](/integrations/data-in/source-spec/page-spec/)
        *   [Screen](/integrations/data-in/source-spec/screen-spec/)
        *   [Track](/integrations/data-in/source-spec/track-spec/)
        *   [Alias](/integrations/data-in/source-spec/alias-spec/)
        *   [Common fields](/integrations/data-in/source-spec/common-fields/)
    *   [Custom events](/integrations/data-in/custom-events/)
    *    Semantic Events
        *   [Understanding Semantic Events](/integrations/data-in/semantic-events/getting-started/)
        *   [A/B Test events](/integrations/data-in/semantic-events/a-b-test/)
        *   [Customer.io events](/integrations/data-in/semantic-events/cio-journeys/)
        *   [Ecommerce Events](/integrations/data-in/semantic-events/ecommerce/)
        *   [Email events](/integrations/data-in/semantic-events/email/)
        *   [Live chat events](/integrations/data-in/semantic-events/live-chat/)
        *   [Mobile App Lifecycle Events](/integrations/data-in/semantic-events/mobile-app/)
        *   [Video playback events](/integrations/data-in/semantic-events/video/)
    *   [Backfill historical data](/integrations/data-in/importing-old-data/)
    *   [Proxying requests to Customer.io](/integrations/data-in/proxying-requests/)
    *    Connections
        *   [Customer.io API](/integrations/data-in/connections/http-api/)
        *   [Journeys Message Metrics](/integrations/data-in/connections/cio-journeys/)
        *   [Mobile App Sources](/integrations/data-in/connections/mobile/)
        *    Forms
            *   [Get started](/integrations/data-in/connections/forms/connected-forms/)
            *   [Formstack](/integrations/data-in/connections/forms/formstack/)
            *   [Jotform](/integrations/data-in/connections/forms/jotform/)
            *   [Squarespace](/integrations/data-in/connections/forms/squarespace/)
            *   [Typeform](/integrations/data-in/connections/forms/typeform/)
            *   [Unbounce](/integrations/data-in/connections/forms/unbounce/)
            *   [Webflow](/integrations/data-in/connections/forms/webflow/)
            *   [Wordpress with WPForms](/integrations/data-in/connections/forms/wordpress-with-wpforms/)
            *   [Custom JS integrations](/integrations/data-in/connections/forms/javascript-form-integrations/)
            *   [Facebook Lead Ads](/integrations/data-in/connections/forms/facebook-lead-ads/)
            *   [Use form data in Customer.io](/integrations/data-in/connections/forms/forms-in-campaigns/)
            *   [Forms API (backend integrations)](/integrations/data-in/connections/forms/forms-api/)
            *   [Edit or disconnect forms](/integrations/data-in/connections/forms/edit-disconnect/)
        *    JavaScript
            *   [Getting Started](/integrations/data-in/connections/javascript/js-source/)
            *   [JavaScript Frameworks](/integrations/data-in/connections/javascript/frameworks/)
            *   [Method Reference](/integrations/data-in/connections/javascript/method-reference/)
            *   [Migrate from another service](/integrations/data-in/connections/javascript/js-migration/)
            *   [Managing identities](/integrations/data-in/connections/javascript/js-source-identities/)
            *   [Cookies and identity management](/integrations/data-in/connections/javascript/js-source-cookies/)
            *   [Utility Methods and Performance](/integrations/data-in/connections/javascript/utility-methods/)
            *   [In-app messages](/integrations/data-in/connections/javascript/in-app/)
            *   [Notification inbox](/integrations/data-in/connections/javascript/inbox/)
            *   [Content Security Policy (CSP)](/integrations/data-in/connections/javascript/content-security-policy/)
            *   [Proxying the JavaScript client](/integrations/data-in/connections/javascript/js-source-proxy/)
            *    Legacy JavaScript
                *   [Get started](/integrations/data-in/connections/javascript/legacy-js/getting-started/)
                *   [Identify people](/integrations/data-in/connections/javascript/legacy-js/identify/)
                *   [Track and page events](/integrations/data-in/connections/javascript/legacy-js/events/)
                *   [In-app messages](/integrations/data-in/connections/javascript/legacy-js/in-app/)
                *   [Content Security Policy (CSP)](/integrations/data-in/connections/javascript/legacy-js/content-security-policy/)
        *    Track API integrations
            *   [Add a Classic Track API integration](/integrations/data-in/connections/classic-api/journeys-sources/)
            *   [Advanced: transform data](/integrations/data-in/connections/classic-api/cio-journeys-api/)
            *   [Invalid Track API Requests](/integrations/data-in/connections/classic-api/invalid-api-requests/)
        *    HubSpot Beta
            *   [Getting Started](/integrations/data-in/connections/hubspot/getting-started/)
            *   [Map HubSpot data to Customer.io](/integrations/data-in/connections/hubspot/mapping-to-customerio/)
            *   [Filter incoming data](/integrations/data-in/connections/hubspot/filter-incoming-data/)
            *   [Deleting Data](/integrations/data-in/connections/hubspot/delete/)
            *   [HubSpot forms](/integrations/data-in/connections/hubspot/forms/)
        *    Reverse ETL
            *   [About Reverse ETL](/integrations/data-in/connections/reverse-etl/about-reverse-etl/)
            *   [Amazon Redshift](/integrations/data-in/connections/reverse-etl/amazon-redshift/)
            *   [Google BigQuery](/integrations/data-in/connections/reverse-etl/google-bigquery/)
            *   [Microsoft SQL Server](/integrations/data-in/connections/reverse-etl/microsoft-sql/)
            *   [MySQL](/integrations/data-in/connections/reverse-etl/mysql/)
            *   [PostgreSQL](/integrations/data-in/connections/reverse-etl/postgresql/)
            *   [Snowflake](/integrations/data-in/connections/reverse-etl/snowflake/)
            *    Legacy integrations
                *   [Reverse ETL Overview](/integrations/data-in/connections/reverse-etl/database-sync/reverse-etl/)
                *   [Amazon Redshift](/integrations/data-in/connections/reverse-etl/database-sync/redshift-reverse-etl/)
                *   [Google BigQuery](/integrations/data-in/connections/reverse-etl/database-sync/bigquery-reverse-etl/)
                *   [Microsoft SQL server](/integrations/data-in/connections/reverse-etl/database-sync/ms-sql-reverse-etl/)
                *   [MySQL](/integrations/data-in/connections/reverse-etl/database-sync/sql-reverse-etl/)
                *   [PostgreSQL](/integrations/data-in/connections/reverse-etl/database-sync/postgres-reverse-etl/)
                *   [Snowflake](/integrations/data-in/connections/reverse-etl/database-sync/snowflake-reverse-etl/)
        *    Salesforce
            *   [Getting Started](/integrations/data-in/connections/salesforce/getting-started/)
            *   [Map Salesforce data to Customer.io](/integrations/data-in/connections/salesforce/mapping-to-customerio/)
            *   [Map data to other services](/integrations/data-in/connections/salesforce/mapping-data/)
            *   [Scheduled syncs](/integrations/data-in/connections/salesforce/syncs/)
            *   [Deleting Data](/integrations/data-in/connections/salesforce/delete/)
            *   [API Call Calculator](/integrations/data-in/connections/salesforce/api-calls-simulator/)
        *    Servers
            *   [Node.js](/integrations/data-in/connections/servers/node/)
            *   [Python](/integrations/data-in/connections/servers/python/)
            *   [Go](/integrations/data-in/connections/servers/go/)
        *    Customer Data Platforms
            *   [Segment](/integrations/data-in/connections/cdps/segment/)
            *   [Segment data-in (classic)](/integrations/data-in/connections/cdps/segment-destination-classic/)
            *   [Rudderstack](/integrations/data-in/connections/cdps/rudderstack-in/)
            *   [mParticle (Legacy)](/integrations/data-in/connections/cdps/integrating-with-mparticle/)
        *    Webhook-based integrations
            *   [Using Zapier with the Track API](/integrations/data-in/connections/webhooks/zapier-legacy-api/)
            *   [Zoho integration](/integrations/data-in/connections/webhooks/integrating-with-zoho-crm/)
            *   [Hubspot integration](/integrations/data-in/connections/webhooks/integrating-with-hubspot/)
*    Data Out
    *   [Getting Started](/integrations/data-out/getting-started/)
    *   [Add a data-out integration](/integrations/data-out/add-destination/)
    *   [Actions](/integrations/data-out/actions/)
    *   [Action triggers: code mode](/integrations/data-out/action-trigger-syntax/)
    *    Database/Warehouse Integrations
        *   [Introduction](/integrations/data-out/data-warehouses/data-warehouse-intro/)
        *   [Standard integrations](/integrations/data-out/data-warehouses/data-warehouses-intro/)
        *   [Advanced Integrations](/integrations/data-out/data-warehouses/data-warehouses-cdp/)
    *   [Filtering and mapping actions](/integrations/data-out/action-mapping/)
    *   [Resend past data](/integrations/data-out/data-replay/)
    *    Connections
        *   [Actable Predictive](/integrations/data-out/connections/actable-predictive/)
        *   [Adobe Target](/integrations/data-out/connections/adobe-target/)
        *   [Algolia Insights](/integrations/data-out/connections/algolia-insights/)
        *   [Amazon Redshift](/integrations/data-out/connections/amazon-redshift-data-out/)
        *   [Amazon Redshift (Advanced)](/integrations/data-out/connections/amazon-redshift/)
        *   [Amazon S3](/integrations/data-out/connections/amazon-s3-data-out/)
        *   [Amazon S3 (Advanced)](/integrations/data-out/connections/amazon-simple-storage-service/)
        *   [Amplitude](/integrations/data-out/connections/amplitude/)
        *   [Amplitude (Message Metrics)](/integrations/data-out/connections/amplitude-metrics/)
        *   [Attio](/integrations/data-out/connections/attio/)
        *   [Azure blob storage](/integrations/data-out/connections/ms-azure-data-out/)
        *   [Bing Ads](/integrations/data-out/connections/bing-ads/)
        *   [Braze](/integrations/data-out/connections/braze/)
        *   [Braze Cohorts](/integrations/data-out/connections/braze-cohorts/)
        *   [Clevertap](/integrations/data-out/connections/clevertap/)
        *   [Close](/integrations/data-out/connections/close/)
        *   [CommandBar](/integrations/data-out/connections/commandbar/)
        *   [Cordial](/integrations/data-out/connections/cordial/)
        *   [Criteo Audiences](/integrations/data-out/connections/criteo-audiences/)
        *   [Customer.io](/integrations/data-out/connections/customerio/)
        *   [Facebook Conversions API](/integrations/data-out/connections/facebook-conversions-api/)
        *   [Friendbuy](/integrations/data-out/connections/friendbuy/)
        *   [FullStory](/integrations/data-out/connections/fullstory/)
        *   [Gainsight PX](/integrations/data-out/connections/gainsight-px-cloud-action/)
        *   [Google Ad Conversions](/integrations/data-out/connections/google-enhanced-conversions/)
        *   [Google Ads (Gtag)](/integrations/data-out/connections/google-ads/)
        *   [Google Analytics](/integrations/data-out/connections/google-analytics-4/)
        *   [Google BigQuery](/integrations/data-out/connections/google-bigquery-data-out/)
        *   [Google BigQuery (Advanced)](/integrations/data-out/connections/google-bigquery/)
        *   [Google Cloud Storage](/integrations/data-out/connections/gcs-data-out/)
        *   [Google Cloud Storage (Advanced)](/integrations/data-out/connections/google-cloud-storage/)
        *   [Google Sheets](/integrations/data-out/connections/google-sheets-non-etl/)
        *   [Google Tag Manager (GTM)](/integrations/data-out/connections/google-tag-manager/)
        *   [Heap](/integrations/data-out/connections/heap/)
        *   [HubSpot](/integrations/data-out/connections/hubspot/)
        *   [Intercom](/integrations/data-out/connections/intercom/)
        *   [Koala](/integrations/data-out/connections/koala/)
        *   [LaunchDarkly](/integrations/data-out/connections/launchdarkly/)
        *   [LiveLike](/integrations/data-out/connections/livelike-cloud/)
        *   [LogRocket](/integrations/data-out/connections/logrocket/)
        *   [Meta (Facebook) Pixel](/integrations/data-out/connections/meta-pixel/)
        *   [Metronome](/integrations/data-out/connections/metronome/)
        *   [Mixpanel](/integrations/data-out/connections/mixpanel/)
        *   [Mixpanel (Message Metrics)](/integrations/data-out/connections/mixpanel-legacy/)
        *   [MoEngage](/integrations/data-out/connections/moengage/)
        *   [MS Azure Blob Storage (Advanced)](/integrations/data-out/connections/azure-blob-storage/)
        *   [Pinterest Conversions](/integrations/data-out/connections/pinterest-conversions/)
        *   [Pipedrive](/integrations/data-out/connections/pipedrive/)
        *   [PlayerZero](/integrations/data-out/connections/playerzero/)
        *   [Qualtrics](/integrations/data-out/connections/qualtrics/)
        *   [Reporting Webhooks](/integrations/data-out/connections/webhooks/)
        *   [Ripe](/integrations/data-out/connections/ripe/)
        *   [Rudderstack (legacy)](/integrations/data-out/connections/rudderstack-legacy/)
        *    Salesforce
            *   [About this integration](/integrations/data-out/connections/salesforce/salesforce-intro/)
            *   [Sent messages as tasks](/integrations/data-out/connections/salesforce/tasks-in-sf/)
            *   [Frequently Asked Questions](/integrations/data-out/connections/salesforce/salesforce-faq/)
        *   [SalesWings](/integrations/data-out/connections/saleswings/)
        *   [Segment](/integrations/data-out/connections/segment/)
        *   [Segment (Message Metrics)](/integrations/data-out/connections/segment-legacy/)
        *   [SendGrid Marketing Campaigns](/integrations/data-out/connections/sendgrid/)
        *   [Slack](/integrations/data-out/connections/slack/)
        *   [Snowflake](/integrations/data-out/connections/snowflake-data-out/)
        *   [Snowflake (Advanced)](/integrations/data-out/connections/snowflake/)
        *   [Sprig](/integrations/data-out/connections/sprig/)
        *   [Talon.One](/integrations/data-out/connections/talon-one/)
        *   [TikTok Conversions](/integrations/data-out/connections/tiktok-conversions/)
        *   [Twilio](/integrations/data-out/connections/twilio/)
        *   [Twilio Engage Messaging](/integrations/data-out/connections/engage-messaging-twilio/)
        *   [Twilio Studio](/integrations/data-out/connections/twilio-studio/)
        *   [Twitter Pixel](/integrations/data-out/connections/twitter-pixel/)
        *   [Visual Website Optimizer (VWO)](/integrations/data-out/connections/vwo/)
        *   [Webhooks](/integrations/data-out/connections/webhook/)
        *   [Wisepops](/integrations/data-out/connections/wisepops/)
        *   [Yandex](/integrations/data-out/connections/yandex-data-out/)
        *   [Zendesk](/integrations/data-out/connections/zendesk/)
*    API Reference
    *   [About our APIs](/integrations/api/customerio-apis)
    *   [Comparing the Pipelines and Track APIs](/integrations/api/track-vs-cdp-api)
    *   [Pipelines API](/integrations/api/cdp)
    *   [Track API](/integrations/api/track)
    *   [App API](/integrations/api/app)
    *   [Design Studio: HTML best practices](/integrations/api/integrate-with-ds)
    *   [Journeys Webhooks](/integrations/api/webhooks)
*    Mobile SDKs
    *    iOS
        *   [Quick Start Guide](/integrations/sdk/ios/quick-start-guide/)
        *    Getting Started
            *   [How it works](/integrations/sdk/ios/getting-started/how-it-works/)
            *   [Authentication](/integrations/sdk/ios/getting-started/auth/)
            *   [Packages and Configuration Options](/integrations/sdk/ios/getting-started/packages-options/)
            *   [Swift 6](/integrations/sdk/ios/getting-started/swift-six/)
            *   [Troubleshooting](/integrations/sdk/ios/getting-started/troubleshooting/)
        *    Identify and Track Users
            *   [Identify people](/integrations/sdk/ios/tracking/identify/)
            *   [Track events](/integrations/sdk/ios/tracking/track-events/)
            *   [Screen tracking](/integrations/sdk/ios/tracking/screen-events/)
            *   [Mobile Lifecycle events](/integrations/sdk/ios/tracking/lifecycle-events/)
            *   [Anonymous activity](/integrations/sdk/ios/tracking/anonymous-activity/)
            *   [Location tracking](/integrations/sdk/ios/tracking/location/)
        *    Push Notifications
            *   [Set up push notifications](/integrations/sdk/ios/push/push-setup/)
            *   [Set up rich push](/integrations/sdk/ios/push/rich-push/)
            *   [App Groups for push tracking](/integrations/sdk/ios/push/app-groups/)
            *   [Deep Links](/integrations/sdk/ios/push/deep-links/)
            *   [Push metrics](/integrations/sdk/ios/push/push-metrics/)
            *   [Sound in push notifications](/integrations/sdk/ios/push/sound-in-push/)
            *   [Provisional Push](/integrations/sdk/ios/push/provisional/)
            *   [Push service certificates](/integrations/sdk/ios/push/push-certificates/)
            *   [Test your push implementation](/integrations/sdk/ios/push/test-push/)
        *    In-App Messages
            *   [Set up in-app messaging](/integrations/sdk/ios/in-app/set-up-in-app/)
            *   [Inline in-app messages](/integrations/sdk/ios/in-app/inline-in-app/)
            *   [Page rules](/integrations/sdk/ios/in-app/target-in-app-messages/)
            *   [In-app event listeners](/integrations/sdk/ios/in-app/in-app-event-listeners/)
            *   [Notification inbox](/integrations/sdk/ios/in-app/inbox/)
        *    What's New
            *   [4.x -> 4.4.0](/integrations/sdk/ios/whats-new/4.4.0-upgrade/)
            *   [3.x -> 4.0.0](/integrations/sdk/ios/whats-new/4.0.0-upgrade/)
            *   [3.x -> 3.13.0](/integrations/sdk/ios/whats-new/3.13.0-upgrade/)
            *   [3.x -> 3.9.0](/integrations/sdk/ios/whats-new/3.9.0-upgrade/)
            *   [2.x -> 3.x](/integrations/sdk/ios/whats-new/3.x-upgrade/)
            *   [1x -> 2.x](/integrations/sdk/ios/whats-new/2.x-upgrade/)
            *   [Changelog](/integrations/sdk/ios/whats-new/changelog/)
        *    iOS
            *   [Quick Start Guide](/integrations/sdk/ios/3.x/quick-start-guide/)
            *    Getting Started
                *   [How it works](/integrations/sdk/ios/3.x/getting-started/how-it-works/)
                *   [Authentication](/integrations/sdk/ios/3.x/getting-started/auth/)
                *   [Packages and Configuration Options](/integrations/sdk/ios/3.x/getting-started/packages-options/)
                *   [Troubleshooting](/integrations/sdk/ios/3.x/getting-started/troubleshooting/)
            *    Identify and Track Users
                *   [Identify people](/integrations/sdk/ios/3.x/tracking/identify/)
                *   [Track events](/integrations/sdk/ios/3.x/tracking/track-events/)
                *   [Screen tracking](/integrations/sdk/ios/3.x/tracking/screen-events/)
                *   [Mobile Lifecycle events](/integrations/sdk/ios/3.x/tracking/lifecycle-events/)
                *   [Anonymous activity](/integrations/sdk/ios/3.x/tracking/anonymous-activity/)
            *    Push Notifications
                *   [Set up push notifications](/integrations/sdk/ios/3.x/push/push-setup/)
                *   [Set up rich push](/integrations/sdk/ios/3.x/push/rich-push/)
                *   [Deep Links](/integrations/sdk/ios/3.x/push/deep-links/)
                *   [Push metrics](/integrations/sdk/ios/3.x/push/push-metrics/)
                *   [Sound in push notifications](/integrations/sdk/ios/3.x/push/sound-in-push/)
                *   [Provisional Push](/integrations/sdk/ios/3.x/push/provisional/)
                *   [Push service certificates](/integrations/sdk/ios/3.x/push/push-certificates/)
                *   [Test your push implementation](/integrations/sdk/ios/3.x/push/test-push/)
            *    In-App Messages
                *   [Set up in-app messaging](/integrations/sdk/ios/3.x/in-app/set-up-in-app/)
                *   [Inline in-app messages](/integrations/sdk/ios/3.x/in-app/inline-in-app/)
                *   [Page rules](/integrations/sdk/ios/3.x/in-app/target-in-app-messages/)
                *   [In-app event listeners](/integrations/sdk/ios/3.x/in-app/in-app-event-listeners/)
            *    What's New
                *   [3.x -> 3.13.0](/integrations/sdk/ios/3.x/whats-new/3.13.0-upgrade/)
                *   [3.x -> 3.9.0](/integrations/sdk/ios/3.x/whats-new/3.9.0-upgrade/)
                *   [2.x -> 3.x](/integrations/sdk/ios/3.x/whats-new/3.x-upgrade/)
                *   [1x -> 2.x](/integrations/sdk/ios/3.x/whats-new/2.x-upgrade/)
                *   [Changelog](/integrations/sdk/ios/3.x/whats-new/changelog/)
        *    iOS
            *   [Get Started](/integrations/sdk/ios/1.x/getting-started/)
            *   [Identify people](/integrations/sdk/ios/1.x/identify/)
            *   [Track events](/integrations/sdk/ios/1.x/track-events/)
            *   [Push notifications](/integrations/sdk/ios/1.x/push/)
            *   [Rich push notifications](/integrations/sdk/ios/1.x/rich-push/)
            *   [In-app messages](/integrations/sdk/ios/1.x/in-app/)
            *   [Test support](/integrations/sdk/ios/1.x/test-support/)
            *   [Changelog](/integrations/sdk/ios/1.x/changelog/)
        *    iOS
            *   [Get Started](/integrations/sdk/ios/2.x/getting-started/)
            *   [Identify people](/integrations/sdk/ios/2.x/identify/)
            *   [Track events](/integrations/sdk/ios/2.x/track-events/)
            *   [Push notifications](/integrations/sdk/ios/2.x/push/)
            *   [In-app messages](/integrations/sdk/ios/2.x/in-app/)
            *   [Test support](/integrations/sdk/ios/2.x/test-support/)
            *   [Update from 2.10 to 2.11](/integrations/sdk/ios/2.x/update-210-to-211/)
            *   [Migrate from an earlier version](/integrations/sdk/ios/2.x/migrate-upgrade/)
            *   [Troubleshooting](/integrations/sdk/ios/2.x/troubleshooting/)
            *   [Changelog](/integrations/sdk/ios/2.x/changelog/)
    *    Android
        *   [Quick Start Guide](/integrations/sdk/android/quick-start-guide/)
        *    Getting Started
            *   [How it works](/integrations/sdk/android/getting-started/how-it-works/)
            *   [Authentication](/integrations/sdk/android/getting-started/auth/)
            *   [Packages and Configuration Options](/integrations/sdk/android/getting-started/packages-options/)
            *   [Troubleshooting](/integrations/sdk/android/getting-started/troubleshooting/)
        *    Identify and Track Users
            *   [Identify people](/integrations/sdk/android/tracking/identify/)
            *   [Screen tracking](/integrations/sdk/android/tracking/screen-events/)
            *   [Mobile Lifecycle events](/integrations/sdk/android/tracking/lifecycle-events/)
            *   [Anonymous activity](/integrations/sdk/android/tracking/anonymous-activity/)
            *   [Track events](/integrations/sdk/android/tracking/track-events/)
            *   [Location tracking](/integrations/sdk/android/tracking/location/)
        *    Push Notifications
            *   [Push notifications](/integrations/sdk/android/push/push/)
            *   [Deep Links](/integrations/sdk/android/push/deep-links/)
            *   [Channel](/integrations/sdk/android/push/push-notification-channel/)
            *   [Push service certificates](/integrations/sdk/android/push/push-certificates/)
            *   [Test your push implementation](/integrations/sdk/android/push/test-push/)
        *    In-App Messages
            *   [In-app messages](/integrations/sdk/android/in-app/in-app/)
            *   [In-app event listeners](/integrations/sdk/android/in-app/in-app-event-listeners/)
            *   [Inline in-app messages](/integrations/sdk/android/in-app/inline-in-app/)
            *   [Page rules](/integrations/sdk/android/in-app/target-in-app-messages/)
            *   [Notification inbox](/integrations/sdk/android/in-app/inbox/)
        *    What's New
            *   [4.x -> 4.10](/integrations/sdk/android/whats-new/4.10-upgrade/)
            *   [3.x -> 4.x](/integrations/sdk/android/whats-new/4.x-upgrade/)
            *   [2.x -> 3.x](/integrations/sdk/android/whats-new/3.x-upgrade/)
            *   [Changelog](/integrations/sdk/android/whats-new/changelog/)
        *    Android
            *   [Get Started](/integrations/sdk/android/3.x/getting-started/)
            *   [Identify people](/integrations/sdk/android/3.x/identify/)
            *   [Track events](/integrations/sdk/android/3.x/track-events/)
            *   [Push notifications](/integrations/sdk/android/3.x/push/)
            *   [In-app messages](/integrations/sdk/android/3.x/in-app/)
            *   [Test support](/integrations/sdk/android/3.x/test-support/)
            *   [Migrate from an earlier version](/integrations/sdk/android/3.x/migrate-upgrade/)
            *   [Troubleshooting](/integrations/sdk/android/3.x/troubleshooting/)
            *   [Changelog](/integrations/sdk/android/3.x/changelog/)
        *    Android
            *   [Get Started](/integrations/sdk/android/2.x/getting-started/)
            *   [Identify people](/integrations/sdk/android/2.x/identify/)
            *   [Track events](/integrations/sdk/android/2.x/track-events/)
            *   [Push notifications](/integrations/sdk/android/2.x/push/)
            *   [Rich push notifications](/integrations/sdk/android/2.x/rich-push/)
            *   [Test support](/integrations/sdk/android/2.x/test-support/)
            *   [Migrate from an earlier version](/integrations/sdk/android/2.x/migrate-upgrade/)
            *   [Changelog](/integrations/sdk/android/2.x/changelog/)
    *    React Native
        *   [Quick Start Guide](/integrations/sdk/react-native/quick-start-guide/)
        *    Getting Started
            *   [How it works](/integrations/sdk/react-native/getting-started/how-it-works/)
            *   [Authentication](/integrations/sdk/react-native/getting-started/auth/)
            *   [Packages and Configuration Options](/integrations/sdk/react-native/getting-started/packages-options/)
            *   [Troubleshooting](/integrations/sdk/react-native/getting-started/troubleshooting/)
        *    Identify and Track Users
            *   [Identify people](/integrations/sdk/react-native/tracking/identify/)
            *   [Track events](/integrations/sdk/react-native/tracking/track-events/)
            *   [Screen tracking](/integrations/sdk/react-native/tracking/screen-events/)
            *   [Mobile Lifecycle events](/integrations/sdk/react-native/tracking/lifecycle-events/)
            *   [Anonymous activity](/integrations/sdk/react-native/tracking/anonymous-activity/)
            *   [Location tracking](/integrations/sdk/react-native/tracking/location/)
        *    Push notifications
            *   [Set up push notifications](/integrations/sdk/react-native/push-notifications/push/)
            *   [App Groups for push tracking](/integrations/sdk/react-native/push-notifications/app-groups/)
            *   [Deep Links](/integrations/sdk/react-native/push-notifications/deep-links/)
            *   [Handling Multiple Push Providers](/integrations/sdk/react-native/push-notifications/multiple-push-providers/)
            *   [Capture Push Metrics](/integrations/sdk/react-native/push-notifications/push-metrics/)
            *   [Android channels](/integrations/sdk/react-native/push-notifications/push-notification-channel/)
        *    In-App Messages
            *   [Set up in-app messages](/integrations/sdk/react-native/in-app-messages/set-up-in-app/)
            *   [Inline in-app messages](/integrations/sdk/react-native/in-app-messages/inline-in-app/)
            *   [In-app event listeners](/integrations/sdk/react-native/in-app-messages/in-app-actions/)
            *   [Notification inbox](/integrations/sdk/react-native/in-app-messages/inbox/)
        *    What's new
            *   [6.x -> 6.4.0](/integrations/sdk/react-native/whats-new/6.4.0-upgrade/)
            *   [5.x -> 6.0.0](/integrations/sdk/react-native/whats-new/6.x-upgrade/)
            *   [4.x -> 5.0.0](/integrations/sdk/react-native/whats-new/5.x-upgrade/)
            *   [4.x -> 4.3](/integrations/sdk/react-native/whats-new/4.3-upgrade/)
            *   [3.4x -> 4.x](/integrations/sdk/react-native/whats-new/4.x-upgrade/)
            *   [3.x -> 3.4](/integrations/sdk/react-native/whats-new/update-to-3.4/)
            *   [2.x -> 3.x](/integrations/sdk/react-native/whats-new/update-to-3x/)
            *   [Changelog](/integrations/sdk/react-native/whats-new/changelog/)
        *    React Native
            *   [Quick Start Guide](/integrations/sdk/react-native/4.x/quick-start-guide/)
            *    Getting Started
                *   [How it works](/integrations/sdk/react-native/4.x/getting-started/how-it-works/)
                *   [Authentication](/integrations/sdk/react-native/4.x/getting-started/auth/)
                *   [Packages and Configuration Options](/integrations/sdk/react-native/4.x/getting-started/packages-options/)
                *   [Troubleshooting](/integrations/sdk/react-native/4.x/getting-started/troubleshooting/)
            *    Identify and Track Users
                *   [Identify people](/integrations/sdk/react-native/4.x/tracking/identify/)
                *   [Track events](/integrations/sdk/react-native/4.x/tracking/track-events/)
                *   [Screen tracking](/integrations/sdk/react-native/4.x/tracking/screen-events/)
                *   [Mobile Lifecycle events](/integrations/sdk/react-native/4.x/tracking/lifecycle-events/)
                *   [Anonymous activity](/integrations/sdk/react-native/4.x/tracking/anonymous-activity/)
            *    Push notifications
                *   [Set up push notifications](/integrations/sdk/react-native/4.x/push-notifications/push/)
                *   [Deep Links](/integrations/sdk/react-native/4.x/push-notifications/deep-links/)
                *   [Handling Multiple Push Providers](/integrations/sdk/react-native/4.x/push-notifications/multiple-push-providers/)
                *   [Capture Push Metrics](/integrations/sdk/react-native/4.x/push-notifications/push-metrics/)
                *   [Android channels](/integrations/sdk/react-native/4.x/push-notifications/push-notification-channel/)
            *    In-App Messages
                *   [Set up in-app messages](/integrations/sdk/react-native/4.x/in-app-messages/set-up-in-app/)
                *   [Inline in-app messages](/integrations/sdk/react-native/4.x/in-app-messages/inline-in-app/)
                *   [In-app event listeners](/integrations/sdk/react-native/4.x/in-app-messages/in-app-actions/)
            *    What's new
                *   [4.x -> 4.3](/integrations/sdk/react-native/4.x/whats-new/4.3-upgrade/)
                *   [3.4x -> 4.x](/integrations/sdk/react-native/4.x/whats-new/4.x-upgrade/)
                *   [3.x -> 3.4](/integrations/sdk/react-native/4.x/whats-new/update-to-3.4/)
                *   [2.x -> 3.x](/integrations/sdk/react-native/4.x/whats-new/update-to-3x/)
                *   [Changelog](/integrations/sdk/react-native/4.x/whats-new/changelog/)
        *    React Native
            *   [Quick Start Guide](/integrations/sdk/react-native/5.x/quick-start-guide/)
            *    Getting Started
                *   [How it works](/integrations/sdk/react-native/5.x/getting-started/how-it-works/)
                *   [Authentication](/integrations/sdk/react-native/5.x/getting-started/auth/)
                *   [Packages and Configuration Options](/integrations/sdk/react-native/5.x/getting-started/packages-options/)
                *   [Troubleshooting](/integrations/sdk/react-native/5.x/getting-started/troubleshooting/)
            *    Identify and Track Users
                *   [Identify people](/integrations/sdk/react-native/5.x/tracking/identify/)
                *   [Track events](/integrations/sdk/react-native/5.x/tracking/track-events/)
                *   [Screen tracking](/integrations/sdk/react-native/5.x/tracking/screen-events/)
                *   [Mobile Lifecycle events](/integrations/sdk/react-native/5.x/tracking/lifecycle-events/)
                *   [Anonymous activity](/integrations/sdk/react-native/5.x/tracking/anonymous-activity/)
            *    Push notifications
                *   [Set up push notifications](/integrations/sdk/react-native/5.x/push-notifications/push/)
                *   [Deep Links](/integrations/sdk/react-native/5.x/push-notifications/deep-links/)
                *   [Handling Multiple Push Providers](/integrations/sdk/react-native/5.x/push-notifications/multiple-push-providers/)
                *   [Capture Push Metrics](/integrations/sdk/react-native/5.x/push-notifications/push-metrics/)
                *   [Android channels](/integrations/sdk/react-native/5.x/push-notifications/push-notification-channel/)
            *    In-App Messages
                *   [Set up in-app messages](/integrations/sdk/react-native/5.x/in-app-messages/set-up-in-app/)
                *   [Inline in-app messages](/integrations/sdk/react-native/5.x/in-app-messages/inline-in-app/)
                *   [In-app event listeners](/integrations/sdk/react-native/5.x/in-app-messages/in-app-actions/)
            *    What's new
                *   [4.x -> 5.0.0](/integrations/sdk/react-native/5.x/whats-new/5.x-upgrade/)
                *   [4.x -> 4.3](/integrations/sdk/react-native/5.x/whats-new/4.3-upgrade/)
                *   [3.4x -> 4.x](/integrations/sdk/react-native/5.x/whats-new/4.x-upgrade/)
                *   [3.x -> 3.4](/integrations/sdk/react-native/5.x/whats-new/update-to-3.4/)
                *   [2.x -> 3.x](/integrations/sdk/react-native/5.x/whats-new/update-to-3x/)
                *   [Changelog](/integrations/sdk/react-native/5.x/whats-new/changelog/)
        *    React Native
            *   [Get Started](/integrations/sdk/react-native/2.x/getting-started/)
            *   [Identify people](/integrations/sdk/react-native/2.x/identify/)
            *   [Track events](/integrations/sdk/react-native/2.x/track-events/)
            *    Push notifications
                *   [Set up push notifications](/integrations/sdk/react-native/2.x/push-notifications/push/)
                *   [Deep Links](/integrations/sdk/react-native/2.x/push-notifications/deep-links/)
                *   [Handling Multiple Push Providers](/integrations/sdk/react-native/2.x/push-notifications/multiple-push-providers/)
                *   [Capture Push Metrics](/integrations/sdk/react-native/2.x/push-notifications/push-metrics/)
            *    In-App Messages
                *   [Set up in-app messages](/integrations/sdk/react-native/2.x/in-app-messages/set-up-in-app/)
                *   [In-app event listeners](/integrations/sdk/react-native/2.x/in-app-messages/in-app-actions/)
            *    Updates and Troubleshooting
                *   [Migrate from an earlier version](/integrations/sdk/react-native/2.x/updates-and-troubleshooting/migrate-upgrade/)
                *   [Troubleshooting](/integrations/sdk/react-native/2.x/updates-and-troubleshooting/troubleshooting/)
                *   [Changelog](/integrations/sdk/react-native/2.x/updates-and-troubleshooting/changelog/)
        *    React Native
            *   [Get Started](/integrations/sdk/react-native/3.x/getting-started/)
            *   [Identify people](/integrations/sdk/react-native/3.x/identify/)
            *   [Track events](/integrations/sdk/react-native/3.x/track-events/)
            *    Push notifications
                *   [Set up push notifications](/integrations/sdk/react-native/3.x/push-notifications/push/)
                *   [Deep Links](/integrations/sdk/react-native/3.x/push-notifications/deep-links/)
                *   [Handling Multiple Push Providers](/integrations/sdk/react-native/3.x/push-notifications/multiple-push-providers/)
                *   [Capture Push Metrics](/integrations/sdk/react-native/3.x/push-notifications/push-metrics/)
            *    In-App Messages
                *   [Set up in-app messages](/integrations/sdk/react-native/3.x/in-app-messages/set-up-in-app/)
                *   [In-app event listeners](/integrations/sdk/react-native/3.x/in-app-messages/in-app-actions/)
            *    Updates and Troubleshooting
                *   [Migrate from an earlier version](/integrations/sdk/react-native/3.x/updates-and-troubleshooting/migrate-upgrade/)
                *   [Update to version 3.4](/integrations/sdk/react-native/3.x/updates-and-troubleshooting/update-to-3.4/)
                *   [Troubleshooting](/integrations/sdk/react-native/3.x/updates-and-troubleshooting/troubleshooting/)
                *   [Changelog](/integrations/sdk/react-native/3.x/updates-and-troubleshooting/changelog/)
    *    Expo
        *   [Quick Start Guide](/integrations/sdk/expo/quick-start-guide/)
        *    Getting Started
            *   [How it works](/integrations/sdk/expo/getting-started/how-it-works/)
            *   [Authentication](/integrations/sdk/expo/getting-started/auth/)
            *   [Packages and Configuration Options](/integrations/sdk/expo/getting-started/packages-options/)
            *   [Troubleshooting](/integrations/sdk/expo/getting-started/troubleshooting/)
        *    Identify and track people
            *   [Identify people](/integrations/sdk/expo/tracking/identify/)
            *   [Track events](/integrations/sdk/expo/tracking/track-events/)
            *   [Screen tracking](/integrations/sdk/expo/tracking/screen-events/)
            *   [Mobile Lifecycle events](/integrations/sdk/expo/tracking/lifecycle-events/)
            *   [Anonymous activity](/integrations/sdk/expo/tracking/anonymous-activity/)
            *   [Location tracking](/integrations/sdk/expo/tracking/location/)
        *    Push notifications
            *   [Set up push notifications](/integrations/sdk/expo/push-notifications/push/)
            *   [App Groups for push tracking](/integrations/sdk/expo/push-notifications/app-groups/)
            *   [Deep Links](/integrations/sdk/expo/push-notifications/deep-links/)
            *   [Capture Push Metrics](/integrations/sdk/expo/push-notifications/push-metrics/)
            *   [Android channels](/integrations/sdk/expo/push-notifications/push-notification-channel/)
            *   [Multiple push providers](/integrations/sdk/expo/push-notifications/multiple-push-providers/)
        *    In-App Messages
            *   [Inline in-app messages](/integrations/sdk/expo/in-app-messages/inline-in-app/)
            *   [Notification inbox](/integrations/sdk/expo/in-app-messages/inbox/)
            *   [Set up in-app messages](/integrations/sdk/expo/in-app-messages/in-app/)
            *   [In-app event listeners](/integrations/sdk/expo/in-app-messages/handling-and-dismissing-actions/)
        *    What's new
            *   [3.x -> 3.3](/integrations/sdk/expo/whats-new/3.3-upgrade/)
            *   [2.x -> 3.x](/integrations/sdk/expo/whats-new/3.x-upgrade/)
            *   [1x -> 2.x](/integrations/sdk/expo/whats-new/2.x-upgrade/)
            *   [Changelog](/integrations/sdk/expo/whats-new/changelog/)
        *    Expo
            *   [Get Started](/integrations/sdk/expo/1.x/getting-started/)
            *   [Identify people](/integrations/sdk/expo/1.x/identify/)
            *   [Track events](/integrations/sdk/expo/1.x/track-events/)
            *    Push notifications
                *   [Set up push notifications](/integrations/sdk/expo/1.x/push-notifications/push/)
                *   [Deep Links](/integrations/sdk/expo/1.x/push-notifications/deep-links/)
                *   [Capture Push Metrics](/integrations/sdk/expo/1.x/push-notifications/push-metrics/)
            *    In-App Messages
                *   [Set up in-app messages](/integrations/sdk/expo/1.x/in-app/in-app/)
                *   [In-app event listeners](/integrations/sdk/expo/1.x/in-app/handling-and-dismissing-actions/)
            *    Updates and Troubleshooting
                *   [Troubleshooting](/integrations/sdk/expo/1.x/updates-and-troubleshooting/troubleshooting/)
                *   [Changelog](/integrations/sdk/expo/1.x/updates-and-troubleshooting/changelog/)
    *    Flutter
        *   [Quick Start Guide](/integrations/sdk/flutter/quick-start-guide/)
        *    Get Started
            *   [How it works](/integrations/sdk/flutter/getting-started/how-it-works/)
            *   [Authentication](/integrations/sdk/flutter/getting-started/auth/)
            *   [Configuration Options](/integrations/sdk/flutter/getting-started/packages-options/)
            *   [Troubleshooting](/integrations/sdk/flutter/getting-started/troubleshooting/)
        *    Identify & track users
            *   [Identify people](/integrations/sdk/flutter/tracking/identify/)
            *   [Mobile Lifecycle events](/integrations/sdk/flutter/tracking/lifecycle-events/)
            *   [Anonymous activity](/integrations/sdk/flutter/tracking/anonymous-activity/)
            *   [Screen tracking](/integrations/sdk/flutter/tracking/screen-events/)
            *   [Track events](/integrations/sdk/flutter/tracking/track-events/)
            *   [Location tracking](/integrations/sdk/flutter/tracking/location/)
        *    Push notifications
            *   [Set up push notifications](/integrations/sdk/flutter/push-notifications/push-setup/)
            *   [App Groups for push tracking](/integrations/sdk/flutter/push-notifications/app-groups/)
            *   [Deep links](/integrations/sdk/flutter/push-notifications/deep-links/)
            *   [Handling multiple push providers](/integrations/sdk/flutter/push-notifications/multiple-push-providers/)
            *   [Capture push metrics](/integrations/sdk/flutter/push-notifications/push-metrics/)
            *   [Android channels](/integrations/sdk/flutter/push-notifications/push-notification-channel/)
        *    In-App Messages
            *   [In-app messages](/integrations/sdk/flutter/in-app-messages/in-app/)
            *   [Inline in-app messages](/integrations/sdk/flutter/in-app-messages/inline-in-app/)
            *   [Notification inbox](/integrations/sdk/flutter/in-app-messages/inbox/)
            *   [In-app event listeners](/integrations/sdk/flutter/in-app-messages/in-app-actions/)
        *    What's new
            *   [3.x -> 4.0.0](/integrations/sdk/flutter/whats-new/4.0.0-upgrade/)
            *   [3.x -> 3.5.0](/integrations/sdk/flutter/whats-new/3.5.0-upgrade/)
            *   [2.x -> 3.0.0](/integrations/sdk/flutter/whats-new/3.x-upgrade/)
            *   [2.x -> 2.2](/integrations/sdk/flutter/whats-new/2.2-upgrade/)
            *   [Upgrade to Flutter 2.x](/integrations/sdk/flutter/whats-new/2.x-upgrade/)
            *   [Changelog](/integrations/sdk/flutter/whats-new/changelog/)
        *    Flutter
            *   [Quick Start Guide](/integrations/sdk/flutter/2.x/quick-start-guide/)
            *    Get Started
                *   [How it works](/integrations/sdk/flutter/2.x/getting-started/how-it-works/)
                *   [Authentication](/integrations/sdk/flutter/2.x/getting-started/auth/)
                *   [Configuration Options](/integrations/sdk/flutter/2.x/getting-started/packages-options/)
                *   [Troubleshooting](/integrations/sdk/flutter/2.x/getting-started/troubleshooting/)
            *    Identify & track users
                *   [Identify people](/integrations/sdk/flutter/2.x/tracking/identify/)
                *   [Mobile Lifecycle events](/integrations/sdk/flutter/2.x/tracking/lifecycle-events/)
                *   [Anonymous activity](/integrations/sdk/flutter/2.x/tracking/anonymous-activity/)
                *   [Screen tracking](/integrations/sdk/flutter/2.x/tracking/screen-events/)
                *   [Track events](/integrations/sdk/flutter/2.x/tracking/track-events/)
            *    Push notifications
                *   [Set up push notifications](/integrations/sdk/flutter/2.x/push-notifications/push-setup/)
                *   [Deep links](/integrations/sdk/flutter/2.x/push-notifications/deep-links/)
                *   [Handling multiple push providers](/integrations/sdk/flutter/2.x/push-notifications/multiple-push-providers/)
                *   [Capture push metrics](/integrations/sdk/flutter/2.x/push-notifications/push-metrics/)
                *   [Android channels](/integrations/sdk/flutter/2.x/push-notifications/push-notification-channel/)
            *    In-App Messages
                *   [In-app messages](/integrations/sdk/flutter/2.x/in-app-messages/in-app/)
                *   [Inline in-app messages](/integrations/sdk/flutter/2.x/in-app-messages/inline-in-app/)
                *   [In-app event listeners](/integrations/sdk/flutter/2.x/in-app-messages/in-app-actions/)
            *    What's new
                *   [2.x -> 2.2](/integrations/sdk/flutter/2.x/whats-new/2.2-upgrade/)
                *   [Upgrade to Flutter 2.x](/integrations/sdk/flutter/2.x/whats-new/2.x-upgrade/)
                *   [Changelog](/integrations/sdk/flutter/2.x/whats-new/changelog/)
        *    Flutter
            *   [Get Started](/integrations/sdk/flutter/1.x/getting-started/)
            *   [Identify people](/integrations/sdk/flutter/1.x/identify/)
            *   [Track events](/integrations/sdk/flutter/1.x/track-events/)
            *   [Update Flutter SDK](/integrations/sdk/flutter/1.x/update/)
            *    Push notifications
                *   [Set up push notifications](/integrations/sdk/flutter/1.x/push-notifications/push/)
                *   [Deep Links](/integrations/sdk/flutter/1.x/push-notifications/deep-links/)
                *   [Handling Multiple Push Providers](/integrations/sdk/flutter/1.x/push-notifications/multiple-push-providers/)
                *   [Capture Push Metrics](/integrations/sdk/flutter/1.x/push-notifications/push-metrics/)
            *    In-App Messages
                *   [In-app messages](/integrations/sdk/flutter/1.x/in-app-messages/in-app/)
                *   [In-app event listeners](/integrations/sdk/flutter/1.x/in-app-messages/in-app-actions/)
            *    Updates and Troubleshooting
                *   [Update iOS](/integrations/sdk/flutter/1.x/updates-and-troubleshooting/migrate-upgrade/)
                *   [Troubleshooting](/integrations/sdk/flutter/1.x/updates-and-troubleshooting/troubleshooting/)
                *   [Changelog](/integrations/sdk/flutter/1.x/updates-and-troubleshooting/changelog/)

Account & Workspaces

*   [Account Verification](/accounts-and-workspaces/account-verification/)
*   [Audit logs](/accounts-and-workspaces/audit-logs/)
*   [Tasks: Workspace performance](/accounts-and-workspaces/workspace-tasks/)
*    Billing
    *   [How We Bill](/accounts-and-workspaces/how-we-bill/)
    *   [Billing for SMS messages](/accounts-and-workspaces/sms-billing/)
    *   [Billing for WhatsApp messages](/accounts-and-workspaces/whatsapp-billing/)
    *   [AI credits](/accounts-and-workspaces/ai-credits/)
    *   [Reducing billing overages](/accounts-and-workspaces/reduce-billing-overages/)
    *   [Payment Problems](/accounts-and-workspaces/payment-problems/)
    *   [Canceling Your Account](/accounts-and-workspaces/canceling/)
    *   [Plan Features](/accounts-and-workspaces/plan-features/)
    *   [Builder plan](/accounts-and-workspaces/builder-plan/)
*    Your Account
    *    Manage team members
        *   [How to add team members](/accounts-and-workspaces/intro-account-access/)
        *   [Assign standard roles](/accounts-and-workspaces/assign-standard-roles/)
        *   [Create & assign custom roles](/accounts-and-workspaces/create-roles/)
    *   [Switch between accounts](/accounts-and-workspaces/manage-accounts/)
    *   [Edit Account Information](/accounts-and-workspaces/editing-account-information/)
    *   [Manage your API credentials](/accounts-and-workspaces/managing-credentials/)
    *   [Security Best Practices](/accounts-and-workspaces/security-best-practices/)
    *   [Two-Factor Authentication](/accounts-and-workspaces/two-factor-auth/)
    *   [Single Sign-on (SSO)](/accounts-and-workspaces/login-with-sso/)
    *   [Account Regions (US and EU)](/accounts-and-workspaces/data-centers/)
    *   [Enable experimental features](/accounts-and-workspaces/beta-experimental-features/)
*    Workspaces
    *   [Workspaces in Customer.io](/accounts-and-workspaces/workspaces/)
    *   [Date and Time Data in Customer.io](/accounts-and-workspaces/datetime-displays/)
    *   [Case sensitivity and your data](/accounts-and-workspaces/case-sensitivity/)
    *   [Search your workspace](/accounts-and-workspaces/workspace-search/)
*    Privacy & Security
    *   [Session cookies and expiration](/accounts-and-workspaces/login-session/)
    *   [Allowlist our IP addresses](/accounts-and-workspaces/ip-addresses/)
    *   [Customer.io, GDPR, and you!](/accounts-and-workspaces/gdpr-faq/)
    *   [Security](/accounts-and-workspaces/security/)
    *   [Mobile and App Store Privacy](/accounts-and-workspaces/mobile-privacy/)
    *   [Privacy](/accounts-and-workspaces/privacy/)
    *   [Respecting your users' privacy](/accounts-and-workspaces/user-privacy/)
    *   [Customer.io Security Qualifications](/accounts-and-workspaces/security-certifications/)
*    Troubleshooting
    *   [Troubleshooting login and browser issues](/accounts-and-workspaces/login-trouble/)
    *   [Create a HAR file for help troubleshooting](/accounts-and-workspaces/create-a-har-file-for-help-troubleshooting/)

AI

*   [Use Customer.io with AI](/ai/cio-with-llms/)
*    Your Customer.io agent Beta
    *   [Ask the agent](/ai/agent/get-started/)
    *   [How the agent works](/ai/agent/how-it-works/)
    *   [Routines](/ai/agent/routines/)
    *   [Segment builder](/ai/agent/ai-segment-builder/)
    *   [Troubleshooting and feedback](/ai/agent/troubleshooting/)
*    Customer.io CLI
    *   [Get started](/ai/cli/get-started/)
    *   [Service accounts](/ai/cli/service-accounts/)
    *   [Command reference](/ai/cli/reference/)
*    Customer.io MCP
    *   [Get Started](/ai/mcp/get-started/)
    *   [ChatGPT setup](/ai/mcp/chatgpt/)
    *   [Claude setup](/ai/mcp/claude/)
    *   [Cursor and other IDEs](/ai/mcp/ide/)
    *   [Update your MCP client](/ai/mcp/mcp-migration/)
*   [Email content analysis](/ai/content-analysis/)
*   [In-app message suggestions](/ai/in-app-suggestions/)
*   [In-app survey analysis](/ai/in-app-survey-analysis/)
*   [Use our docs with AI](/ai/use-docs-with-ai/)

[Release Notes](/release-notes/)

# Liquid syntax list

This page contains a list of the liquid tags, keys, and filters available to you in Customer.io. If you’re new to liquid, you can learn more in our guide about [personalizing messages](/journeys/using-liquid/).

 You're looking at the latest Liquid documentation

**If your account was created on or after Nov 28, 2023,** you are using our latest liquid version for all messages. If your account was created before this date, go to [How to upgrade your liquid version](/journeys/liquid-upgrade/#how-to-upgrade) for more info.

The two versions are largely similar, but you'll find a list of differences on our [Liquid Upgrade page](/journeys/liquid-upgrade/#differences-in-liquid-versions).

 You're looking at legacy Liquid documentation

**If your account was created on or after Nov 28, 2023,** you are using our latest liquid version for all messages. If your account was created before this date, go to [How to upgrade your liquid version](/journeys/liquid-upgrade/#how-to-upgrade) for more info.

The two versions are largely similar, but you'll find a list of differences on our [Liquid Upgrade page](/journeys/liquid-upgrade/#differences-in-liquid-versions).

Looking for something specific?  

*   ## Customer.io Keys[](#customer.io-keys-latest)
    
    These keys output data related to customers and campaign triggers.
    
*   ### cio\_link[](#cio_link-latest)
    
    Use this tag to track links in outside of push or in-app messages. This includes `mailto` links. If you use our SDKs, you do not need to use this tag to track links in in-app messages. To track links in *emails*, go to `cio_link_id` below.
    
    The filters `track` and `url_params` are optional. If you exclude these filters, url parameters will be present and tracking will be on. To turn either off, set them to false. For more info on this tag, go to [Link tracking](/journeys/link-tracking/#other-message-types).
    
    Do not use this tag to track [deep links](/journeys/universal-links/#deep-links-vs-universal-links).
    
    ##### Example
    
    ```text
    {% cio_link url:https://example.com %}
    {% cio_link url:https://example.com track:true url_params:true %}
    {% cio_link url:https://example.com track:true url_params:false %}
    {% cio_link url:https://example.com track:false url_params:true %}
    {% cio_link url:https://example.com track:false url_params:false %}
    ```
    
    ##### Output
    
    ```text
    https://e.customeriomail.com/e/c/{string}
    https://e.customeriomail.com/e/c/{string}
    https://e.customeriomail.com/e/c/{string}
    https://example.com?utm_campaign={string}&utm_content={string}&utm_medium={string}&utm_source=customer.io
    https://example.com
    ```
    
*   ### cio\_link\_id[](#cio_link_id-latest)
    
    Use this to track [deep links](/journeys/universal-links/#deep-links-vs-universal-links) in **emails**. Visit [Track universal and app links in email](/journeys/universal-links/#track-universal-and-app-links-in-email) for instructions.
    
    For links in non-email messages, go to `cio_link` above.
    
    ##### Example
    
    ```text
    <a href="https://yourwebsite.com/confirm?link_id={% cio_link_id %}" class="untracked">Text</a>
    ```
    
*   ### customer attributes[](#customer-attributes-latest)
    
    You reference customer attributes—data associated directly with a person in Customer.io—in the `customer` scope. You may want to use customer attributes with an `if` conditional so you have text to fallback to if a customer doesn’t have the attribute in question. You can use `default` rather than checking for empty strings using `== blank` or `!= blank`.
    
    ##### Syntax
    
    ```text
    {{customer.<attribute_name>}}
    ```
    
    ##### Example
    
    ```text
    Hi {{ customer.first_name | default: "there" }}
    
    {% if customer.first_name != blank %}
      Hello {{ customer.first_name }}!
    {% else %}
      Hello there!
    {% endif %}
    ```
    
*   ### event properties[](#event-properties-latest)
    
    If you trigger a campaign using an event, you can reference properties from the event that triggers your campaign in the `event` scope. You may want to use event properties with an `if` conditional, so that you have text to fallback to if an event doesn’t have the property in question or your property doesn’t contain the value you expect. You can use the `default` filter rather than checking for empty strings using `== blank` or `!= blank` too.
    
    ##### Syntax
    
    ```text
    {{event.<property>}}
    ```
    
    ##### Example
    
    ```text
    {% if event.type == "purchase" %}
      Thanks for your purchase!
    {% else %}
      Thanks for using our service!
    {%endif%}
    ```
    
*   ### event\_id[](#event_id-latest)
    
    The id of the event being previewed for the selected sample profile. It throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_id}}
    ```
    
*   ### event\_name[](#event_name-latest)
    
    The name of the event that triggers a campaign. If you send an event with different casings - for instance, MyEvent and myevent - Customer.io will output the event name that corresponds with the profile. This throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_name}}
    ```
    
*   ### event\_timestamp[](#event_timestamp-latest)
    
    The UNIX timestamp when a particular event was performed. This throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_timestamp}}
    ```
    
*   ### journey attributes[](#journey-attributes-latest)
    
    Journey attributes are unique to workflows. You can temporarily store data during a campaign instead of on a customer’s profile. Learn more about [setting journey attributes](/journeys/set-journey-attributes/). To reference journey attributes in messages or webhooks, you’ll use the `journey` object.
    
    ##### Syntax
    
    ```text
    {{journey.<attribute_name>}}
    ```
    
    ##### Example
    
    ```text
    {% if journey.weather != blank %}
      Here's the forecast for the day: {{journey.weather}}!
    {% else %}
      Check out your forecast online at...
    {%endif%}
    ```
    
*   ### object & relationship attributes[](#object-relationship-attributes-latest)
    
    This syntax lets you reference object or relationship data associated with people, not campaign triggers. For trigger liquid, see [trigger properties](#trigger-properties-latest). The keys you’ll need depend on your use case. See [Objects in liquid](/journeys/objects-in-liquid/#reference-non-trigger-data) for more information, and make sure you [understand the limitations before using this liquid](/journeys/objects-in-liquid/#before-you-begin).
    
    ##### Syntax
    
    ```text
    {{objects.<object-type-name>[#].<object-attribute-name>}} // reference an object attribute
    {{objects.<object-type-name>[#].relationship.<relationship-attribute-name>}} // reference a relationship attribute
    {{customer._relationship.<relationship-attribute-name>}} // reference a relationship attribute for the audience member of object or relationship-triggered campaigns
    ```
    
    ##### Example
    
    ```text
    // list all online classes that a person has not started
    {% for class in objects.online_classes %}
    {% if class.relationship.status == "not_started" %}
      - {{class.name}}
    {% endif %}
    {% endfor %}
    ```
    
*   ### render\_liquid[](#render_liquid-latest)
    
    Renders nested liquid syntax within an attribute value. Use this tag on any attribute whose value contains liquid—like content generated by [LLM actions](/journeys/llm-actions/), webhooks, or other sources. Without `render_liquid`, liquid syntax in the attribute value displays as static text instead of rendering dynamically.
    
    For example, if an LLM action stores `Hello {{customer.first_name}}` in a [journey attribute](#journey-attributes-latest) called `body`, referencing it with `{{journey.body}}` outputs the literal text `Hello {{customer.first_name}}`. Use `{% render_liquid journey.body %}` to render the customer’s actual name.
    
    ##### Syntax
    
    ```text
    {% render_liquid <liquid-key-name>.<attribute_name> %}
    ```
    
    ##### Example
    
    ```text
    {% render_liquid journey.body %}
    ```
    
*   ### snippets[](#snippets-latest)
    
    [Create snippets](/journeys/snippets/) to reuse content across your messages. For instance, you could make a footer with a snippet.
    
    ##### Example
    
    ```text
    {{snippets.footer}}
    ```
    
*   ### trigger properties[](#trigger-properties-latest)
    
    The `trigger` object can pull in data that triggers a transactional message, API-triggered broadcast, and campaigns triggered by webhooks, objects, or relationships. Remember to add fallbacks with conditionals or the `default` filter; otherwise, your messages could fail to send if the value and a fallback don’t exist. [Learn more about using `trigger` objects](/journeys/using-liquid/#trigger-properties).
    
    ##### Syntax
    
    ```text
    // For transactional messages, webhook-triggered campaigns, or API-triggered broadcasts
    {{trigger.<data.property>}} 
    
    // For object-triggered campaigns
    {{trigger.<object_type>.<attribute_name>}}
    
    // For object or relationship-triggered campaigns
    {{trigger.relationship.<attribute_name>}}
    ```
    
    ##### Example
    
    ```text
    {% if trigger.first_name %}
      Hi {{trigger.first_name | capitalize}}!
    {% else %}
      Hi friend!
    {%endif%}
    ```
    
*   ### view\_in\_browser\_url[](#view_in_browser_url-latest)
    
    Our default link that generates a web version of your email, [personalized for each recipient](/view-in-browser). This tag only works in **emails**—it is not supported in other message types like push notifications, in-app messages, SMS, or WhatsApp. If you set up [custom link tracking](/journeys/link-tracking-custom-domain/), your view in browser links use your branded domain. In general, these URLs look something like: `https://e.customeriomail.com/deliveries/....`
    
    ##### Syntax
    
    ```text
    {% view_in_browser_url %}
    ```
    
*   ## Customer.io Unsubscribe Keys[](#customer.io-unsubscribe-keys-latest)
    
    These keys output unsubscribe links unique to each customer.
    
*   ### manage\_subscription\_preferences\_url[](#manage_subscription_preferences_url-latest)
    
    Renders a unique unsubscribe link for [a customer and their email-address](/journeys/subscriptions-overview/#unsubscribe-links). This link takes a user to your subscription center where they can manage all of their preferences.
    
    ##### Syntax
    
    ```text
    {% manage_subscription_preferences_url %}
    ```
    
*   ### unsubscribe[](#unsubscribe-latest)
    
    Renders the word unsubscribe and links to the customer’s unique unsubscribe URL.
    
    ##### Syntax
    
    ```text
    {% unsubscribe %}
    ```
    
*   ### unsubscribe\_url[](#unsubscribe_url-latest)
    
    Renders a unique unsubscribe link for [a customer and their email-address](/unsubscribes/#how-do-i-add-an-unsubscribe-link-into-a-custom-layout).
    
    ##### Syntax
    
    ```text
    {% unsubscribe_url %}
    ```
    
*   ## Customer.io Meta Keys[](#customer.io-meta-keys-latest)
    
    These keys output high-level data around your messages, campaigns, and more. Many of the `.id` values are useful as UTM parameters in links so you can log where your traffic is coming from or attribute customer actions to messages.
    
*   ### campaign.id[](#campaign-id-latest)
    
    “Campaign” in this context represents any workflow. This is the workflow’s ID, which can be found after the workflow type in the URL.
    
    For example, the campaign ID here is 2000: `https://fly.customer.io/env/12345/v2/campaigns/2000/overview.`
    
    And here it’s 1: `https://fly.customer.io/env/109950/composer/newsletters/1/templates/21`."
    
    ##### Syntax
    
    ```text
    {{campaign.id}}
    ```
    
*   ### campaign.name[](#campaign-name-latest)
    
    “Campaign” in this context represents any workflow. The name that you assigned your workflow.
    
    ##### Syntax
    
    ```text
    {{campaign.name}}
    ```
    
*   ### campaign.subscription\_topic\_ids[](#campaign-subscription_topic_ids-latest)
    
    To use this, you must enable our [subscription center](/journeys/subscription-center/). This returns the topic assigned in subscription preferences settings for Campaigns, API Triggered Broadcasts and Newsletters.
    
    ##### Syntax
    
    ```text
    {{campaign.subscription_topic_ids}}
    ```
    
*   ### campaign.type[](#campaign-type-latest)
    
    “Campaign” in this context represents any workflow.
    
    This returns the type of trigger for a campaign: `behavioral` ([legacy segment-triggered](/journeys/campaign-triggers/#condition-trigger)), `seg_attr` ([attribute or segment-triggered](/journeys/campaign-triggers/#conditions-trigger)), `transactional` (event-triggered), `form`, `date`, `object`, or `relationship`.
    
    For messages sent through our Transactional API, this returns `transactional_message`.
    
    It also returns `triggered_broadcast` for an API-triggered broadcast or `newsletter` accordingly."
    
    ##### Syntax
    
    ```text
    {{campaign.type}}
    ```
    
*   ### content[](#content-latest)
    
    Use in layouts to indicate where code added via the email editor will be included. You might use this in a template for a transactional message or API-triggered broadcast where you will provide content from the API directly.
    
    ##### Example
    
    ```text
    {{content}}
    ```
    
*   ### delivery\_id[](#delivery_id-latest)
    
    A URL-compatible base64 string that identifies an instance of a message created for a person. When previewing a message, you’ll see `unsent`. This is generated when the message is drafted or sent.
    
    ##### Syntax
    
    ```text
    {{delivery_id}}
    ```
    
*   ### editor[](#editor-latest)
    
    Describes the type of editor used to create an action. One of `bee` (drag-and-drop email editor), `html` (code email editor), `wysiwyg` (rich text email editor), or `rich` (rich push editor). For *Create or update person* actions, in-app messages, Design Studio emails, SMS, and custom push, this value is blank.
    
    ##### Syntax
    
    ```text
    {{editor}}
    ```
    
*   ### layout.id[](#layout-id-latest)
    
    The numerical ID associated with the email layout you’ve used. Only available for emails made with the code or rich text editors.
    
    ##### Syntax
    
    ```text
    {{layout.id}}
    ```
    
*   ### layout.name[](#layout-name-latest)
    
    The name assigned to the email layout you’re using. Only available for emails made with the code or rich text editors.
    
    ##### Syntax
    
    ```text
    {{layout.name}}
    ```
    
*   ### message.id[](#message-id-latest)
    
    The numerical ID for a message action in the workflow. For example, an SMS action might have a `{{message.id}}` of 200. Note that this identifies the action in your workflow, not the individual delivery instances. Every SMS delivery generated from the action would have a different `{{delivery_id}}`.
    
    For newsletters, the `message.id` is the value after templates in your URL. For example, the `message.id` here is `21` `https://fly.customer.io/env/109950/composer/newsletters/1/templates/21`.
    
    ##### Syntax
    
    ```text
    {{message.id}}
    ```
    
*   ### message.journey\_id[](#message-journey_id-latest)
    
    The ID for the path a person went through in a Campaign or API-triggered Broadcast. You can use this value to trace message metrics back to a person’s path through a journey using the `journey.id` value sent in our [Reporting Webhooks](/webhooks).
    
    ##### Syntax
    
    ```text
    {{message.journey_id}}
    ```
    
*   ### message.name[](#message-name-latest)
    
    The name you give your message in the workflow, like “Welcome to ACME!”
    
    ##### Syntax
    
    ```text
    {{message.name}}
    ```
    
*   ### message.preheader[](#message-preheader-latest)
    
    For email messages only, if your message has a preheader value set, this tag echos it.
    
    ##### Syntax
    
    ```text
    {{message.preheader}}
    ```
    
*   ### message.send\_to\_unsubs[](#message-send_to_unsubs-latest)
    
    If the message is set to send to unsubscribed users, this returns true. Otherwise, it returns false.
    
    ##### Syntax
    
    ```text
    {{message.send_to_unsubs}}
    ```
    
*   ### message.subject[](#message-subject-latest)
    
    If your message has a subject, or the message subject is different from the message name, this tag echos it.
    
    ##### Syntax
    
    ```text
    {{message.subject}}
    ```
    
*   ### message.subscription\_topic\_ids[](#message-subscription_topic_ids-latest)
    
    To use this, you must enable our [subscription center](/journeys/subscription-center/). This returns the topic ID of the subscription preference assigned to Campaigns, API-triggered Broadcasts and Newsletters. If there is a message-level override of the topic (Campaigns and API-triggered Broadcasts only), it will return the message-level topic ID.
    
    ##### Syntax
    
    ```text
    {{message.subscription_topic_ids}}
    ```
    
*   ### message.subscription\_topic.name[](#message-subscription_topic-name-latest)
    
    To use this, you must enable our [subscription center](/journeys/subscription-center/). Renders the name of the subscription topic assigned to a broadcast or campaign. If the topic is overriden for a message, this will render the message-level topic name.
    
    ##### Syntax
    
    ```text
    {{message.subscription_topic.name}}
    {{message.subscription_topic.name | default: "Unsubscribe"}}
    ```
    
*   ### message.type[](#message-type-latest)
    
    This refers to the type of a particular workflow action. Possible values are: `email_action`, `delay_seconds_action`, `delay_time_window_action`, `split_randomized_action`, `webhook_action`, `twilio_action`, `slack_action`, `attribute_update_action`, `filter_match_delay_action`, `grace_period_action`, `push_action`, `conditional_wait_action`, `conditional_branch_action`, `multi_split_branch_action`, `random_cohort_branch_action,` `exit_action`, `static_seg_update_action`, `collection_query_action`, `create_event_action`, `multi_lang_branch_action`, `batch_update_action`, `in_app_action`.
    
    ##### Syntax
    
    ```text
    {{message.type}}
    ```
    
*   ### subscription\_topic\_name[](#subscription_topic_name-latest)
    
    To use this, you must enable our [subscription center](/journeys/subscription-center/). Renders the name of the subscription topic assigned to a broadcast or campaign. If the topic is overriden for a message, this will render the message-level topic name. Add a [language parameter](/journeys/unsubscribe-faqs/#currently-supported-languages) to translate the name, like `lang='pt'`. If the language doesn’t match a translation in your subscription center, customers will see the default language.
    
    ##### Syntax
    
    ```text
    {% subscription_topic_name %}
    {% subscription_topic_name lang='pt' %}
    ```
    
*   ## Variable Tags[](#variable-tags-latest)
    
    Tags define the logic of your liquid. Variable tags help you define and alter variables.
    
*   ### assign[](#assign-latest)
    
    Assign a value to a variable.
    
    ##### Syntax
    
    ```text
    {% assign var_name = 'value' %} 
    ```
    
    ##### Input
    
    ```text
    {% assign favorite_food = 'apples' %} 
    ```
    
    ##### Output
    
    ```text
    {{ favorite_food }}
    ```
    
*   ### capture[](#capture-latest)
    
    Captures contents and assigns them to a variable.
    
    ##### Input
    
    ```text
    {% capture about_me %}I am 28 and my favorite food is pasta.{% endcapture %}
    ```
    
    ##### Output
    
    ```text
    {{ about_me }}
    ```
    
*   ## Iterative Tags[](#iterative-tags-latest)
    
    Loop or iterate over data.
    
*   ### cycle[](#cycle-latest)
    
    In a ‘for’ loop, this tag loops through and outputs strings in the order they were passed.
    
    ##### Input
    
    ```text
    <ul>{% assign characters = "coyote,bugs,tweety" | split: "," %} 
      {% for character in characters %} 
      <li class="{% cycle 'odd', 'even' %}">{{ character }}</li> 
      {% endfor %}
    </ul> 
    ```
    
    ##### Output
    
    ```text
    <ul> 
      <li class='odd'>coyote</li>
      <li class='even'>bugs</li> 
      <li class='odd'>tweety</li> 
    </ul>
    ```
    
*   ### for loop[](#for-loop-latest)
    
    Repeatedly executes a block of code, most commonly to perform an operation for each item in an array. You might use a for loop in a message to provide a receipt of purchases (assuming an array of items in a purchase). [Find more information about for loops and iteration here.](https://liquidjs.com/tags/for.html#break) For instance, you can use a break tag - {% break %} - to exit a loop.
    
    ##### Syntax
    
    ```text
    {% for item in array %}
      {{ item }}
    {% endfor %}
    
    {% comment %} You can use a break tag so the loop stops iterating. {% endcomment %}
    {% for i in (1..5) %}
      {% if i == 4 %}
        {% break %}
      {% else %}
        {{ i }}
      {% endif %}
    {% endfor %}
    ```
    
    ##### Example
    
    ```text
    {% comment %} You can output each item of the array. {% endcomment %}
    {% for member in members_of_band %}
      {{member}}
    {% endfor %}
    
    {% comment %} If the items are objects, you can output properties from each object. {% endcomment %}
    {% for product in event.products %}
      - {{ product.title }} x {{ product.price }}
    {% endfor %}
    ```
    
*   ## Conditional Tags[](#conditional-tags-latest)
    
    Set conditions to determine the output.
    
*   ### case[](#case-latest)
    
    Creates a set of conditions depending on a variable’s specific value—like a set of if, if-else, else conditions.
    
    For example, you might use this to display different text depending on if a customer lives in a specific country.
    
    ##### Syntax
    
    ```text
    {% case condition %}
      {% when "value1" %}
        text when condition is value1.
      {% when "value2" or "value3" %}
        text when condition is value2 or value3
      {% else %}
        text when condition does not match other conditions
    {% endcase %}
    ```
    
*   ### if[](#if-latest)
    
    Executes a block of code if a condition is met. We execute the first true condition. Use `elsif` to add multiple ‘if’ conditions and `else` for the block of code you want to execute if all conditions are false. Use the [`default` filter](/journeys/liquid-tag-list/?version=latest#default-latest) to specify a fallback for when a variable does not exist instead of an if statement. [Find more information about conditional liquid here](https://github.com/customerio/liquid/wiki/Liquid-for-Designers#if--else).
    
    ##### Example
    
    ```text
    {% if customer.lastEventType == "sports" %}
      You last attended a sports event, so we thought you might like to try out our leagues! Fill out our interest form below.
    {% elsif customer.lastEventType == "theater" %}
      You attended a theater event, so we thought you might like to try out our after show parties! Fill out our interest form below.
    {% elsif customer.lastEventType %} 
      {% comment %} If the attribute exists and does not equal sports or theater, then this will render.{% endcomment %}
      You last attended {{customer.lastEventType}}; we'd love to hear what other offerings you'd like from us in the form below.
    {% else %} 
      {% comment %} If the attribute does not exist, this will render. {% endcomment %}
      Let us know your interests in the form below so we can better serve you!
    {% endif %}
    ```
    
*   ### unless[](#unless-latest)
    
    Like an if conditional, but reversed: this tag executes a block of code if your condition is *not* met.
    
    ##### Example
    
    ```text
    {% unless product.name == "cool beans" %}
      The beans are not cool.
    {% endunless %}
    ```
    
*   ## Logical Operators[](#logical-operators-latest)
    
    Logical operators determine the basic rules for evaluating true or false statements. You can also use `and` and `or` operators to combine logic statements to evaluate multiple conditions.
    
*   ### and[](#and-latest)
    
    Evaluate a statement as true when both conditions are true.
    
    ##### Syntax
    
    ```text
    {% if condition1 and condition2 %}
      // do something if both condition1 and condition 2 are true
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.name == "bugs bunny" and event.episode_start == true %}
      What's up doc?
    {% else %}
      That's all folks!
    {% endif %}
    ```
    
*   ### does not equal (!=)[](#does-not-equal-latest)
    
    Use `!=` to check that two values are *not* equal to each other.
    
    ##### Example
    
    ```text
    {% if customer.name != "daffy duck" %}
      Duck season!
    {% else %}
      Wabbit season!
    {%endif%}
    ```
    
*   ### equals (==)[](#equals-latest)
    
    Use `==` to check if two values are equal to each other.
    
    ##### Example
    
    ```text
    {% if customer.name == "daffy duck" %}
      Wabbit season!
    {% else %}
      Duck season!
    {% endif %}
    ```
    
*   ### greater than and greater than or equal to (>, >=)[](#greater-than-and-greater-than-or-equal-to-latest)
    
    Use `>` to match when one value is greater than another. Use `>=` to match when one value is greater than *or* equal to another.
    
    ##### Syntax
    
    ```text
    {% if val1 > val2 %}
      {% comment %}do something if val1 is greater than val2{% endcomment %}
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.acct_age_years > 1 %}
      Thanks for being with us these past years
    {% else %}
      Thanks for spending the last year with us!
    {% endif %}
    ```
    
*   ### less than and less than or equal to (<, <=)[](#less-than-and-less-than-or-equal-to-latest)
    
    Use `<` to match when one value is less than another. Use `<=` to match when one value is less than *or* equal to another.
    
    ##### Syntax
    
    ```text
    {% if val1 < val2 %}
      {% comment %}do something if val1 is less than val2{% endcomment %}
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.purchases < 5 %}
      Thanks for your support
    {% else %}
      Thanks for spending the last year with us!
    {% endif %}
    ```
    
*   ### or[](#or-latest)
    
    Evaluate a statement as true when either of two conditions are true.
    
    ##### Syntax
    
    ```text
    {% if condition1 or condition2 %}
      {% comment %}do something if either condition1 and condition 2 are true{% endcomment %}
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.name == "bugs bunny" or customer.group == "looney toons" %}
      That's all folks!
    {% else %}
      See you later!
    {% endif %}
    ```
    
*   ## Timestamps and Dates[](#timestamps-and-dates-latest)
    
    Use these tags to get and manipulate dates and times.
    
*   ### add\_day[](#add_day-latest)
    
    Adds a day, or multiple days, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | add_day: <int_days> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | add_day: 7 }}
    ```
    
*   ### add\_month[](#add_month-latest)
    
    Adds a month, or multiple months, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | add_month: <int_months> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | add_month: 7 }}
    ```
    
*   ### add\_year[](#add_year-latest)
    
    Adds a year, or multiple years, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | add_year: <int_years> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | add_year: 4 }}
    ```
    
*   ### countdown[](#countdown-latest)
    
    Creates a countdown timer in your message, helping you alert your audience to how soon an event they’re interested in is set to happen. Countdown timers take several parameters. At the minimum, a countdown must include the font size, the foreground (font) color, the background color, and the time you want to count down to. **You can only set this to count down from a *static timestamp*; you cannot set the time to count down based on a customer’s attribute, for instance.**
    
    The countdown timer cannot contain more than 60 frames. This limits the size of the animated GIF in your messages. So, if the resolution is set to seconds, the counter will stop after 60 seconds from when the person opens their message. The countdown image reloads when a person opens the message again, so the counter will always be relevant to the user’s current time, but it cannot count indefinitely.
    
    Parameter
    
    required
    
    format
    
    default
    
    description
    
    point
    
    ✓
    
    integer
    
    The font size for the timer
    
    time
    
    ✓
    
    ISO 8601 timestamp
    
    The date and time you want to countdown to in the format `YYYY-MM-DD hh:mm:ss (GMT)`. Remember to close the time in quotes, as the value includes a space. This field does not accept liquid variables.
    
    fg
    
    ✓
    
    hex color
    
    The foreground (font) hexidecimal color
    
    bg
    
    ✓
    
    hex color
    
    The background hexidecimal color
    
    apng
    
    boolean
    
    false
    
    Determines whether to show your countdown as a gif (default) or animated PNG. Note that some browsers/email clients don’t support apng images.
    
    font
    
    string
    
    inter, roboto
    
    The font family for your timer
    
    weight
    
    string
    
    normal
    
    The font weight, takes normal CSS `font-weight` values.
    
    locale
    
    language code
    
    en
    
    The language you want to display: `en` (English), `ru` (Russian), `jp` (Japanese), `zh` (Chinese), `pt` (Portugese), `es` (Spanish), and `fr` (French)
    
    looping
    
    boolean
    
    false
    
    Determines whether the countdown timer should restart after it finishes
    
    resolution
    
    one of S, M, H, D
    
    S
    
    Determines how often the timer counts down—by the second, minute, hour, or day.
    
    frames
    
    integer
    
    1
    
    Number of seconds you want to show, based on the resolution, where seconds: 60, minutes: 2, hours: 1, days: 1
    
    ##### Example
    
    ```text
    {% countdown point:64 font:roboto weight:light fg:000000 bg:f2f6f9 time:"2022-07-04 12:00:00 (GMT)" locale:en looping:true resolution:S frames:2 %}
    ```
    
    [![countdown-timer.png
    ](https://docs.customer.io/images/countdown-timer.png)](#8aca4f25c6b61d7d00851acc7cbf0828-lightbox)
    
*   ### date[](#date-latest)
    
    Format a date. Use the [LiquidJS reference](https://liquidjs.com/filters/date.html) for more information about date filters including overriding the time zone. For a full list of regions, see our [Supported time zone formats](/journeys/example-timezones/#region). You can also offset the time zone in minutes (360 = -6:00 hrs and -360 = +6:00 hrs).
    
    ##### Input
    
    ```text
    {{ 1483272000 | date: '%H:%M, %a, %b %d, %Y' }}
    {{ 1483272000 | date: '%a., %-m/%d at %I:%M %P %Z' }}
    {{ "1990-12-31T23:00:00Z" | date: "%Y-%m-%dT%H:%M:%S", "Asia/Colombo" }}
    {{ "1990-12-31T23:00:00Z" | date: "%Y-%m-%dT%H:%M:%S", 360 }}
    ```
    
    ##### Output
    
    ```text
    12:00, Sun, Jan 01, 2017
    Sun., 1/01 at 12:00 pm UTC
    1991-01-01T04:30:00
    1990-12-31T17:00:00
    ```
    
*   ### date\_to\_long\_string[](#date_to_long_string-latest)
    
    Converts a date-time to include the full name of the month. You can convert this to ordinal time by adding ‘ordinal’, and you can follow that with ‘US’ if you’d like to lead with the month. By default, this displays the date in DD, M full name, YYYY.
    
    ##### Input
    
    ```text
    {{ site.time | date_to_long_string }}
    {{ site.time | date_to_long_string: "ordinal" }}
    {{ site.time | date_to_long_string: "ordinal", "US" }}
    ```
    
    ##### Output
    
    ```text
    07 November 2008
    7th November 2008
    November 7th, 2008
    ```
    
*   ### date\_to\_rfc822[](#date_to_rfc822-latest)
    
    Converts a date-time into the RFC-822 format used for RSS feeds.
    
    ##### Input
    
    ```text
    {{ site.time | date_to_rfc822 }}
    ```
    
    ##### Output
    
    ```text
    Mon, 07 Nov 2008 13:07:54 -0800
    ```
    
*   ### date\_to\_string[](#date_to_string-latest)
    
    Converts a date-time to ordinal time. Add ‘US’ to lead with the month. By default, this displays the date in DD, M abbreviated, YYYY.
    
    ##### Input
    
    ```text
    {{ site.time | date_to_string }}
    {{ site.time | date_to_string: "ordinal" }}
    {{ site.time | date_to_string: "ordinal", "US" }}
    ```
    
    ##### Output
    
    ```text
    07 Nov 2008
    07th Nov 2008
    Nov 7th, 2008
    ```
    
*   ### date\_to\_xmlschema[](#date_to_xmlschema-latest)
    
    Converts a date-time into ISO 8601, a format expected by XML schema.
    
    ##### Input
    
    ```text
    {{ site.time | date_to_xmlschema }}
    ```
    
    ##### Output
    
    ```text
    2008-11-07T13:07:54-08:00
    ```
    
*   ### event\_timestamp[](#event_timestamp-latest)
    
    The UNIX timestamp when a particular event was performed. This time is different from the `now` tag! This throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_timestamp}}
    ```
    
*   ### now[](#now-latest)
    
    The current time in UTC. You must [format time](https://liquidjs.com/filters/date.html) with `date`.
    
    To modify date or time with `add` or `subtract` filters you must convert `now` into a unix timestamp first using `date: '%s'`. If you use our built in `add_day`, `add_month`, or `add_year` filters, you must convert the timestamp to an integer first. You can do this by using the `plus` filter to add `0` as shown in the second example below.
    
    ##### Example
    
    ```text
    {{ 'now' | date: '%I:%M %p %B %d, %Y' }}
    {{ 'now' | date: '%s' | plus: 0 | add_day: 1 | date: '%I:%M %p %B %d, %Y'}}
    ```
    
    ##### Output
    
    ```text
    08:28 AM May 11, 2021
    08:28 AM May 12, 2021
    ```
    
*   ### subtract\_day[](#subtract_day-latest)
    
    Subtracts a day, or multiple days, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | subtract_day: <int_days> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | subtract_day: 7 }}
    ```
    
*   ### subtract\_month[](#subtract_month-latest)
    
    Subtracts a month, or multiple months, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | subtract_month: <int_months> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | subtract_month: 2 }}
    ```
    
*   ### subtract\_year[](#subtract_year-latest)
    
    Subtracts a year, or multiple years, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | subtract_year: <int_years> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | subtract_year: 4 }}
    ```
    
*   ## Array Filters[](#array-filters-latest)
    
    Liquid used to filter and manipulate arrays (lists of values). If your event or another incoming value is an array, you may iterate over the array with a `for` loop or grab items at a particular index of the array, to display information for your audience.
    
*   ### compact[](#compact-latest)
    
    Removes `nil` (empty) values from an array.
    
    ##### Input
    
    ```text
    {{ "mick, keith, nil, Charlie" | compact }} 
    ```
    
    ##### Output
    
    ```text
    mick, keith, Charlie
    ```
    
*   ### concat[](#concat-latest)
    
    Concatenates arrays, joining them end to end. Accepts a single object or an array of objects. The resulting array contains all of the elements of both original arrays. `concat` does not remove duplicate entries unless you also use the `uniq` filter.
    
    ##### Input
    
    ```text
    {% assign stones = "mick, keith, ronnie, charlie" | split: ", " %} 
    {% assign beatles = "john, paul, george, ringo" | split: ", " %} 
    {% assign rolling_beatles = stones | concat: beatles %} 
    {{ rolling_beatles | join: ", " }}
    ```
    
    ##### Output
    
    ```text
    mick, keith, ronnie, charlie, john, paul, george, ringo
    ```
    
*   ### find[](#find-latest)
    
    Returns the first object in an array for which the queried attribute has the given value or returns nil if no item in the array satisfies the given criteria.
    
    ##### Input
    
    ```text
    {{ customer.purchases | find: "type", "kitchen" | json }}
    ```
    
    ##### Output
    
    ```text
    {"date":"1726589206","title":"utensils","type":"kitchen"}
    ```
    
*   ### find\_exp[](#find_exp-latest)
    
    Returns the first object in an array for which the given expression evaluates to true or returns nil if no item in the array satisfies the evaluated expression.
    
    ##### Input
    
    ```text
    {{ members | find_exp: "item", "item.graduation_year == 2014" | json }}
    ```
    
    ##### Output
    
    ```text
    {"graduation_year":2014,"name":"John"}
    ```
    
*   ### first[](#first-latest)
    
    Returns the first element of the array.
    
    ##### Input
    
    ```text
    acme.characters = ["Wile E Coyote", "Road Runner"]
    {{ acme.characters | first }}
    ```
    
    ##### Output
    
    ```text
    Wile E Coyote
    ```
    
*   ### group\_by[](#group_by-latest)
    
    Groups an array’s items by a given property.
    
    ##### Input
    
    ```text
    {% assign groups = customer.purchases | group_by: "type" %}
    
    {% for group in groups %}
    
      {{group.name | capitalize}}
    
      {% for item in group.items %}
    
        - {{ item.title }}
    
      {% endfor %}
    
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    Bathroom
    - shower curtain
    - body soap
    Kitchen
    - forks
    - spoons
    - knives
    ```
    
*   ### group\_by\_exp[](#group_by_exp-latest)
    
    Groups an array’s items using a Liquid expression.
    
    ##### Input
    
    ```text
    {% assign groups = customer.purchases | group_by_exp: "item", "item.type contains 'kitchen'" %} 
    
    {% for group in groups %}
    
      {% if group.name == true %}
    
        You bought some kitchen supplies from us in the past year:
    
          {% for item in group.items %}
    
          - {{item.title}}
    
          {% endfor %}
    
      {% endif %}
    
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    You bought some kitchen supplies from us in the past year:
    - forks
    - spoons
    - knives
    ```
    
*   ### join[](#join-latest)
    
    Joins the elements of an array with the character passed as the parameter.
    
    ##### Input
    
    ```text
    acme.characters = ["Wile E Coyote", "Road Runner"] 
    {{ acme.characters | join: ', ' }}
    ```
    
    ##### Output
    
    ```text
    Wile E Coyote, Road Runner
    ```
    
*   ### json\_array\_uniq[](#json_array_uniq-latest)
    
    Evaluates an array of JSON objects and outputs an array containing all the unique objects based only on the value of the passed-in property name. Use the filter `to_json` if a string is the desired output.
    
    ##### Input
    
    ```text
    {{ customer.arrayOfColorObjects | concat: customer.arrayOfColorObjectsWithDuplicationsAndNew | json_array_uniq: 'name' | to_json }}
    ```
    
    ##### Output
    
    ```text
    [{"color":"brown","name":"coyote"},{"color":"black","name":"bugs"},{"color":"yellow","name":"tweety"},{"color":"black","name":"daffy"}]
    ```
    
*   ### last[](#last-latest)
    
    Returns the last element of the array.
    
    ##### Input
    
    ```text
    acme.characters = ["Wile E Coyote", "Road Runner"]
    {{ acme.characters | last }}
    ```
    
    ##### Output
    
    ```text
    Road Runner
    ```
    
*   ### limit[](#limit-latest)
    
    Return a set number of values from an array or string.
    
    ##### Input
    
    ```text
    {% assign beatles = "john, paul, george, ringo" | split: ", " %} 
    {{ beatles | limit: 2 | join: ", " }}
    ```
    
    ##### Output
    
    ```text
    john, paul
    ```
    
*   ### map[](#map-latest)
    
    Creates an array of values by extracting the values of a property in an object. You can output your new characters in a [‘for’ loop](#for-loop).
    
    ##### Input
    
    ```text
    Array of objects: [{"name":"coyote"},{"name":"bugs"},{"name":"tweety"}]"
    {% assign names = customer.characters | map: 'name' %}
    ```
    
    ##### Output
    
    ```text
    coyote, bugs, tweety
    ```
    
*   ### pop[](#pop-latest)
    
    Removes the last element from the array.
    
    ##### Input
    
    ```text
    {% assign fruits = "apples, oranges, peaches" | split: ", " %}
    
    {% assign everything = fruits | pop %}
    
    {% for item in everything %}
    - {{ item }}
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    - apples
    - oranges
    ```
    
*   ### push[](#push-latest)
    
    Adds an element to an array.
    
    ##### Input
    
    ```text
    {% assign fruits = "apples, oranges" | split: ", " %}
    
    {% assign everything = fruits | push: "peaches" %}
    
    {% for item in everything %}
    - {{ item }}
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    - apples
    - oranges
    - peaches
    ```
    
*   ### remove[](#remove-latest)
    
    Remove an element from an array. The array can contain objects of any type.
    
    ##### Input
    
    ```text
    {% assign pl = customer.products | remove: customer.products[0] %}
    - {{ customer.products.size }}
    - {{ pl.size }}
    ```
    
    ##### Output
    
    ```text
    - 2 
    - 1
    ```
    
*   ### reverse[](#reverse-latest)
    
    Reverses the order of the items in an array.
    
    ##### Input
    
    ```text
    {% assign my_array = "apples, oranges, peaches, plums" | split: ", " %}
    
    {{ my_array | reverse | join: ", " }}
    ```
    
    ##### Output
    
    ```text
    plums, peaches, oranges, apples
    ```
    
*   ### shift[](#shift-latest)
    
    Removes the first element from the array.
    
    ##### Input
    
    ```text
    {% assign fruits = "apples, oranges, peaches" | split: ", " %}
    
    {% assign everything = fruits | shift %}
    
    {% for item in everything %}
    - {{ item }}
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    - oranges
    - peaches
    ```
    
*   ### size[](#size-latest)
    
    Returns the number of characters (the size) of a string (in characters) or the number of elements in an array.
    
    ##### Input
    
    ```text
    {{ "That's all, folks!" | size }}
    {{ customer.latest_purchase | size }}
    {{ objects.online_classes | size }}
    {{ objects.online_classes.size }}
    ```
    
    ##### Output
    
    ```text
    18 // The number of characters
    4 // If `latest_purchase` is an array, this returns the number of items in the array. Otherwise, it returns a count of characters. 
    2 // The number of objects (onlines classes) that a person is related to.
    2 // Using the size filter with dot notation
    ```
    
*   ### sort[](#sort-latest)
    
    Sorts the elements of an array by an attribute of an element in that array. Usually used with a ‘for’ loop. The order of the sorted array is case-sensitive! This filter will not reorder any list/array that contains null values. See [Sorting looped data](/journeys/using-liquid/#sorting-looped-data) for an advanced example.
    
    ##### Input
    
    ```text
    {% assign beatles = "paul, john, ringo, george" | split: ", " %}
    
    {{ beatles | sort | join: ", " }}
    ```
    
    ##### Output
    
    ```text
    george, john, paul, ringo
    ```
    
*   ### sort\_natural[](#sort_natural-latest)
    
    Sort the items in an array in case-insensitive order.
    
    ##### Input
    
    ```text
    {{ "mick, keith, Charlie, Ronnie" | sort_natural }}
    ```
    
    ##### Output
    
    ```text
    Charlie, keith, mick, Ronnie
    ```
    
*   ### sum[](#sum-latest)
    
    The `sum` filter aggregates numbers. Every value is cast to a number. Unlike with legacy liquid, `sum` does not concatenate numbers, strings, or booleans. You can specify an object property to sum, as shown in the third example below.
    
    ##### Input
    
    ```text
    {% assign nums = '1,2,3' | split: ',' %}
    {{ nums | sum }}
    
    {% assign letters = 'a,b,c' | split: ',' %}
    {{ letters | sum }}
    
    {{ cart.products | sum: 'total_number' }} {% comment %} where `total_number` includes milk,cheese,eggs {% endcomment %}
    
    {{ purchase.products | sum }} {% comment %} where `products` includes true,false {% endcomment %}
    ```
    
    ##### Output
    
    ```text
    6
    0
    3
    1 {% comment %} counts the number of trues, would also aggregate numbers alongside booleans {% endcomment %}
    ```
    
*   ### uniq[](#uniq-latest)
    
    Removes duplicate elements in an array.
    
    ##### Input
    
    ```text
    {% assign my_array = '"lions", "tigers", "bears", "bears", "lions"' %}
    {{ my_array | uniq | join: ", " }} 
    ```
    
    ##### Output
    
    ```text
    lions, tigers, bears
    ```
    
*   ### unshift[](#unshift-latest)
    
    Adds an element to the beginning of the array.
    
    ##### Input
    
    ```text
    {% assign fruits = "oranges, peaches" | split: ", " %}
    
    {% assign everything = fruits | unshift: "apples" %}
    
    {% for item in everything %}
    - {{ item }}
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    - apples
    - oranges
    - peaches
    ```
    
*   ### where[](#where-latest)
    
    Creates an array including only the objects with a given property value, or any “truthy” value by default.
    
    ##### Input
    
    ```text
    All Players:
    {% for player in customer.players %} 
      - {{ player.last_name }} 
    {% endfor %} 
    
    Baseball Players:
    {% assign baseball_players = customer.players | where: "sport", "baseball" %} 
    {% for player in baseball_players %} 
      - {{ player.last_name }} 
    {% endfor %}
    
    ----------------------------
    
    All products:
    {% for product in customer.products %}
    - {{ product.title }}
    {% endfor %}
    
    {% assign available_products = customer.products | where: "available" %}
    
    Available products:
    {% for product in available_products %}
    - {{ product.title }}
    {% endfor %}
    ```
    
*   ### where\_exp[](#where_exp-latest)
    
    Selects all the objects in an array where the expression is true. You provide two items separated by a comma: the property you want to match on and the value you want to match.
    
    ##### Input
    
    ```text
    All products:
    {% for product in customer.products %}
    - {{ product.title }}
    {% endfor %}
    
    {% assign kitchen_products = customer.products | where_exp: "item", "item.size > 30 and item.type == 'kitchen'" %}
    
    Kitchen products:
    {% for product in kitchen_products %}
    - {{ product.title }}
    {% endfor %}
    ```
    
*   ### where\_not[](#where_not-latest)
    
    Creates an array of items that **do not match** a given property value, or any “falsey” value by default. When using `where_not`, you provide two items separated by a comma: the property you want to match on and the value you want to match.
    
    ##### Input
    
    ```text
    All players: 
    {% for player in customer.players %} 
      - {{ player.last_name }} 
    {% endfor %} 
    
    Not baseball players: 
    {% assign not_baseball_players = customer.players | where_not: "sport", "baseball" %} 
    {% for player in not_baseball_players %} 
      - {{ player.last_name }} 
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    All players: 
      - Posey 
      - Maradona 
      - Montana 
      - Gretzky 
      - Jordan 
    
    Not baseball players: 
      - Maradona 
      - Montana 
      - Gretzky 
      - Jordan 
    ```
    
*   ## Number and Currency Filters[](#number-and-currency-filters-latest)
    
    These are tags and filters that manipulate incoming number, integer, and timestamp values.
    
    Some tags, like the `currency` and `format_number`, take an optional localization parameter, formatting the output for a specific locale. These tags use the format `{{ 10 | currency: "en-us" }}`, which would output `$10.00`.
    
*   ### A list of locales and currency codes[](#a-list-of-locales-and-currency-codes-latest)
    
    We support the following localization values:
    
    ```fallback
    af, ar, az, be, bg, bn, bs, ca, cs, cy, da, de-AT, de-CH, de-DE, de, dz, el-CY, el, en-AU, en-CA, en-CY, 
    en-GB, en-IE, en-IN, en-NZ, en-TT, en-US, en-ZA, en, eo, es-419, es-AR, es-CL, es-CO, es-CR, es-EC, es-ES, 
    es-MX, es-NI, es-PA, es-PE, es-US, es-VE, es, et, eu, fa, fi, fr-CA, fr-CH, fr-FR, fr, gl, gsw-CH, he, 
    hi-IN, hi, hr, hu, id, is, it-CH, it, ja-JP, ja, ka, kk, km, kn, ko, lb, lo, lt, lv, mg, mk, ml, mn, mr-IN, 
    ms, na, nb, ne, ng, nl, nn, oc, or, pa, pl, pt-BR, pt, rm, ro, ru, sc, sd, sk, sl, sn, sq, sr, st, sv-FI, 
    sv-SE, sv, sw, ta, te, th, tl, tn, tr, tt, ug, uk, ur, uz, vi, wo, za, zh-CN, zh-HK, zh-Hant-MO, zh-MO, 
    zh-TW, ao, cd, ci, cm, eg, gh, ke, ls, ly, ma, mu, mw, mz, sz, tz, zm
    ```
    
    We support the following currency codes:
    
    ```fallback
    'AED','AFN','ALL','AMD','ANG','AOA','ARS','AUD','AWG','AZN','BAM','BBD','BDT','BGN','BHD','BIF','BMD',
    'BND','BOB','BRL','BSD','BTN','BWP','BYN','BZD','CAD','CDF','CHF','CLP','CNY','COP','CRC','CUC','CUP',
    'CVE','CZK','DJF','DKK','DOP','DZD','EGP','ERN','ETB','EUR','FJD','FKP','GBP','GEL','GHS','GIP','GMD',
    'GNF','GTQ','GYD','HKD','HNL','HRK','HTG','HUF','IDR','ILS','INR','IQD','IRR','ISK','JMD','JOD','JPY',
    'KES','KGS','KHR','KMF','KPW','KRW','KWD','KYD','KZT','LAK','LBP','LKR','LRD','LSL','LYD','MAD','MDL',
    'MGA','MKD','MMK','MNT','MOP','MRU','MUR','MVR','MWK','MXN','MYR','MZN','NAD','NGN','NIO','NOK','NPR',
    'NZD','OMR','PAB','PEN','PGK','PHP','PKR','PLN','PYG','QAR','RON','RSD','RUB','RWF','SAR','SBD','SCR',
    'SDG','SEK','SGD','SHP','SLE','SLL','SOS','SRD','SSP','STN','SVC','SYP','SZL','THB','TJS','TMT','TND',
    'TOP','TRY','TTD','TWD','TZS','UAH','UGX','USD','UYU','UZS','VES','VND','VUV','WST','XAF','XCD','XDR',
    'XOF','XPF','XSU','YER','ZAR','ZMW','ZWL'
    ```
    
*   ### abs[](#abs-latest)
    
    Returns the absolute value of a number.
    
    ##### Input
    
    ```text
    {{ 3.14 | abs }}
    ```
    
    ##### Output
    
    ```text
    3.14
    ```
    
*   ### ceil[](#ceil-latest)
    
    Rounds a number up to the nearest integer.
    
    ##### Input
    
    ```text
    {{ 3.14 | ceil }}
    ```
    
    ##### Output
    
    ```text
    4
    ```
    
*   ### currency[](#currency-latest)
    
    Converts an integer to currency. This filter accepts two arguments for currency and locale. When no arguments are passed to the filter, the currency code defaults to USD. When only a locale is passed, we base the currency on the closest match to the locale. See above for a list of [specific locales and currencies](#number-and-currency-filters). We only accept a currency code after a locale is specified.
    
    ##### Input
    
    ```text
    {% comment %} no arguments: {% endcomment %} 
      {{ 1234567.896 | currency }} 
    {% comment %} only locale: {% endcomment %}
      {{ 1234567.896 | currency: 'en-GB' }} 
    {% comment %} locale and currency code: {% endcomment %}
      {{ 1234567.896 | currency: 'en', 'EUR' }}
    ```
    
    ##### Output
    
    ```text
    $1,234,567.90
    £1,234,567.90
    €1,234,567.90
    ```
    
*   ### floor[](#floor-latest)
    
    Rounds a number down to the nearest integer.
    
    ##### Input
    
    ```text
    {{ 3.14 | floor }}
    ```
    
    ##### Output
    
    ```text
    3
    ```
    
*   ### format\_number[](#format_number-latest)
    
    Format a number with a delimiter. This filter also takes an optional localization parameter to format a number for a [specific locale](#a-list-of-locales-and-currency-codes-latest).
    
    **NOTE**: This replaces the former `number_with_delimeter` filter.
    
    ##### Input
    
    ```text
    {{ 10000 | format_number }}
    {{ 123456.78 | format_number: "fr" }} 
    ```
    
    ##### Output
    
    ```text
    10,000
    123 456,78
    ```
    
*   ### random[](#random-latest)
    
    Generates a random number between 0 and an integer you specify.
    
    ##### Example
    
    ```text
    {% random 100 %}
    ```
    
*   ### round[](#round-latest)
    
    Rounds a number up or down to the nearest integer, or to a decimal place you specify.
    
    ##### Input
    
    ```text
    {{ 4.32 | round }} 
    {{ 4.32 | round: 1 }}
    ```
    
    ##### Output
    
    ```text
    4
    4.3
    ```
    
*   ### rounded\_currency[](#rounded_currency-latest)
    
    Rounds a number to the nearest whole integer and formats it to a currency. Accepts both a locale and currency code. We only accept a currency code after a locale is specified. See above for a list of [specific locales and currencies](#number-and-currency-filters).
    
    ##### Input
    
    ```text
    {% comment %} no arguments: {% endcomment %}
      {{ 1234567.896 | rounded_currency }} 
    {% comment %} only locale: {% endcomment %}
      {{ 1234567.896 | rounded_currency: 'en-GB' }} 
    {% comment %} locale and currency code: {% endcomment %}
      {{ 1234567.896 | rounded_currency: 'en', 'EUR' }} 
    ```
    
    ##### Output
    
    ```text
    $1,234,568
    £1,234,568
    €1,234,568
    ```
    
*   ## Math Filters[](#math-filters-latest)
    
    Filters that perform math operations on incoming number or integer values. With the legacy liquid version, if you encounter an error with negatives while using math filters, wrap the negative numbers in quotes.
    
*   ### at\_least[](#at_least-latest)
    
    Limits a number to a minimum value.
    
    ##### Input
    
    ```text
    {{ 41 | at_least: 42 }}
    ```
    
    ##### Output
    
    ```text
    42
    ```
    
*   ### at\_most[](#at_most-latest)
    
    Limits a number to a maximum value.
    
    ##### Input
    
    ```text
    {{ 100 | at_most: 99 }}
    ```
    
    ##### Output
    
    ```text
    99
    ```
    
*   ### divided\_by[](#divided_by-latest)
    
    Divides a number by another number.
    
    ##### Input
    
    ```text
    {{ 10 | divided_by: 2.5 }}
    {{ 10 | divided_by: 4 }}
    {{ 10 | divided_by: 4.0 }}
    ```
    
    ##### Output
    
    ```text
    4
    2.5
    2.5
    ```
    
*   ### minus[](#minus-latest)
    
    Subtracts a number from another number.
    
    ##### Input
    
    ```text
    {{ 10 | minus: 1 }}
    ```
    
    ##### Output
    
    ```text
    9
    ```
    
*   ### modulo[](#modulo-latest)
    
    Returns the remainder of division. The output will always be a positive number, even when there’s a negative number as input.
    
    ##### Input
    
    ```text
    {{ 3 | modulo: 2 }}
    ```
    
    ##### Output
    
    ```text
    1
    ```
    
*   ### plus[](#plus-latest)
    
    Adds a number to another.
    
    ##### Input
    
    ```text
    {{ 10 | plus: 1 }}
    ```
    
    ##### Output
    
    ```text
    11
    ```
    
*   ### times[](#times-latest)
    
    Multiplies a number by another number.
    
    ##### Input
    
    ```text
    {{ 5 | times: 2 }}
    {{ 10 | times: 2.5 }}
    ```
    
    ##### Output
    
    ```text
    10
    25
    ```
    
*   ## String Filters[](#string-filters-latest)
    
    The following filters manipulate strings in templates. You might use these to truncate or set the case of strings you reference from other places, to humanize your messages for recipients.
    
*   ### append[](#append-latest)
    
    Adds a string to the end of another string.
    
    ##### Input
    
    ```text
    {{ "What's all the hubbub, " | append: "bub?" }}
    ```
    
    ##### Output
    
    ```text
    What's all the hubbub, bub?
    ```
    
*   ### array\_to\_sentence\_string[](#array_to_sentence_string-latest)
    
    Converts a list of data into a commma-delineated list. Use in tandem with the [`split` filter](/journeys/liquid-tag-list/?version=latest#split-latest).
    
    ##### Input
    
    ```text
    {{ customer.groceries | split:"," | array_to_sentence_string }}
    {{ customer.groceries | split:"," | array_to_sentence_string: "or" }}
    ```
    
    ##### Output
    
    ```text
    cherry, kiwi, and passion fruit
    cherry, kiwi, or passion fruit
    ```
    
*   ### base64[](#base64-latest)
    
    Base64-encodes a string.
    
    ##### Input
    
    ```text
    {{ 'Hello, world!' | base64 }}
    ```
    
    ##### Output
    
    ```text
    SGVsbG8sIHdvcmxkIQ==
    ```
    
*   ### base64\_decode[](#base64_decode-latest)
    
    Decode a base64-encoded string.
    
    ##### Input
    
    ```text
    {{ "Zm9vLmJhcg==" | base64_decode }}
    ```
    
    ##### Output
    
    ```text
    foo.bar
    ```
    
*   ### base64\_encode[](#base64_encode-latest)
    
    Base64-encode a value.
    
    ##### Input
    
    ```text
    {{ "foo.bar" | base64_encode }}
    ```
    
    ##### Output
    
    ```text
    Zm9vLmJhcg==
    ```
    
*   ### base64\_url\_safe\_decode[](#base64_url_safe_decode-latest)
    
    Decode a string from URL-safe Base64.
    
    ##### Input
    
    ```text
    {{ "Zm9vLmJhcg" | base64_url_safe_decode }}
    ```
    
    ##### Output
    
    ```text
    foo
    ```
    
*   ### base64\_url\_safe\_encode[](#base64_url_safe_encode-latest)
    
    Encode a string into URL-safe Base64. To produce URL-safe Base64, this filter uses `-` and `_` in place of `+` and `/`.
    
    ##### Input
    
    ```text
    {{ "foo" | base64_url_safe_encode }}
    ```
    
    ##### Output
    
    ```text
    Zm9vLmJhcg
    ```
    
*   ### capitalize[](#capitalize-latest)
    
    Capitalize the first character in a string.
    
    ##### Input
    
    ```text
    {{ "hello world" | capitalize }}
    ```
    
    ##### Output
    
    ```text
    Hello world
    ```
    
*   ### cgi\_escape[](#cgi_escape-latest)
    
    CGI escapes a string for use in a URL.
    
    ##### Input
    
    ```text
    {{ "overview: account" | cgi_escape }}
    ```
    
    ##### Output
    
    ```text
    overview%3A+account
    ```
    
*   ### contains[](#contains-latest)
    
    Finds a substring inside a string, or the presence of a string in an array of strings. This filter only works with strings; you cannot use it to search for an object in an array of object.
    
    ##### Syntax
    
    ```text
    {% if product.description contains 'lorem ipsum' %}
      You might also be interested in Fillerama or Office Ipsum.
    {% endif %}
    ```
    
*   ### downcase[](#downcase-latest)
    
    Converts a string to lower case.
    
    ##### Syntax
    
    ```text
    {{ 'STRING' | downcase }}
    ```
    
    ##### Input
    
    ```text
    {{ "ACME" | downcase }}
    ```
    
    ##### Output
    
    ```text
    acme
    ```
    
*   ### escape[](#escape-latest)
    
    Escaping a string removes special characters. To encode a URL, use [`url_encode`](/journeys/liquid-tag-list/?version=latest#url_encode-latest) instead.
    
    ##### Input
    
    ```text
    {{ "win+help@customer.io" | escape }}
    ```
    
    ##### Output
    
    ```text
    win%2Bhelp%40customer.io
    ```
    
*   ### escape\_once[](#escape_once-latest)
    
    Escapes or encodes a string, but doesn’t include already-escaped characters.
    
    ##### Input
    
    ```text
    {{ "1 < 2 & 3" | escape_once }}
    ```
    
    ##### Output
    
    ```text
    1 < 2 & 3
    ```
    
*   ### hex\_base64[](#hex_base64-latest)
    
    Returns a base64 encoding of a hex digest, like ones returned by the `hmac_sha256` filter.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | hmac_sha256: "some_key" | hex_base64 }}
    ```
    
    ##### Output
    
    ```text
    bd23cyOCFrzicxM7w/ahKoJPQd0YTQlFLwXHZZ2ufVc=
    ```
    
*   ### hmac\_sha1[](#hmac_sha1-latest)
    
    Converts a string into an hmac\_sha1 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | hmac_sha1: "some_key" }}
    ```
    
    ##### Output
    
    ```text
    2bdf556c9a75766f258d1e2824f6d0e31d1beedc
    ```
    
*   ### hmac\_sha256[](#hmac_sha256-latest)
    
    Converts a string into an hmac\_sha256 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | hmac_sha256: "some_key" }}
    ```
    
    ##### Output
    
    ```text
    6dddb773238216bce273133bc3f6a12a824f41dd184d09452f05c7659dae7d57
    ```
    
*   ### lstrip[](#lstrip-latest)
    
    Strips all whitespace, including tabs, spaces, and newlines, from the left side of a string.
    
    ##### Input
    
    ```text
    text{{ " Customer.io " | lstrip }}text
    ```
    
    ##### Output
    
    ```text
    textCustomer.io text
    ```
    
*   ### md5[](#md5-latest)
    
    Converts a string into an md5 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | md5 }}
    ```
    
    ##### Output
    
    ```text
    d52b6a207bf5255c05b1d0056230617e
    ```
    
*   ### newline\_to\_br[](#newline_to_br-latest)
    
    Replaces newline with an HTML line break. input: See [this](https://shopify.github.io/liquid/filters/newline_to_br/) example for output.
    
    ##### Input
    
    ```text
    <br />
    Customer.io<br />
    liquid<br />
    ```
    
*   ### normalize\_whitespace[](#normalize_whitespace-latest)
    
    Replaces any occurrence of whitespace with a single space.
    
    ##### Input
    
    ```text
    {{ "a \n b" | normalize_whitespace }}
    ```
    
    ##### Output
    
    ```text
    a b
    ```
    
*   ### number\_of\_words[](#number_of_words-latest)
    
    Counts the number of words in text. [Learn about counting Chinese-Japanese-Korean characters](https://liquidjs.com/filters/number_of_words.html).
    
    ##### Input
    
    ```text
    {{ "Welcome to Customer.io!" | number_of_words }}
    ```
    
    ##### Output
    
    ```text
    3
    ```
    
*   ### pluralize[](#pluralize-latest)
    
    Outputs the singular or plural version of a string based on the value of a number. The first parameter is the singular string and the second parameter is the plural string.
    
    ##### Syntax
    
    ```text
    {{ int-val | pluralize: 'singular', 'plural'}}
    ```
    
    ##### Input
    
    ```text
    {{ event.item_count | pluralize: 'item', 'items' }}
    ```
    
    ##### Output
    
    ```text
    3 items
    ```
    
*   ### prepend[](#prepend-latest)
    
    Adds a string to the beginning of another string.
    
    ##### Input
    
    ```text
    {{ "Sufferin' succotash!" | prepend: "Sylvester: " }}
    ```
    
    ##### Output
    
    ```text
    Sylvester: Sufferin' succotash!
    ```
    
*   ### remove\_first[](#remove_first-latest)
    
    Removes the first occurrence of a value from a string.
    
    ##### Input
    
    ```text
    {{ "folks that's all, folks!" | remove_first: "folks" }}
    ```
    
    ##### Output
    
    ```text
    that's all folks!
    ```
    
*   ### remove\_last[](#remove_last-latest)
    
    Remove the last occurence of a string within a substring.
    
    ##### Input
    
    ```text
    {{ "foobarbar" | remove_last: "bar" }}
    ```
    
    ##### Output
    
    ```text
    foobar
    ```
    
*   ### remove[](#remove-string-latest)
    
    Removes a value from a string.
    
    ##### Input
    
    ```text
    {{ "And that's all, folks!" | remove: ", folks" }}
    ```
    
    ##### Output
    
    ```text
    And that's all!
    ```
    
*   ### replace[](#replace-latest)
    
    Find and replace values within a string. The first argument represents the value you want to replace, and the second argument is the replacement.
    
    ##### Syntax
    
    ```text
    {{ "String you want to replace values in" | replace: "find-str", "replace-str" }}
    ```
    
    ##### Input
    
    ```text
    {{ "Coyotes never catch roadrunners!" | replace: "never", "always" }}
    ```
    
    ##### Output
    
    ```text
    Coyotes always catch roadrunners!
    ```
    
*   ### replace\_first[](#replace_first-latest)
    
    Find and replace the first match in a string. The first argument represents the value you want to replace, and the second argument is the replacement.
    
    ##### Syntax
    
    ```text
    {{ "String you want to replace values in" | replace_first: "find-str", "replace-str" }}
    ```
    
    ##### Input
    
    ```text
    {{ "roller rocket roller skates" | replace_first: "roller", "awesome" }}
    ```
    
    ##### Output
    
    ```text
    awesome rocket roller skates
    ```
    
*   ### replace\_last[](#replace_last-latest)
    
    Replace the last occurence of a string within a substring.
    
    ##### Input
    
    ```text
    {{ "foobarbar" | replace_last: "bar", "foo" }}
    ```
    
    ##### Output
    
    ```text
    foobarfoo
    ```
    
*   ### rstrip[](#rstrip-latest)
    
    Strips all whitespace, including tabs, spaces, and newlines, from the right side of a string.
    
    ##### Input
    
    ```text
    text{{ " Customer.io " | rstrip }}text
    ```
    
    ##### Output
    
    ```text
    text Customer.iotext
    ```
    
*   ### sha1[](#sha1-latest)
    
    Converts a string into a sha1 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | sha1 }}
    ```
    
    ##### Output
    
    ```text
    c197ff0ae0a41983362f35ca972c544061c54d4c
    ```
    
*   ### sha256[](#sha256-latest)
    
    Converts a string into a sha256 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | sha256 }}
    ```
    
    ##### Output
    
    ```text
    6dddb773238216bce273133bc3f6a12a824f41dd184d09452f05c7659dae7d57
    ```
    
*   ### slice[](#slice-latest)
    
    Returns the character located at the index specified in the first argument. You can also provide a second argument indicating the length of the string you want to return (if you want to return multiple characters).
    
    If the first argument is a negative number, the index is begins from the end of the string.
    
    ##### Syntax
    
    ```text
    {{ "string" | slice: <req, index of char>, <optional, length of result> }}
    ```
    
    ##### Input
    
    ```text
    {{ "Customer.io" | slice: 3 }}
    {{ "Customer.io" | slice: 3, 3 }}
    {{ "Customer.io" | slice: '-4', 3 }}
    ```
    
    ##### Output
    
    ```text
    t
    tom
    r.i
    ```
    
*   ### slugify[](#slugify-latest)
    
    Converts a string into a lowercase URL slug. Set the mode to specify how characters and spaces should be converted. Then set a boolean value of `true` if you want to retain the original casing of the string. By default, the `slugify` filter replaces spaces and non-alphanumeric characters with dashes and lowercases all letters.
    
    mode
    
    replaces
    
    “none”
    
    no characters
    
    “raw”
    
    spaces
    
    “default”
    
    spaces and non-alphanumeric characters
    
    “pretty”
    
    spaces and non-alphanumeric characters except for .\_~!$&’()+,;=@
    
    “ascii”
    
    spaces, non-alphanumeric, and non-ASCII characters
    
    “latin”
    
    like default, except Latin characters are first transliterated (e.g. àèïòü to aeiou)
    
    ##### Input
    
    ```text
    {{ "The _config.yml file" | slugify }}
    
    {{ "The _config.yml file" | slugify: "pretty" }}
    
    {{ "The _cönfig.yml file" | slugify: "ascii" }}
    
    {{ "The cönfig.yml file" | slugify: "latin" }}
    
    {{ "The cönfig.yml file" | slugify: "latin", true }}
    ```
    
    ##### Output
    
    ```text
    the-config-yml-file
    
    the-_config.yml-file
    
    the-c-nfig-yml-file
    
    the-config-yml-file
    
    The-config-yml-file
    ```
    
*   ### split[](#split-latest)
    
    Divides an input string into an array using a separator you define. This filter is often used with a for loop.
    
    ##### Input
    
    ```text
    {% assign rolling_stones = "Mick, Keith, Ronnie, Charlie" | split: ", " %}
    
    {% for member in rolling_stones %}
      {{ member }}
    {% endfor %}
    ```
    
*   ### strip[](#strip-latest)
    
    Strips all whitespace, including tabs, spaces, and newlines, from the left and right side of a string.
    
    ##### Input
    
    ```text
    text{{ " Customer.io " | strip }}text
    ```
    
    ##### Output
    
    ```text
    Customer.io
    ```
    
*   ### strip\_html[](#strip_html-latest)
    
    Removes HTML characters from a string.
    
    ##### Input
    
    ```text
    {{ "Eh, what's <i>up</i>, <b>Doc</b>?" | strip_html }}
    ```
    
    ##### Output
    
    ```text
    Eh, what's up, Doc?
    ```
    
*   ### strip\_newlines[](#strip_newlines-latest)
    
    Removes line breaks (\\n) from a string.
    
    ##### Example
    
    ```text
    {{ product.description | strip_newlines }}
    ```
    
*   ### titlecase[](#titlecase-latest)
    
    Converts a string to title case.
    
    ##### Syntax
    
    ```text
    {{ 'string' | titlecase }}
    ```
    
    ##### Input
    
    ```text
    {{ "rocket roller skates" | titlecase }}
    ```
    
    ##### Output
    
    ```text
    Rocket Roller Skates
    ```
    
*   ### truncate[](#truncate-latest)
    
    Shortens a string to the specified number of characters, adding an ellipsis if the string is longer than the value provided.
    
    ##### Input
    
    ```text
    {{ "I knew I shoulda taken that left turn at Albuquerque." | truncate: 20 }}
    ```
    
    ##### Output
    
    ```text
    I knew I shoulda ...
    ```
    
*   ### truncatewords[](#truncatewords-latest)
    
    Shortens a string to a specified number of words, rather than characters, and adds an ellipsis if the string contains more words than the value provided.
    
    ##### Input
    
    ```text
    {{ "I knew I shoulda taken that left turn at Albuquerque." | truncatewords: 8 }}
    ```
    
    ##### Output
    
    ```text
    I knew I shoulda taken that left turn...
    ```
    
*   ### upcase[](#upcase-latest)
    
    Converts a string to upper case.
    
    ##### Syntax
    
    ```text
    {{ 'string' | upcase }}
    ```
    
    ##### Input
    
    ```text
    {{ 'acme' | upcase }}
    ```
    
    ##### Output
    
    ```text
    ACME
    ```
    
*   ### uri\_escape[](#uri_escape-latest)
    
    This filter percent encodes special characters in a URI that are not [reserved](https://en.wikipedia.org/wiki/Percent-encoding#Types_of_URI_characters).
    
    ##### Input
    
    ```text
    {{ "https://example.com/?q=foo, \bar?" | uri_escape }}
    ```
    
    ##### Output
    
    ```text
    https://example.com/?q=foo,%20%08ar?
    ```
    
*   ### url\_decode[](#url_decode-latest)
    
    Decodes a string that has been encoded as a URL or has been modified by `url_encode`.
    
    ##### Input
    
    ```text
    {{ "%27Customer.io+is+great%27" | url_decode }}
    ```
    
    ##### Output
    
    ```text
    Customer.io is great
    ```
    
*   ### url\_encode[](#url_encode-latest)
    
    Escapes/encodes URL-unsafe characters in a string.
    
    ##### Input
    
    ```text
    {{ "cool.person@example.com" | url_encode }}
    ```
    
    ##### Output
    
    ```text
    cool.person%40example.com
    ```
    
*   ### xml\_escape[](#xml_escape-latest)
    
    Escapes text for use in XML. If you use this filter in HTML messages (i.e. not webhooks), the final output may differ due to HTML processing.
    
    ##### Input
    
    ```text
    {{ "Have you seen \'Learn the basics: video guide\'?" | xml_escape }}
    ```
    
    ##### Output
    
    ```text
    Have you read &#39;James &amp; the Giant Peach&#39;?
    ```
    
*   ## Miscellaneous[](#miscellaneous-latest)
    
    These are tags that you can use to escape liquid rendering or escape rendering all together.
    
*   ### comment[](#comment-latest)
    
    This tag doesn’t show its contents, providing a way for you to leave notes inside templates for other members of your organization.
    
    ##### Syntax
    
    ```text
    {% comment %} Don't display me! {% endcomment %}
    ```
    
*   ### default[](#default-latest)
    
    Set a [default](https://liquidjs.com/filters/default.html) value when one does not exist. You can use the `default` filter rather than checking for empty strings using `== blank` or `!= blank`.
    
    ##### Example
    
    ```text
    {{ product_color | default: "red" }}
    {{ product_price | default: 2.99 }}
    ```
    
*   ### from\_json[](#from_json-latest)
    
    This filter lets you create values from JSON. `from_json` parses string-encoded (or ‘stringified’) JSON so you can reference its values with liquid. Note that you don’t need this filter for the JSON-encoded values of people, events, or objects; they are already automatically parsed.
    
    ##### Example
    
    ```text
    {% assign var = '{"key": "value", "number": 123, "boolean": true}' | from_json %}
    {{ var.key }}
    {{ var.number }}
    {{ var.boolean }}
    ```
    
    ##### Input
    
    ```text
    {% assign fruit = '{"type": "kiwi", "quantity": 2, "sweet": true}' | from_json %}
    {{ fruit.type }}
    {{ fruit.quantity }}
    {{ fruit.sweet }}
    
    {% assign greeting = '[{"greeting": "hello" }, {"greeting": "hey" }, {"greeting": "hi" }, {"greeting": "howdy" }]' | from_json %}
    {{ intro[0].greeting }}
    {{ intro[1].greeting }}
    {{ intro[2].greeting }}
    {{ intro[3].greeting }}
    ```
    
    ##### Output
    
    ```text
    kiwi
    2
    true
    
    hello
    hey
    hi
    howdy
    ```
    
*   ### generate\_uuid[](#generate_uuid-latest)
    
    Generate a UUID.
    
    ##### Example
    
    ```text
    {% generate_uuid %}
    ```
    
*   ### json[](#json-latest)
    
    Converts values to a JSON-encoded string (same as using `jsonify`). An additional `space` parameter can be specified to format/prettify the JSON.
    
    ##### Input
    
    ```text
    {% assign arr = "foo bar coo" | split: " " %}
    {{ arr | json: 4 }}
    ```
    
    ##### Output
    
    ```text
    [
      "foo",
      "bar",
      "coo"
    ]
    ```
    
*   ### raw[](#raw-latest)
    
    Temporarily disables Liquid processing. You might use this to escape tag processing if you use a conflicting syntax or you want to show raw liquid syntax in your message."
    
    ##### Example
    
    ```text
    {% raw %}
      {{This}} is displayed exactly as typed.
    {% endraw %}
    ```
    
*   ### to\_json[](#to_json-latest)
    
    Outputs the json representation of the input. For example, `{{ customer | to_json }}` sends all your customer data into a JSON variable.
    
    ##### Example
    
    ```text
    {{ customer | to_json }}
    ```
    
*   ### whitespace control[](#whitespace-control-latest)
    
    You can remove whitespace before and/or after a tag using hyphens.
    
    ##### Input
    
    ```text
    {% assign username = "Charlie" %}
    Hello, {{ username -}} !
    ```
    
    ##### Output
    
    ```text
    Hello, Charlie!
    ```
    
*   ## Customer.io Keys[](#customer.io-keys-legacy)
    
    These keys output data related to customers and campaign triggers.
    
*   ### cio\_link[](#cio_link-legacy)
    
    Use this tag to track links in outside of push or in-app messages. This includes `mailto` links. If you use our SDKs, you do not need to use this tag to track links in in-app messages. To track links in *emails*, go to `cio_link_id` below.
    
    The filters `track` and `url_params` are optional. If you exclude these filters, url parameters will be present and tracking will be on. To turn either off, set them to false. For more info on this tag, go to [Link tracking](/journeys/link-tracking/#other-message-types).
    
    Do not use this tag to track [deep links](/journeys/universal-links/#deep-links-vs-universal-links).
    
    ##### Example
    
    ```text
    {% cio_link url:https://example.com %}
    {% cio_link url:https://example.com track:true url_params:true %}
    {% cio_link url:https://example.com track:true url_params:false %}
    {% cio_link url:https://example.com track:false url_params:true %}
    {% cio_link url:https://example.com track:false url_params:false %}
    ```
    
    ##### Output
    
    ```text
    https://e.customeriomail.com/e/c/{string}
    https://e.customeriomail.com/e/c/{string}
    https://e.customeriomail.com/e/c/{string}
    https://example.com?utm_campaign={string}&utm_content={string}&utm_medium={string}&utm_source=customer.io
    https://example.com
    ```
    
*   ### cio\_link\_id[](#cio_link_id-legacy)
    
    Use this to track [deep links](/journeys/universal-links/#deep-links-vs-universal-links) in **emails**. Visit [Track universal and app links in email](/journeys/universal-links/#track-universal-and-app-links-in-email) for instructions.
    
    For links in non-email messages, go to `cio_link` above.
    
    ##### Example
    
    ```text
    <a href="https://yourwebsite.com/confirm?link_id={% cio_link_id %}" class="untracked">Text</a>
    ```
    
*   ### customer attributes[](#customer-attributes-legacy)
    
    You reference customer attributes—data associated directly with a person in Customer.io—in the `customer` scope. You may want to use customer attributes with an `if` conditional, so that you have text to fallback to if a customer doesn’t have the attribute in question.
    
    ##### Syntax
    
    ```text
    {{customer.<attribute_name>}}
    ```
    
    ##### Example
    
    ```text
    {% if customer.name != blank %}
      Hi {{customer.name | capitalize}}
    {% else %}
      Hi Buddy
    {%endif%}
    ```
    
*   ### event properties[](#event-properties-legacy)
    
    If you trigger a campaign using an event, you can reference properties from the event that triggers your campaign in the `event` scope. You may want to use event properties with an `if` conditional, so that you have text to fallback to if an event doesn’t have the property in question or your property doesn’t contain the value you expect.
    
    ##### Syntax
    
    ```text
    {{event.<property>}}
    ```
    
    ##### Example
    
    ```text
    {% if event.type == "purchase" %}
      Thanks for your purchase!
    {% else %}
      Thanks for using our service!
    {%endif%}
    ```
    
*   ### event\_id[](#event_id-legacy)
    
    The id of the event being previewed for the selected sample profile. It throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_id}}
    ```
    
*   ### event\_name[](#event_name-legacy)
    
    The name of the event that triggers a campaign. If you send an event with different casings - for instance, MyEvent and myevent - Customer.io will output the event name that corresponds with the profile. This throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_name}}
    ```
    
*   ### event\_timestamp[](#event_timestamp-legacy)
    
    The UNIX timestamp when a particular event was performed. This throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_timestamp}}
    ```
    
*   ### journey attributes[](#journey-attributes-legacy)
    
    Journey attributes are unique to workflows. You can temporarily store data during a campaign instead of on a customer’s profile. Learn more about [setting journey attributes](/journeys/set-journey-attributes/). To reference journey attributes in messages or webhooks, you’ll use the `journey` object.
    
    ##### Syntax
    
    ```text
    {{journey.<attribute_name>}}
    ```
    
    ##### Example
    
    ```text
    {% if journey.weather != blank %}
      Here's the forecast for the day: {{journey.weather}}!
    {% else %}
      Check out your forecast online at...
    {%endif%}
    ```
    
*   ### object & relationship attributes[](#object-relationship-attributes-legacy)
    
    This syntax lets you reference object or relationship data associated with people, not campaign triggers. For trigger liquid, see [trigger properties](#trigger-properties-latest). The keys you’ll need depend on your use case. See [Objects in liquid](/journeys/objects-in-liquid/#reference-non-trigger-data) for more information, and make sure you [understand the limitations before using this liquid](/journeys/objects-in-liquid/#before-you-begin).
    
    ##### Syntax
    
    ```text
    {{objects.<object-type-name>[#].<object-attribute-name>}} // reference an object attribute
    {{objects.<object-type-name>[#].relationship.<relationship-attribute-name>}} // reference a relationship attribute
    {{customer._relationship.<relationship-attribute-name>}} // reference a relationship attribute for the audience member of object or relationship-triggered campaigns
    ```
    
    ##### Example
    
    ```text
    // list all online classes that a person has not started
    {% for class in objects.online_classes %}
    {% if class.relationship.status == "not_started" %}
      - {{class.name}}
    {% endif %}
    {% endfor %}
    ```
    
*   ### snippets[](#snippets-legacy)
    
    [Create snippets](/journeys/snippets/) to reuse content across your messages. For instance, you could make a footer with a snippet.
    
    ##### Example
    
    ```text
    {{snippets.footer}}
    ```
    
*   ### trigger properties[](#trigger-properties-legacy)
    
    The `trigger` object pulls in data that triggers a transactional message, API-triggered broadcast, and campaigns triggered by webhooks, objects, or relationships. Remember to add fallbacks with conditionals; otherwise, your messages could fail to send if the value and a fallback don’t exist. [Learn more about using `trigger` objects](/journeys/using-liquid/#trigger-properties).
    
    ##### Syntax
    
    ```text
    // For transactional messages, webhook-triggered campaigns, or API-triggered broadcasts
    {{trigger.<data.property>}} 
    
    // For object-triggered campaigns
    {{trigger.<object_type>.<attribute_name>}}
    
    // For object or relationship-triggered campaigns
    {{trigger.relationship.<attribute_name>}}
    ```
    
    ##### Example
    
    ```text
    {% if trigger.first_name %}
      Hi {{trigger.first_name | capitalize}}!
    {% else %}
      Hi friend!
    {%endif%}
    ```
    
*   ### view\_in\_browser\_url[](#view_in_browser_url-legacy)
    
    Our default link that generates a web version of your email, [personalized for each recipient](/view-in-browser). This tag only works in **emails**—it is not supported in other message types like push notifications, in-app messages, SMS, or WhatsApp. If you set up [custom link tracking](/journeys/link-tracking-custom-domain/), your view in browser links use your branded domain. In general, these URLs look something like: `https://e.customeriomail.com/deliveries/....`
    
    ##### Syntax
    
    ```text
    {% view_in_browser_url %}
    ```
    
*   ## Customer.io Unsubscribe Keys[](#customer.io-unsubscribe-keys-legacy)
    
    These keys output unsubscribe links unique to each customer.
    
*   ### manage\_subscription\_preferences\_url[](#manage_subscription_preferences_url-legacy)
    
    Renders a unique unsubscribe link for [a customer and their email-address](/journeys/subscriptions-overview/#unsubscribe-links). This link takes a user to your subscription center where they can manage all of their preferences.
    
    ##### Syntax
    
    ```text
    {% manage_subscription_preferences_url %}
    ```
    
*   ### unsubscribe[](#unsubscribe-legacy)
    
    Renders the word unsubscribe and links to the customer’s unique unsubscribe URL.
    
    ##### Syntax
    
    ```text
    {% unsubscribe %}
    ```
    
*   ### unsubscribe\_url[](#unsubscribe_url-legacy)
    
    Renders a unique unsubscribe link for [a customer and their email-address](/unsubscribes/#how-do-i-add-an-unsubscribe-link-into-a-custom-layout).
    
    ##### Syntax
    
    ```text
    {% unsubscribe_url %}
    ```
    
*   ## Customer.io Meta Keys[](#customer.io-meta-keys-legacy)
    
    These keys output high-level data around your messages, campaigns, and more. Many of the `.id` values are useful as UTM parameters in links so you can log where your traffic is coming from or attribute customer actions to messages.
    
*   ### campaign.id[](#campaign-id-legacy)
    
    “Campaign” in this context represents any workflow. This is the workflow’s ID, which can be found after the workflow type in the URL.
    
    For example, the campaign ID here is 2000: `https://fly.customer.io/env/12345/v2/campaigns/2000/overview.`
    
    And here it’s 1: `https://fly.customer.io/env/109950/composer/newsletters/1/templates/21`."
    
    ##### Syntax
    
    ```text
    {{campaign.id}}
    ```
    
*   ### campaign.name[](#campaign-name-legacy)
    
    “Campaign” in this context represents any workflow. The name that you assigned your workflow.
    
    ##### Syntax
    
    ```text
    {{campaign.name}}
    ```
    
*   ### campaign.subscription\_topic\_ids[](#campaign-subscription_topic_ids-legacy)
    
    To use this, you must enable our [subscription center](/journeys/subscription-center/). This returns the topic assigned in subscription preferences settings for Campaigns, API Triggered Broadcasts and Newsletters.
    
    ##### Syntax
    
    ```text
    {{campaign.subscription_topic_ids}}
    ```
    
*   ### campaign.type[](#campaign-type-legacy)
    
    “Campaign” in this context represents any workflow.
    
    This returns the type of trigger for a campaign: `behavioral` ([legacy segment-triggered](/journeys/campaign-triggers/#condition-trigger)), `seg_attr` ([attribute or segment-triggered](/journeys/campaign-triggers/#conditions-trigger)), `transactional` (event-triggered), `form`, `date`, `object`, or `relationship`.
    
    For messages sent through our Transactional API, this returns `transactional_message`.
    
    It also returns `triggered_broadcast` for an API-triggered broadcast or `newsletter` accordingly."
    
    ##### Syntax
    
    ```text
    {{campaign.type}}
    ```
    
*   ### content[](#content-legacy)
    
    Use in layouts to indicate where code added via the email editor will be included. You might use this in a template for a transactional message or API-triggered broadcast where you will provide content from the API directly.
    
    ##### Example
    
    ```text
    {{content}}
    ```
    
*   ### delivery\_id[](#delivery_id-legacy)
    
    A URL-compatible base64 string that identifies an instance of a message created for a person. When previewing a message, you’ll see `unsent`. This is generated when the message is drafted or sent.
    
    ##### Syntax
    
    ```text
    {{delivery_id}}
    ```
    
*   ### editor[](#editor-legacy)
    
    Describes the type of editor used to create an action. One of `bee` (drag-and-drop email editor), `html` (code email editor), `wysiwyg` (rich text email editor), or `rich` (rich push editor). For *Create or update person* actions, in-app messages, Design Studio emails, SMS, and custom push, this value is blank.
    
    ##### Syntax
    
    ```text
    {{editor}}
    ```
    
*   ### layout.id[](#layout-id-legacy)
    
    The numerical ID associated with the email layout you’ve used. Only available for emails made with the code or rich text editors.
    
    ##### Syntax
    
    ```text
    {{layout.id}}
    ```
    
*   ### layout.name[](#layout-name-legacy)
    
    The name assigned to the email layout you’re using. Only available for emails made with the code or rich text editors.
    
    ##### Syntax
    
    ```text
    {{layout.name}}
    ```
    
*   ### message.id[](#message-id-legacy)
    
    The numerical ID for a message action in the workflow. For example, an SMS action might have a `{{message.id}}` of 200. Note that this identifies the action in your workflow, not the individual delivery instances. Every SMS delivery generated from the action would have a different `{{delivery_id}}`.
    
    For newsletters, the `message.id` is the value after templates in your URL. For example, the `message.id` here is `21` `https://fly.customer.io/env/109950/composer/newsletters/1/templates/21`.
    
    ##### Syntax
    
    ```text
    {{message.id}}
    ```
    
*   ### message.journey\_id[](#message-journey_id-legacy)
    
    The ID for the path a person went through in a Campaign or API-triggered Broadcast. You can use this value to trace message metrics back to a person’s path through a journey using the `journey.id` value sent in our [Reporting Webhooks](/webhooks).
    
    ##### Syntax
    
    ```text
    {{message.journey_id}}
    ```
    
*   ### message.name[](#message-name-legacy)
    
    The name you give your message in the workflow, like “Welcome to ACME!”
    
    ##### Syntax
    
    ```text
    {{message.name}}
    ```
    
*   ### message.preheader[](#message-preheader-legacy)
    
    For email messages only, if your message has a preheader value set, this tag echos it.
    
    ##### Syntax
    
    ```text
    {{message.preheader}}
    ```
    
*   ### message.send\_to\_unsubs[](#message-send_to_unsubs-legacy)
    
    If the message is set to send to unsubscribed users, this returns true. Otherwise, it returns false.
    
    ##### Syntax
    
    ```text
    {{message.send_to_unsubs}}
    ```
    
*   ### message.subject[](#message-subject-legacy)
    
    If your message has a subject, or the message subject is different from the message name, this tag echos it.
    
    ##### Syntax
    
    ```text
    {{message.subject}}
    ```
    
*   ### message.subscription\_topic\_ids[](#message-subscription_topic_ids-legacy)
    
    To use this, you must enable our [subscription center](/journeys/subscription-center/). This returns the topic ID of the subscription preference assigned to Campaigns, API-triggered Broadcasts and Newsletters. If there is a message-level override of the topic (Campaigns and API-triggered Broadcasts only), it will return the message-level topic ID.
    
    ##### Syntax
    
    ```text
    {{message.subscription_topic_ids}}
    ```
    
*   ### message.type[](#message-type-legacy)
    
    This refers to the type of a particular workflow action. Possible values are: `email_action`, `delay_seconds_action`, `delay_time_window_action`, `split_randomized_action`, `webhook_action`, `twilio_action`, `slack_action`, `attribute_update_action`, `filter_match_delay_action`, `grace_period_action`, `push_action`, `conditional_wait_action`, `conditional_branch_action`, `multi_split_branch_action`, `random_cohort_branch_action,` `exit_action`, `static_seg_update_action`, `collection_query_action`, `create_event_action`, `multi_lang_branch_action`, `batch_update_action`, `in_app_action`.
    
    ##### Syntax
    
    ```text
    {{message.type}}
    ```
    
*   ### subscription\_topic\_name[](#subscription_topic_name-legacy)
    
    To use this, you must enable our [subscription center](/journeys/subscription-center/). Renders the name of the subscription topic assigned to a broadcast or campaign. If the topic is overriden for a message, this will render the message-level topic name. Add a [language parameter](/journeys/unsubscribe-faqs/#currently-supported-languages) to translate the name, like `lang='pt'`. If the language doesn’t match a translation in your subscription center, customers will see the default language.
    
    ##### Syntax
    
    ```text
    {% subscription_topic_name %}
    {% subscription_topic_name lang='pt' %}
    ```
    
*   ## Variable Tags[](#variable-tags-legacy)
    
    Tags define the logic of your liquid. Variable tags help you define and alter variables.
    
*   ### assign[](#assign-legacy)
    
    Assign a value to a variable.
    
    ##### Syntax
    
    ```text
    {% assign var_name = 'value' %} 
    ```
    
    ##### Input
    
    ```text
    {% assign favorite_food = 'apples' %} 
    ```
    
    ##### Output
    
    ```text
    {{ favorite_food }}
    ```
    
*   ### capture[](#capture-legacy)
    
    Captures contents and assigns them to a variable.
    
    ##### Input
    
    ```text
    {% capture about_me %}I am 28 and my favorite food is pasta.{% endcapture %}
    ```
    
    ##### Output
    
    ```text
    {{ about_me }}
    ```
    
*   ## Iterative Tags[](#iterative-tags-legacy)
    
    Loop or iterate over data.
    
*   ### cycle[](#cycle-legacy)
    
    In a ‘for’ loop, this tag loops through and outputs strings in the order they were passed.
    
    ##### Input
    
    ```text
    <ul>{% assign characters = "coyote,bugs,tweety" | split: "," %} 
      {% for character in characters %} 
      <li class="{% cycle 'odd', 'even' %}">{{ character }}</li> 
      {% endfor %}
    </ul> 
    ```
    
    ##### Output
    
    ```text
    <ul> 
      <li class='odd'>coyote</li>
      <li class='even'>bugs</li> 
      <li class='odd'>tweety</li> 
    </ul>
    ```
    
*   ### for loop[](#for-loop-legacy)
    
    Repeatedly executes a block of code, most commonly to perform an operation for each item in an array. You might use a for loop in a message to provide a receipt of purchases (assuming an array of items in a purchase). [Find more information about for loops and iteration here.](https://shopify.github.io/liquid/tags/iteration/)
    
    ##### Syntax
    
    ```text
    {% for item in array %}
      {{ item }}
    {% endfor %}
    ```
    
    ##### Example
    
    ```text
    {% comment %} You can output each item of the array {% endcomment %}
    {% for member in members_of_band %}
      {{member}}
    {% endfor %}
    
    {% comment %} If the items are objects, you can output properties from each object {% endcomment %}
    {% for product in event.products %}
      - {{ product.title }} x {{ product.price }}
    {% endfor %}
    ```
    
*   ## Conditional Tags[](#conditional-tags-legacy)
    
    Set conditions to determine the output.
    
*   ### case[](#case-legacy)
    
    Creates a set of conditions depending on a variable’s specific value—like a set of if, if-else, else conditions.
    
    For example, you might use this to display different text depending on if a customer lives in a specific country.
    
    ##### Syntax
    
    ```text
    {% case condition %}
      {% when "value1" %}
        text when condition is value1.
      {% when "value2" or "value3" %}
        text when condition is value2 or value3
      {% else %}
        text when condition does not match other conditions
    {% endcase %}
    ```
    
*   ### if[](#if-legacy)
    
    Executes a block of code if a condition is met. We execute the first true condition. Use `elsif` to add multiple ‘if’ conditions and `else` for the block of code you want to execute if all conditions are false. [Find more information about conditional liquid here](https://github.com/customerio/liquid/wiki/Liquid-for-Designers#if--else).
    
    ##### Example
    
    ```text
    Hey
    {% if customer.first_name %}
      {{customer.first_name}}
    {% else %}
      there
    {% endif %}
    !
    
    {% if customer.lastEventType == "sports" %}
      You last attended a sports event, so we thought you might like to try out our leagues! Fill out our interest form below.
    {% elsif customer.lastEventType == "theater" %}
      You attended a theater event, so we thought you might like to try out our after show parties! Fill out our interest form below.
    {% elsif customer.lastEventType %} 
      {% comment %} If the attribute exists and does not equal sports or theater, then this will render. {% endcomment %}
      You last attended {{customer.lastEventType}}; we'd love to hear what other offerings you'd like from us in the form below.
    {% else %} 
      {% comment %} If the attribute does not exist, this will render. {% endcomment %}
      Let us know your interests in the form below so we can better serve you!
    {% endif %}
    ```
    
*   ### unless[](#unless-legacy)
    
    Like an if conditional, but reversed: this tag executes a block of code if your condition is *not* met.
    
    ##### Example
    
    ```text
    {% unless product.name == "cool beans" %}
      The beans are not cool.
    {% endunless %}
    ```
    
*   ## Logical Operators[](#logical-operators-legacy)
    
    Logical operators determine the basic rules for evaluating true or false statements. You can also use `and` and `or` operators to combine logic statements to evaluate multiple conditions.
    
*   ### and[](#and-legacy)
    
    Evaluate a statement as true when both conditions are true.
    
    ##### Syntax
    
    ```text
    {% if condition1 and condition2 %}
      // do something if both condition1 and condition 2 are true
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.name == "bugs bunny" and event.episode_start == true %}
      What's up doc?
    {% else %}
      That's all folks!
    {% endif %}
    ```
    
*   ### does not equal (!=)[](#does-not-equal-legacy)
    
    Use `!=` to check that two values are *not* equal to each other.
    
    ##### Example
    
    ```text
    {% if customer.name != "daffy duck" %}
      Duck season!
    {% else %}
      Wabbit season!
    {%endif%}
    ```
    
*   ### equals (==)[](#equals-legacy)
    
    Use `==` to check if two values are equal to each other.
    
    ##### Example
    
    ```text
    {% if customer.name == "daffy duck" %}
      Wabbit season!
    {% else %}
      Duck season!
    {% endif %}
    ```
    
*   ### greater than and greater than or equal to (>, >=)[](#greater-than-and-greater-than-or-equal-to-legacy)
    
    Use `>` to match when one value is greater than another. Use `>=` to match when one value is greater than *or* equal to another.
    
    ##### Syntax
    
    ```text
    {% if val1 > val2 %}
      {% comment %}do something if val1 is greater than val2{% endcomment %}
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.acct_age_years > 1 %}
      Thanks for being with us these past years
    {% else %}
      Thanks for spending the last year with us!
    {% endif %}
    ```
    
*   ### less than and less than or equal to (<, <=)[](#less-than-and-less-than-or-equal-to-legacy)
    
    Use `<` to match when one value is less than another. Use `<=` to match when one value is less than *or* equal to another.
    
    ##### Syntax
    
    ```text
    {% if val1 < val2 %}
      {% comment %}do something if val1 is less than val2{% endcomment %}
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.purchases < 5 %}
      Thanks for your support
    {% else %}
      Thanks for spending the last year with us!
    {% endif %}
    ```
    
*   ### or[](#or-legacy)
    
    Evaluate a statement as true when either of two conditions are true.
    
    ##### Syntax
    
    ```text
    {% if condition1 or condition2 %}
      {% comment %}do something if either condition1 and condition 2 are true{% endcomment %}
    {% endif %}
    ```
    
    ##### Example
    
    ```text
    {% if customer.name == "bugs bunny" or customer.group == "looney toons" %}
      That's all folks!
    {% else %}
      See you later!
    {% endif %}
    ```
    
*   ## Timestamps and Dates[](#timestamps-and-dates-legacy)
    
    Use these tags to get and manipulate dates and times.
    
*   ### add\_day[](#add_day-legacy)
    
    Adds a day, or multiple days, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | add_day: <int_days> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | add_day: 7 }}
    ```
    
*   ### add\_month[](#add_month-legacy)
    
    Adds a month, or multiple months, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | add_month: <int_months> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | add_month: 7 }}
    ```
    
*   ### add\_year[](#add_year-legacy)
    
    Adds a year, or multiple years, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | add_year: <int_years> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | add_year: 4 }}
    ```
    
*   ### countdown[](#countdown-legacy)
    
    Creates a countdown timer in your message, helping you alert your audience to how soon an event they’re interested in is set to happen. Countdown timers take several parameters. At the minimum, a countdown must include the font size, the foreground (font) color, the background color, and the time you want to count down to. **You can only set this to count down from a *static timestamp*; you cannot set the time to count down based on a customer’s attribute, for instance.**
    
    The countdown timer cannot contain more than 60 frames. This limits the size of the animated GIF in your messages. So, if the resolution is set to seconds, the counter will stop after 60 seconds from when the person opens their message. The countdown image reloads when a person opens the message again, so the counter will always be relevant to the user’s current time, but it cannot count indefinitely.
    
    Parameter
    
    required
    
    format
    
    default
    
    description
    
    point
    
    ✓
    
    integer
    
    The font size for the timer
    
    time
    
    ✓
    
    ISO 8601 timestamp
    
    The date and time you want to countdown to in the format `YYYY-MM-DD hh:mm:ss (GMT)`. Remember to close the time in quotes, as the value includes a space. This field does not accept liquid variables.
    
    fg
    
    ✓
    
    hex color
    
    The foreground (font) hexidecimal color
    
    bg
    
    ✓
    
    hex color
    
    The background hexidecimal color
    
    apng
    
    boolean
    
    false
    
    Determines whether to show your countdown as a gif (default) or animated PNG. Note that some browsers/email clients don’t support apng images.
    
    font
    
    string
    
    inter, roboto
    
    The font family for your timer
    
    weight
    
    string
    
    normal
    
    The font weight, takes normal CSS `font-weight` values.
    
    locale
    
    language code
    
    en
    
    The language you want to display: `en` (English), `ru` (Russian), `jp` (Japanese), `zh` (Chinese), `pt` (Portugese), `es` (Spanish), and `fr` (French)
    
    looping
    
    boolean
    
    false
    
    Determines whether the countdown timer should restart after it finishes
    
    resolution
    
    one of S, M, H, D
    
    S
    
    Determines how often the timer counts down—by the second, minute, hour, or day.
    
    frames
    
    integer
    
    1
    
    Number of seconds you want to show, based on the resolution, where seconds: 60, minutes: 2, hours: 1, days: 1
    
    ##### Example
    
    ```text
    {% countdown point:64 font:roboto weight:light fg:000000 bg:f2f6f9 time:"2022-07-04 12:00:00 (GMT)" locale:en looping:true resolution:S frames:2 %}
    ```
    
    [![countdown-timer.png
    ](https://docs.customer.io/images/countdown-timer.png)](#8aca4f25c6b61d7d00851acc7cbf0828-lightbox)
    
*   ### date[](#date-legacy)
    
    Format a date. Use the [Ruby syntax reference](https://ruby-doc.org/stdlib-2.5.1/libdoc/time/rdoc/Time.html#method-c-parse) for more information about date formatting syntax.
    
    ##### Input
    
    ```text
    {{ 1483272000 | date: '%H:%M, %a, %b %d, %Y' }}
    ```
    
    ##### Output
    
    ```text
    12:00, Sun, Jan 01, 2017
    ```
    
*   ### event\_timestamp[](#event_timestamp-legacy)
    
    The UNIX timestamp when a particular event was performed. This time is different from the `now` tag! This throws an error if the event has not been sent recently (within the last ~30 days).
    
    ##### Syntax
    
    ```text
    {{event_timestamp}}
    ```
    
*   ### now[](#now-legacy)
    
    The current time in UTC. You must [format time](https://ruby-doc.org/stdlib-2.5.1/libdoc/time/rdoc/Time.html#method-c-parse) with `date`.
    
    To modify date or time with `add` or `subtract` filters you must convert `now` into a unix timestamp first using `date: '%s'`. If you use our built in `add_day`, `add_month`, or `add_year` filters, you must convert the timestamp to an integer first. You can do this by using the `plus` filter to add `0` as shown in the second example below.
    
    ##### Example
    
    ```text
    {{ 'now' | date: '%I:%M %p %B %d, %Y' }}
    {{ 'now' | date: '%s' | plus: 0 | add_day: 1 | date: '%I:%M %p %B %d, %Y'}}
    ```
    
    ##### Output
    
    ```text
    08:28 AM May 11, 2021
    08:28 AM May 12, 2021
    ```
    
*   ### subtract\_day[](#subtract_day-legacy)
    
    Subtracts a day, or multiple days, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | subtract_day: <int_days> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | subtract_day: 7 }}
    ```
    
*   ### subtract\_month[](#subtract_month-legacy)
    
    Subtracts a month, or multiple months, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | subtract_month: <int_months> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | subtract_month: 2 }}
    ```
    
*   ### subtract\_year[](#subtract_year-legacy)
    
    Subtracts a year, or multiple years, to a given timestamp.
    
    ##### Syntax
    
    ```text
    {{ <unix_timestamp> | subtract_year: <int_years> }}
    ```
    
    ##### Example
    
    ```text
    {{ 1477430251 | subtract_year: 4 }}
    ```
    
*   ### timezone[](#timezone-legacy)
    
    Converts a timestamp to a time zone you specify. You can use `now` instead of a timestamp. You can convert to any time zone using numerical format, as an offset from UTC (e.g. -5 for EST). Otherwise, unix timestamps default to UTC. You can also specify the [region using a string, like `America/Los_Angeles`](/journeys/example-timezones/#region). Check out our [blog](https://customer.io/blog/easy-date-formatting-with-liquid/#formatting-dates-and-times-in-liquid) for more, common examples for formatting timestamps.
    
    ##### Example
    
    ```text
    {{ 1483272000 | timezone: '-8' | date: '%H:%M, %a, %b %d, %Y' }}
    {{ 1483272000 | timezone: 'America/Los_Angeles' | date: '%H:%M, %a, %b %d, %Y' }}
    {{ 1483272000 | timezone: 'America/Los_Angeles' | date: '%a., %-m/%d at %I:%M %P %Z' }}
    ```
    
    ##### Output
    
    ```text
    04:00, Sun, Jan 01, 2017
    04:00, Sun, Jan 01, 2017
    Sun., 1/01 at 4:00 am PST
    ```
    
*   ## Array Filters[](#array-filters-legacy)
    
    Liquid used to filter and manipulate arrays (lists of values). If your event or another incoming value is an array, you may iterate over the array with a `for` loop or grab items at a particular index of the array, to display information for your audience.
    
*   ### compact[](#compact-legacy)
    
    Removes `nil` (empty) values from an array.
    
    ##### Input
    
    ```text
    {{ "mick, keith, nil, Charlie" | compact }} 
    ```
    
    ##### Output
    
    ```text
    mick, keith, Charlie
    ```
    
*   ### concat[](#concat-legacy)
    
    Concatenates arrays, joining them end to end. Does not accept non-arrays passed in as an argument. The resulting array contains all of the elements of both original arrays. `concat` does not remove duplicate entries unless you also use the `uniq` filter.
    
    ##### Input
    
    ```text
    {% assign stones = "mick, keith, ronnie, charlie" | split: ", " %} 
    {% assign beatles = "john, paul, george, ringo" | split: ", " %} 
    {% assign rolling_beatles = stones | concat: beatles %} 
    {{ rolling_beatles | join: ", " }}
    ```
    
    ##### Output
    
    ```text
    mick, keith, ronnie, charlie, john, paul, george, ringo
    ```
    
*   ### first[](#first-legacy)
    
    Returns the first element of the array.
    
    ##### Input
    
    ```text
    acme.characters = ["Wile E Coyote", "Road Runner"]
    {{ acme.characters | first }}
    ```
    
    ##### Output
    
    ```text
    Wile E Coyote
    ```
    
*   ### join[](#join-legacy)
    
    Joins the elements of an array with the character passed as the parameter.
    
    ##### Input
    
    ```text
    acme.characters = ["Wile E Coyote", "Road Runner"] 
    {{ acme.characters | join: ', ' }}
    ```
    
    ##### Output
    
    ```text
    Wile E Coyote, Road Runner
    ```
    
*   ### last[](#last-legacy)
    
    Returns the last element of the array.
    
    ##### Input
    
    ```text
    acme.characters = ["Wile E Coyote", "Road Runner"]
    {{ acme.characters | last }}
    ```
    
    ##### Output
    
    ```text
    Road Runner
    ```
    
*   ### limit[](#limit-legacy)
    
    Return a set number of values from an array or string.
    
    ##### Input
    
    ```text
    {% assign beatles = "john, paul, george, ringo" | split: ", " %} 
    {{ beatles | limit: 2 | join: ", " }}
    ```
    
    ##### Output
    
    ```text
    john, paul
    ```
    
*   ### map[](#map-legacy)
    
    Creates an array of values by extracting the values of a property in an object. You can output your new characters in a [‘for’ loop](#for-loop).
    
    ##### Input
    
    ```text
    Array of objects: [{"name":"coyote"},{"name":"bugs"},{"name":"tweety"}]"
    {% assign names = customer.characters | map: 'name' %}
    ```
    
    ##### Output
    
    ```text
    coyote, bugs, tweety
    ```
    
*   ### remove[](#remove-legacy)
    
    Remove an element from an array. The array can contain objects of any type.
    
    ##### Input
    
    ```text
    {% assign pl = customer.products | remove: customer.products[0] %}
    - {{ customer.products.size }}
    - {{ pl.size }}
    ```
    
    ##### Output
    
    ```text
    - 2 
    - 1
    ```
    
*   ### size[](#size-legacy)
    
    Returns the number of characters (the size) of a string (in characters) or the number of elements in an array.
    
    ##### Input
    
    ```text
    {{ "That's all, folks!" | size }}
    {{ customer.latest_purchase | size }}
    {{ objects.online_classes | size }}
    {{ objects.online_classes.size }}
    ```
    
    ##### Output
    
    ```text
    18 // The number of characters
    4 // If `latest_purchase` is an array, this returns the number of items in the array. Otherwise, it returns a count of characters. 
    2 // The number of objects (onlines classes) that a person is related to.
    2 // Using the size filter with dot notation
    ```
    
*   ### sort[](#sort-legacy)
    
    Sorts the elements of an array by an attribute of an element in that array. Usually used with a ‘for’ loop. The order of the sorted array is case-sensitive! This filter will throw an error when used with any list/array that contains null values.
    
    ##### Input
    
    ```text
    {% assign beatles = "paul, john, ringo, george" | split: ", " %}
    
    {{ beatles | sort | join: ", " }}
    ```
    
    ##### Output
    
    ```text
    george, john, paul, ringo
    ```
    
*   ### sort\_natural[](#sort_natural-legacy)
    
    Sort the items in an array in case-insensitive order.
    
    ##### Input
    
    ```text
    {{ "mick, keith, Charlie, Ronnie" | sort_natural }}
    ```
    
    ##### Output
    
    ```text
    Charlie, keith, mick, Ronnie
    ```
    
*   ### sum[](#sum-legacy)
    
    The `sum` filter concatenates values in an array, including numbers; every value is treated as a string. You can specify an object property to sum, as shown in the third example below.
    
    The `sum` filter doesn’t add number values together. But if you [upgrade](/journeys/liquid-upgrade/#changing-your-liquid-version) to our [latest liquid](/journeys/liquid-tag-list/?version=latest#sum-latest), it will!
    
    ##### Input
    
    ```text
    {% assign nums = '1,2,3' | split: ',' %}
    {{ nums | sum }}
    
    {% assign letters = 'a,b,c' | split: ',' %}
    {{ letters | sum }}
    
    {{ cart.products | sum: 'total_number' }} {% comment %} where `total_number` includes milk,cheese,eggs {% endcomment %}
    
    {{ purchase.products | sum }} {% comment %} where `products` includes true,false {% endcomment %}
    ```
    
    ##### Output
    
    ```text
    123
    abc
    milkcheeseeggs
    truefalse {% comment %} would also concatenate numbers alongside booleans {% endcomment %}
    ```
    
*   ### uniq[](#uniq-legacy)
    
    Removes duplicate elements in an array.
    
    ##### Input
    
    ```text
    {% assign my_array = '"lions", "tigers", "bears", "bears", "lions"' %}
    {{ my_array | uniq | join: ", " }} 
    ```
    
    ##### Output
    
    ```text
    lions, tigers, bears
    ```
    
*   ### where[](#where-legacy)
    
    Creates an array including only the objects with a given property value, or any “truthy” value by default.
    
    ##### Input
    
    ```text
    All Players:
    {% for player in customer.players %} 
      - {{ player.last_name }} 
    {% endfor %} 
    
    Baseball Players:
    {% assign baseball_players = customer.players | where: "sport", "baseball" %} 
    {% for player in baseball_players %} 
      - {{ player.last_name }} 
    {% endfor %}
    
    ----------------------------
    
    All products:
    {% for product in customer.products %}
    - {{ product.title }}
    {% endfor %}
    
    {% assign available_products = customer.products | where: "available" %}
    
    Available products:
    {% for product in available_products %}
    - {{ product.title }}
    {% endfor %}
    ```
    
*   ### where\_not[](#where_not-legacy)
    
    Creates an array of items that **do not match** a given property value, or any “falsey” value by default. When using `where_not`, you provide two items separated by a comma: the property you want to match on and the value you want to match.
    
    ##### Input
    
    ```text
    All players: 
    {% for player in customer.players %} 
      - {{ player.last_name }} 
    {% endfor %} 
    
    Not baseball players: 
    {% assign not_baseball_players = customer.players | where_not: "sport", "baseball" %} 
    {% for player in not_baseball_players %} 
      - {{ player.last_name }} 
    {% endfor %}
    ```
    
    ##### Output
    
    ```text
    All players: 
      - Posey 
      - Maradona 
      - Montana 
      - Gretzky 
      - Jordan 
    
    Not baseball players: 
      - Maradona 
      - Montana 
      - Gretzky 
      - Jordan 
    ```
    
*   ## Number and Currency Filters[](#number-and-currency-filters-legacy)
    
    These are tags and filters that manipulate incoming number, integer, and timestamp values.
    
    Some tags, like the `currency` and `format_number`, take an optional localization parameter, formatting the output for a specific locale. These tags use the format `{{ 10 | currency: "en-us" }}`, which would output `$10.00`.
    
*   ### A list of locales[](#a-list-of-locales-legacy)
    
    We support the following localization values:
    
    ```fallback
    af, ar, az, be, bg, bn, bs, ca, cs, cy, da, de-AT, de-CH, de-DE, de, dz, el-CY, 
    el, en-AU, en-CA, en-CY, en-GB, en-IE, en-IN, en-NZ, en-TT, en-US, en-ZA, en, eo, 
    es-419, es-AR, es-CL, es-CO, es-CR, es-EC, es-ES, es-MX, es-NI, es-PA, es-PE, es-US, 
    es-VE, es, et, eu, fa, fi, fr-CA, fr-CH, fr-FR, fr, gl, he, hi-IN, hi, hr, hu, id, 
    is, it-CH, it, ja, ka, km, kn, ko, lb, lo, lt, lv, mk, ml, mn, mr-IN, ms, na, nb, 
    ne, ng, nl, nn, oc, or, pa, pl, pt-BR, pt, rm, ro, ru, sc, sd, sk, sl, sn, sq, sr, 
    st, sw, ta, te, th, tl, tn, tr, tt, ug, ur, uz, vi, wo, za, zh-CN, zh-HK, zh-TW, 
    zh-YUE, ao, cd, ci, cm, eg, gh, ke, ls, ly, ma, mu, mw, mz, sz, tz, zm
    ```
    
*   ### abs[](#abs-legacy)
    
    Returns the absolute value of a number.
    
    ##### Input
    
    ```text
    {{ 3.14 | abs }}
    ```
    
    ##### Output
    
    ```text
    3.14
    ```
    
*   ### ceil[](#ceil-legacy)
    
    Rounds a number up to the nearest integer.
    
    ##### Input
    
    ```text
    {{ 3.14 | ceil }}
    ```
    
    ##### Output
    
    ```text
    4
    ```
    
*   ### currency[](#currency-legacy)
    
    Converts an integer to currency. This filter can also take an optional localization parameter to format currency for a [specific locale](#number-and-currency-filters).
    
    ##### Input
    
    ```text
    {{ 10 | currency }}
    {{ 123456.78 | currency: "fr" }}
    ```
    
    ##### Output
    
    ```text
    $10.00
    123 456,78€
    ```
    
*   ### floor[](#floor-legacy)
    
    Rounds a number down to the nearest integer.
    
    ##### Input
    
    ```text
    {{ 3.14 | floor }}
    ```
    
    ##### Output
    
    ```text
    3
    ```
    
*   ### format\_number[](#format_number-legacy)
    
    Format a number with a delimiter. This filter also takes an optional localization parameter to format a number for a [specific locale](#number-and-currency-filters-legacy).
    
    **NOTE**: This replaces the former `number_with_delimeter` filter.
    
    ##### Input
    
    ```text
    {{ 10000 | format_number }}
    {{ 123456.78 | format_number: "fr" }} 
    ```
    
    ##### Output
    
    ```text
    10,000
    123 456,78
    ```
    
*   ### random[](#random-legacy)
    
    Generates a random number between 0 and an integer you specify.
    
    ##### Example
    
    ```text
    {% random 100 %}
    ```
    
*   ### round[](#round-legacy)
    
    Rounds a number up or down to the nearest integer, or to a decimal place you specify.
    
    ##### Input
    
    ```text
    {{ 4.32 | round }} 
    {{ 4.32 | round: 1 }}
    ```
    
    ##### Output
    
    ```text
    4
    4.3
    ```
    
*   ### rounded\_currency[](#rounded_currency-legacy)
    
    Rounds a number to the nearest whole integer and formats it to a currency.
    
    ##### Input
    
    ```text
    {{ 3.1415 | rounded_currency }}
    ```
    
    ##### Output
    
    ```text
    $3
    ```
    
*   ## Math Filters[](#math-filters-legacy)
    
    Filters that perform math operations on incoming number or integer values. With the legacy liquid version, if you encounter an error with negatives while using math filters, wrap the negative numbers in quotes.
    
*   ### at\_least[](#at_least-legacy)
    
    Limits a number to a minimum value.
    
    ##### Input
    
    ```text
    {{ 41 | at_least: 42 }}
    ```
    
    ##### Output
    
    ```text
    42
    ```
    
*   ### at\_most[](#at_most-legacy)
    
    Limits a number to a maximum value.
    
    ##### Input
    
    ```text
    {{ 100 | at_most: 99 }}
    ```
    
    ##### Output
    
    ```text
    99
    ```
    
*   ### divided\_by[](#divided_by-legacy)
    
    Divides a number by another number.
    
    ##### Input
    
    ```text
    {{ 10 | divided_by: 2.5 }}
    {{ 10 | divided_by: 4 }}
    {{ 10 | divided_by: 4.0 }}
    ```
    
    ##### Output
    
    ```text
    4.0
    2
    2.5
    ```
    
*   ### minus[](#minus-legacy)
    
    Subtracts a number from another number.
    
    ##### Input
    
    ```text
    {{ 10 | minus: 1 }}
    ```
    
    ##### Output
    
    ```text
    9
    ```
    
*   ### modulo[](#modulo-legacy)
    
    Returns the remainder of division.
    
    ##### Input
    
    ```text
    {{ 3 | modulo: 2 }}
    ```
    
    ##### Output
    
    ```text
    1
    ```
    
*   ### plus[](#plus-legacy)
    
    Adds a number to another.
    
    ##### Input
    
    ```text
    {{ 10 | plus: 1 }}
    ```
    
    ##### Output
    
    ```text
    11
    ```
    
*   ### times[](#times-legacy)
    
    Multiplies a number by another number.
    
    ##### Input
    
    ```text
    {{ 5 | times: 2 }}
    {{ 10 | times: 2.5 }}
    ```
    
    ##### Output
    
    ```text
    10
    25.0
    ```
    
*   ## String Filters[](#string-filters-legacy)
    
    The following filters manipulate strings in templates. You might use these to truncate or set the case of strings you reference from other places, to humanize your messages for recipients.
    
*   ### append[](#append-legacy)
    
    Adds a string to the end of another string.
    
    ##### Input
    
    ```text
    {{ "What's all the hubbub, " | append: "bub?" }}
    ```
    
    ##### Output
    
    ```text
    What's all the hubbub, bub?
    ```
    
*   ### base64[](#base64-legacy)
    
    Base64-encodes a string.
    
    ##### Input
    
    ```text
    {{ 'Hello, world!' | base64 }}
    ```
    
    ##### Output
    
    ```text
    SGVsbG8sIHdvcmxkIQ==
    ```
    
*   ### base64\_decode[](#base64_decode-legacy)
    
    Decode a base64-encoded string.
    
    ##### Input
    
    ```text
    {{ "Zm9vLmJhcg==" | base64_decode }}
    ```
    
    ##### Output
    
    ```text
    foo.bar
    ```
    
*   ### base64\_encode[](#base64_encode-legacy)
    
    Base64-encode a value.
    
    ##### Input
    
    ```text
    {{ "foo.bar" | base64_encode }}
    ```
    
    ##### Output
    
    ```text
    Zm9vLmJhcg==
    ```
    
*   ### base64\_url\_safe\_decode[](#base64_url_safe_decode-legacy)
    
    Decode a string from URL-safe Base64.
    
    ##### Input
    
    ```text
    {{ "Zm9vLmJhcg" | base64_url_safe_decode }}
    ```
    
    ##### Output
    
    ```text
    foo
    ```
    
*   ### base64\_url\_safe\_encode[](#base64_url_safe_encode-legacy)
    
    Encode a string into URL-safe Base64. To produce URL-safe Base64, this filter uses `-` and `_` in place of `+` and `/`.
    
    ##### Input
    
    ```text
    {{ "foo" | base64_url_safe_encode }}
    ```
    
    ##### Output
    
    ```text
    Zm9vLmJhcg
    ```
    
*   ### capitalize[](#capitalize-legacy)
    
    Capitalize the first character in a string.
    
    ##### Input
    
    ```text
    {{ "hello world" | capitalize }}
    ```
    
    ##### Output
    
    ```text
    Hello world
    ```
    
*   ### contains[](#contains-legacy)
    
    Finds a substring inside a string, or the presence of a string in an array of strings. This filter only works with strings; you cannot use it to search for an object in an array of object.
    
    ##### Syntax
    
    ```text
    {% if product.description contains 'lorem ipsum' %}
      You might also be interested in Fillerama or Office Ipsum.
    {% endif %}
    ```
    
*   ### downcase[](#downcase-legacy)
    
    Converts a string to lower case.
    
    ##### Syntax
    
    ```text
    {{ 'STRING' | downcase }}
    ```
    
    ##### Input
    
    ```text
    {{ "ACME" | downcase }}
    ```
    
    ##### Output
    
    ```text
    acme
    ```
    
*   ### escape[](#escape-legacy)
    
    Escaping (or encoding) a string removes special characters.
    
    ##### Input
    
    ```text
    {{ "win+help@customer.io" | escape }}
    ```
    
    ##### Output
    
    ```text
    win%2Bhelp%40customer.io
    ```
    
*   ### escape\_once[](#escape_once-legacy)
    
    Escapes or encodes a string, but doesn’t include already-escaped characters.
    
    ##### Input
    
    ```text
    {{ "1 < 2 & 3" | escape_once }}
    ```
    
    ##### Output
    
    ```text
    1 < 2 & 3
    ```
    
*   ### hex\_base64[](#hex_base64-legacy)
    
    Returns a base64 encoding of a hex digest, like ones returned by the `hmac_sha256` filter.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | hmac_sha256: "some_key" | hex_base64 }}
    ```
    
    ##### Output
    
    ```text
    bd23cyOCFrzicxM7w/ahKoJPQd0YTQlFLwXHZZ2ufVc=
    ```
    
*   ### hmac\_sha1[](#hmac_sha1-legacy)
    
    Converts a string into an hmac\_sha1 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | hmac_sha1: "some_key" }}
    ```
    
    ##### Output
    
    ```text
    2bdf556c9a75766f258d1e2824f6d0e31d1beedc
    ```
    
*   ### hmac\_sha256[](#hmac_sha256-legacy)
    
    Converts a string into an hmac\_sha256 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | hmac_sha256: "some_key" }}
    ```
    
    ##### Output
    
    ```text
    6dddb773238216bce273133bc3f6a12a824f41dd184d09452f05c7659dae7d57
    ```
    
*   ### htmlencode[](#htmlencode-legacy)
    
    Escapes HTML characters into HTML entities.
    
*   ### lstrip[](#lstrip-legacy)
    
    Strips all whitespace, including tabs, spaces, and newlines, from the left side of a string.
    
    ##### Input
    
    ```text
    text{{ " Customer.io " | lstrip }}text
    ```
    
    ##### Output
    
    ```text
    textCustomer.io text
    ```
    
*   ### md5[](#md5-legacy)
    
    Converts a string into an md5 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | md5 }}
    ```
    
    ##### Output
    
    ```text
    d52b6a207bf5255c05b1d0056230617e
    ```
    
*   ### newline\_to\_br[](#newline_to_br-legacy)
    
    Replaces newline with an HTML line break. input: See [this](https://shopify.github.io/liquid/filters/newline_to_br/) example for output.
    
    ##### Input
    
    ```text
    <br />
    Customer.io<br />
    liquid<br />
    ```
    
*   ### pluralize[](#pluralize-legacy)
    
    Outputs the singular or plural version of a string based on the value of a number. The first parameter is the singular string and the second parameter is the plural string.
    
    ##### Syntax
    
    ```text
    {{ int-val | pluralize: 'singular', 'plural'}}
    ```
    
    ##### Input
    
    ```text
    {{ event.item_count | pluralize: 'item', 'items' }}
    ```
    
    ##### Output
    
    ```text
    3 items
    ```
    
*   ### prepend[](#prepend-legacy)
    
    Adds a string to the beginning of another string.
    
    ##### Input
    
    ```text
    {{ "Sufferin' succotash!" | prepend: "Sylvester: " }}
    ```
    
    ##### Output
    
    ```text
    Sylvester: Sufferin' succotash!
    ```
    
*   ### remove\_first[](#remove_first-legacy)
    
    Removes the first occurrence of a value from a string.
    
    ##### Input
    
    ```text
    {{ "folks that's all, folks!" | remove_first: "folks" }}
    ```
    
    ##### Output
    
    ```text
    that's all folks!
    ```
    
*   ### remove\_last[](#remove_last-legacy)
    
    Remove the last occurence of a string within a substring.
    
    ##### Input
    
    ```text
    {{ "foobarbar" | remove_last: "bar" }}
    ```
    
    ##### Output
    
    ```text
    foobar
    ```
    
*   ### remove[](#remove-string-legacy)
    
    Removes a value from a string.
    
    ##### Input
    
    ```text
    {{ "And that's all, folks!" | remove: ", folks" }}
    ```
    
    ##### Output
    
    ```text
    And that's all!
    ```
    
*   ### replace[](#replace-legacy)
    
    Find and replace values within a string. The first argument represents the value you want to replace, and the second argument is the replacement.
    
    ##### Syntax
    
    ```text
    {{ "String you want to replace values in" | replace: "find-str", "replace-str" }}
    ```
    
    ##### Input
    
    ```text
    {{ "Coyotes never catch roadrunners!" | replace: "never", "always" }}
    ```
    
    ##### Output
    
    ```text
    Coyotes always catch roadrunners!
    ```
    
*   ### replace\_first[](#replace_first-legacy)
    
    Find and replace the first match in a string. The first argument represents the value you want to replace, and the second argument is the replacement.
    
    ##### Syntax
    
    ```text
    {{ "String you want to replace values in" | replace_first: "find-str", "replace-str" }}
    ```
    
    ##### Input
    
    ```text
    {{ "roller rocket roller skates" | replace_first: "roller", "awesome" }}
    ```
    
    ##### Output
    
    ```text
    awesome rocket roller skates
    ```
    
*   ### replace\_last[](#replace_last-legacy)
    
    Replace the last occurence of a string within a substring.
    
    ##### Input
    
    ```text
    {{ "foobarbar" | replace_last: "bar", "foo" }}
    ```
    
    ##### Output
    
    ```text
    foobarfoo
    ```
    
*   ### rstrip[](#rstrip-legacy)
    
    Strips all whitespace, including tabs, spaces, and newlines, from the right side of a string.
    
    ##### Input
    
    ```text
    text{{ " Customer.io " | rstrip }}text
    ```
    
    ##### Output
    
    ```text
    text Customer.iotext
    ```
    
*   ### sha1[](#sha1-legacy)
    
    Converts a string into a sha1 hash.
    
    ##### Input
    
    ```text
    {{ "Customer.io" | sha1 }}
    ```
    
    ##### Output
    
    ```text
    c197ff0ae0a41983362f35ca972c544061c54d4c
    ```
    
*   ### sha256[](#sha256-legacy)
    
    Converts a string into the same output as [`hmac_sha256`](/journeys/liquid-tag-list/?version=legacy#hmac_sha256-legacy).
    
    ##### Input
    
    ```text
    {{ "Customer.io" | sha256 }}
    ```
    
    ##### Output
    
    ```text
    6dddb773238216bce273133bc3f6a12a824f41dd184d09452f05c7659dae7d57
    ```
    
*   ### slice[](#slice-legacy)
    
    Returns the character located at the index specified in the first argument. You can also provide a second argument indicating the length of the string you want to return (if you want to return multiple characters).
    
    If the first argument is a negative number, the index is begins from the end of the string.
    
    ##### Syntax
    
    ```text
    {{ "string" | slice: <req, index of char>, <optional, length of result> }}
    ```
    
    ##### Input
    
    ```text
    {{ "Customer.io" | slice: 3 }}
    {{ "Customer.io" | slice: 3, 3 }}
    {{ "Customer.io" | slice: '-4', 3 }}
    ```
    
    ##### Output
    
    ```text
    t
    tom
    r.i
    ```
    
*   ### split[](#split-legacy)
    
    Divides an input string into an array using a separator you define. This filter is often used with a for loop.
    
    ##### Input
    
    ```text
    {% assign rolling_stones = "Mick, Keith, Ronnie, Charlie" | split: ", " %}
    
    {% for member in rolling_stones %}
      {{ member }}
    {% endfor %}
    ```
    
*   ### strip[](#strip-legacy)
    
    Strips all whitespace, including tabs, spaces, and newlines, from the left and right side of a string.
    
    ##### Input
    
    ```text
    text{{ " Customer.io " | strip }}text
    ```
    
    ##### Output
    
    ```text
    Customer.io
    ```
    
*   ### strip\_html[](#strip_html-legacy)
    
    Removes HTML characters from a string.
    
    ##### Input
    
    ```text
    {{ "Eh, what's <i>up</i>, <b>Doc</b>?" | strip_html }}
    ```
    
    ##### Output
    
    ```text
    Eh, what's up, Doc?
    ```
    
*   ### strip\_newlines[](#strip_newlines-legacy)
    
    Removes line breaks (\\n) from a string.
    
    ##### Example
    
    ```text
    {{ product.description | strip_newlines }}
    ```
    
*   ### titlecase[](#titlecase-legacy)
    
    Converts a string to title case.
    
    ##### Syntax
    
    ```text
    {{ 'string' | titlecase }}
    ```
    
    ##### Input
    
    ```text
    {{ "rocket roller skates" | titlecase }}
    ```
    
    ##### Output
    
    ```text
    Rocket Roller Skates
    ```
    
*   ### truncate[](#truncate-legacy)
    
    Shortens a string to the specified number of characters, adding an ellipsis if the string is longer than the value provided.
    
    ##### Input
    
    ```text
    {{ "I knew I shoulda taken that left turn at Albuquerque." | truncate: 20 }}
    ```
    
    ##### Output
    
    ```text
    I knew I shoulda ...
    ```
    
*   ### truncatewords[](#truncatewords-legacy)
    
    Shortens a string to a specified number of words, rather than characters, and adds an ellipsis if the string contains more words than the value provided.
    
    ##### Input
    
    ```text
    {{ "I knew I shoulda taken that left turn at Albuquerque." | truncatewords: 8 }}
    ```
    
    ##### Output
    
    ```text
    I knew I shoulda taken that left turn...
    ```
    
*   ### upcase[](#upcase-legacy)
    
    Converts a string to upper case.
    
    ##### Syntax
    
    ```text
    {{ 'string' | upcase }}
    ```
    
    ##### Input
    
    ```text
    {{ 'acme' | upcase }}
    ```
    
    ##### Output
    
    ```text
    ACME
    ```
    
*   ### url\_decode[](#url_decode-legacy)
    
    Decodes a string that has been encoded as a URL or has been modified by `url_encode`.
    
    ##### Input
    
    ```text
    {{ "%27Customer.io+is+great%27" | url_decode }}
    ```
    
    ##### Output
    
    ```text
    Customer.io is great
    ```
    
*   ### url\_encode[](#url_encode-legacy)
    
    Escapes/encodes URL-unsafe characters in a string.
    
    ##### Input
    
    ```text
    {{ "cool.person@example.com" | url_encode }}
    ```
    
    ##### Output
    
    ```text
    cool.person%40example.com
    ```
    
*   ## Miscellaneous[](#miscellaneous-legacy)
    
    These are tags that you can use to escape liquid rendering or escape rendering all together.
    
*   ### comment[](#comment-legacy)
    
    This tag doesn’t show its contents, providing a way for you to leave notes inside templates for other members of your organization.
    
    ##### Syntax
    
    ```text
    {% comment %} Don't display me! {% endcomment %}
    ```
    
*   ### generate\_uuid[](#generate_uuid-legacy)
    
    Generate a UUID.
    
    ##### Example
    
    ```text
    {% generate_uuid %}
    ```
    
*   ### raw[](#raw-legacy)
    
    Temporarily disables Liquid processing. You might use this to escape tag processing if you use a conflicting syntax or you want to show raw liquid syntax in your message."
    
    ##### Example
    
    ```text
    {% raw %}
      {{This}} is displayed exactly as typed.
    {% endraw %}
    ```
    
*   ### to\_json[](#to_json-legacy)
    
    Outputs the json representation of the input. For example, `{{ customer | to_json }}` sends all your customer data into a JSON variable.
    
    ##### Example
    
    ```text
    {{ customer | to_json }}
    ```
    

Version latestlegacy

*    [Customer.io Keys](#customer.io-keys-latest)
    *   [cio\_link](#cio_link-latest)
    *   [cio\_link\_id](#cio_link_id-latest)
    *   [customer attributes](#customer-attributes-latest)
    *   [event properties](#event-properties-latest)
    *   [event\_id](#event_id-latest)
    *   [event\_name](#event_name-latest)
    *   [event\_timestamp](#event_timestamp-latest)
    *   [journey attributes](#journey-attributes-latest)
    *   [object & relationship attributes](#object-relationship-attributes-latest)
    *   [render\_liquid](#render_liquid-latest)
    *   [snippets](#snippets-latest)
    *   [trigger properties](#trigger-properties-latest)
    *   [view\_in\_browser\_url](#view_in_browser_url-latest)

*    [Customer.io Unsubscribe Keys](#customer.io-unsubscribe-keys-latest)
    *   [manage\_subscription\_preferences\_url](#manage_subscription_preferences_url-latest)
    *   [unsubscribe](#unsubscribe-latest)
    *   [unsubscribe\_url](#unsubscribe_url-latest)

*    [Customer.io Meta Keys](#customer.io-meta-keys-latest)
    *   [campaign.id](#campaign-id-latest)
    *   [campaign.name](#campaign-name-latest)
    *   [campaign.subscription\_topic\_ids](#campaign-subscription_topic_ids-latest)
    *   [campaign.type](#campaign-type-latest)
    *   [content](#content-latest)
    *   [delivery\_id](#delivery_id-latest)
    *   [editor](#editor-latest)
    *   [layout.id](#layout-id-latest)
    *   [layout.name](#layout-name-latest)
    *   [message.id](#message-id-latest)
    *   [message.journey\_id](#message-journey_id-latest)
    *   [message.name](#message-name-latest)
    *   [message.preheader](#message-preheader-latest)
    *   [message.send\_to\_unsubs](#message-send_to_unsubs-latest)
    *   [message.subject](#message-subject-latest)
    *   [message.subscription\_topic\_ids](#message-subscription_topic_ids-latest)
    *   [message.subscription\_topic.name](#message-subscription_topic-name-latest)
    *   [message.type](#message-type-latest)
    *   [subscription\_topic\_name](#subscription_topic_name-latest)

*    [Variable Tags](#variable-tags-latest)
    *   [assign](#assign-latest)
    *   [capture](#capture-latest)

*    [Iterative Tags](#iterative-tags-latest)
    *   [cycle](#cycle-latest)
    *   [for loop](#for-loop-latest)

*    [Conditional Tags](#conditional-tags-latest)
    *   [case](#case-latest)
    *   [if](#if-latest)
    *   [unless](#unless-latest)

*    [Logical Operators](#logical-operators-latest)
    *   [and](#and-latest)
    *   [does not equal (!=)](#does-not-equal-latest)
    *   [equals (==)](#equals-latest)
    *   [greater than and greater than or equal to (>, >=)](#greater-than-and-greater-than-or-equal-to-latest)
    *   [less than and less than or equal to (<, <=)](#less-than-and-less-than-or-equal-to-latest)
    *   [or](#or-latest)

*    [Timestamps and Dates](#timestamps-and-dates-latest)
    *   [add\_day](#add_day-latest)
    *   [add\_month](#add_month-latest)
    *   [add\_year](#add_year-latest)
    *   [countdown](#countdown-latest)
    *   [date](#date-latest)
    *   [date\_to\_long\_string](#date_to_long_string-latest)
    *   [date\_to\_rfc822](#date_to_rfc822-latest)
    *   [date\_to\_string](#date_to_string-latest)
    *   [date\_to\_xmlschema](#date_to_xmlschema-latest)
    *   [event\_timestamp](#event_timestamp-latest)
    *   [now](#now-latest)
    *   [subtract\_day](#subtract_day-latest)
    *   [subtract\_month](#subtract_month-latest)
    *   [subtract\_year](#subtract_year-latest)

*    [Array Filters](#array-filters-latest)
    *   [compact](#compact-latest)
    *   [concat](#concat-latest)
    *   [find](#find-latest)
    *   [find\_exp](#find_exp-latest)
    *   [first](#first-latest)
    *   [group\_by](#group_by-latest)
    *   [group\_by\_exp](#group_by_exp-latest)
    *   [join](#join-latest)
    *   [json\_array\_uniq](#json_array_uniq-latest)
    *   [last](#last-latest)
    *   [limit](#limit-latest)
    *   [map](#map-latest)
    *   [pop](#pop-latest)
    *   [push](#push-latest)
    *   [remove](#remove-latest)
    *   [reverse](#reverse-latest)
    *   [shift](#shift-latest)
    *   [size](#size-latest)
    *   [sort](#sort-latest)
    *   [sort\_natural](#sort_natural-latest)
    *   [sum](#sum-latest)
    *   [uniq](#uniq-latest)
    *   [unshift](#unshift-latest)
    *   [where](#where-latest)
    *   [where\_exp](#where_exp-latest)
    *   [where\_not](#where_not-latest)

*    [Number and Currency Filters](#number-and-currency-filters-latest)
    *   [A list of locales and currency codes](#a-list-of-locales-and-currency-codes-latest)
    *   [abs](#abs-latest)
    *   [ceil](#ceil-latest)
    *   [currency](#currency-latest)
    *   [floor](#floor-latest)
    *   [format\_number](#format_number-latest)
    *   [random](#random-latest)
    *   [round](#round-latest)
    *   [rounded\_currency](#rounded_currency-latest)

*    [Math Filters](#math-filters-latest)
    *   [at\_least](#at_least-latest)
    *   [at\_most](#at_most-latest)
    *   [divided\_by](#divided_by-latest)
    *   [minus](#minus-latest)
    *   [modulo](#modulo-latest)
    *   [plus](#plus-latest)
    *   [times](#times-latest)

*    [String Filters](#string-filters-latest)
    *   [append](#append-latest)
    *   [array\_to\_sentence\_string](#array_to_sentence_string-latest)
    *   [base64](#base64-latest)
    *   [base64\_decode](#base64_decode-latest)
    *   [base64\_encode](#base64_encode-latest)
    *   [base64\_url\_safe\_decode](#base64_url_safe_decode-latest)
    *   [base64\_url\_safe\_encode](#base64_url_safe_encode-latest)
    *   [capitalize](#capitalize-latest)
    *   [cgi\_escape](#cgi_escape-latest)
    *   [contains](#contains-latest)
    *   [downcase](#downcase-latest)
    *   [escape](#escape-latest)
    *   [escape\_once](#escape_once-latest)
    *   [hex\_base64](#hex_base64-latest)
    *   [hmac\_sha1](#hmac_sha1-latest)
    *   [hmac\_sha256](#hmac_sha256-latest)
    *   [lstrip](#lstrip-latest)
    *   [md5](#md5-latest)
    *   [newline\_to\_br](#newline_to_br-latest)
    *   [normalize\_whitespace](#normalize_whitespace-latest)
    *   [number\_of\_words](#number_of_words-latest)
    *   [pluralize](#pluralize-latest)
    *   [prepend](#prepend-latest)
    *   [remove\_first](#remove_first-latest)
    *   [remove\_last](#remove_last-latest)
    *   [remove](#remove-string-latest)
    *   [replace](#replace-latest)
    *   [replace\_first](#replace_first-latest)
    *   [replace\_last](#replace_last-latest)
    *   [rstrip](#rstrip-latest)
    *   [sha1](#sha1-latest)
    *   [sha256](#sha256-latest)
    *   [slice](#slice-latest)
    *   [slugify](#slugify-latest)
    *   [split](#split-latest)
    *   [strip](#strip-latest)
    *   [strip\_html](#strip_html-latest)
    *   [strip\_newlines](#strip_newlines-latest)
    *   [titlecase](#titlecase-latest)
    *   [truncate](#truncate-latest)
    *   [truncatewords](#truncatewords-latest)
    *   [upcase](#upcase-latest)
    *   [uri\_escape](#uri_escape-latest)
    *   [url\_decode](#url_decode-latest)
    *   [url\_encode](#url_encode-latest)
    *   [xml\_escape](#xml_escape-latest)

*    [Miscellaneous](#miscellaneous-latest)
    *   [comment](#comment-latest)
    *   [default](#default-latest)
    *   [from\_json](#from_json-latest)
    *   [generate\_uuid](#generate_uuid-latest)
    *   [json](#json-latest)
    *   [raw](#raw-latest)
    *   [to\_json](#to_json-latest)
    *   [whitespace control](#whitespace-control-latest)

*    [Customer.io Keys](#customer.io-keys-legacy)
    *   [cio\_link](#cio_link-legacy)
    *   [cio\_link\_id](#cio_link_id-legacy)
    *   [customer attributes](#customer-attributes-legacy)
    *   [event properties](#event-properties-legacy)
    *   [event\_id](#event_id-legacy)
    *   [event\_name](#event_name-legacy)
    *   [event\_timestamp](#event_timestamp-legacy)
    *   [journey attributes](#journey-attributes-legacy)
    *   [object & relationship attributes](#object-relationship-attributes-legacy)
    *   [snippets](#snippets-legacy)
    *   [trigger properties](#trigger-properties-legacy)
    *   [view\_in\_browser\_url](#view_in_browser_url-legacy)

*    [Customer.io Unsubscribe Keys](#customer.io-unsubscribe-keys-legacy)
    *   [manage\_subscription\_preferences\_url](#manage_subscription_preferences_url-legacy)
    *   [unsubscribe](#unsubscribe-legacy)
    *   [unsubscribe\_url](#unsubscribe_url-legacy)

*    [Customer.io Meta Keys](#customer.io-meta-keys-legacy)
    *   [campaign.id](#campaign-id-legacy)
    *   [campaign.name](#campaign-name-legacy)
    *   [campaign.subscription\_topic\_ids](#campaign-subscription_topic_ids-legacy)
    *   [campaign.type](#campaign-type-legacy)
    *   [content](#content-legacy)
    *   [delivery\_id](#delivery_id-legacy)
    *   [editor](#editor-legacy)
    *   [layout.id](#layout-id-legacy)
    *   [layout.name](#layout-name-legacy)
    *   [message.id](#message-id-legacy)
    *   [message.journey\_id](#message-journey_id-legacy)
    *   [message.name](#message-name-legacy)
    *   [message.preheader](#message-preheader-legacy)
    *   [message.send\_to\_unsubs](#message-send_to_unsubs-legacy)
    *   [message.subject](#message-subject-legacy)
    *   [message.subscription\_topic\_ids](#message-subscription_topic_ids-legacy)
    *   [message.type](#message-type-legacy)
    *   [subscription\_topic\_name](#subscription_topic_name-legacy)

*    [Variable Tags](#variable-tags-legacy)
    *   [assign](#assign-legacy)
    *   [capture](#capture-legacy)

*    [Iterative Tags](#iterative-tags-legacy)
    *   [cycle](#cycle-legacy)
    *   [for loop](#for-loop-legacy)

*    [Conditional Tags](#conditional-tags-legacy)
    *   [case](#case-legacy)
    *   [if](#if-legacy)
    *   [unless](#unless-legacy)

*    [Logical Operators](#logical-operators-legacy)
    *   [and](#and-legacy)
    *   [does not equal (!=)](#does-not-equal-legacy)
    *   [equals (==)](#equals-legacy)
    *   [greater than and greater than or equal to (>, >=)](#greater-than-and-greater-than-or-equal-to-legacy)
    *   [less than and less than or equal to (<, <=)](#less-than-and-less-than-or-equal-to-legacy)
    *   [or](#or-legacy)

*    [Timestamps and Dates](#timestamps-and-dates-legacy)
    *   [add\_day](#add_day-legacy)
    *   [add\_month](#add_month-legacy)
    *   [add\_year](#add_year-legacy)
    *   [countdown](#countdown-legacy)
    *   [date](#date-legacy)
    *   [event\_timestamp](#event_timestamp-legacy)
    *   [now](#now-legacy)
    *   [subtract\_day](#subtract_day-legacy)
    *   [subtract\_month](#subtract_month-legacy)
    *   [subtract\_year](#subtract_year-legacy)
    *   [timezone](#timezone-legacy)

*    [Array Filters](#array-filters-legacy)
    *   [compact](#compact-legacy)
    *   [concat](#concat-legacy)
    *   [first](#first-legacy)
    *   [join](#join-legacy)
    *   [last](#last-legacy)
    *   [limit](#limit-legacy)
    *   [map](#map-legacy)
    *   [remove](#remove-legacy)
    *   [size](#size-legacy)
    *   [sort](#sort-legacy)
    *   [sort\_natural](#sort_natural-legacy)
    *   [sum](#sum-legacy)
    *   [uniq](#uniq-legacy)
    *   [where](#where-legacy)
    *   [where\_not](#where_not-legacy)

*    [Number and Currency Filters](#number-and-currency-filters-legacy)
    *   [A list of locales](#a-list-of-locales-legacy)
    *   [abs](#abs-legacy)
    *   [ceil](#ceil-legacy)
    *   [currency](#currency-legacy)
    *   [floor](#floor-legacy)
    *   [format\_number](#format_number-legacy)
    *   [random](#random-legacy)
    *   [round](#round-legacy)
    *   [rounded\_currency](#rounded_currency-legacy)

*    [Math Filters](#math-filters-legacy)
    *   [at\_least](#at_least-legacy)
    *   [at\_most](#at_most-legacy)
    *   [divided\_by](#divided_by-legacy)
    *   [minus](#minus-legacy)
    *   [modulo](#modulo-legacy)
    *   [plus](#plus-legacy)
    *   [times](#times-legacy)

*    [String Filters](#string-filters-legacy)
    *   [append](#append-legacy)
    *   [base64](#base64-legacy)
    *   [base64\_decode](#base64_decode-legacy)
    *   [base64\_encode](#base64_encode-legacy)
    *   [base64\_url\_safe\_decode](#base64_url_safe_decode-legacy)
    *   [base64\_url\_safe\_encode](#base64_url_safe_encode-legacy)
    *   [capitalize](#capitalize-legacy)
    *   [contains](#contains-legacy)
    *   [downcase](#downcase-legacy)
    *   [escape](#escape-legacy)
    *   [escape\_once](#escape_once-legacy)
    *   [hex\_base64](#hex_base64-legacy)
    *   [hmac\_sha1](#hmac_sha1-legacy)
    *   [hmac\_sha256](#hmac_sha256-legacy)
    *   [htmlencode](#htmlencode-legacy)
    *   [lstrip](#lstrip-legacy)
    *   [md5](#md5-legacy)
    *   [newline\_to\_br](#newline_to_br-legacy)
    *   [pluralize](#pluralize-legacy)
    *   [prepend](#prepend-legacy)
    *   [remove\_first](#remove_first-legacy)
    *   [remove\_last](#remove_last-legacy)
    *   [remove](#remove-string-legacy)
    *   [replace](#replace-legacy)
    *   [replace\_first](#replace_first-legacy)
    *   [replace\_last](#replace_last-legacy)
    *   [rstrip](#rstrip-legacy)
    *   [sha1](#sha1-legacy)
    *   [sha256](#sha256-legacy)
    *   [slice](#slice-legacy)
    *   [split](#split-legacy)
    *   [strip](#strip-legacy)
    *   [strip\_html](#strip_html-legacy)
    *   [strip\_newlines](#strip_newlines-legacy)
    *   [titlecase](#titlecase-legacy)
    *   [truncate](#truncate-legacy)
    *   [truncatewords](#truncatewords-legacy)
    *   [upcase](#upcase-legacy)
    *   [url\_decode](#url_decode-legacy)
    *   [url\_encode](#url_encode-legacy)

*    [Miscellaneous](#miscellaneous-legacy)
    *   [comment](#comment-legacy)
    *   [generate\_uuid](#generate_uuid-legacy)
    *   [raw](#raw-legacy)
    *   [to\_json](#to_json-legacy)

* * *

Platform

*   [Platform overview](https://customer.io/customer-engagement-platform)
*   [Platform features](https://customer.io/features/)
*   [Journeys](https://customer.io/journeys/)
*   [Data Pipelines](https://customer.io/data-pipelines/)
*   [Parcel](https://customer.io/parcel/)
*   [Pricing](https://customer.io/pricing/)

Resources

*   [Documentation](https://docs.customer.io/)
*   [Release Notes](https://docs.customer.io/release-notes/)
*   [Blog](https://customer.io/blog/)
*   [Community](https://academy.customer.io/community/login)
*   [Competitors](https://customer.io/competitors/)
*   [API](https://docs.customer.io/api/)
*   [Guides](https://customer.io/learn/)

Company

*   [About](https://customer.io/about/)
*   [Careers](https://customer.io/careers/)
*   [Support](https://fly.customer.io/?support=true)
*   [Partners](https://customer.io/partners/)
*   [Startup Program](https://customer.io/startup-program/)
*   [Contact](https://customer.io/contact/)

![Customer.io](https://docs.customer.io/images/cio-logo-no-text-verdant.svg)

[win@customer.io](mailto:win@customer.io)  
  
9450 SW Gemini Dr  
Suite 43920  
Beaverton, Oregon 97008-7105 US

[![LinkedIn](https://docs.customer.io/images/Social Linkedin Fill.svg)](https://www.linkedin.com/company/customer-io)

[![Twitter (X)](https://docs.customer.io/images/Social Twitter Fill.svg)](https://twitter.com/customerio)

[![Youtube](https://docs.customer.io/images/Social Youtube Fill.svg)](https://www.youtube.com/channel/UCkCaWdezRoa8ZyR9pEVaipA)

[![Instagram](https://docs.customer.io/images/Social Instagram Fill.svg)](https://www.instagram.com/customer.io/)

[Status](https://status.customerio.com/) [Terms of Service](https://customer.io/legal/terms-of-service/) [Privacy Policy](https://customer.io/legal/privacy-policy/) @2024 Peaberry Software, Inc.

.st0{fill:#2dbcaf}.st1{fill:#5dc9e1}.st2{fill:#fddd00}.st3{fill:#ce3262}.st4{fill:#00acd7}.st5{fill:#fff}function aiHelperLink(e){$(e).attr("href",function(){return e.href+"?query="+encodeURIComponent($(".ais-SearchBox-input").first().val())})}document.addEventListener("DOMContentLoaded",function(){function e(e){const t=e.querySelector(".combo-btn\_\_label");e.addEventListener("click",function(n){n.preventDefault(),document.querySelectorAll(".combo-btn\_\_menu.open").forEach(e=>{e.classList.remove("open"),e.previousElementSibling.setAttribute("aria-expanded","false")});const o=window.location.pathname.replace(/\\/$/,"")||"/",i=o==="/"?null:\`${o}.md\`;if(!i)return;const a=fetch(i).then(e=>{if(!e.ok)throw new Error(e.status);return e.text()});let s;try{s=navigator.clipboard.write(\[new ClipboardItem({"text/plain":a.then(e=>new Blob(\[e\],{type:"text/plain"}))})\])}catch{s=a.then(e=>navigator.clipboard.writeText(e))}s.then(()=>{typeof trackEvent=="function"&&trackEvent("Docs: Markdown Copied"),e.classList.add("copied"),t?(t.textContent="Copied!",setTimeout(()=>{t.textContent="Copy page",e.classList.remove("copied")},1500)):setTimeout(()=>{e.classList.remove("copied")},1500)}).catch(()=>{t&&(t.textContent="Error",setTimeout(()=>{t.textContent="Copy page"},1500))})})}function t(e){e.addEventListener("click",function(){if(typeof trackEvent=="function"){var t=e.getAttribute("data-sdk-type");t?trackEvent("Docs: Markdown Bundle Downloaded",{sdktype:t,filename:e.getAttribute("data-filename")}):trackEvent("Docs: Markdown Downloaded",{path:e.getAttribute("href")})}document.querySelectorAll(".combo-btn\_\_menu.open").forEach(e=>{e.classList.remove("open"),e.previousElementSibling.setAttribute("aria-expanded","false")})})}document.querySelectorAll(".combo-btn\_\_toggle").forEach(function(e){e.addEventListener("click",function(e){e.stopPropagation();const t=this.nextElementSibling,n=t.classList.contains("open");document.querySelectorAll(".combo-btn\_\_menu.open").forEach(e=>{e.classList.remove("open"),e.previousElementSibling.setAttribute("aria-expanded","false")}),n||(t.classList.add("open"),this.setAttribute("aria-expanded","true"))})}),document.querySelectorAll(".combo-btn\_\_menu").forEach(function(e){e.addEventListener("click",function(e){e.stopPropagation()})}),document.addEventListener("click",function(){document.querySelectorAll(".combo-btn\_\_menu.open").forEach(e=>{e.classList.remove("open"),e.previousElementSibling.setAttribute("aria-expanded","false")})}),document.addEventListener("keydown",function(e){e.key==="Escape"&&document.querySelectorAll(".combo-btn\_\_menu.open").forEach(e=>{e.classList.remove("open"),e.previousElementSibling.setAttribute("aria-expanded","false")})}),document.querySelectorAll(".js-copy-markdown").forEach(e),document.querySelectorAll(".js-download-markdown").forEach(t)})