Email Marketing 101 – Event Variables, Conditional Tags và Ứng Dụng

Lại một tuần nữa chúng ta nói về Email Marketing. Công bằng mà nói, có lẽ mình có thể start một Blog riêng để nói về Email Marketing mất :))

Ở những bài viết trước, mình đã viết về 3 Email Flows cơ bản mà bất kỳ store nào cũng cần có. Chỉ riêng 3 Flows đó thôi đã có thể giúp bạn gia tăng doanh thu, có thêm một chút lợi nhuận rồi.

Ở bài viết ngày hôm nay, mình sẽ bàn sâu hơn về Klaviyo – một Email Platform – cũng như Customer Data Platform mà hầu hết các anh em làm e-Commerce đều sử dụng. Sau bài viết này, bạn có thể hiểu thêm về những tính năng Advanced trong Klaviyo, từ đó có thể customize cách sử dụng theo ý mình muốn, để gia tăng trải nghiệm của khách hàng thông qua Email. Mình cũng có một vài suggestion để áp dụng những kỹ thuật này, trong trường hợp bạn bí ý tưởng 😉

Bài này sẽ hơi khô khan và thuần kỹ thuật, khá là khó đọc nên có gì thì anh em thông cảm nhá :3

Event Variables Là Gì?

Nếu bạn từng sử dụng Flow Abandoned Cart mặc định của Klaviyo (nếu bạn sử dụng Shopify), bạn sẽ thấy một đoạn code khá là loằng ngoằng như này trong Email:

Và khi ấn Preview, chúng ta sẽ thấy đoạn code trên được thay thế bởi hình ảnh, tên sản phẩm và số lượng của một cái Cart mà khách hàng đã “Abandoned”, ví dụ như sau:

Tức là, bằng một cách thần kỳ nào đó, chúng ta có thể kéo thông tin Cart của khách hàng về Klaviyo, sau đó show chúng ở trên Email, từ đó tạo ra trải nghiệm cá nhân hóa tốt hơn cho khách hàng.

Câu hỏi tiếp theo là, vậy thì có những Data nào được bắn lên Klaviyo từ Shopify? Data khi khách Placed Order có khác với Data khi khách Abandoned Checkout không? Có những trường hợp nào chúng ta có thể sử dụng những thông tin này để tạo ra trải nghiệm tốt hơn cho khách hàng?

Câu trả lời nằm ở từ khóa: Event Variables.

Đầu tiên thì phải quay về bản chất khi bạn tạo Flow – bạn sẽ được chọn khi nào thì Trigger cái Flow đó (khi nào thì một Flow sẽ được kích hoạt đối với 1 người dùng – từ đó sẽ gửi 1 loạt các Email trong Flow đó).

Sẽ có các loại Trigger sau đây:

Trong đó, Trigger mà chúng ta thường sử dụng nhiều nhất, đó là Metric – hay còn gọi là Event (trừ Welcome Series – là chọn Trigger dạng List thôi).

Với mỗi Metric (từ giờ sẽ gọi là Event), Shopify sẽ gửi kèm thêm rất nhiều thông tin liên quan đến Event đó để chúng ta có thể sử dụng trong Email – đây chính là Event Variables. Ví dụ, với Placed Order, chúng ta sẽ có thông tin order của khách, có thông tin shipping, v.v…

Với Started Checkout (là Event sử dụng cho Abandoned Cart), chúng ta sẽ có thông tin khách hàng, thông tin Cart, số lượng item, ảnh ọt, đại loại vậy.

Vậy thì, truy cập những thông tin này ở đâu? Và làm sao để chúng ta tự viết được một đoạn code để kéo những thông tin này vào Email?

Đầu tiên, bạn cần tạo 1 Flow với Trigger là Event mà bạn muốn sử dụng (ví dụ là Started Checkout đi). Sau đó, bạn tạo 1 Email và chọn Edit Content như bình thường.

Hướng ánh nhìn của bạn lên góc phải màn hình, bạn sẽ thấy nút “Preview and Test”:

Lưu ý, với những nội dung được kéo ra từ Event Variables, bạn phải Preview qua tính năng này mới có thể thấy được. Nếu Preview ở ngoài phần Flow, bạn sẽ thấy phần content đó trắng tinh.

Khi ấn Preview, bạn sẽ thấy một giao diện như sau – với cột bên phải chính là list các Event Variables mà Event đó cung cấp:

Nếu bạn sử dụng Shopify – bạn sẽ thấy mặc định Shopify bắn lên rất nhiều Data – và bạn có thể sử dụng tất cả các Data này để cho vào Email tùy thích. Từ list sản phẩm trong Cart, số lượng sản phẩm, Cart có sử dụng coupon không, giảm bao nhiêu tiền, v.v…tất cả đều có thể được sử dụng, nhằm mang lại trải nghiệm cá nhân hóa nhất có thể – ví dụ như Email dưới đây:

Để sử dụng những Data này trong Email, bạn chỉ cần click vào Variable mà bạn muốn sử dụng – ngay lập tức Klaviyo sẽ copy cho bạn Variable đó, và bạn chỉ cần paste vào trong Email là xong:

Ví dụ, bạn có thể copy Variable checkout_url (ví dụ là {{ event.extra.checkout_url }}) – sau đó dán vào phần Link của một cái Button/Call To Action chẳng hạn – bạn sẽ có ngay một Button được cá nhân hóa theo từng khách hàng – họ sẽ truy cập được link thanh toán cho Cart của họ ngay lập tức. Cool huh?

Ví dụ như thế này

Khi preview nó sẽ ra như này:

Vậy là xong!

Chỉ cần test vài lần là bạn sẽ hiểu rõ cách sử dụng Event Variables, và bạn đã có trong tay thêm một vũ khí rất mạnh trong hành trình làm Email Marketing.

Dưới đây, mình sẽ show cho bạn một vài cách sử dụng Event Variables, kết hợp với Conditional Tags và Dynamic Table của Klaviyo để tạo nên những trải nghiệm tốt hơn cho khách rất nhiều.

Technique #1 – Show Discount Code trong Abandoned Cart

Như ví dụ ở trên, mình có một đoạn email mà mình muốn nó chỉ xuất hiện nếu khách hàng sử dụng Coupon trong Cart (ví dụ là kêu khách order đi, mày đang có coupon 10% OFF trong Cart), còn nếu không thì sẽ show một đoạn content khác – kiểu như này:

Cart không có coupon thì sẽ trông như này
Cart có coupon thì sẽ trông như này

Bằng cách này, mình không cần phải tách Abandoned Cart ra làm 2 Flows (một Flows cho những Cart có Coupon, một cho những Cart không có Coupon), mà vẫn tối ưu được trải nghiệm của cả 2 loại khách hàng.

Để làm được điều này, bạn sẽ cần một đoạn code sau:

{% if event|lookup:'Discount Codes' %}
[CONTENT NẾU CÓ DISCOUNT CODE]
{% else %}
[CONTENT NẾU KHÔNG CÓ DISCOUNT CODE]
{% endif %}

Lưu ý, bạn sẽ cần chuyển sang định dạng Code để có thể sử dụng được Conditional Tags. Ngoài ra, đoạn code này chỉ work nếu bạn sử dụng Shopify, còn nếu bạn dùng các Platform khác, bạn cần thay Event Variables cho phù hợp

Với đoạn code trên, Klaviyo sẽ tìm trong Event Variable, xem xem Variable “Discount Codes” có tồn tại hay không. Nếu có, nó sẽ show ra đoạn Content dành cho khách hàng có Discount Code trong Cart. Nếu không có (else), nó sẽ show ra đoạn content mặc định dành cho trường hợp không có discount code.

Với đoạn code có Discount Code, mình có sử dụng thêm 2 Event Variables nữa để tăng độ cá nhân hóa – đó là tên Coupon và số tiền được giảm – 2 Variables này đều lấy trực tiếp từ Event Started Checkout được bắn lên Shopify:

I also saw that you got a special coupon - "{{ event|lookup:'Discount Codes'|lookup:'0' }}" - which gives you ${{ event|lookup:'Total Discounts' }} OFF for this cart!

Kết quả là mình sẽ được một đoạn email như thế này:

Cool?

Technique #2 – re-Check Personalized Design (Customily Edition)

Nếu bạn bán Personalized – bao gồm cả những loại Personalized đơn giản như Name, hay phức tạp hơn như Clipart Customized (kiểu như Gossby), chắc chắn bạn sẽ gặp một trường hợp, đó là khách hàng order nhầm. Có thể là sai tên, sai clipart, v.v…

Quan trọng hơn, chỉ khi nhận hàng, khách mới biết là họ nhầm. Và như thế là quá muộn. Hoặc là chúng ta phải ship lại hàng cho khách, hoặc là ăn một cái dispute vào mồm. Dù là gì thì cũng không tốt chút nào.

Thay vào đó, có một cách đơn giản để giảm tình trạng này, đó là trong email Order Confirmation (Email #1 của Post Purchase Flow), bạn hãy include luôn ảnh Personalized của khách vào Email để họ check. Nếu có sai sót, họ sẽ reply lại ngay email để chúng ta kịp thời cancel sản xuất và điều chỉnh lại Design (tin mình đi, khách thường xuyên order nhầm hơn chúng ta nghĩ nhiều).

Ví dụ một Email Confirmation nó sẽ kiểu như thế này

Tất nhiên, bằng cách sử dụng thêm Conditional Tags dạng If-Else như Technique #1, chúng ta có thể đặt luôn điều kiện, rằng nếu sản phẩm là Personalized thì mới hiển thị Mockup dạng Personalized như kia, còn nếu không sẽ hiển thị Mockup bình thường 😉

Lưu ý, phần này mình sẽ viết chủ yếu cho Customily (vì mình xài Customily). Nếu bạn xài App khác có thể tự điều chỉnh cho phù hợp, hoặc comment ở dưới mình sẽ support 😀

Ngoài ra, để có thể hiển thị Personalized Mockup trong Email, bạn cần bật tính năng “Add preview image to order” của Customily lên nhé:

Khi bật tính năng này, với những Order mới, bạn sẽ thấy trong Event Variable xuất hiện thêm một Variable khác của Customily, đó là “_customily-preview”. Đây chính là link ảnh Personalized Preview của Customily mà bạn có thể sử dụng để show ra cho khách hàng.

Để bắt đầu thêm phần Preview vào Klaviyo, chúng ta sẽ sử dụng một tính năng khác của Klaviyo, đó là Dynamic Table.

Bạn kéo Block Table vô Email nhé

Khi bạn mới add Block Table vào Email, giao diện xuất hiện sẽ như sau:

Mặc định, bạn sẽ có 2 cột – như trên hình là một cột Text và một cột hình.

Ở phần Cell Selector, bạn sẽ chọn cột mà bạn muốn chỉnh sửa.

Ở phần Cell Content, bạn sẽ chọn xem bạn muốn cột đó xuất hiện dưới dạng Text hay Image. Như mình thì mình thích giao diện cột trái là Text, cột phải là hình.

Tuy nhiên, chúng ta sẽ chưa đụng đến phần này vội. Bạn sẽ cần config một chút ở phần Table Setting trước khi làm tiếp. Chuyển sang Table Setting, chúng ta có giao diện sau:

Ở phần Table Data, bạn sẽ cần chuyển sang dạng Dynamic, và điền nội dung CHÍNH XÁC như sau:

  • Row collection: event.extra.line_items
  • Row alias: item

Giải thích kỹ thuật ra thì khá là dài dòng, nhưng đại khái việc này sẽ giúp biến cái Table của bạn thành Dynamic Table – tức bảng với nội dung “động”, và sẽ thay đổi nội dung dựa theo Event Variables.

Sau khi hoàn thành, bạn quay lại Tab Content, và bắt đầu chỉnh sửa.

Ở cột Text, mình sử dụng đoạn code sau:

Product Name: {{ item.name }}
{% if item.product.properties|lookup:'Add name here:' %}
Name on Design: {{ item.product.properties|lookup:'Add name here:' }}{% endif %}

Đoạn code trên, dịch ra Tiếng Việt, là bên trong Event Variables của Event Placed Order, mình sẽ đi tìm một Event Variables có tên là “Add name here:”. Nếu Variable này có tồn tại (tức sản phẩm có Personalized), mình sẽ show tên mà khách hàng sử dụng để Personalized ra luôn, còn nếu không có thì thôi, chỉ show tên sản phẩm thôi.

Nếu bạn để ý, phần “Add name here:” mà mình ghi ở trên chính là Option Label mà mình sử dụng cho phần Personalized trên Customily. Bạn cần thay lại cho match với Option Label mà bạn sử dụng nhé.

Phần “Name on Design” này khá hay nếu bạn chỉ sử dụng 1 Option Set (chỉ có 1 Option Label), còn nếu bạn dùng nhiều loại Option Set khác nhau (ví dụ làm Clipart Customized) thì bỏ phần này luôn cũng được.

Ở cột Image, bạn chọn “Add Dynamic Image / Browse Image”, sau đó chọn “Dynamic Image” và điền vào đoạn code sau:

{% if item.product.properties|lookup:'_customily-preview' %}{{ item.product.properties|lookup:'_customily-preview' }}{% else %}{{ item.product.images.0.src }}{% endif %}

Dịch tiếng Code ra Tiếng Việt, đoạn code này sẽ đi tìm Variable có tên “_customily-preview” – nếu có tồn tại, nó sẽ lấy giá trị của Variable đó làm link ảnh (chính là link preview mà Customily đẩy lên Klaviyo thông qua Shopify). Nếu không tồn tại, nó sẽ lấy Mockup #1 của sản phẩm làm ảnh đại diện.

Bằng cách này, nếu sản phẩm không phải Customize, khách hàng vẫn sẽ nhìn thấy hình ảnh sản phẩm bình thường (thay vì bị trắng xóa kiểu lỗi).

Vậy là xong, để căn giữa cho đẹp thì bạn chọn Align Content (ở phần Table Setting, kéo xuống dưới một tý) căn giữa là ok

Tuy nhiên, nếu chỉ dừng ở đây, phiên bản Desktop nhìn sẽ rất ổn, nhưng phiên bản Mobile sẽ hiển thị khá ngu, cụ thể như sau:

Cá nhân mình thì thích nếu khách hàng xem bằng Mobile, email sẽ tự căn lại sao cho phần Text lên trên, phần hình ảnh xuống dưới. Bằng cách này, khách hàng vẫn sẽ nhìn ảnh được full size, thay vì bị co xuống còn bé tý.

Tuy nhiên, nếu sử dụng tính năng Dynamic Table, điều này là không tránh được vì…Klaviyo không cho phép việc đó. Vì vậy, để hiển thị trên Mobile được tử tế hơn, chúng ta sẽ…ẩn Table này trên Mobile đi, và sử dụng một tính năng khác để hiển thị tương tự trên Mobile.

Để làm điều đó, bạn chỉ cần vào “Display Options”, sau đó chọn Desktop là được:

Để hiển thị thông tin Personalized trên Mobile, chúng ta sẽ sử dụng Block “Split” của Klaviyo:

Có thể bạn sẽ thắc mắc, tại sao không dùng luôn tính năng Split cho Desktop? Câu trả lời là, trên Desktop, tính năng Split không…căn giữa theo chiều dọc được, dẫn đến nhìn Content khá là ngu, vậy thôi =))

Thông cảm cho người bị OCD nhé =))

Nhìn nó bị khó chịu vl mà =))

Với tính năng Split, bạn có thể setup y chang như bên Table – về mặt nội dung của cột Text và cột Image. Chỉ khác, thay vì vào Table Setting để cấu hình Dynamic, bạn vào Display Options, chọn Create Content Repeat Rule và cấu hình như phần Table Setting là xong. Ngoài ra bạn cũng cần chọn show on Mobile để block này không hiển thị trên Desktop nữa.

Vậy là xong rùi đó :))

Nếu bạn đang chạy Customized/Personalized, áp dụng Technique #2 sẽ giúp bạn giảm đáng kể lượng Dispute, Complaint, cũng như tăng trải nghiệm của khách hàng, từ đó dễ có khách hàng quay lại và Feedback tốt hơn rất nhiều.

Technique #3 – Estimated Date

Đây là một kỹ thuật nhỏ mà mình hay sử dụng khi optimize store, tất nhiên nó có thể áp dụng cho cả Email nữa.

Thông thường, chúng ta hay sử dụng những từ kiểu như “Hàng của bạn sẽ được sản xuất trong 5 – 7 ngày”, “Dự kiến thời gian shipping là 10 – 14 ngày”, “Discount code của bạn sẽ hết hạn sau 2 ngày nữa”, v.v…

Chi tiết này tuy không lớn, nhưng nó sẽ mang lại một chút bất tiện cho khách hàng. Họ sẽ phải ngồi tính toán xem 5 – 7 ngày nữa là hôm nào, nếu họ mua làm quà thì có kịp không, v.v…

Thậm chí có nhiều bên còn sử dụng “5 – 7 business days” để thời gian nhìn có vẻ…ngắn, nhưng thực tế sẽ là 10 – 12 ngày. Khách hàng sẽ lại phải ngồi nhẩm “5 business days, cộng thêm 2 ngày thứ 7 chủ nhật nữa, v.v…” sẽ rất là phiền phức.

Thay vì vậy, bạn có thể ghi rõ luôn ngày dự kiến mà hàng hóa sản xuất xong, ngày dự kiến mà hàng delivered, v.v…Ví dụ, hàng dự kiến sẽ sản xuất xong vào ngày 14/1, và sẽ ship đi vào ngày 16/1 chẳng hạn.

Với thông tin chi tiết như vậy, khách sẽ rất dễ hình dung, từ đó ấn tượng của khách với Brand sẽ tốt lên một chút.

Những chi tiết nho nhỏ này, nếu bạn làm tốt và chăm chút nó, nó sẽ tạo nên những khoảnh khắc happy nho nhỏ. Nhiều khoảnh khắc như vậy cộng dồn lại, nó sẽ tạo nên một trải nghiệm tốt cho khách hàng từ đầu tới cuối.

Nếu bạn theo trường phái optimize từng thứ tiểu tiết như mình để giúp khách hàng có một trải nghiệm tốt nhất, đây là kỹ thuật bạn có thể sử dụng.

Ví dụ, bạn muốn cộng thêm 7 ngày kể từ ngày khách hàng nhận email – để thông báo ngày dự kiến hàng sẽ sản xuất xong chẳng hạn, bạn có thể sử dụng đoạn code sau:

{% today '%Y-%m-%d' as today %} {{ today|days_later:7|format_date_string|date:'F d' }}

Ví dụ, hôm nay là ngày 10/1/2023, kết quả đầu ra sẽ là “January 17,”. Ví dụ, bạn có thể có một đoạn Content kiểu như này:

Khỏi cần phải tính toán chi cho mệt. Khách cũng nhẹ đầu, khỏi mở dispute hay gửi ticket trước ngày 17 làm gì cho phắc tạp ra.

Kỹ thuật này nhẹ nhàng vậy thôi, nhưng trải nghiệm mang lại cho khách thì thích lắm :3 Anh em cứ đặt mình vào vị trí của khách khi order thì sẽ hiểu.

Kết

Bài này có vẻ hơi khô khan và thuần kỹ thuật, tuy nhiên mình nghĩ hầu hết anh em đều đang chưa sử dụng hết sức mạnh của Klaviyo – thậm chí nhiều người còn không biết những tính năng này tồn tại.

Nếu sử dụng tốt những kỹ thuật trên, bạn sẽ tối ưu được trải nghiệm khách hàng, tăng Feedback tốt, giảm Dispute, giảm Ticket, tối ưu lợi nhuận, kiếm được rất nhiều tiền từ Store, rồi bán Store, sau đó trở thành tỷ phú.

Còn chờ đợi gì mà không xài?

7 thoughts on “Email Marketing 101 – Event Variables, Conditional Tags và Ứng Dụng”

  1. Anh L ơi, nếu được anh có thể share thêm mind-set và tutorial để leverage automation platform cho Email Marketing được hông ạ.

    Ví dụ: Working Flow – [Prompt] → Chat GPT → Email Calendar → Email Content → Google Sheet → Klaviyo.

    Em cảm ơn anh nhiều ạ.

    Cheers,
    Em Sang.

    Reply

Leave a Comment