リード獲得フォーム

リード獲得フォーム1 分で読めます

サービス業向けの相談申し込みフォームを作る

会計士、弁護士、コーチ、クリニック向けの相談申し込みフォームです。連絡方法と時間を尋ね、デリケートな詳細は電話のときに回します。

Preet SutharIkiform 創業者

名前、メールアドレス、連絡方法とおおよその時間帯、大まかな相談内容を尋ね、状況の詳細はすべて電話のときに聞きます。ブラウザーからタイムゾーンを記録すれば、希望された「午前」は相手の午前になります。電話を選んだときだけ電話番号を求めるなど、フォームのスキーマで表せないルールは自分のコードで適用してください。

相談申し込みならではの違い

相談の申し込みは、問題を抱えた人から来ます。税務署からの手紙、賃貸の争い、始めたい事業などです。本人は説明したがり、フォームはそれを促します。そこが落とし穴です。入力した内容はすべて送信データと一緒に保存され、通知メールに表示され、向けた先へ Webhook で送られます。口座番号や事案の詳細は、そのどこにもふさわしくありません。

だからフォームの役割は見た目より狭く、相手が誰か、どう・いつ連絡するか、おおよその内容だけです。それ以外はすべて電話を待ちます。電話なら、何を書き留めてどこに保管するかを自分で管理できます。

相談フォームで尋ねることと、電話まで待つことフォームで電話で誰か名前、メールどうやってメール、電話、ビデオいつ日、時間帯、タイムゾーン内容大まかな相談内容本人の状況本人の言葉で書類自分の経路で番号口座、ID、記録対応の可否と料金あなたの回答相談フォームで尋ねることと、電話まで待つことフォームで電話で誰か名前、メールどうやってメール、電話、ビデオいつ日、時間帯、タイムゾーン内容大まかな相談内容本人の状況本人の言葉で書類自分の経路で番号口座、ID、記録対応の可否と料金あなたの回答
  1. 誰か:名前とメールアドレスを尋ねます。
  2. どう連絡するか:メール、電話、ビデオを尋ねます。
  3. いつか:希望日、時間帯、タイムゾーンを尋ねます。
  4. 何についてか:大まかな相談内容を 1 つ尋ねます。
  5. 電話では、本人の状況を本人の言葉で聞きます。
  6. 書類はフォームではなく、自分で選んだ経路で受け取ります。
  7. 口座番号、ID、記録はフォームに一切入力させません。
  8. 電話の最後に、対応の可否と料金を伝えます。
上の行だけで、電話の予約と準備には十分です。下の行が電話の目的です。

フィールド

プレビュー

Ikiform のバリデーターをブラウザーで実行します。何も送信されません。

ご希望の連絡方法は?

電話を選んだ場合のみ。

ご都合のよい時間帯

1〜2 文で。口座番号や個人の記録は入れないでください。

電話 を選んで電話番号を空にしてみてください。フィールドを条件付きで必須にはできないので、スキーマはそれを受け付けます。下のコードがその穴をふさぎます。
フィールドこの形にしている理由
contact_methodradio にすれば、最初の連絡を本人が希望した方法で行えます
phoneスキーマでは任意、電話を選んだときはコードで必須
preferred_datedate フィールドは YYYY-MM-DD を保存します。スキーマの min は固定なので、ページがブラウザーで明日を min に設定します
timezoneブラウザーで Intl.DateTimeFormat().resolvedOptions().timeZone から入力。例:Europe/Berlin
note上限 500 文字。通知メールには値ごとに 500 文字まで表示されるので、メモ全体が収まります

条件付きのルールは自分のコードで

Ikiform は各フィールドを個別に検証します。電話のときだけ電話番号を求めるなど、ほかのフィールドに依存するルールはコードで実行します。サーバーの版では確実に適用でき、ブラウザーの版では訪問者を案内し、不要なものは送りません。

スクリプトは、電話 が選ばれたら電話番号の入力欄に required を付け、訪問者自身のカレンダーで明日を最も早い日に設定し、非表示のタイムゾーンを埋めます。

consultation.html
<form action="https://ikiform.com/f/frm_xxxxxxxxxxxxxxxx" method="POST" id="consult">
  <label for="name">Name</label>
  <input id="name" name="name" autocomplete="name" required />
  <label for="email">Email</label>
  <input id="email" name="email" type="email" autocomplete="email" required />

  <fieldset>
    <legend>How should we reach you?</legend>
    <label><input type="radio" name="contact_method" value="email" checked /> Email</label>
    <label><input type="radio" name="contact_method" value="phone" /> Phone call</label>
    <label><input type="radio" name="contact_method" value="video" /> Video call</label>
  </fieldset>
  <label for="phone">Phone</label>
  <input id="phone" name="phone" type="tel" autocomplete="tel" />

  <label for="topic">What is it about?</label>
  <select id="topic" name="topic" required>
    <option value="new_business">Starting a business</option>
    <option value="tax">Tax and bookkeeping</option>
    <option value="other">Something else</option>
  </select>

  <label for="preferred_date">Preferred day</label>
  <input id="preferred_date" name="preferred_date" type="date" />
  <fieldset>
    <legend>Best time</legend>
    <label><input type="radio" name="time_window" value="morning" /> Morning</label>
    <label><input type="radio" name="time_window" value="afternoon" /> Afternoon</label>
    <label><input type="radio" name="time_window" value="evening" /> Evening</label>
  </fieldset>
  <input type="hidden" name="timezone" />

  <label for="note">Anything we should know first?</label>
  <textarea id="note" name="note" rows="3" maxlength="500"></textarea>
  <p>A sentence or two. Please don't include account numbers or personal records.</p>

  <input name="_gotcha" type="text" tabindex="-1" autocomplete="off" hidden />
  <button>Request a consultation</button>
</form>

<script>
  const form = document.getElementById("consult");
  const phone = form.elements.phone;
  const tomorrow = new Date(Date.now() + 86400000);
  const local = new Date(tomorrow.getTime() - tomorrow.getTimezoneOffset() * 60000);

  form.elements.timezone.value = Intl.DateTimeFormat().resolvedOptions().timeZone;
  form.elements.preferred_date.min = local.toISOString().slice(0, 10);
  form.addEventListener("change", () => {
    phone.required = form.elements.contact_method.value === "phone";
  });
</script>

サーバー側の版はシークレットキー付きで送信するので、Ikiform は Allowed domains と人間確認をスキップします。その場合はすべての送信がサーバーの IP から来るため、訪問者ごとに 1 分あたり 5 件という Standard の制限が、全訪問者をまとめて数えることになります。サーバー経由で送信するフォームには Relaxed か Custom のレート制限を選び、IKIFORM_SECRET_KEY はサーバー専用の環境変数に置いてください。サーバー側の fetch は Origin を送らず、Ikiform は無料の localhost テストをそこから判別するので、サーバーの版は訪問者の Origin ヘッダーを転送します。

デリケートな詳細をフォームに書かせない

  • 上のフォームのように、ヘルプテキストで伝えましょう。はっきりした指示には、思ったよりも従ってもらえます。
  • 身分証の番号、口座番号、医療の詳細のフィールドは追加しないでください。職業上、顧客データに関する規則があるなら、連絡先以外を集める前に確認し、残りはその規則を満たす経路で集めてください。
  • フィールド名も重要です。Ikiform は、password、ssn、cvv、seed を含む名前など、フィールド名が認証情報のように見えると、通知メールを確認のために保留します。スタートアップ向けコンサルティングのフォームの seed_round というフィールドはこれに引っかかります。funding_stage という名前にしてください。
  • Webhook は、全社のチャンネルではなく非公開のチャンネルなど、チーム全員が顧客の名前を読んでよい場所にだけ向けてください。

最初の返信

通知メールは Reply の宛先が訪問者になった状態で届くので、最初の返信は受信トレイから直接送れます。その返信の役割は 1 つ、日時を確定することです。都合を尋ねるより、相手の時間帯の中で具体的な候補を 2 つ出すほうが、承諾してもらいやすくなります。

  • 書く前に、相手の時間帯を自分の時刻に換算します。Australia/Sydney の morning は、ロンドンでは前日の夜です。
  • 相手のタイムゾーンで候補を 2 つ出し、メールにタイムゾーンを明記して、誰も 1 時間早く来ないようにします。
  • 連絡方法を伝えます。教えてもらった番号か、招待と一緒に送るビデオのリンクです。
  • 相談内容が自分の業務の範囲外なら、最初の返信でそう伝え、対応できる人を紹介します。その返信も送る価値があります。

動作を確認する

  1. 電話 を選び、電話番号を空にして送信します。ブラウザーかサーバーがメッセージを出して止めます。
  2. メールアドレス を選んで送信し、送信データを開きます。phone の値はなく、America/Chicago のようなタイムゾーンが入っています。
  3. 希望日に今日を選んでみます。日付の選択肢に出てきません。
  4. 通知メールを確認します。メモが全文表示され、Reply で訪問者宛てに書けます。
  5. フィールド ID を一覧にし、password、ssn、cvv、seed を含むものがないことを確認します。

ハマりどころ

  • タイムゾーンのない日付。 preferred_date は時点ではなく暦の日です。電話する前に timezone と time_window と合わせて読んでください。
  • 何も選ばれていないラジオボタン。 チェックされていないラジオボタンのグループは何も送りません。任意の time_window ならそれで問題なく、contact_method が メールアドレス にチェックした状態で始まるのはそのためです。
  • 予約の確認メールはない。 Ikiform はフォームに入力した人にはメールを送りません。日時は最初の返信で確定します。本人に枠を選んでもらいたいなら、デモ依頼フォームのように予約ツールに引き継いでください。
  • 電話番号の形式。 電話番号のフィールドは、入力どおり 6〜15 桁を受け付けます。+14155550123 の形式が必要なシステムから発信するなら e164 をオンにしてください。その場合、国番号のない番号は拒否されます。

よくある質問

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