個人開発で「愛犬取説」を作ったらStripe に弾かれた話

はじめに

THINKONYX で個人開発しているサービス「愛犬取説(あいけんとりせつ)」を 2026 年春に公開しました。本記事では、サービスの紹介と、開発過程で一番苦労した「決済システムの選定」について書き残しておきます。

特に、Stripe のアカウント承認が下りなかった話は、これから個人で課金サービスを作ろうとしている方の参考になれば幸いです。

サービスURL: https://dog-manual.thinkonyx.jp


愛犬取説とは

万が一の時も安心。愛犬の大切な情報を 1 枚にまとめて共有できる Web アプリ。

愛犬取説は、愛犬の以下のような情報を 1 つの「取扱説明書」にまとめて保存・共有できるサービスです。

  • 基本情報(名前、犬種、生年月日、マイクロチップ番号など)
  • 医療履歴(ワクチン、既往症、かかりつけ医)
  • 性格・苦手なもの・知っているコマンド
  • 食事、散歩、排泄、睡眠などの生活リズム
  • 緊急連絡先(家族、かかりつけ動物病院)

作成した取説は QR コード付きの公開ページとして共有できるので、

  • ペットホテルに預ける時
  • 旅行先で動物病院にかかる時
  • 自分が事故・入院などで一時的に世話ができなくなった時

など、第三者が愛犬を一時的にケアする場面で「この子の情報を一発で伝えられる」ことを目指しています。

実際、私自身が「もし自分に何かあった時、愛犬のことを家族や預け先にちゃんと伝えられているだろうか?」と不安になったのが開発のきっかけでした。


開発のきっかけ

ペットの飼い主であれば誰しも、

  • かかりつけ動物病院の電話番号、すぐ言える?
  • フードのメーカーと量、メモしてある?
  • アレルギーや過去の手術歴、家族全員が把握してる?

…と聞かれて、すべて即答できる人は意外と少ないと思います。

私自身、愛犬を実家に預ける時に「散歩の時間って何時だっけ?」「フードの量って何グラム?」と毎回 LINE で聞かれていて、これを 1 つにまとめておけば良いのでは、と思ったのがスタートでした。

スマホのメモでも良いのですが、

  • 第三者にもサッと見てもらえる形式が欲しい
  • 緊急時にログイン無しで見られるようにしたい
  • スマホで撮った写真と一緒に管理したい

という要件を満たすために、Web アプリとして自作することにしました。

技術スタックは Next.js 15 + Supabase + Vercel というシンプルな構成です。フロントエンドは React 19、認証・DB・ストレージは全部 Supabase に寄せています。


Stripe に弾かれた話

サービスは基本無料ですが、運営費(Vercel・Supabase・ドメイン・メールサーバー)を賄うために、応援機能(投げ銭)を入れることにしました。

最初に選んだ決済プラットフォームは、個人開発の定番である Stripe です。

Stripe アカウント審査で不承認

ところが、Stripe のアカウント審査で不承認となりました。

理由として説明されたのは、ざっくり言うと

カードネットワークパートナーのポリシーにより、当該事業はサポートできない」

というものでした。Stripe 独自の判断ではなく、その上流にあるカードブランド側のリスク評価で弾かれた、というニュアンスです。

これは Stripe に限った話ではなく、同じカードネットワークを使う他の決済代行(Square、PAY.JP など)でも、同じ理由で弾かれる可能性が高いということを意味します。

「個人事業 × 比較的新しいサービス × 寄付モデル」という組み合わせは、カードブランド側から見るとリスクカテゴリに入りやすいようで、これは個人で交渉してもひっくり返せる類の話ではない、と判断しました。

結論:Buy Me a Coffee に切り替え

色々調べた結果、Buy Me a Coffee(BMC) を採用することにしました。

BMC を選んだ理由はシンプルで、

  • 私(運営者)と決済の間に BMC が入るので、自分でカード会社と直接契約する必要がない
  • 一回の投げ銭・月額メンバーシップ両方に対応している
  • クリエイター向けに最適化されていて、UI が親しみやすい
  • 海外ユーザーにも対応しやすい

という点が、「個人で運営する応援ベースのサービス」と相性が良かったからです。

愛犬取説では、Buy Me a Coffee の Webhook を受けて、応援してくれた方にサービス内で「応援会員」バッジが表示される仕組みを実装しました。

応援ページ: https://buymeacoffee.com/thinkonyx

学んだこと: 個人で課金システムを組む時は、「Stripe で行ける前提」で設計せず、カードブランド審査が落ちる前提のプラン B を最初から想定しておいた方が良い、というのが今回の教訓です。


技術的にハマったところ

参考までに、開発中にハマったポイントをいくつか共有します。

1. Next.js 15 の params が Promise 化された

Next.js 15 から、動的ルートの paramsPromise になりました。

// Before (Next.js 14)
export default function Page({ params }: { params: { slug: string } }) {
  const { slug } = params
}

// After (Next.js 15)
export default async function Page({ params }: { params: Promise<{ slug: string }> }) {
  const { slug } = await params
}

最初これに気づかず、共有ページが動かなくて 30 分くらい溶けました。

2. OG 画像の <div> 制約

リンクをチャットや SNS に貼った時にプレビュー画像が出るように、next/ogImageResponse で OG 画像を動的生成しました。

ハマったのは、<div> に複数の子要素を入れる場合は display: 'flex' を明示しないと 500 エラーになるということ。エラーメッセージは出るのですが、最初は「なぜ flex を強制されるのか」がピンと来ず、しばらく悩みました。

3. Supabase RLS と公開ページの両立

愛犬取説は「ログインユーザー本人だけが編集できる」「でも QR コード経由なら誰でも閲覧できる」という二重のアクセス制御が必要でした。

これは Supabase の Row Level Security(RLS)で、

  • authenticated ロール: 自分の user_id の行のみ操作可
  • anon ロール: 公開フラグが立っている行のみ SELECT 可

のように分けて書くことで実現しました。最初は anon 用のポリシーを書き忘れていて、共有ページから見ると「取説が見つかりません」になる、というバグを踏みました。


これから

愛犬取説は、まだリリースしたばかりの小さなサービスですが、

  • 動物病院・ペットホテル様向けの紹介
  • ワクチン期限リマインダー機能
  • 複数の家族で 1 頭の取説を共有できる機能

など、追加していきたい機能はたくさんあります。

ペットを家族として迎えている方、特に「自分にもしものことがあった時、この子は大丈夫だろうか」と一度でも考えたことがある方に、ぜひ使ってみてもらえると嬉しいです。


リンク

Tags:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA