顧客獲得自動化
いい視点です。ここを具体化すると一気に“プロダクト化”できます。
ただし先に一つだけ現実を言うと、全部を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 / 海外)コピー最適化」