概要

KARTE内のイベント内で、カート・閲覧・お気に入り(cart,view_item,favorite)のイベントが発生したが、(以降、対象イベントと呼称)一定期間内に購入イベントが発生してないユーザーに対し、商品のリマインドを行う施策を送信します

表示イメージ

null

利用の前提条件

施策実装に必要な情報・データは以下のとおりです

  • KARTE上でのイベント発生
  • 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列」を追加します。

null

スタイルやカラー、周囲のデザインは自社ブランドに合うようにご調整ください。

カスタマイズ例

💡 以下のような要件は、上記のレシピでは実装できず、個別にカスタマイズが必要です
  • 購入除外に関して
    • Datahub上に連携された購買データを参照して除外
    • カート内の商品と同じ商品の購入を行っているか参照して除外
  • 商品在庫データを考慮して訴求する商品を除外