概要
KARTE内のイベント内で、カート・閲覧・お気に入り(cart,view_item,favorite)のイベントが発生したが、(以降、対象イベントと呼称)一定期間内に購入イベントが発生してないユーザーに対し、商品のリマインドを行う施策を送信します
表示イメージ
利用の前提条件
施策実装に必要な情報・データは以下のとおりです
- KARTE上でのイベント発生
- 配信の基準となる商品IDを持つ対象イベント
- 参考:カートイベントのスキーマ
- 購入(buy)イベント
- 参考:購入イベントのスキーマ
- 配信の基準となる商品IDを持つ対象イベント
- KARTE Datahub
- 商品マスタ
- 商品ID(item_id) / 商品名(name) / 商品画像(image) / 商品URL(url) / 商品価格(price) が最小構成
- 商品マスタ
挙動の詳細
- 配信間隔は最短1時間に1回
- 実行時点の「前の1時間で発生した”最後の対象イベント”」を元に配信
- ex. 13時実行の場合、12時〜13時までの間に発生した対象イベント
- ex.「前日にカートが発生したユーザーに翌日に送付する」など調整可能
- 対象のイベント発生後配信までの間に、どのような商品でも購入イベントが発生したら除外
- 対象イベント内に複数商品がある場合、複数の商品を表示することが可能(※順不動)
- ログインしたユーザーのみに配信が可能です
実装方法
リストの作成
カゴ落ちをした user_id と 商品の一覧を抽出するSQLです。こちらのSQLを参考にリストを作成してください。
WITH raw AS (
SELECT
user_id
, REGEXP_EXTRACT_ALL(JSON_EXTRACT(values, '$.cart.items'), r'"item_id":"([^"]+)"') AS item_ids -- item_idの箇所は取得しているイベントのvaluesに応じて柔軟に変更してください
, sync_date
, JSON_EXTRACT(values, '$.cart.status') AS cart_status
FROM
{% karte_event relative_period[0], relative_period[1] %}
WHERE
event_name = 'cart'
AND JSON_EXTRACT(VALUES, '$.cart.items') IS NOT NULL
AND not user_id like 'vis-%'
)
--------------
-- 直前の一時間における最新のカートイベントの取得
--------------
, latest as(
SELECT
event.*
FROM (
SELECT user_id, ARRAY_AGG(
t ORDER BY t.sync_date DESC LIMIT 1
)[OFFSET(0)] event
FROM
raw t
WHERE TIMESTAMP_TRUNC(sync_date, HOUR) = TIMESTAMP_TRUNC(TIMESTAMP_SUB(CURRENT_TIMESTAMP(), INTERVAL 1 HOUR), HOUR)
GROUP BY
user_id
)
WHERE event.cart_status = 'true'
)
--------------
-- 最新の購入日時を抽出
--------------
, buy as (
SELECT
user_id
, max(sync_date) as latest_buy_date
FROM
{% karte_event relative_period[0], relative_period[1] %}
WHERE
event_name = 'buy'
group by user_id
)
--------------
-- 商品マスタを取得
--------------
, item_master as(
SELECT DISTINCT
itemid AS item_id, -- 適宜カラム名に合わせて変更ください(商品ID, SKU_ID)
title AS name, -- 適宜カラム名に合わせて変更ください(商品名)
price, -- 適宜カラム名に合わせて変更ください(価格)
url, -- 適宜カラム名に合わせて変更ください(商品詳細ページURL)
image -- 適宜カラム名に合わせて変更ください(画像URL)
FROM 商品マスタテーブル -- テーブルのパスを入力してください
)
--------------
-- 最終データ作成
--------------
-- 最新のカートイベントに、商品マスタを突合
--カートに入っているが購入に至っていない商品の情報を取得
, cart_items AS (
SELECT * FROM latest, UNNEST(item_ids) AS item_id
LEFT JOIN item_master USING(item_id)
WHERE item_master.item_id is not null
)
--カートイベントが最新の購入イベントよりも前である場合に限定
--商品の重複を避けるために`ROW_NUMBER()`を使用してユニークな商品のみを取得
, unique AS (
SELECT
cart_items.user_id,
sync_date,
latest_buy_date,
item_id,
name,
FORMAT("%'d", price) AS price,
url,
image,
ROW_NUMBER() OVER (PARTITION BY cart_items.user_id, sync_date, name ORDER BY item_id) as rn
FROM
cart_items,
UNNEST(item_ids) as item_id
LEFT JOIN buy
ON cart_items.user_id = buy.user_id
AND cart_items.sync_date < latest_buy_date
WHERE
latest_buy_date IS NULL
)
--ユーザーIDとカート投入日ごとに商品の配列を集約して出力
, res AS (
SELECT
user_id,
sync_date,
ARRAY_AGG(STRUCT(item_id, name, price, url, image) ORDER BY rn) as item_array
FROM unique
WHERE
rn = 1
GROUP BY
user_id,
sync_date
)
SELECT * FROM res
アクションの作成
何らかのテンプレートからアクションを作成します。アクションの中でカゴ落ち商品を表示したい箇所に、保存済みプリセットブロックから「カート落ち商品表示1列」を追加します。
スタイルやカラー、周囲のデザインは自社ブランドに合うようにご調整ください。
カスタマイズ例
💡 以下のような要件は、上記のレシピでは実装できず、個別にカスタマイズが必要です
- 購入除外に関して
- Datahub上に連携された購買データを参照して除外
- カート内の商品と同じ商品の購入を行っているか参照して除外
- 商品在庫データを考慮して訴求する商品を除外