AIで作った980円の商品、決済手数料を一律3.6%で見積もると残額を読み違える

980 円のテンプレートを 10 本売ったら、手元にいくら残るのか。最初の試算では、コンビニ決済もカードと同じ 3.6%として、1 本あたり 945 円と出しました。Stripe の料金表を開くと、コンビニ決済には 120 円の最低手数料があります。同じ 980 円でも、概算残額は 860 円でした。
AI で作った小さなデジタル商品は、制作にかけた時間が短いぶん、価格も低く置きたくなります。でも、商品を作る時間と、売るたびに引かれる金額は別です。私は AI へ価格を相談する前に、決済方法ごとの前提を自分で検査したいと思いました。ここで扱うのは販売実績ではなく、公開料金表を使った仮の販売計画です。実際の売上や手取りを示す数字ではありません。
前回と今回の差分
前回は、AI で用意した販売用 ZIP の日本語ファイル名が購入者側で読めるかを検査しました。商品ファイルを渡せる形にしても、価格の計算を間違えると、売るほど想定からずれます。
| 時点 | 確認できること | 今回の差分 |
|---|---|---|
| 前回完了時 | ZIPの名前の文字コードと正規化を検査できます | 販売時の決済手数料は計算していません |
| 今回完了後 | 3種類の支払い方法について、公開料金を使った概算を比較できます | 返金、税、契約別料金、実売データはなお別途確認が必要です |
飛ばせる章: 料金表の読み方を知っている場合は、「9行の試算を走らせる」から始められます。
なぜ3.6%だけでは足りないか
Stripe の日本向け標準料金表では、オンラインのカード決済は成功 1 回あたり 3.6%です。一方、コンビニ決済は 3.6%でも最低手数料が 120 円です。また、PayPay は通常 3.98%ですが、デジタルコンテンツ事業向けには 9.48%という別の表示があります。AI が商品価格だけを見て「手数料は 3.6%」とまとめても、支払い方法と商品区分を落とした時点で試算になりません。
ここでは「日本円で 980 円、1 件ずつ成功、標準料金のカード・コンビニ・デジタルコンテンツ事業向け PayPay」を仮定します。PayPay の 9.48%を使えるかは、この計算では確定できません。導入時には Stripe の表示と契約を確認します。円未満の処理も実際の Stripe 請求額だと断定せず、比較のため四捨五入しました。
[AIで作るデジタル商品] → [仮の販売価格 980円]
↓
[購入者が選ぶ支払い方法]
├─ カード: 3.6%
├─ コンビニ: 3.6%、ただし最低120円
└─ PayPay: デジタルコンテンツ事業向け9.48%
↓
[概算残額を比較して価格を再検討]
用語
| 用語 | この試算での意味 |
|---|---|
| 決済手数料 | 決済が成功したとき、料金表に従って差し引くと仮定した金額です |
| 最低手数料 | 率で計算した額が小さくても、1件につき少なくとも差し引かれる額です |
| 概算残額 | 商品価格から、ここで計算した決済手数料だけを引いた額です。利益や振込額ではありません |
| Decimal | Pythonで十進の小数を扱う型です。金額の概算で2進浮動小数点の誤差を避けます |
| ROUND_HALF_UP | 円未満をこの実験用に四捨五入する設定です。Stripeの実際の丸め規則を代弁しません |
9行の試算を走らせる
Python 標準機能だけを使います。まず版を確認しました。
python3 --version
Python 3.13.5
次の内容をfee_trial.pyとして保存します。最初の 1 行は「一律 3.6%」という失敗した計算です。その下で料金を支払い方法別に分け、コンビニの最低額を適用します。数値は 2026 年 10 月 5 日に確認した Stripe の公開料金表を入力したものです。料金の更新時には、表を見直してratesと最低額も更新します。
from decimal import Decimal, ROUND_HALF_UP
prices = [980, 1980, 3300]
rates = {
"card": Decimal("0.036"),
"konbini": Decimal("0.036"),
"paypay_digital": Decimal("0.0948"),
}
def estimate(price, method):
fee = (Decimal(price) * rates[method]).quantize(
Decimal("1"), rounding=ROUND_HALF_UP
)
if method == "konbini":
fee = max(fee, Decimal(120))
return int(fee), price - int(fee)
wrong = (Decimal(980) * Decimal("0.036")).quantize(
Decimal("1"), rounding=ROUND_HALF_UP
)
print(f"first: price=980 method=konbini fee={wrong} net={980-int(wrong)}")
for price in prices:
for method in rates:
fee, net = estimate(price, method)
print(f"price={price} method={method} fee={fee} net={net}")
print("ten_sales_convenience_980=", estimate(980, "konbini")[1] * 10)
print("ten_sales_card_980=", estimate(980, "card")[1] * 10)
python3 fee_trial.py
first: price=980 method=konbini fee=35 net=945
price=980 method=card fee=35 net=945
price=980 method=konbini fee=120 net=860
price=980 method=paypay_digital fee=93 net=887
price=1980 method=card fee=71 net=1909
price=1980 method=konbini fee=120 net=1860
price=1980 method=paypay_digital fee=188 net=1792
price=3300 method=card fee=119 net=3181
price=3300 method=konbini fee=120 net=3180
price=3300 method=paypay_digital fee=313 net=2987
ten_sales_convenience_980= 8600
ten_sales_card_980= 9450
最初の見積もりから、コンビニ決済の概算残額は 1 件あたり 85 円下がりました。仮に 10 件すべてがこの方法なら、9450 円ではなく 8600 円です。1980 円でもコンビニの最低 120 円が効きますが、3300 円では 3.6%を四捨五入した 119 円に対して、まだ 120 円の最低額が効きます。率だけでは境目を見落とします。
PayPay は別の注意点があります。この例の 980 円なら概算手数料は 93 円です。ただし「PayPay なら必ず 9.48%」という意味ではありません。料金表には一般の 3.98%とデジタルコンテンツ事業向けの 9.48%が並びます。商材区分を先に確認せず、都合のいい率だけ選ぶのは危険です。
価格を変える前に残ったこと
この試算は決済成功 1 件あたりの比較に限ります。制作時間、サポート費、返金、税金、広告費、通貨換算、契約別の料金は含みません。売上がゼロなら、ここに並んだ「概算残額」もゼロです。支払い方法の利用比率も、まだ実測していません。
私はまず決済方法を限定した小さな販売テストを行い、実際の支払い方法と請求明細を見てから、価格を直したいです。AI に値付けの案を出してもらうのは、その後でも遅くありません。料金表の条件を確かめずに「980 円なら十分」という答えだけ採用するより、失敗の場所がはっきりします。
よくあるエラー
| 症状 | 原因 | 対処 |
|---|---|---|
| コンビニの概算手数料が35円になる | 3.6%だけ掛け、最低120円を忘れています | max(率で計算した額, 120)で比較します |
| PayPayの数字が資料と違う | 通常の3.98%と、デジタルコンテンツ事業向けの9.48%を混同しています | 契約・商材区分を確認してから率を選びます |
| 概算残額を利益と呼んでしまう | 手数料だけを引き、ほかの費用を引いていません | 利益の表と切り離し、制作・税・返金などを別に集計します |
| 小数の端数が計算ごとにぶれる | floatと丸め規則を混在させています | Decimalに文字列を渡し、丸め方を明記します |
一次情報
| 資料 | 確認した内容 |
|---|---|
| Stripe 日本の料金体系 | 標準のカード決済3.6%、コンビニ決済の最低120円など |
| Stripe 決済手段別の料金体系 | PayPayの通常3.98%とデジタルコンテンツ事業向け9.48%の表示 |
Python decimal公式文書 | 十進演算とROUND_HALF_UPによる丸め方 |


