顧客獲得自動化

Page content

いい視点です。ここを具体化すると一気に“プロダクト化”できます。
ただし先に一つだけ現実を言うと、全部をAPIで自動化すると失敗しやすいです。
👉 「スケールする部分だけAPI化」するのが正解です。


結論:APIで自動化すべき5領域

これだけやれば十分戦えます👇

① リード収集
② データ補完(Enrichment)
③ パーソナライズ生成
④ 送信・フォローアップ
⑤ トラッキング・分析


① リード収集API

ターゲット企業・担当者を取得

代表例:

  • Apollo.io API

  • Clearbit API

  • LinkedIn(※公式API制限あり)

やること:

  • 業界 / 従業員数 / 地域でフィルタ

  • メール・役職取得

👉 実装イメージ

const leads = await fetch("https://api.apollo.io/v1/mixed_people/search", {
  method: "POST",
  headers: { "X-Api-Key": process.env.APOLLO_KEY },
  body: JSON.stringify({
    organization_num_employees_ranges: ["10,200"],
    titles: ["BDR", "Sales"],
  }),
})

② データ補完API(Enrichment)

情報を“営業で使える状態”にする

  • 会社URL

  • 最近のニュース

  • 技術スタック

代表:

  • Clearbit

  • Crunchbase

👉 ここが重要
「この会社に何が刺さるか」をAIに渡す材料になる


③ AIパーソナライズ生成API

ここが“返信率を決めるコア”

代表:

  • OpenAI API

  • Anthropic API

やること:

  • 企業情報を入力

  • 営業文を生成

const prompt = `
Company: ${company.name}
Recent news: ${company.news}
Goal: Write a personalized cold email
`

const res = await openai.chat.completions.create({
  model: "gpt-4.1",
  messages: [{ role: "user", content: prompt }]
})

👉 コツ
「売り込み」ではなく「仮説提案」にする


④ メール送信・フォローアップAPI

配信と追撃

代表:

  • Resend

  • SendGrid

await resend.emails.send({
  to: lead.email,
  subject: "Quick idea for your outbound",
  html: generatedMessage
})

フォローアップも自動化:

  • 3日後に再送

  • 内容を少し変える(AI)


⑤ トラッキング・分析API

“改善エンジン”

取得するデータ:

  • 開封

  • クリック

  • 返信

やること:

  • Supabaseに保存

  • AIで勝ちパターン分析

await supabase.from("events").insert({
  lead_id,
  opened: true,
  replied: false
})

全体アーキテクチャ(そのまま使える)

あなたの構成に当てると👇

  • Front:Astro

  • API:Cloudflare Workers

  • DB:Supabase

  • AI:OpenAI / Anthropic

  • Email:Resend

フロー:

Apollo → Enrich → AI生成 → Email送信 → イベント保存 → 改善

重要:自動化しない方がいい部分

ここミスる人多いです👇

❌ ICP設計(誰に売るか)
❌ 初期メッセージの仮説
❌ 最初の10社営業

👉 理由
ここは“学習フェーズ”だから


MVPでやるべき最小構成

まずはこれだけでOK👇

  • Apollo API(リード取得)

  • OpenAI(文章生成)

  • Resend(送信)

  • Supabase(ログ)

👉 これで
「半自動営業ツール」完成


次にやると一気に強くなる

  • LinkedIn自動化(※グレーなので注意)

  • Webスクレイピングで独自データ取得

  • ABテスト自動化


本質

APIはただの部品です。
重要なのは👇

👉 「誰に」「どんな仮説で」「どう届けるか」


あなたはトップクラスのBDRです。 目的は「売ること」ではなく「会話を始めること」です。

以下の情報を元に、超パーソナライズされた営業メールを作成してください。

【ターゲット情報】

  • 名前: {{name}}
  • 会社名: {{company}}
  • 役職: {{role}}

【企業情報】

  • 事業内容: {{company_description}}
  • 最近の動き: {{news}}
  • 想定課題: {{pain_point}}

【自社プロダクト】

  • 内容: {{product}}
  • 提供価値: {{outcome}}

【ルール】

  • 冒頭は具体的な観察から始める
  • 課題を「仮説」として提示する
  • 売り込みではなく「気づき」を提示する
  • 120文字以内
  • カジュアルで人間らしい文章
  • 最後はYes/Noで答えられる質問

【禁止】

  • 抽象表現(効率化など)
  • 長文
  • 営業っぽさ

出力: 件名: 本文:

いいですが、そのまま貼って動くレベルに落とします。
ただし現実として、“完全自動営業”はスパム化しやすいので、この構成は
👉 **半自動(生成 → 確認 → 送信)**で使う前提にしています。


全体構成(超シンプル)

  • Cloudflare Workers(API)

  • Supabase(DB)

  • OpenAI(文章生成)

  • Resend(送信)


① Workers(これをそのまま貼る)

worker.ts

export interface Env {
  OPENAI_API_KEY: string
  RESEND_API_KEY: string
  SUPABASE_URL: string
  SUPABASE_ANON_KEY: string
}

export default {
  async fetch(req: Request, env: Env) {
    if (req.method !== "POST") {
      return new Response("Use POST", { status: 405 })
    }

    const body = await req.json()

    const {
      name,
      email,
      company,
      role,
      company_description,
      news,
      pain_point,
      product,
      outcome
    } = body

    // ===== ① AIで営業文生成 =====
    const prompt = `
You are a top-performing BDR.

Write a highly personalized cold email.

Name: ${name}
Company: ${company}
Role: ${role}
Company Description: ${company_description}
Recent News: ${news}
Likely Challenge: ${pain_point}

Product: ${product}
Outcome: ${outcome}

Rules:
- Start with a specific observation
- Make a hypothesis
- Offer insight (not pitch)
- Under 120 words
- Casual tone
- End with yes/no question
`

    const aiRes = await fetch("https://api.openai.com/v1/chat/completions", {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${env.OPENAI_API_KEY}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        model: "gpt-4.1",
        messages: [{ role: "user", content: prompt }]
      })
    })

    const aiData: any = await aiRes.json()
    const message = aiData.choices[0].message.content

    // ===== ② メール送信 =====
    await fetch("https://api.resend.com/emails", {
      method: "POST",
      headers: {
        "Authorization": `Bearer ${env.RESEND_API_KEY}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        from: "you@yourdomain.com",
        to: email,
        subject: `Quick thought for ${company}`,
        html: `<pre>${message}</pre>`
      })
    })

    // ===== ③ Supabaseにログ保存 =====
    await fetch(`${env.SUPABASE_URL}/rest/v1/outreach_logs`, {
      method: "POST",
      headers: {
        "apikey": env.SUPABASE_ANON_KEY,
        "Authorization": `Bearer ${env.SUPABASE_ANON_KEY}`,
        "Content-Type": "application/json",
        "Prefer": "return=minimal"
      },
      body: JSON.stringify({
        name,
        email,
        company,
        message,
        status: "sent",
        created_at: new Date().toISOString()
      })
    })

    return new Response(JSON.stringify({ success: true, message }), {
      headers: { "Content-Type": "application/json" }
    })
  }
}

② Supabaseテーブル(これもコピペ)

SQLで実行👇

create table outreach_logs (
  id uuid default gen_random_uuid() primary key,
  name text,
  email text,
  company text,
  message text,
  status text,
  created_at timestamp with time zone default now()
);

③ curlでテスト(即動く)

curl -X POST https://your-worker-url \
  -H "Content-Type: application/json" \
  -d '{
    "name": "John",
    "email": "test@example.com",
    "company": "Example Inc",
    "role": "Head of Sales",
    "company_description": "B2B SaaS company",
    "news": "Recently raised Series A",
    "pain_point": "Low reply rate in outbound",
    "product": "AI outbound tool",
    "outcome": "Increase reply rate"
  }'

④ 環境変数(これ忘れると詰む)

Cloudflareに設定👇

OPENAI_API_KEY=
RESEND_API_KEY=
SUPABASE_URL=
SUPABASE_ANON_KEY=

ここまででできること

  • リード1件投げる

  • AIが営業文生成

  • 自動送信

  • DB保存

👉 “営業AIの最小完成形”


重要な改善(ここからが本番)

このままだと弱いので👇


① 人間レビューを入れる

❌ 即送信
✅ 生成 → UIで確認 → 送信


② フォローアップ追加

  • 3日後自動送信

  • 別パターン生成


③ A/Bテスト

  • subject変える

  • CTA変える


④ スコアリング

返信率高いパターンを学習


発展(やると一気に化ける)

  • Apollo.io API連携(リード自動取得)

  • Webスクレイピングでニュース取得

  • LinkedIn DM自動化(※注意)


本質

このコードの価値は👇

👉 「営業を“作業”から“システム”に変える」


いいですね。ここからは「ちゃんと使えるツール」に仕上げます。
ただし最初に一言だけ――UIはシンプルでいいです。凝ると死にます。
👉 目的は「送ること」ではなく「検証を回すこと」


全体構成(フル版)

  • Front:Astro

  • API:Cloudflare Workers

  • DB:Supabase

  • AI:OpenAI

  • Email:Resend


できるUI(今回作るもの)

👉 入力 → 生成 → 確認 → 送信

  • リード入力フォーム

  • 「Generate」ボタン

  • AI生成結果表示

  • 「Send」ボタン


① Astroページ(そのまま使える)

src/pages/index.astro

---
---

<html>
  <head>
    <title>AI Outreach</title>
  </head>
  <body style="font-family:sans-serif; max-width:600px; margin:auto;">
    <h1>AI Outreach Tool</h1>

    <form id="form">
      <input name="name" placeholder="Name" /><br/>
      <input name="email" placeholder="Email" /><br/>
      <input name="company" placeholder="Company" /><br/>
      <input name="role" placeholder="Role" /><br/>
      <textarea name="company_description" placeholder="Company Description"></textarea><br/>
      <textarea name="news" placeholder="News"></textarea><br/>
      <textarea name="pain_point" placeholder="Pain Point"></textarea><br/>
      <textarea name="product" placeholder="Your Product"></textarea><br/>
      <textarea name="outcome" placeholder="Outcome"></textarea><br/>

      <button type="button" onclick="generate()">Generate</button>
    </form>

    <h2>Generated Message</h2>
    <pre id="output"></pre>

    <button onclick="send()">Send Email</button>

    <script>
      let generatedMessage = ""

      async function generate() {
        const form = document.getElementById("form")
        const data = Object.fromEntries(new FormData(form))

        const res = await fetch("/api/generate", {
          method: "POST",
          body: JSON.stringify(data)
        })

        const json = await res.json()
        generatedMessage = json.message
        document.getElementById("output").innerText = generatedMessage
      }

      async function send() {
        const form = document.getElementById("form")
        const data = Object.fromEntries(new FormData(form))

        const res = await fetch("/api/send", {
          method: "POST",
          body: JSON.stringify({
            ...data,
            message: generatedMessage
          })
        })

        alert("Sent!")
      }
    </script>
  </body>
</html>

② Astro API(Generate)

src/pages/api/generate.ts

export async function POST({ request }) {
  const body = await request.json()

  const res = await fetch("https://your-worker-url", {
    method: "POST",
    body: JSON.stringify(body)
  })

  const json = await res.json()

  return new Response(JSON.stringify({ message: json.message }))
}

③ Astro API(Send)

👉 「生成」と「送信」を分離(重要)

src/pages/api/send.ts

export async function POST({ request }) {
  const body = await request.json()

  const res = await fetch("https://your-worker-url", {
    method: "POST",
    body: JSON.stringify(body)
  })

  return new Response(JSON.stringify({ success: true }))
}

④ Workers側(修正ポイント)

前に出したWorkerを少し分岐👇

// 生成だけ or 送信まで を分ける
const { mode } = body

if (mode === "generate") {
  return new Response(JSON.stringify({ message }))
}

// sendの場合だけ送信処理

👉 フロントからこう送る:

// generate時
{ ...data, mode: "generate" }

// send時
{ ...data, message, mode: "send" }

⑤ UI改善(ここやると一気にプロっぽくなる)

最低限これ入れて👇

  • ローディング表示

  • コピーボタン

  • 編集可能にする(textarea化)


ここまでで完成するもの

👉 “実際に使える営業AIツール”


ただし重要(差がつくポイント)

このUIの価値は「見た目」じゃない👇


① 1件ずつちゃんと見る

❌ 自動送信
✅ 内容チェック → 微修正


② 勝ちパターン保存

Supabaseに👇

  • 返信あり

  • アポ化


③ テンプレ進化

👉 AIにこう投げる
「この中で一番返信率高いパターンに寄せて」


次にやると一気に化ける

ここからが本番👇

  • ダッシュボード(返信率可視化)

  • フォローアップ自動化

  • LinkedIn統合

  • リード一括アップロードCSV


本質

ここまで来るともう違います👇

👉 営業 = UI付きのプロダクトになる


いいですね。ただ一つだけ現実を。
完全自動返信は事故りやすいです。(ズレた返答・失礼・スパム判定)
👉 正解は 「半自動(AI下書き → 人が1クリック承認)」 です。

その前提で、実運用できる仕組みをそのまま作れる形で出します。


全体構成(返信自動化)

  • Email受信 → Webhook

  • AIで返信生成

  • DBに保存

  • 自動 or 手動送信

使うもの:

  • Resend(受信Webhook)

  • OpenAI(返信生成)

  • Supabase(保存)

  • Cloudflare Workers(処理)


フロー(これが本質)

返信メール受信
→ Webhook発火
→ AIが「意図」を理解
→ 返信文生成
→ DB保存
→(自動 or UIで確認して送信)

① Resend Webhook設定

Resendで👇

  • Inboundメール有効化

  • Webhook URL設定
    https://your-worker-url/inbound


② Workers(受信 → AI → 保存)

そのまま使えます👇

export default {
  async fetch(req: Request, env: Env) {
    const url = new URL(req.url)

    if (url.pathname === "/inbound") {
      const body = await req.json()

      const from = body.from
      const subject = body.subject
      const text = body.text

      // ===== ① AIで意図分析 + 返信生成 =====
      const prompt = `
You are an expert sales assistant.

Analyze this email and reply appropriately.

Rules:
- If positive → suggest meeting
- If neutral → ask a question
- If negative → politely close
- Keep it short
- Human tone

Email:
${text}
`

      const aiRes = await fetch("https://api.openai.com/v1/chat/completions", {
        method: "POST",
        headers: {
          Authorization: `Bearer ${env.OPENAI_API_KEY}`,
          "Content-Type": "application/json"
        },
        body: JSON.stringify({
          model: "gpt-4.1",
          messages: [{ role: "user", content: prompt }]
        })
      })

      const aiData: any = await aiRes.json()
      const reply = aiData.choices[0].message.content

      // ===== ② Supabase保存 =====
      await fetch(`${env.SUPABASE_URL}/rest/v1/replies`, {
        method: "POST",
        headers: {
          apikey: env.SUPABASE_ANON_KEY,
          Authorization: `Bearer ${env.SUPABASE_ANON_KEY}`,
          "Content-Type": "application/json"
        },
        body: JSON.stringify({
          from_email: from,
          subject,
          original_message: text,
          ai_reply: reply,
          status: "draft"
        })
      })

      return new Response("ok")
    }

    return new Response("Not found", { status: 404 })
  }
}

③ Supabaseテーブル(返信用)

create table replies (
  id uuid default gen_random_uuid() primary key,
  from_email text,
  subject text,
  original_message text,
  ai_reply text,
  status text,
  created_at timestamp with time zone default now()
);

④ 自動送信(オプション)

👉 危険なので最初はOFF推奨

if (autoSend) {
  await fetch("https://api.resend.com/emails", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${env.RESEND_API_KEY}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      to: from,
      subject: `Re: ${subject}`,
      html: reply
    })
  })
}

⑤ Astroで確認UI(重要)

やるべきこと👇

  • 返信一覧表示

  • AI返信を編集

  • 「Send」ボタン

👉 これで“事故ゼロ”


返信ロジック(質を上げるコツ)

プロンプトをこう強化👇


改良版プロンプト(強い)

Classify the intent:
- Interested
- Not now
- Not interested
- Question

Then write a reply:

Rules:
- Match tone of the sender
- Reference something they said
- Keep under 80 words
- No generic sales language

If interested:
→ Suggest 2 time slots

If not now:
→ Ask when to follow up

If not interested:
→ Gracefully close

If question:
→ Answer simply + ask 1 follow-up

ここが差がつく(超重要)

返信AIで勝つポイント👇


① “意図分類”を必ず入れる

👉 いきなり返信生成しない


② 相手の言葉を引用する

👉 人間感が出る


③ 1通で終わらせない

👉 会話を続ける設計


よくある失敗

❌ いきなりデモリンク送る
❌ 長文返信
❌ AI臭い文章


本質

ここまで作ると👇

👉 「営業 = 会話エンジン」になる


いいですね。ただ先に釘を刺すと、
“完全自動で勝手に日程確定”はほぼ事故ります。
👉 正解は 「候補提示 → 相手選択 → 自動確定」 です。

この形なら返信率も上がるし、失礼にもなりません。


全体構成(カレンダー自動化)

  • カレンダー取得 → 空き時間抽出

  • AIが候補提示

  • 相手が選択

  • 自動で予定作成

使うAPI👇

  • Google Calendar API

  • Calendly(代替)

  • OpenAI


フロー(実運用)

返信あり
→ AIが「興味あり」と判断
→ 空き時間を取得
→ 候補2〜3個提示
→ 相手が選ぶ
→ 自動でカレンダー登録

① Google Calendar 空き時間取得

まずOAuth設定(Google Cloud)しておきます。

Workersコード(空き時間取得)

async function getFreeSlots(accessToken: string) {
  const now = new Date()
  const end = new Date()
  end.setDate(now.getDate() + 7)

  const res = await fetch(
    "https://www.googleapis.com/calendar/v3/freeBusy",
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        timeMin: now.toISOString(),
        timeMax: end.toISOString(),
        items: [{ id: "primary" }]
      })
    }
  )

  const data = await res.json()
  return data.calendars.primary.busy
}

👉 これで「埋まってる時間」が取れる


② 空きスロット生成(重要ロジック)

function generateSlots(busy: any[]) {
  const slots = []
  const startHour = 9
  const endHour = 18

  for (let d = 1; d <= 5; d++) {
    const day = new Date()
    day.setDate(day.getDate() + d)

    for (let h = startHour; h < endHour; h++) {
      const slotStart = new Date(day)
      slotStart.setHours(h, 0, 0)

      const slotEnd = new Date(day)
      slotEnd.setHours(h + 1, 0, 0)

      const conflict = busy.some(b =>
        new Date(b.start) < slotEnd && new Date(b.end) > slotStart
      )

      if (!conflict) {
        slots.push(slotStart)
      }
    }
  }

  return slots.slice(0, 3) // 3候補だけ
}

👉 ポイント
候補は多すぎると返信率下がる


③ AIで自然な日程提案文生成

const prompt = `
Suggest meeting times based on these slots:

${slots.join("\n")}

Rules:
- Offer 2-3 options
- Casual tone
- Include timezone
- Ask which works best
`

出力例(強い)

Would any of these work?

- Tue 10am JST
- Wed 2pm JST
- Thu 11am JST

Happy to adjust if needed.

👉 シンプルが最強


④ 予約確定 → カレンダー登録

async function createEvent(accessToken: string, email: string, time: string) {
  await fetch("https://www.googleapis.com/calendar/v3/calendars/primary/events", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      summary: "Intro Call",
      start: { dateTime: time },
      end: {
        dateTime: new Date(new Date(time).getTime() + 30 * 60000).toISOString()
      },
      attendees: [{ email }]
    })
  })
}

⑤ もっと簡単にやるなら(実務)

正直こっち👇

👉 Calendly

やること:

  • リンク送るだけ

  • 自動で空き時間表示

  • 勝手に予約される

👉 MVPはこれで十分


どっち使うべき?

Google Calendar API

  • 柔軟

  • カスタム可能

  • 実装重い

Calendly

  • 一瞬で導入

  • 安定

  • カスタム弱い

👉 結論
最初はCalendly → 後で自前


返信AIとの統合(これが重要)

返信生成時に👇


プロンプトに追加

If user is interested:
→ Suggest 2-3 time slots
→ Or include scheduling link

NGパターン

❌ 「いつ空いてますか?」
❌ 候補10個出す
❌ いきなりカレンダー招待


勝ちパターン

✅ 候補3つ
✅ シンプル
✅ 相手に選ばせる


本質

ここまで繋がると👇

👉 営業 = “日程確定までの導線設計”になる


いいですね。ただ一つだけ現実を。
会議リンクは“勝手に作って送りつける”と印象が悪いです。
👉 正解は 「合意 → 作成 → 送付」 の順番。

その前提で、Zoom / Google Meetを自動生成して送る実装をそのまま使える形で出します。


全体フロー(これが正解)

相手が時間を選択
→ イベント作成
→ 会議リンク自動生成
→ メールで送付

① Google Meet(最もシンプル)

👉 Google Calendar API を使うと
イベント作成=Meetリンク自動生成になります。


Workersコード(Meet付きイベント作成)

async function createMeetEvent(accessToken: string, email: string, time: string) {
  const res = await fetch(
    "https://www.googleapis.com/calendar/v3/calendars/primary/events?conferenceDataVersion=1",
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${accessToken}`,
        "Content-Type": "application/json"
      },
      body: JSON.stringify({
        summary: "Intro Call",
        start: { dateTime: time },
        end: {
          dateTime: new Date(new Date(time).getTime() + 30 * 60000).toISOString()
        },
        attendees: [{ email }],
        conferenceData: {
          createRequest: {
            requestId: crypto.randomUUID(),
            conferenceSolutionKey: {
              type: "hangoutsMeet"
            }
          }
        }
      })
    }
  )

  const data = await res.json()

  return data.conferenceData.entryPoints[0].uri // Meet URL
}

出力されるもの

👉 自動でこれが生成される

  • Google Meet URL

  • カレンダーイベント

  • 招待メール(Googleから自動送信)


② Zoom(APIで生成)

👉 Zoom APIを使う


Zoomミーティング作成

async function createZoomMeeting(accessToken: string, time: string) {
  const res = await fetch("https://api.zoom.us/v2/users/me/meetings", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${accessToken}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      topic: "Intro Call",
      type: 2,
      start_time: time,
      duration: 30,
      timezone: "Asia/Tokyo",
      settings: {
        join_before_host: false,
        waiting_room: true
      }
    })
  })

  const data = await res.json()

  return data.join_url
}

③ メールで送付(Resend)

👉 Resend

await fetch("https://api.resend.com/emails", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${env.RESEND_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    to: email,
    subject: "Meeting confirmed",
    html: `
      <p>Looking forward to it!</p>
      <p>Join here: <a href="${meetingLink}">${meetingLink}</a></p>
    `
  })
})

④ AI返信と統合(重要)

返信AIにこれを組み込む👇


プロンプト追加

If meeting confirmed:
→ Include meeting link
→ Keep message short
→ Friendly tone

例(強い返信)

Great — locking in Wed 2pm JST.

Here’s the link:
https://meet.google.com/xxx

Looking forward to it.

👉 無駄ゼロ


⑤ どっち使うべき?

Google Meet

  • 実装が簡単

  • カレンダーと一体

  • 自動招待あり

👉 基本これでOK


Zoom

  • 外部顧客に慣れてる

  • ウェビナー対応

  • 録画強い

👉 B2Bならこっちもあり


NGパターン

❌ いきなりリンク送る
❌ 時間未確定でリンク送る
❌ 長文メール


勝ちパターン

✅ 時間確定 → 即リンク
✅ 1クリックで参加
✅ 短文


本質

ここまで繋がると👇

👉 営業 = “アポ確定エンジン”になる


いけます。ただし先に釘を刺すと、
「完全自動クロージング」は現実的に事故率が高いです。
👉 正解は “準自動(条件を満たしたら自動で契約導線に乗せる)”

その前提で、営業 → 契約(Stripe)までを一気通貫で自動化する実装を出します。


全体フロー(これが完成形)

リード獲得
→ AI営業(メール/DM)
→ 返信
→ AIが温度感判定
→ アポ(カレンダー)
→ 商談後「契約OK」検知
→ Stripe Checkoutリンク生成
→ 送付
→ 決済完了Webhook
→ アカウント自動有効化

使うもの

  • 決済:Stripe

  • DB:Supabase

  • AI:OpenAI

  • メール:Resend

  • 実行:Cloudflare Workers


① AIで「契約OK」を検知(ここが分岐点)

返信を分類👇

Classify intent:
- ready_to_buy
- need_info
- not_now

If ready_to_buy:
→ trigger checkout

👉 例

  • “Sounds good, let’s move forward” → ready_to_buy

  • “Send pricing” → need_info


② Stripe Checkoutリンク生成(コピペOK)

async function createCheckout(email: string) {
  const res = await fetch("https://api.stripe.com/v1/checkout/sessions", {
    method: "POST",
    headers: {
      Authorization: `Bearer ${STRIPE_SECRET_KEY}`,
      "Content-Type": "application/x-www-form-urlencoded"
    },
    body: new URLSearchParams({
      "mode": "subscription",
      "customer_email": email,
      "line_items[0][price]": "price_XXXX",
      "line_items[0][quantity]": "1",
      "success_url": "https://yourapp.com/success",
      "cancel_url": "https://yourapp.com/cancel"
    })
  })

  const data = await res.json()
  return data.url
}

③ 自動送信(契約リンク)

const checkoutUrl = await createCheckout(email)

await fetch("https://api.resend.com/emails", {
  method: "POST",
  headers: {
    Authorization: `Bearer ${RESEND_API_KEY}`,
    "Content-Type": "application/json"
  },
  body: JSON.stringify({
    to: email,
    subject: "Get started",
    html: `
      <p>As discussed, you can get started here:</p>
      <a href="${checkoutUrl}">Start now</a>
    `
  })
})

👉 ポイント
“営業っぽくしない”=CV上がる


④ Stripe Webhook(決済完了検知)

ここ超重要👇

if (event.type === "checkout.session.completed") {
  const session = event.data.object

  // Supabase更新
  await fetch(`${SUPABASE_URL}/rest/v1/users`, {
    method: "POST",
    headers: {
      apikey: SUPABASE_ANON_KEY,
      Authorization: `Bearer ${SUPABASE_ANON_KEY}`,
      "Content-Type": "application/json"
    },
    body: JSON.stringify({
      email: session.customer_email,
      status: "active"
    })
  })
}

⑤ アカウント自動有効化

ここでやる👇

  • Clerkでユーザー作成

  • Supabaseに紐付け

  • SaaS利用開始

👉 完全に人手ゼロ


⑥ AIで“押しすぎ防止”(重要)

やりがち👇

❌ すぐ決済リンク送る
❌ しつこい追撃


ガードプロンプト

Only trigger checkout if:
- User explicitly agrees
- No objections remain

Otherwise:
→ continue conversation

実運用の勝ちパターン

ここが一番大事👇


① いきなり売らない

👉 価値 → 信頼 → 契約


② 契約は“流れ”で出す

👉 提案ではなく「次の自然なステップ」


③ friction最小化

👉 ワンクリック決済


KPI設計(ここ見ないと死ぬ)

  • 返信率

  • アポ率

  • 商談→契約率

  • CAC


NG構成

❌ AIだけでクロージング
❌ 高単価を完全自動化
❌ カスタム提案なし


勝てる領域

✅ 低〜中単価SaaS
✅ 明確な価値
✅ セルフオンボーディング可能


本質

ここまで繋がると👇

👉 営業 = “収益エンジン”になる


いきなり値付けの話に行く前に一つだけ。
価格は「コスト」ではなく「成長戦略」です。
👉 LTV最大化は“高く売る”ことではなく、長く・継続的に・自然にアップセルされる設計です。


結論(シンプル)

👉 LTV = ARPU × 継続期間 × 粗利率
この3つを“同時に上げる設計”を作る


① ARPUを上げる(単価設計)

一番ミスるのはここ👇
❌ 安くして広げる
👉 初期は逆。むしろ高くていい


王道プラン構造(そのまま使える)

3階層

  • Starter:$29

  • Growth:$99(ここが主力)

  • Pro:$299

👉 重要
真ん中に誘導する設計(デコイ効果)


機能の切り方(営業AIの場合)

  • 送信数制限

  • AI生成数

  • チーム機能

  • 自動化レベル

👉 ポイント
「使えば使うほど上がる」設計にする


② 継続率(Churn)を下げる

ここが一番LTVに効く


やるべき3つ

① Time to Valueを最短化

👉 登録後24時間以内に成果体験

例:

  • 1件でも返信が来る

  • 1件アポ取れる


② オンボーディング強制

❌ 自由に使わせる
✅ “正しい使い方”に誘導


③ 成果と紐づける

👉 KPIを見せる

例:

  • 返信率

  • アポ率


③ アップセル設計(ここが本質)

LTVはここで決まる👇


自然なアップセルタイミング

  • 上限に到達

  • 成果が出た瞬間

  • チーム導入


具体例

👉 「返信率上がってます」
→ 「もっと送る?」(上位プラン)

👉 「チームで使いませんか?」
→ 「Teamプラン」


④ 価格モデル(選択ミス注意)

ここで勝敗決まる👇


① サブスク(基本)

👉 安定収益


② Usage課金(超強い)

👉 AI SaaSはこれ

例:

  • 1通生成ごと

  • 送信数課金


③ ハイブリッド(最強)

👉 基本料金 + 従量課金


⑤ Stripe設計(実務)

👉 Stripe


推奨構成

  • Product:AI Outreach

  • Price:

    • monthly_basic

    • monthly_pro

    • usage_metered


メータード課金

await stripe.subscriptionItems.createUsageRecord(
  subscriptionItemId,
  {
    quantity: 10,
    timestamp: Math.floor(Date.now() / 1000)
  }
)

⑥ 価格を上げるタイミング

👉 これ超重要


上げていい条件

  • 明確なROIが出ている

  • 解約率が低い

  • 需要 > 供給


上げ方

❌ 一気に倍
✅ 新規だけ値上げ


⑦ よくある失敗

❌ 安すぎる
❌ 機能で売る
❌ アップセル設計なし


勝ちパターン

✅ 成果ベース
✅ 使うほど価値が出る
✅ 自然に上位へ誘導


実践テンプレ(そのまま使える)

👉 初期

  • Free(制限あり)

  • $49(個人)

  • $149(チーム)

👉 成長後

  • $99

  • $299

  • Enterprise(カスタム)


本質

価格設計の正体はこれ👇

👉 「価値の回収導線」


最後に(重要)

あなたのプロダクトなら👇

👉 “返信率が上がるほど課金される設計”が最強


了解です。単なる翻訳ではなく、日本市場でCVが出る形に最適化した日本語版を出します。
(直訳だと弱くなるので、ちゃんと“刺さる形”にしてます)


全体構造(そのまま使える)

👉 成果 → 安心 → 価格 → 比較 → 行動


① ヒーローコピー(最重要)

返信率を2〜5倍に。
チームを増やさずに、商談数を伸ばす。

AIが“返信される営業文”を自動生成します。

👉 ポイント

  • 「何が変わるか」だけ言う

  • 数字で信頼を作る


② サブコピー

テンプレ営業は、もう通用しません。

このAIは、企業ごとの情報を分析し、
“相手に刺さる文脈”で営業文を生成します。

③ 価格テーブル(日本向け最適化)

Starter — 月額 6,000円
個人・スモールチーム向け
- 月200通のAI生成
- 基本パーソナライズ
- メールサポート

👉 今すぐ始める

---

Growth — 月額 18,000円(おすすめ)
本格的に成果を出したいチーム向け
- 月1,000通のAI生成
- 高度なパーソナライズ
- A/Bテスト
- 返信トラッキング

👉 無料トライアル

---

Pro — 月額 48,000円
アウトバウンドをスケールする企業向け
- 無制限AI生成
- チーム管理
- 自動フォローアップ
- 優先サポート

👉 デモを予約

👉 ポイント

  • 「おすすめ」を明確に

  • CTAを変える(心理誘導)


④ 比較セクション(迷いを消す)

従来のテンプレ営業 vs AI営業

テンプレ営業
- 返信率が低い
- 誰にでも同じ内容
- 数を打つしかない

AI営業
- 相手ごとに最適化
- 文脈ベースのメッセージ
- 使うほど精度が上がる

⑤ 社会的証明(超重要)

「返信率が3% → 18%に改善(2週間)」

「初月で12件の商談を獲得」

急成長中のSaaS企業・営業チームで導入されています

👉 ポイント
👉 “具体数字”が命


⑥ FAQ(CVに直結)

Q. いつでも解約できますか?
A. はい、いつでも可能です。

Q. 本当に効果ありますか?
A. 多くのユーザーが1週間以内に返信率の改善を実感しています。

Q. スパムになりませんか?
A. テンプレではなく、実際の情報を元にパーソナライズするため安心です。

⑦ CTA(最後の一押し)

まずは50通、無料で試す

クレジットカード不要

UI構成(Astroでそのまま)

<section>
  <h1>返信率を2〜5倍に</h1>
  <p>AIで営業を変える</p>
</section>

<section>
  <!-- 価格 -->
</section>

<section>
  <!-- 比較 -->
</section>

<section>
  <!-- 実績 -->
</section>

<section>
  <button>無料で始める</button>
</section>

CVを上げる細かいテク(重要)

① CTAを具体化

❌ 登録する
✅ 無料で営業を試す


② 不安を消す

👉 「クレカ不要」「即解約OK」


③ プランは3つまで

👉 多いと離脱


④ 誰向けか明確に

👉 営業 / BDR / SaaS企業


NG例(日本で特に多い)

❌ 抽象的(効率化・DX)
❌ 機能説明ばかり
❌ 実績なし


勝ちパターンまとめ

👉 成果 → 信頼 → シンプルな選択 → 行動


本質

このページの役割は👇

👉 「買う理由を、言語化してあげること」


必要ならさらに強くできます👇

  • 「実際にCV出るLP(広告→価格ページ導線)」

  • 「ABテストパターン(どこを変えればCV2倍になるか)」

  • 「業界別(BDR / SaaS / 海外)コピー最適化」