DOCS

フォームとFormchanをつなぐ

専用の送信先URLをフォームに設定すると、Formchanで問い合わせを受信できます。基本の設定から、通知・外部連携までご案内します。

BUILD WITH AI

開発にAIを使っているなら、 URLと仕様書を渡すだけ。

管理画面で取得したフォームの送信先URLと、このMarkdown仕様書を開発AIに渡してください。既存フォームの接続も、新しいフォームの作成も依頼できます。

AIに渡す依頼文を見る
このサイトのお問い合わせフォームをFormchanにつないでください。

送信先URL:[管理画面で取得した専用URLをここに貼り付け]
連携仕様書:https://formchan.app/lp/integration-ja.md

仕様書を読んで、既存のデザインを活かして実装してください。フォームがなければ作成してください。入力の検証、送信中・成功・エラーの表示、二重送信の防止も含め、テスト送信の確認方法を案内してください。

基本の設定

アカウントを作成すると、最初のフォームが用意されます。ダッシュボードに表示される専用URLを、フォームのaction属性に設定してください。method属性はPOSTにします。

フォーム設定画面で、専用の送信先URLと埋め込み用コードを確認できます。
フォーム設定画面で、専用の送信先URLと埋め込み用コードを確認できます。
<form action="https://formchan.app/f/YOUR_FORM_KEY" method="POST">
  <input name="name">
  <input name="email" type="email">
  <textarea name="message"></textarea>
  <button>送信</button>
</form>

送信後、利用者には送信完了ページが表示されます。問い合わせはFormchanの受信箱に届き、AIが重要度・タグ・要約を付けます。設定後はテスト送信で、受信と通知を確認してください。

入力項目の設定

各項目のname属性は自由に指定できます。送信された項目は、受信箱と通知メールに表示されます。

返信先のメールアドレスには、name属性がemail、mail、_replytoなどの項目を使用します。送信者名にはname、fullnameなどの項目を使用します。

1回の送信サイズは64KBまでです。項目は先頭から50個まで、各項目の値は5,000文字まで受け付けます。超えた項目や文字は保存されません。

送信後のページ

既定では、Formchanの送信完了ページを表示します。送信元ページを確認できる場合は、戻るリンクも表示されます。

送信後の移動先を指定しない場合に表示される、送信完了ページ。
送信後の移動先を指定しない場合に表示される、送信完了ページ。

自分のサイトの完了ページへ移動させるには、_nextという隠し項目にURLを設定します。送信を許可するサイトを指定している場合は、そのサイト内のURLを使用してください。

<input type="hidden" name="_next" value="https://example.com/thanks">

JavaScriptでの送信

Accept: application/jsonヘッダーを指定すると、送信結果をJSONで取得できます。ページを移動せずに、フォーム内で完了メッセージを表示する場合などに利用できます。

const res = await fetch('https://formchan.app/f/YOUR_FORM_KEY', {
  method: 'POST',
  headers: { Accept: 'application/json' },
  body: new FormData(form),
});
const data = await res.json(); // { ok: true }

成功時はok: true、失敗時はok: falseとerrorが返ります。errorには次のコードが入ります。

エラーコードHTTP内容
not_found404フォームが存在しない、または無効になっている
origin403送信元のサイトが許可されていない
rate429短時間の送信回数が上限に達した
body400送信データを読み取れない、またはサイズが上限を超えた
empty400入力内容がすべて空になっている

スパム対策

name属性が_gotchaの非表示項目を追加すると、簡易的なボット対策になります。この項目に値が入っていた場合は、送信成功の応答を返しますが、問い合わせとして保存しません。

<input name="_gotcha" style="display:none" tabindex="-1" autocomplete="off">

同じIPアドレスからの短時間の連続送信には、送信回数の制限も適用されます。

フォームの設定で、送信を許可するサイトを指定できます。指定後は、それ以外のサイトからの送信を受け付けません。

サイト・フレームワーク別の設定

HTML
基本の設定にあるサンプルコードを使用し、actionを専用URLに変更してください。
WordPress
カスタムHTMLブロックにフォームのコードを貼り付けます。フォームプラグインを利用する場合は、送信先を変更できるか確認してください。
Webflow
フォーム設定のActionに専用URLを入力し、MethodをPOSTに設定してください。
React / Next.js
「JavaScriptでの送信」の例を参考に、fetchで専用URLへ送信してください。

通知の設定

重要度★3の問い合わせは、判定後すぐに通知先へメールでお知らせします。通知先を追加した場合は、確認メール内のリンクを開いて認証してください。認証後に通知が有効になります。

通知先は、確認メールで認証したアドレスのみ有効になります。
通知先は、確認メールで認証したアドレスのみ有効になります。

★1・★2は、1日1通のまとめメールでお知らせします。配信時刻は設定で変更できます。対象の問い合わせがない日は配信しません。

即時通知・まとめメールの有効/無効と、まとめメールの配信時刻を設定できます。
即時通知・まとめメールの有効/無効と、まとめメールの配信時刻を設定できます。
重要度★3の問い合わせを知らせる通知メール。
重要度★3の問い合わせを知らせる通知メール。
★1・★2の問い合わせをまとめた、毎日のメール。
★1・★2の問い合わせをまとめた、毎日のメール。

プロプラン以上では、Slack、Chatwork、Microsoft Teams、Google Chat、Discordにも通知できます。

チャット通知の設定画面(プロプラン以上)。
チャット通知の設定画面(プロプラン以上)。

Webhook

ビジネスプランの機能です。問い合わせのAI判定後、設定したURLにJSON形式のデータをPOSTで送信します。

Webhookの設定画面(ビジネスプラン)。
Webhookの設定画面(ビジネスプラン)。

X-Formchan-Signatureヘッダーには、Webhookのシークレットで本文を署名したHMAC-SHA256が、sha256=…の形式で入ります。受信側で署名を検証し、送信元がFormchanであることを確認してください。

送信データの例

{
  "event": "submission.created",
  "at": "2026-10-12T09:29:41.000Z",
  "workspace": { "id": "w_…", "name": "Harbor Design Studio" },
  "submission": {
    "id": "sb_…",
    "number": 1,
    "form": { "id": "fm_…", "name": "Contact" },
    "received_at": "2026-10-12T09:29:38.000Z",
    "name": "Emily Parker",
    "email": "emily@example.com",
    "fields": { "name": "Emily Parker", "email": "emily@example.com", "message": "…" },
    "stars": 3,
    "tags": [{ "id": "tg_…", "name": "Inquiry", "by": "ai" }],
    "summary": "Wants a consultation on adding a second floor.",
    "reason": "Concrete request with budget and timeline.",
    "done": false
  }
}

署名の検証例(Node.js)

import crypto from 'node:crypto';

// rawBody: the request body as a string, before JSON.parse
function isFromFormchan(rawBody, signature, secret) {
  const expected = 'sha256=' + crypto.createHmac('sha256', secret).update(rawBody).digest('hex');
  const a = Buffer.from(expected), b = Buffer.from(signature || '');
  return a.length === b.length && crypto.timingSafeEqual(a, b);
}

受信できない場合は、actionに設定した専用URL、methodのPOST指定、フォーム設定の送信許可サイトを確認してください。

大切な問い合わせに、 きちんと応える毎日へ。

月100件まで無料。 いまのフォームで、AIによる仕分けを試してみませんか。

無料で始める