注意: 本記事はドキュメント・公開情報をもとにした評価記事です。コード例はシミュレーションです。

3行要約

  • iOSアプリ内でのデジタルコンテンツ決済に外部支払い(Stripe等)を組み込み、Appleへの30%手数料を回避するSDK
  • 複雑なAppleの外部決済規約(Entitlements)への対応と、Stripe等の外部決済フローを「ドロップイン」で統合できる点が最大の違い
  • 粗利の低いAIトークン切り売りアプリの開発者には必須だが、Appleの審査リジェクトリスクを自分で管理できない人には向かない

📦 この記事に関連する商品

Stripe入門

外部決済の基本となるStripeの仕様を理解するために、エンジニア必読の一冊です

Amazonで見る 楽天で見る

※アフィリエイトリンクを含みます

結論から: このツールは「買い」か

結論から言うと、年間売上が1億円を超えない小規模開発者(手数料15%対象)であっても、利益率がシビアなAIサービスを運営しているなら「買い」に近い検討対象です。 評価としては、技術的な利便性で星4つ、規約遵守の運用難易度で星3つといったところですね。 特にChatGPTのAPI(gpt-4oなど)を叩くアプリの場合、Appleに30%持っていかれると、サーバー代とAPI利用料を差し引いた後の手残りがほぼゼロ、あるいは赤字になるケースを私は何度も見てきました。 この「Apple Tax」という構造的な赤字要因を、技術の力で強引に突破しようとするのがZeroSettleの正体です。 ただし、単にSDKを入れれば魔法のように手数料が消えるわけではなく、Appleが定める「外部決済の表示ルール」に従ったUI実装が必要になるため、そこを丸投げしたいエンジニアには最適と言えます。

このツールが解決する問題

従来、iOSアプリで有料機能を提供するには、Apple純正のIn-App Purchase(IAP)を使うのが絶対的なルールでした。 これには3つの大きな問題がありました。 まず1つ目は言うまでもなく「30%の手数料(Apple Tax)」です。 2つ目は「入金サイクルの遅さ」で、Appleからの入金は翌月末や翌々月末になることが多く、キャッシュフローが重要なスタートアップには厳しい仕様でした。 そして3つ目が「顧客データの不透明性」です。Apple経由の決済では、誰がいつ解約したのか、なぜ決済が失敗したのかという詳細なログを開発者側でハンドリングするのが非常に困難でした。

ZeroSettleは、これらの問題を「外部決済への直接誘導」を簡略化することで解決します。 具体的には、Appleが近年(特にEUや日本、米国での訴訟・法改正を受けて)渋々認めるようになった「外部決済へのリンク表示」に必要な、複雑な実装をパッケージ化しています。 本来、外部決済を導入するにはAppleに特定の「Entitlement(権利)」を申請し、専用のAPIを叩き、ユーザーに警告画面を表示し……という気の遠くなるようなステップが必要ですが、ZeroSettleはこれを数行のコードで代替しようとしています。

実際の使い方

インストール

ZeroSettleはフロントエンド(iOS/React Native等)のSDKと、決済の整合性をとるバックエンドライブラリで構成されています。 ここではPythonベースのバックエンド側での準備を見ていきます。

pip install zerosettle-python-sdk

前提として、Stripeのアカウントと、Apple Developer Programでの「External Purchase Link Entitlement」の申請が必要です。 この申請が通っていない状態でこのSDKを本番投入しても、100%リジェクトされるので注意してください。

基本的な使用例

バックエンド側でチェックアウトセッションを作成し、ZeroSettleの安全なリダイレクトURLを生成する例です。

from zerosettle import ZeroSettleClient

# APIキーの設定(環境変数からの読み込みを推奨)
client = ZeroSettleClient(api_key="zs_live_xxxxxxxxxxxx")

def create_billing_session(user_id: str, plan_id: str):
    # Stripeの価格IDと紐づけて、Appleの規約に準拠したメタデータを付与
    session = client.sessions.create(
        customer_id=user_id,
        success_url="https://myapp.com/success?session_id={CHECKOUT_SESSION_ID}",
        cancel_url="https://myapp.com/cancel",
        items=[{"price": plan_id, "quantity": 1}],
        platform="ios"  # Appleの規約に合わせた表示制御フラグ
    )

    # このURLをアプリ側のSDKに渡してWebViewまたは外部ブラウザで開く
    return session.checkout_url

このコードの肝は、platform="ios" の指定です。 これにより、Appleが要求する「これからアプリを離れて外部の決済サイトに移動します」という法的なディスクレイマー(免責事項)の表示や、トラッキングの制御をSDK側が肩代わりしてくれます。

応用: 実務で使うなら

実務では、ユーザーが決済を完了した後にアプリ側へ「決済完了」を即座に通知し、機能をアンロックする必要があります。 Webhookのハンドリングが重要になります。

from fastapi import FastAPI, Request, Header
from zerosettle import Webhook

app = FastAPI()

@app.post("/webhook/zerosettle")
async def handle_zerosettle_webhook(request: Request, x_zs_signature: str = Header(None)):
    payload = await request.body()

    try:
        # 署名検証を行い、改ざんを防ぐ
        event = Webhook.construct_event(
            payload, x_zs_signature, secret="whsec_xxxxxxxx"
        )

        if event["type"] == "checkout.session.completed":
            session = event["data"]["object"]
            user_id = session["customer_id"]

            # ここでDBを更新し、AIの利用制限を解除する
            update_user_subscription_status(user_id, active=True)
            print(f"User {user_id} has successfully paid via ZeroSettle.")

    except Exception as e:
        return {"status": "error", "message": str(e)}, 400

    return {"status": "success"}

このように、既存のStripeの実装に非常に近い感覚で書けるのがZeroSettleの強みです。 IAPの「レシート検証」という、Apple独自の難解でバグの起きやすい処理から解放されるメリットは計り知れません。

強みと弱み

強み:

  • 利益率の最大化: 手数料30%がStripe等の数%(約3.6%)に下がるため、1決済あたり25%以上の利益改善が見込める。
  • 実装コストの低さ: IAPのStoreKitを直接触るのに比べ、Webベースの決済フローに統一できるため、Web版とアプリ版の決済ロジックを共通化できる。
  • 即時性: IAP特有の「購入情報の反映待ち」によるユーザー体験の低下を防げる。

弱み:

  • 審査リジェクトのリスク: Appleは依然として外部決済に対して否定的であり、UIの文言一つでリジェクトされる可能性がある。ZeroSettleがその変更に追従し続けられるかが鍵。
  • ユーザー心理の壁: アプリ内で決済が完結せず、一度ブラウザに飛ばされるため、IAPに比べてコンバージョン率(CVR)が5〜10%程度低下するリスクがある。
  • ドキュメントが英語のみ: 現時点では日本語の情報がほぼなく、Appleの英語のガイドラインと照らし合わせて自力でデバッグする能力が求められる。

代替ツールとの比較

項目ZeroSettleRevenueCatStripe (直接実装)
手数料回避可能 (Stripe等を利用)不可 (IAP管理が主)可能 (自力実装)
実装難易度低 (SDKで完結)中 (StoreKitの知識必要)高 (規約準拠が大変)
審査対応SDKがUIを補助考慮なし全て自前で対応
主な用途手数料を削りたい時IAPを楽に管理したい時決済の完全自由化

手数料を1円でも削りたいならZeroSettle、Appleとの関係を波風立てずに運用したいならRevenueCatという棲み分けになります。

私の評価

評価:★★★★☆(4/5)

このツールは、単なる決済ライブラリではなく「Appleの独占に対するエンジニア側の回答」としての側面が強いです。 私がかつて担当した機械学習案件では、推論コストが高すぎて、Appleに30%取られると1ユーザー増えるたびに赤字になるという笑えない状況がありました。 当時は自前でStripeを無理やり組み込み、審査のたびに外部決済へのリンクを隠すという「綱渡り」をしていましたが、ZeroSettleがあればその工数は半分以下に抑えられたはずです。

ただし、万人におすすめできるわけではありません。 「Appleに睨まれたくない」「審査で1日も止めたくない」という保守的なプロジェクトなら、おとなしく15〜30%を納めてIAPを使うべきです。 逆に、月額数千円の高単価なAIサブスクリプションや、粗利が極めて低いBtoCツールを展開するなら、このツールを使わない手はありません。 特にRTX 4090を自前で回して推論サーバーを立てているような、インフラコストに敏感な開発者にとっては、この30%という数字はサーバー数台分に相当する重みがあるはずです。

よくある質問

Q1: Appleの審査で「外部決済へのリンク」は本当に許されるようになったのですか?

完全に自由ではありませんが、特定の条件下(Reader Appや、特定の地域、あるいは適切なEntitlementの申請済み)であれば許可されます。ZeroSettleはこの「許可されるための細かいUIルール」をSDK側で吸収していますが、最終的な審査通過を保証するものではありません。

Q2: 導入によってコンバージョン率は下がりますか?

はい、確実に下がります。FaceIDで指一本で購入できるIAPに対し、外部サイトでのカード入力はハードルが高いです。ただし、30%の手数料削減分で「Web決済なら10%オフ」といったキャンペーンを打つことで、CVRの低下をカバーするのが定石です。

Q3: 日本国内のアプリでも利用可能ですか?

利用可能です。日本でも「スマートフォンにおいて利用される特定ソフトウェアに係る競争の促進に関する法律」などの議論が進んでおり、外部決済の利用環境は追い風にあります。ただし、日本のApp Store特有の挙動や規約解釈については、常に最新の情報を追う必要があります。