.png&w=3840&q=75)
今回の記事は Shopify App Store で提供されている、「離脱防止カウントダウンポップアップ」を実装できる Shopify アプリについての記事です。
カゴ落ち(カート放棄)や直帰を減らす施策の中でも、離脱しそうな瞬間に、期限付きオファーを提示するのは即効性が高く、まず試す価値があります。
離脱防止ポップアップについて調べるにあたり、以下の観点を参考にしています。
離脱防止カウントダウンポップアップは、ユーザーがストアを離れようとしたタイミング(いわゆる Exit Intent)や、一定の条件(滞在時間・スクロール深度など)で表示するポップアップに、カウントダウンタイマーを組み合わせた施策です。
カウントダウンが入ることで「今だけ」「急いだほうがいい」という心理(緊急性・希少性)が生まれ、次のアクションにつながりやすくなります。
アプリを使うと、これらをノーコードで実装できるケースが多いです。一方で「デザインや条件を完全に自由にしたい」「軽量にしたい」場合は、テーマ側でのコーディング実装も選択肢になります(後述します)。
離脱防止カウントダウンポップアップを導入することで得られる利点を解説します。
カゴ落ち(カート放棄)の回復率が上がる
迷っているユーザーに対し、最後のひと押し(割引・送料無料・特典)を提示できます。
“今すぐ買う理由”を作れる
カウントダウンがあるだけで、同じクーポンでも反応が変わります。期限が曖昧なオファーより強いです。
直帰率の改善につながる
その場で購入しなくても、メルマガ登録・SMS 登録・WhatsApp 登録など「離脱前の接点」を作れます。
リスト(メール/SMS/WhatsApp)の獲得ができる
1回の訪問で売れなくても、次の接点を持てるのが大きいです。特に単価が高い商材ほど効きます。
オファーのターゲティングができる
国、デバイス、ページ、UTM、商品タグなどで出し分けできるアプリを使うと、割引の出しすぎを防げます。
A/B テストで勝ちパターンが見つかる
文言、割引率、表示タイミング、デザインなどをテストできるアプリは、伸びしろを見つけやすいです。
“社会的証明(Social Proof)”との相性が良い
最近の購入通知や閲覧数と、期限付きオファーを組み合わせると、心理的な後押しが強くなります。
運用が回る(設定・スケジュール)
セール期間だけ自動でオンにする、表示回数を制限する、など運用面のミスを減らせます。
計測できると改善が早い
表示回数、クリック数、CVR、注文回復率が見えると、やるべき改善が明確になります。
離脱防止ポップアップは「入れれば売れる」ではなく、出し方の設計が重要です。アプリを選ぶ際は、次の機能をチェックしておくと失敗が減ります。
ここまでを踏まえると、最初は「条件設定が簡単」「頻度制御がある」「クーポン導線が作れる」アプリから入るのが無難です。
アプリを入れずに、テーマ側で軽量に実装したい方向けに、Exit Intent + 滞在時間 + スクロールをトリガーにしたカウントダウンポップアップのサンプルを載せます。
ポイントは次の通りです。
/discount/クーポンコード?redirect=現在ページ の形で簡易実装(ストア設定により挙動は異なります)Shopify 管理画面の「オンラインストア > テーマ > コード編集」から、snippets/exit-countdown-popup.liquid を作成して、以下を貼り付けます。
<div id="ExitCountdownPopup" class="exit-popup" aria-hidden="true" role="dialog" aria-modal="true">
<div class="exit-popup__backdrop" data-exit-popup-close></div>
<div class="exit-popup__panel" role="document">
<button class="exit-popup__close" type="button" aria-label="閉じる" data-exit-popup-close>
×
</button>
<p class="exit-popup__title">ちょっと待ってください</p>
<p class="exit-popup__text">
いま購入すると <strong>10%OFF</strong> が使えます。
残り <span data-exit-popup-countdown>05:00</span> で終了です。
</p>
<div class="exit-popup__actions">
<a
class="exit-popup__btn"
href="/discount/EXIT10?redirect={{ request.path }}"
data-exit-popup-cta
>
クーポンを適用して購入する
</a>
<button class="exit-popup__secondary" type="button" data-exit-popup-close>
今は閉じる
</button>
</div>
<p class="exit-popup__note">※割引の適用条件はストア設定により異なります。</p>
</div>
</div>
<style>
.exit-popup { position: fixed; inset: 0; display: none; z-index: 99999; }
.exit-popup.is-open { display: block; }
.exit-popup__backdrop { position: absolute; inset: 0; background: rgba(0,0,0,.55); }
.exit-popup__panel {
position: relative;
max-width: 520px;
margin: 10vh auto 0;
background: #fff;
border-radius: 12px;
padding: 22px;
box-shadow: 0 10px 30px rgba(0,0,0,.25);
}
.exit-popup__close {
position: absolute;
top: 10px;
right: 12px;
width: 40px;
height: 40px;
border: 0;
background: transparent;
font-size: 22px;
cursor: pointer;
}
.exit-popup__title { margin: 0 0 8px; font-size: 18px; font-weight: 700; }
.exit-popup__text { margin: 0 0 14px; line-height: 1.7; }
.exit-popup__actions { display: flex; gap: 10px; flex-wrap: wrap; }
.exit-popup__btn {
display: inline-block;
padding: 12px 14px;
border-radius: 10px;
text-decoration: none;
border: 1px solid #111;
}
.exit-popup__secondary {
padding: 12px 14px;
border-radius: 10px;
border: 1px solid #ddd;
background: #f7f7f7;
cursor: pointer;
}
.exit-popup__note { margin: 10px 0 0; font-size: 12px; opacity: .75; }
</style>
<script>
(() => {
const popup = document.getElementById('ExitCountdownPopup');
if (!popup) return;
const SETTINGS = {
durationSeconds: 5 * 60,
showAfterSeconds: 8,
showAfterScrollPercent: 45,
showOncePer: 'day',
storageKey: 'exit_countdown_popup_seen_at'
};
const now = () => Date.now();
const readSeenAt = () => {
try { return localStorage.getItem(SETTINGS.storageKey); } catch (e) { return null; }
};
const writeSeenAt = () => {
try { localStorage.setItem(SETTINGS.storageKey, String(now())); } catch (e) {}
};
const hasSeen = () => {
const v = readSeenAt();
if (!v) return false;
if (SETTINGS.showOncePer === 'session') return true;
const seenAt = parseInt(v, 10);
if (Number.isNaN(seenAt)) return false;
const oneDayMs = 24 * 60 * 60 * 1000;
return (now() - seenAt) < oneDayMs;
};
let countdownInterval = null;
const countdownEl = popup.querySelector('[data-exit-popup-countdown]');
const format = (seconds) => {
const m = Math.floor(seconds / 60);
const s = seconds % 60;
const mm = String(m).padStart(2, '0');
const ss = String(s).padStart(2, '0');
return mm + ':' + ss;
};
const startCountdown = () => {
if (!countdownEl) return;
const endAt = now() + SETTINGS.durationSeconds * 1000;
const tick = () => {
const remaining = Math.max(0, Math.ceil((endAt - now()) / 1000));
countdownEl.textContent = format(remaining);
if (remaining <= 0) {
clearInterval(countdownInterval);
}
};
tick();
clearInterval(countdownInterval);
countdownInterval = setInterval(tick, 250);
};
const open = () => {
if (popup.classList.contains('is-open')) return;
if (hasSeen()) return;
popup.classList.add('is-open');
popup.setAttribute('aria-hidden', 'false');
writeSeenAt();
startCountdown();
};
const close = () => {
popup.classList.remove('is-open');
popup.setAttribute('aria-hidden', 'true');
};
popup.addEventListener('click', (e) => {
const closeBtn = e.target.closest('[data-exit-popup-close]');
if (closeBtn) close();
});
document.addEventListener('keydown', (e) => {
if (e.key === 'Escape') close();
});
const onMouseOut = (e) => {
if (e.clientY > 10) return;
if (!e.relatedTarget && !e.toElement) {
open();
document.removeEventListener('mouseout', onMouseOut);
}
};
document.addEventListener('mouseout', onMouseOut);
setTimeout(() => open(), SETTINGS.showAfterSeconds * 1000);
const onScroll = () => {
const doc = document.documentElement;
const scrollTop = window.scrollY || doc.scrollTop;
const height = doc.scrollHeight - doc.clientHeight;
if (height <= 0) return;
const percent = Math.round((scrollTop / height) * 100);
if (percent >= SETTINGS.showAfterScrollPercent) {
open();
window.removeEventListener('scroll', onScroll);
}
};
window.addEventListener('scroll', onScroll, { passive: true });
})();
</script>
layout/theme.liquid の </body> の直前あたりに、以下を追加します。
{% render 'exit-countdown-popup' %}
これで表示されます。
setTimeout と scroll のトリガー部分をコメントアウトしてくださいshowOncePer を session に変更してくださいEXIT10 の部分を変更してください(管理画面で作成したコードに合わせる)アプリ導入前の PoC(効果検証)にも使えるので、まずこの形で試すのもおすすめです。
ここからは、Shopify App Store で提供されている「離脱防止カウントダウンポップアップ」を実装できるアプリを10個紹介します。
インストールは Shopify App Store でアプリ名を検索して進めてください。
コード不要で、離脱タイミングに合わせたカウントダウンポップアップを表示できる特化型アプリ。
「離脱防止」×「カウントダウン」に特化しているので、目的が明確なストアほどハマります。
ページ滞在時間・離脱動作・スクロール深度など、トリガー条件を細かく設定できるのが強みです。
以下の Shopify 公式アプリストアからインストールできます。

メール/SMS ポップアップ、スピンホイール、フォーム、Exit Intent まで揃った “総合ポップアップ” 系。
テンプレートの種類が多く、運用に慣れていないチームでも回しやすいタイプです。
Exit Intent に加えてカートトリガーもあるため、カゴ落ち対策にも向きます。
※管理画面は英語(日本語未翻訳)

ポップアップとバーをまとめて整備しながら、カウントダウンで緊急性も作れる万能型。
「メールポップアップ」と「カウントダウンタイマーバー」を同時に整備できるのが魅力です。
特にターゲティングが強く、国・デバイス・商品タグ・Shopify Markets・UTM などまで対応しています。
※日本語対応あり

ソーシャルプルーフ(最近の購入など)+カウントダウン+Exit Popup をまとめて入れたい人向け。
売上通知・閲覧カウンターなどの「社会的証明」と、カウントダウンや Exit Popup を組み合わせられます。
“信頼” と “緊急性” の両方を一つのアプリで作れるのがポイントです。
※管理画面は英語(日本語未翻訳)

リアルタイム通知とカウントダウンで “迷い” を “購入” に変える、FOMO 強めの構成。
販売通知、カート追加、閲覧数、レビューなどのポップアップに加えて、カウントダウンタイマーも扱えます。
A/B テストや分析もあり、改善前提で運用したいストアと相性がいいです。
※日本語対応あり

“AI 駆動の通知バー”で、タイムセールや配送案内をスマートに出し分けたい方向け。
厳密には「ポップアップ」より「通知バー」寄りですが、期間限定オファーの見せ方として非常に優秀です。
スケジュール自動化や分析ダッシュボードもあるため、運用の再現性が出しやすいです。
※日本語対応あり

低価格で Exit Intent を始めたい人向け。テンプレも多く、最初の一歩にちょうどいい。
Exit Intent に強く、タイミング調整ができるため、過剰に邪魔になりにくい設計ができます。
さらに商品別にメッセージを出し分けられるので、訴求を尖らせたいストアにも向きます。
※管理画面は英語(日本語未翻訳)

“離脱しそうな瞬間に割引を出す” を最短で作れる、シンプルな Exit Intent 特化系。
「離脱時に出す」「クーポンコードで転換させる」「メールも回収する」という王道導線を、テンプレから短時間で作れます。
運用上は「表示頻度」と「対象ページの絞り込み」をしっかり設定するのがポイントです。
※管理画面は英語(日本語未翻訳)

WhatsApp を軸に「離脱防止」「カゴ落ち回収」「チャット接客」をまとめてやりたいストア向け。
このアプリは “ポップアップ単体” というより、WhatsApp を中心に売上を作るタイプです。
Exit Popups や Spin The Wheel を使って WhatsApp 購読者を集め、放棄カート回収を回す流れが作れます。
※「カウントダウン付きのポップアップ」が目的の場合は、他のカウントダウン系アプリや、前述のテーマ実装と組み合わせると作りやすいです。
※管理画面は英語(日本語未翻訳)

Exit Intent とカウントダウンを組み合わせて、クーポンの “期限” で背中を押したい人向け。
スピンホイール(ゲーム)でクーポンを配布し、さらにクーポン期限のカウントダウンを表示できます。
Exit Intent、遅延表示、リマインダーなど「表示条件」も揃っていて、運用の幅が広いです。
※日本語対応あり
「まずは低コストで試したい」場合に見やすいよう、ざっくり比較します(テーブルは使わず箇条書きでまとめます)。
月額が低い($5前後)で始めたい
無料から試したい(上限あり)
“分析・改善” も見据えて伸ばしたい
価格だけでなく、表示頻度の制御とターゲティングができるかも重要です。割引の出しすぎは利益を圧迫するので、ここは必ず確認してください。
日本語対応があるかどうかは、運用スピードに直結します。英語 UI が問題ない場合は選択肢が広がりますが、チーム運用だと日本語対応があるほうが楽です。
「離脱防止カウントダウン」を最短で作るなら、目的別に次の選び方がわかりやすいです。
離脱防止カウントダウンに特化して、シンプルに導入したい
Exit Intent を中心に、テンプレでサクッと回したい
メール/SMS 連携まで含めて “ポップアップ施策” を強くしたい
社会的証明(売れてる感)+カウントダウンで FOMO を強化したい
バナー中心で、タイムセールや配送案内をスマートに運用したい
また「まずは効果が出るか検証したい」場合は、本文中のコーディング例で 簡易実装 → 反応が良ければアプリで運用強化 が現実的です。
今回は、Shopify の「離脱防止カウントダウンポップアップ」を実装できるアプリ10選を紹介しました。
離脱施策は、やりすぎるとブランド体験を壊すリスクもあります。だからこそ、
この4点を押さえると、成果が出やすくなります。
どのアプリをインストールするか迷っている場合は、まず「無料枠のあるアプリ」で試し、勝ちパターンが見えたら上位プランや別アプリに移行するのがおすすめです。
ここまでお付き合い頂き、誠にありがとうございました。