メルペイでおトク

メルペイのコード決済で
50円(税込)以上のお支払いを3回行うと
次のお支払い時に値引きされます!
ハズレなしの値引き額スロット開催中!

コード決済でお買い物

事前のエントリー不要。街のお店でコード決済を3回するだけ!支払い方法(クレジット/メルペイ残高/ポイント)は問いません

※コード決済以外は対象外

スロットに挑戦

3つの選択肢からランダムで
値引き額が決定

4回目のお支払いが
自動値引き

同時に、次のスタンプ1個目をGET!

1
2
3

一度始めたら、無限におトク!

※決済金額が値引き額を下回る場合であっても、値引き残額を次回のお支払いに利用することや、ご返金はできません

特典一覧

¥{{item}}

OFF

MAX

超レア特典

¥{{rx.maxRewardVariation}}

OFF

※決済金額が値引き額を下回る場合であっても、値引き残額を次回のお支払いに利用することや、ご返金はできません

※抽選方法や当選確率に関するお問い合わせには個別にお答えしておりません

特典情報を取得できなかったため、特典一覧は表示していません。

おトク履歴

{{item.dateLabel}}

{{item.title}}

通常:¥{{item.normalAmountLabel}}

{{item.discountLabel}}

-

¥ {{item.paidAmountLabel}}

{{item.dateLabel}}

{{item.title}}

通常:¥{{item.normalAmountLabel}}

{{item.discountLabel}}

-

¥ {{item.paidAmountLabel}}

もっと見る

よくある質問

Q スロットはいつ回せますか?
対象となるメルペイの「コード決済」を3回行うと、スロットに挑戦できます。3回目のお支払い完了後にコード決済画面に自動表示されます。

次の場合はスロットに挑戦できず、特典の付与・適用も行われません。
・対象外の決済(例:自動販売機での利用、iD決済など)の場合
・1回の決済がキャンペーンで定める最低金額に満たない場合

※「コード決済」や対象/対象外の決済の詳細は、本ページ内の「街のお店でのお買い物について(対象の決済方法/対象外の決済方法/対象外のお店)」をご確認ください.
Q 特典はいつ使えますか?
獲得した特典は、獲得した決済時ではなく、次回のコード決済時に自動で適用され、お客さまにて追加操作をする必要はありません。

ただし、ご利用時の金額が特典の値引額を下回る場合、差額分の返金や、次回への繰り越しなどはできませんため、ご注意ください。
例)500円の商品を決済し、999円の値引額が適用された場合、決済金額は0円(499円は失効)

※システム上の都合により特典の反映が遅れる場合があります。反映され次第、次回のお支払いから自動適用されます
Q 特典の有効期限はありますか?

はい、特典には、一律同じ有効期限(2026/6/12 23:59:59)があります。有効期限を過ぎると失効しますのでご注意ください。

なお、想定を上回るお客さまにご参加いただいた場合、キャンペーン期間より早く終了する場合がございます。その場合、有効期限は、上記ではなく、キャンペーン期間より早く終了する日となりますことご了承ください。


※ 早期終了の場合には、アプリ内通知や本ページにてお知らせします。なお、予算については、運営上、お答えできませんことあわせてご了承ください。

Q 決済をキャンセル・返金した場合はどうなりますか?

決済をキャンセルしても、カウント済みのコード決済数(スタンプ数)は減りません。

特典を使用した決済をキャンセルした場合、返金額は値引き適用後の金額を基準に計算されます。返金できる金額の上限は、値引き後に実際にお支払いした金額です。

そのため、購入金額の一部をキャンセルした場合でも、返金額が実際にお支払いした金額を上回るときは、実際にお支払いした金額までしか返金されません。

特典の詳細

コード決済で3回支払うと、4回目が自動で値引き

特典内容・条件

キャンペーン期間中にメルペイのコード決済を3回ご利用ごとに、特典一覧のいずれかの値引き額を獲得できます。獲得した値引き額は、次のメルペイのコード決済ご利用時に操作不要で自動適用されます(獲得上限なし)。

■ キャンペーン期間

2026年5月13日(水)14:00~2026年6月12日(金)23:59:59

※想定を上回るお客さまにご参加いただいた場合、本キャンペーンを上記終了日より早く終了する場合がございます。早期終了の場合には、アプリ内通知や本ページにてお知らせします。なお、予算については、運営上、お答えできませんことあわせてご了承ください

■ キャンペーン参加条件

下記条件を満たしているお客さまが対象です。

・本キャンペーンのお知らせが届いている方

※システム上の都合により通知が遅れて送付される場合がございます。通知をお受け取り時点でキャンペーン期間が終了していても、キャンペーン期間中に条件を達成していた場合は、特典獲得の対象となります

特典獲得条件

下記条件をすべて満たしているお客さまが特典を獲得できます。

・キャンペーン参加条件を満たしていること

・キャンペーン期間中にメルペイのコード決済を3回ご利用いただくこと

・1回の支払い金額が50円以上(税込)であること

※1回の支払い金額が50円(税込)以上である必要があります。50円未満のご利用の場合、1回分のご利用としてカウントされません。ただし、値引き額が自動適用され、50円未満となった場合は、1回分のご利用としてカウントされます

※メルペイクーポンはご利用いただけますが、メルペイクーポン適用後の金額が50円未満になった場合、1回分のご利用としてカウントされません

特典詳細

■ 値引き額

獲得できる値引き額は以下です。

{{item}}

※特典情報を取得できなかったため、特典一覧は表示していません。

※値引き額はランダムで決定されます。抽選方法や当選確率に関するお問い合わせには個別にお答えしておりません

※値引き額はメルカリポイントではございません

■ 獲得(カウント)の仕組み

キャンペーン期間中は、値引きが自動適用された決済完了後、その決済を1回とカウントし、再度3回メルペイのコード決済をご利用いただくと、値引き獲得、次回値引き自動適用し決済のサイクルを繰り返します。現在のメルペイのコード決済数(スタンプ数)は、以下メルカリアプリにてご確認いただけます。

・おさいふ>ロイヤルティエリア(還元率)

・おさいふ>ロイヤルティエリア(還元率)>詳細(あなたの還元率)ページ

・コード決済画面

■ 獲得タイミング

特典獲得条件を満たしている場合、3回ごとのメルペイのコード決済完了後、特典を獲得いただけます。

※獲得した値引きの有効期限は、一律キャンペーン期間終了日までです

※獲得した値引き額は、獲得後にコード決済画面上に自動反映されます

※お客さまのご利用状況やシステム上の都合などにより、値引き額の反映に時間がかかる場合があります。反映され次第、次回のお支払いから自動で値引きされます

■ 適用タイミング

特典獲得後、次のメルペイのコード決済ご利用時に自動適用されます。なお、特典の反映に時間がかかっている場合、反映されるまで値引きは適用されません。

※適用タイミングはお客さまでご選択できませんためご注意ください

※支払い金額をお客さま自身でご入力いただく場合も、自動適用となります。そのため、値引き額を差し引かず、商品代金をそのまま支払い金額としてご入力ください

※ご利用金額が値引き額を下回る場合であっても、値引き残額を次回のお支払いに利用することや、ご返金はできません

※メルペイクーポンと値引きを併用した場合、値引きした上でクーポンが適用されます

※メルペイのコード決済以外の決済方法をご利用時は値引きは適用されません

街のお店でのお買い物について

■ 対象の決済方法

・メルペイのコード決済

※コード決済画面を開いて、店舗でスキャンしてもらう決済方法と店舗に設置しているQRコードをコード読み取り画面で読み取って支払う決済方法が対象です

※支払い方法(クレジット/メルペイ残高/ポイント)は問いません

■ 対象外の決済方法

以下の決済方法は対象外です:

・iD決済(ApplePay・Mastercard®タッチ決済)

・メルカード

・バーチャルカード

・メルペイのネット決済

■ 対象のお店

・全国のメルペイのコード決済が使えるお店でのご利用が対象です

・メルペイのコード決済が使えるお店はこちらをご確認ください

※街のお店でご利用の際は、決済方法が「メルペイ」であることをお店にお伝えのうえご利用ください

※ネットショップなどのオンライン決済(ネット決済)は対象外です

■ 対象外のお店

以下でのご利用は対象外です。あらかじめご了承ください。

・自動販売機

・駐輪場

・駐車場

・食券機

※上記はあくまで一例になります。上記に限らず、当社が対象外としたお店での利用や一部商品は対象外となる場合がございます

お問い合わせについて

本キャンペーンについてのお問い合わせはこちらのガイドを参照し、【コード決済で使う度におトクキャンペーン】とご不明な点を記載のうえご連絡ください。

const sendScreenDisplayLog = async () => { try { await platform.logLaplace({ action: "SCREEN_DISPLAY", section: "otoku-lp", element: "page-load", trackingId: page?.trackingId, campaignUrl: location?.href ?? "" }); } catch (error) { } }; const sendHistoryMoreTapLog = async () => { try { await platform.logLaplace({ action: "TAP", section: "otoku-lp", element: "history-show-more", trackingId: page?.trackingId, campaignUrl: location?.href ?? "" }); } catch (error) { } }; const applyOsaifu = (res) => { const stampProgress = res?.components?.loyaltyArea?.loyalty?.otokuCampaign?.stampProgress; const rewardVariations = Array.isArray(stampProgress?.rewardVariations) ? stampProgress.rewardVariations : []; rx.osaifuResponse = res ?? null; rx.isCampaignTarget = !!stampProgress?.isCampaignTarget; rx.maxStampCount = stampProgress?.maxStampCount ?? "0"; rx.currentStampCount = stampProgress?.currentStampCount ?? "0"; rx.rewardVariations = rewardVariations; rx.smallRewardVariations = rewardVariations.slice(0, Math.max(rewardVariations.length - 1, 0)); rx.maxRewardVariation = rewardVariations[rewardVariations.length - 1] ?? ""; rx.hasRewardInfo = rewardVariations.length > 0; }; const formatHistoryDate = (occuredAt) => { if (!occuredAt) return ""; return occuredAt.slice(0, 10).replace(/-/g, "/"); }; const applyHistories = (entries) => { const safeEntries = Array.isArray(entries) ? entries : []; const formatAmount = (value) => { const digits = String(value ?? "").replace(/[^0-9]/g, ""); if (!digits) return "0"; return Number(digits).toLocaleString("ja-JP"); }; const readAmount = (value) => { if (typeof value === "number" || typeof value === "string") { return Number(String(value).replace(/[^0-9]/g, "") || "0"); } if (value && typeof value === "object") { const candidates = [value.amount, value.discountPoint, value.point, value.value]; for (const candidate of candidates) { const amount = Number(String(candidate ?? "").replace(/[^0-9]/g, "") || "0"); if (amount > 0) return amount; } } return 0; }; const findNestedAmount = (value, preferredKeys, depth = 0) => { if (depth > 4 || value == null) return 0; const directAmount = readAmount(value); if (directAmount > 0) return directAmount; if (Array.isArray(value)) { for (const item of value) { const nestedAmount = findNestedAmount(item, preferredKeys, depth + 1); if (nestedAmount > 0) return nestedAmount; } return 0; } if (typeof value !== "object") return 0; for (const key of preferredKeys) { if (key in value) { const nestedAmount = findNestedAmount(value[key], preferredKeys, depth + 1); if (nestedAmount > 0) return nestedAmount; } } for (const key of Object.keys(value)) { if (preferredKeys.indexOf(key) !== -1) continue; const nestedAmount = findNestedAmount(value[key], preferredKeys, depth + 1); if (nestedAmount > 0) return nestedAmount; } return 0; }; const getDiscountPointAmount = (entry) => { return findNestedAmount(entry?.discountPoint, ["amount", "canceledAmount", "value"]); }; const getPointAmount = (entry) => { return findNestedAmount(entry?.point, ["amount", "value", "point"]); }; const getFundAmount = (entry) => { return findNestedAmount(entry?.fund, ["amount", "value", "fund"]); }; const getDefpayAmount = (entry) => { return findNestedAmount(entry?.defpay, ["amount", "value", "defpay"]); }; const getPaymentAmount = (entry) => { return getFundAmount(entry) + getPointAmount(entry) + getDefpayAmount(entry); }; const effectiveEntries = env.isTesting ? safeEntries.map((entry) => { if (getDiscountPointAmount(entry) > 0 || getPointAmount(entry) <= 0) return entry; return { ...entry, discountPoint: { amount: String(getPointAmount(entry)), status: entry?.point?.status ?? "" } }; }) : safeEntries; const discountedEntries = effectiveEntries.filter((entry) => getDiscountPointAmount(entry) > 0); const allHistoryDisplayItems = discountedEntries.map((entry) => { const discountAmountNumber = getDiscountPointAmount(entry); const paymentAmountNumber = getPaymentAmount(entry); const maxRewardVariation = rx.maxRewardVariation ?? ""; const normalAmountNumber = paymentAmountNumber + discountAmountNumber; return { id: entry?.paymentId ?? entry?.occuredAt ?? entry?.description ?? "history", dateLabel: formatHistoryDate(entry?.occuredAt ?? ""), title: entry?.description ?? "\u5C65\u6B74", subLabel: entry?.paymentType ?? "", paidAmountLabel: formatAmount(paymentAmountNumber), normalAmountLabel: formatAmount(normalAmountNumber), discountLabel: discountAmountNumber > 0 ? "\xA5 " + formatAmount(discountAmountNumber) + " \u5024\u5F15\u304D" : "", hasPoint: discountAmountNumber > 0, highlight: discountAmountNumber > 0 && String(discountAmountNumber) === String(maxRewardVariation) }; }); const visibleCount = Math.min(3, allHistoryDisplayItems.length); rx.historyEntries = effectiveEntries; rx.historyAllDisplayItems = allHistoryDisplayItems; rx.historyVisibleCount = visibleCount; rx.historyDisplayItems = allHistoryDisplayItems.slice(0, visibleCount); rx.hasDiscountHistory = allHistoryDisplayItems.length > 0; rx.hasMoreDiscountHistory = allHistoryDisplayItems.length > visibleCount; }; const osaifuApiPath = env.isTesting && typeof rx.osaifuApiPath === "string" && rx.osaifuApiPath ? rx.osaifuApiPath : "/osaifu/v1/get_osaifu"; const historyApiPath = env.isTesting && typeof rx.historyApiPath === "string" && rx.historyApiPath ? rx.historyApiPath : "/ahapi/v1/list_latest_actionable_histories"; const isLatestHistoryApi = String(historyApiPath).indexOf("latest_actionable_histories") !== -1; const fetchAllHistories = async (yearmonth) => { const res = await platform.api.post( historyApiPath, { listOption: { pageSize: 100 }, ...isLatestHistoryApi ? {} : { filterOption: { yearmonth } } }, { endpoint: "merpay-gateway", withAuth: true, contentType: "application/json" } ); const entries = Array.isArray(res?.entries) ? res.entries : []; return entries; }; rx.osaifuResponse = null; rx.isCampaignTarget = false; rx.maxStampCount = "0"; rx.currentStampCount = "0"; rx.rewardVariations = []; rx.smallRewardVariations = []; rx.maxRewardVariation = ""; rx.hasRewardInfo = false; rx.osaifuError = null; rx.historyEntries = []; rx.historyAllDisplayItems = []; rx.historyDisplayItems = []; rx.historyVisibleCount = 0; rx.hasDiscountHistory = false; rx.hasMoreDiscountHistory = false; rx.historyError = null; rx.faqKeyExpiry = "expiry"; rx.faqKeySlot = "slot"; rx.faqKeyDevice = "device"; rx.faqKeyCancel = "cancel"; rx.faqExpiryOpen = false; rx.faqSlotOpen = false; rx.faqDeviceOpen = false; rx.faqCancelOpen = false; rx.toggleFaq = (key) => { const nextOpen = key === "expiry" ? !rx.faqExpiryOpen : key === "slot" ? !rx.faqSlotOpen : key === "device" ? !rx.faqDeviceOpen : !rx.faqCancelOpen; rx.faqExpiryOpen = key === "expiry" ? nextOpen : false; rx.faqSlotOpen = key === "slot" ? nextOpen : false; rx.faqDeviceOpen = key === "device" ? nextOpen : false; rx.faqCancelOpen = key === "cancel" ? nextOpen : false; }; rx.showMoreHistories = async () => { await sendHistoryMoreTapLog(); const nextVisibleCount = rx.historyAllDisplayItems.length; rx.historyVisibleCount = nextVisibleCount; rx.historyDisplayItems = rx.historyAllDisplayItems.slice(0, nextVisibleCount); rx.hasMoreDiscountHistory = rx.historyAllDisplayItems.length > nextVisibleCount; }; await sendScreenDisplayLog(); try { const res = await platform.api.post(osaifuApiPath, void 0, { endpoint: "merpay-gateway", withAuth: true, contentType: "application/json" }); applyOsaifu(res); } catch (error) { rx.osaifuError = error instanceof Error ? error.message : "get_osaifu fetch failed"; } try { const histories = await fetchAllHistories({ year: 2026, month: 3 }); applyHistories(histories); } catch (error) { rx.historyError = error instanceof Error ? error.message : "list_actionable_histories fetch failed"; } //# sourceURL=egp-script-0.ts