ビルダーのフォームを卒業する

ビルダーのフォームを卒業する2 分で読めます

Netlify Forms の上限:100 件を超えると何が起きるか、そして抜け出し方

Netlify の旧プランはサイトごとにフォーム送信を計測して自動でアップグレードし、クレジットプランはサイトを一時停止することがあるので、フォームをバックエンドに移しましょう。

Preet SutharIkiform 創業者

Netlify の旧プランでは、各サイトに月 100 件のフォーム送信が含まれ、それを超えるとサイトが自動的に有料の Forms レベルにアップグレードされます。2025 年 9 月以降に作成したアカウント向けのクレジット制プランではフォームは無料ですが、無料のチームがクレジットを使い切ると、フォームも含めてすべてのサイトが一時停止されます。フォームを Ikiform に移すには、素の HTML でもどのフレームワークでも、Netlify の属性を削除して action を設定するだけです。

Netlify ならではの違い

Netlify はサイトビルダーではなく、フォーム機能を内蔵したホスティングです。これが上限にも抜け出し方にも影響します。どの上限が適用されるかは、アカウントの作成時期で決まります。

アカウントNetlify のドキュメントの記載送信の多いフォームにとっての意味
旧プラン(2025 年 9 月 4 日より前に作成)Forms Level 0 には、サイトごと・月ごとに 100 件の送信と 10 MB のアップロードが含まれます。超えるとサイトは 1,000 件の Forms Level 1 にアップグレードされ、請求サイクルの終わりに課金されます。それを超えると、追加の利用パッケージが 500 件ずつ加わりますスパムの波で、誰も決めていないのにサイトが有料レベルに上がることがあります。無料の旧プランでは、上限に達するとアカウントのすべてのサイトが一時停止されます
クレジット制プラン(それ以降に作成)フォームの送信は無料かつ無制限で、レベルはありませんフォーム自体は無料です。ただし、無料のチームが月のクレジットを使い切ると Netlify はすべてのプロジェクトを一時停止し、一時停止したプロジェクトはフォームの送信を受け付けません

Netlify 自身のドキュメントに、旧プランのアップグレードは自動であること、利用量が下のレベルを上回っている間は戻せないことが明記されています。何かを決める前に、Netlify のダッシュボードでチームのプランの種類とサイトのフォーム利用量を確認してください。

移行する 2 つ目の理由は、数字とは関係ありません。Netlify Forms は、デプロイされた HTML を読み取って動きます。

  • フォームはデプロイ時に検出されます。React、Vue、Svelte が描画するフォームはその HTML に存在しないので、ビルドが見つけられるように非表示の静的なコピーを置き、form-name フィールド付きでそこに送信します。
  • Next.js では、OpenNext アダプターがそのコピーを public/ の静的ファイルとして必要とし、送信は Next.js のページではなくその静的ファイルに向ける必要があります。それがないまま React のコードに data-netlify があると、ビルドが失敗します。
  • 送信は urlencoded か multipart でなければなりません。JSON は受け付けられません。
  • フォームが動くのは、サイトが Netlify にデプロイされている間だけです。ホストを移すと、フォームも移すことになります。
旧プランの Netlify サイトのフォーム利用量が 1 か月でどう増えるかと、Ikiform に送信すると何が変わるか旧プラン、1 サイト、1 か月Ikiform に送信するフォームLevel0100件まで含む101件目の送信スパムも数えられるLevel1月 1,000件、課金追加パッケージそれぞれ 500件追加Netlify上の同じページIkiformのエンドポイント素のaction のURLNetlifyForms数えるものなし自動アップグレード送信旧プランの Netlify サイトのフォーム利用量が 1 か月でどう増えるかと、Ikiform に送信すると何が変わるか旧プラン、1 サイト、1 か月Ikiform に送信するフォームLevel 0100 件まで含む101 件目の送信スパムも数えられるLevel 1月 1,000 件、課金追加パッケージそれぞれ 500 件追加Netlify 上の同じページIkiform のエンドポイント素の action の URLNetlify Forms数えるものなし自動アップグレード送信
  1. 旧プランでは、サイトは月の初めに 100 件の送信を含む Forms Level 0 から始まります。
  2. 101 件目の送信が届きます。Netlify の利用量のドキュメントはサイトの利用量を対象にしているので、スパムの急増が上限を超えさせる原因になることもあります。
  3. Netlify はサイトを 1,000 件の Forms Level 1 にアップグレードし、サイクルの終わりに請求します。
  4. Level 1 を超えると、追加の利用パッケージが 500 件ずつ加わります。
  5. フォームを Ikiform に送信するようにすると、ページは Netlify に置いたまま、送信は Ikiform のエンドポイントに向かいます。
  6. Netlify Forms は送信を受け取らないので、数えるものもアップグレードするものもありません。
ホスティングは Netlify のままです。移るのはフォームの送信先だけで、それと一緒に計測も移ります。

スタックごとにフォームを移す

コードを変える前に、Netlify のフォーム名ごとに Ikiform のフォームを 1 つ作り、その Honeypot field を bot-field に設定します。そうすれば既存の非表示の入力欄が、名前を変えずにそのままハニーポットとして働きます。スタックを選んでください。

Netlify 上の素の HTML なら、変更はいちばん少なくて済みます。Netlify の属性と form-name の入力欄を削除し、action をエンドポイントに向け、サンクスページのパスを完全な URL として _redirect に移します。bot-field の入力欄はハニーポットとして残します。

<form name="contact" method="POST" action="/thanks" data-netlify="true" netlify-honeypot="bot-field">
  <input type="hidden" name="form-name" value="contact" />
  <p hidden><input name="bot-field" /></p>
  <label>Email <input type="email" name="email" required /></label>
  <label>Topic
    <select name="topic">
      <option value="question">A question</option>
      <option value="bug">Something is broken</option>
      <option value="work">Working together</option>
    </select>
  </label>
  <label>Message <textarea name="message" required></textarea></label>
  <button type="submit">Send</button>
</form>
TanStack Start と React Router の版は、自分のサーバーから送信します。サーバー側の版はシークレットキー付きで送信するので、Ikiform は Allowed domains と人間確認をスキップします。その場合はすべての送信がサーバーの IP から来るため、訪問者ごとに 1 分あたり 5 件という Standard の制限が、すべての訪問者をまとめて数えてしまいます。サーバー経由で送信するフォームでは Relaxed か Custom のレート制限を選び、IKIFORM_SECRET_KEY はサーバー専用の環境変数に置いてください。

どの版も Netlify と同じフィールド名を使うので、通知メールや CSV の列は見慣れたままです。Netlify Forms との比較に、data-netlify-recaptcha やファイルの入力欄も含めた属性の対応表があります。

デプロイプレビューと許可ドメイン

Netlify はプルリクエストごとに deploy-preview-42--your-site.netlify.app のような専用のアドレスを付けます。これは your-site.netlify.app のサブドメインではないので、Allowed domains にサイトのアドレスを入れてもプレビューはカバーされず、プレビューからの送信は origin_mismatch でスパムになります。

  • 本番用に your-site.netlify.app と独自ドメインを追加します。
  • テストしている間だけ特定のプレビューのホストを追加し、終わったら削除します。
  • netlify.app 単体は追加しないでください。Netlify 上のすべてのサイトがあなたのフォームに送信できるようになってしまいます。
  • または、環境変数を使ってプレビューを許可ドメインのない 2 つ目の Ikiform のフォームに向け、本番は厳格なままにします。

送信を失わずに切り替える

  1. サイトの Forms セクションから、フォームごとの過去の送信データを CSV でダウンロードします。Ikiform にはインポート機能がありません。
  2. 新しいフォームをプレビューにデプロイしてテストを送ります。Ikiform のダッシュボードでフィールド名を確認します。
  3. 本番にマージし、本番のドメインからもう一度テストを送ります。
  4. Netlify の送信 Webhook は Ikiform の Webhook に置き換えます。Netlify は JWS トークンで署名し、Ikiform は Standard Webhooks のヘッダーを使うので、検証処理も変わります。
  5. 数日間 Netlify に送信が届かなくなったら、サイトの Forms 設定でフォームの検出をオフにします。
Netlify はファイルアップロードを受け付け、すべての送信に Akismet をかけます。Ikiform はファイルアップロードにまだ対応していません。ファイル付きの送信には 422 files_not_supported が返ります。ファイルが必要なフォームがあれば、そのフォームだけ Netlify Forms に残し、残りを移してください。

Netlify で動作を確認する

  1. フォームの Allowed domains に自分のサイトのドメインを追加し、開発中は localhost も追加します。空のままにすると、どこからの送信も受け付けます。
  2. プレビューをデプロイし、そのホストを追加して、そこからフォームを送信します。
  3. ダッシュボードで Submissions を開きます。送ったすべてのフィールドを含む新しい送信データがあります。
  4. フィールドが email、topic、message で、form-name も bot-field もないことを確認します。
  5. Netlify でサイトの Forms タブを開き、テストがそこにないことを確認します。
  6. bot-field を埋めて 1 回送信します。スパムとして保存され、何も送られません。
  7. 通知の各受信者の受信トレイを確認します。それぞれにフィールド入りのメールが届き、フォームに email フィールドがあれば Reply で送信者に返信できます。

ハマりどころ

問題対処法
Ikiform に form-name フィールドが表示される非表示の form-name の入力欄がまだフォームに残っているか、コードがまだ設定しています。削除してください。Ikiform は URL でフォームを識別します。
フォームに関するエラーで Next.js のビルドが失敗するReact のコードに netlify か data-netlify の属性がまだ残っています。public/__forms.html と一緒に削除してください。
プレビューからの送信がスパムになるプレビューのホストが Allowed domains にありません。テスト中だけ追加するか、プレビュー用に 2 つ目のフォームを使ってください。
本物も含めて、すべての送信がスパムになる入力欄は bot-field なのに Honeypot field が _gotcha のまま、またはその逆です。両者を合わせてください。
422 files_not_supportedフォームの <input type="file"> でファイルが選択されています。ファイルアップロードにはまだ対応していません。入力欄を削除するか、代わりにリンクを尋ねてください。
429 rate_limited1 人の訪問者がフォームのレート制限を超えて送信しました。Standard では訪問者ごとに 1 分あたり 5 件までです。Retry-After まで待つか、共有の IP 1 つから送信するフォームには Relaxed か Custom を選んでください。

よくある質問

手順で詰まったときや、あなたの状況に合うガイドがほしいときはメールでどうぞ: hello@ikiform.com