חזרה
    מדריכים מעשיים
    WhatsApp
    Meta Cloud API

    בוט WhatsApp רשמי עם Meta Cloud API - הקמה מאפס

    רועי טל
    פורסם: 25.6.2026
    עודכן: 24.9.2026
    17 דקות קריאה
    האזינו לפוסטקריינות AI · 22 דק'
    0:00 / 21:33
    בוט WhatsApp רשמי עם Meta Cloud API - הקמה מאפס

    WhatsApp Cloud API הוא הממשק הרשמי של Meta לשליחה ולקבלה של הודעות וואטסאפ מתוך קוד, בלי שירות מתווך באמצע. Meta מעבירה כל הודעה של לקוח לשרת שלכם והשרת עונה דרך ה-API שלה. במדריך מקימים בוט כזה מאפס: אפליקציה ב-Meta, מספר בדיקה, טוקן קבוע ושרת Webhook על Supabase שעונה אוטומטית. בסוף מחברים אליו את Claude. על אותו מבנה רץ הבוט שאני משתמש בו בעסק.

    כך עוברת הודעה אחת דרך הקוד של המדריך:

    המחשה של מה שהקוד במדריך עושה עם כל הודעה. Meta מעבירה אותה לשרת בבקשה חתומה, השרת בודק את החתימה ומחזיר 200 מיד ורק אחר כך כותב תשובה, כאן עם Claude ושולח אותה דרך Graph API. כשהלקוח קורא את התשובה מגיע Webhook נוסף עם הסטטוס.

    מה צריך לפני שמתחילים

    • חשבון ב-Meta
      חשבון פייסבוק ותיק עסקי (Business portfolio). תיק שלא עבר אימות עסקי מספיק כדי להתחיל. כך נבנתה גם אפליקציית הבדיקה של המדריך.
    • טלפון עם וואטסאפ
      הוא יקבל את הודעות הבדיקה וישלח לבוט את ההודעה הראשונה.
    • פרויקט ב-Supabase
      התוכנית החינמית מספיקה לבדיקות. שם ירוץ השרת.
    • Node.js במחשב
      בשביל ה-CLI של Supabase. במסלול האוטומטי צריך גם Claude Code או Codex.

    Cloud API או GreenAPI

    GreenAPI ושירותים דומים מחברים מספר וואטסאפ רגיל כמו מכשיר מקושר, בסריקת קוד QR ושולחים ומקבלים דרכו הודעות. Cloud API הוא הממשק ש-Meta עצמה מפעילה לעסקים, עם מספר שמוקצה לו ואפליקציה משלכם.

    Meta Cloud APIGreenAPI ודומיו
    החיבוראפליקציה ב-Meta, מספר ייעודי וטוקןסריקת קוד QR ממספר קיים, כמו WhatsApp Web
    דרך מי עוברות ההודעותMeta והשרת שלכםגם השרתים של החברה המתווכת
    חסימותחשבון שמפר את המדיניות של Meta לעסקים יכול להיחסםGreenAPI מפרסמת בעצמה הנחיות איך להגן על המספר מחסימה
    עלותהבדיקות חינם ובפרודקשן תשלום לפי הודעה (פירוט בהמשך)תוכנית חינמית מוגבלת למפתחים ו-12 דולר לחודש לתוכנית העסקית, לפי האתר שלהם
    למי זה מתאיםבוט של עסק שעונה ללקוחות לאורך זמןניסוי מהיר, או שליחה ממספר שכבר קיים

    לאן אפשר לחבר את הבוט

    וואטסאפ עצמו לא דורש AI. השרת שבונים כאן מקבל הודעה ומחזיר תשובה. מה שהבוט יודע לעשות תלוי במה שמחברים מאחוריו:

    • מערכות שכבר קיימות
      דשבורד, מסד נתונים או CRM: "כמה הזמנות נכנסו היום?", "תפתח משימה". הבוט שלי מריץ ככה deploy לאתר ומושך נתונים מהדשבורד.
    • כלים של Google
      Gmail, Calendar ו-Drive מתוך הצ'אט: "תקבע פגישה מחר ב-10:00", "תמצא את ההצעה מהשבוע שעבר".
    • סוכן AI אוטונומי
      הודעה אחת מפעילה סוכן כמו OpenClaw או Hermes Agent, שמריץ דפדפן, עובד עם קבצים ומבצע משימה של כמה שלבים.
    • תזכורות ואישורי הזמנה
      נשלחים בזמן הנכון. מחוץ לחלון של 24 שעות זה אפשרי רק בהודעת תבנית מאושרת, בתשלום.
    • לידים
      כל פנייה נענית מיד, נשמרת ומגיעה אליכם מסוכמת, גם באמצע הלילה.

    מסלול אוטומטי: Claude Code בונה את השרת

    ההוראות כתובות ל-Claude Code ועובדות באותה צורה עם Codex או עם כל סוכן קוד אחר. את החלקים שדורשים את הלוח של Meta עושים לפי המסלול הידני, בשלבים שמצוינים בכל סעיף.

    1. אפליקציה ומספר בדיקה. יוצרים אפליקציה ב-Meta, מאמתים את הטלפון שלכם כנמען ומעתיקים את ה-Phone Number ID (שלבים 1 עד 4 במסלול הידני).
    2. טוקן קבוע ו-App Secret. מייצרים טוקן של משתמש מערכת (שלבים 5 עד 9) ומעתיקים את ה-App Secret מ-App settings ואז Basic. את הטוקן לא מדביקים בצ'אט עם הסוכן.
    3. השרת. פותחים את Claude Code בתיקייה ריקה ומדביקים את הבקשה:
      הבקשה ל-Claude Code

      הקם לי שרת Webhook לבוט WhatsApp על Meta Cloud API, כ-Supabase Edge Function בשם whatsapp-webhook. בבקשת GET הוא מחזיר את hub.challenge כש-hub.verify_token תואם ל-WHATSAPP_VERIFY_TOKEN. בבקשת POST הוא בודק את החתימה בכותרת x-hub-signature-256 מול WHATSAPP_APP_SECRET, מחזיר 200 מיד ועונה ברקע עם EdgeRuntime.waitUntil, דרך graph.facebook.com/v26.0 עם WHATSAPP_TOKEN ו-WHATSAPP_PHONE_NUMBER_ID. אם בהודעה אין from, עונים ל-from_user_id בשדה recipient. בשלב הזה הבוט רק מחזיר "קיבלתי: " ואת הטקסט. תגדיר את הסודות חוץ מ-WHATSAPP_TOKEN, שאותו אגדיר בעצמי ותעלה את הפונקציה עם --no-verify-jwt --use-api. בסוף תן לי את כתובת ה-Callback ואת ה-Verify token.

      מאשרים את הפעולות ש-Claude Code מבקש להריץ: יצירת הפונקציה, הגדרת הסודות וההעלאה. את הטוקן מגדירים לבד, בטרמינל:
      הסוד של הטוקן
      npx supabase secrets set WHATSAPP_TOKEN=PERMANENT_TOKEN
    4. החיבור בצד של Meta. מדביקים את כתובת ה-Callback ואת ה-Verify token בלוח של Meta ורושמים את השדה messages (שלבים 10 עד 12), או נותנים ל-Claude Code לעשות את זה דרך ה-MCP של Meta, בסעיף הבא.
    5. פרסום. מוסיפים כתובת למדיניות פרטיות ומפרסמים את האפליקציה (שלב 13). בלי זה, הודעה אמיתית מהטלפון לא מגיעה לשרת.
    6. בדיקה. שולחים הודעה מהטלפון למספר הבדיקה והבוט עונה תוך שניות. אם לא:
      כשהבוט לא עונה

      הבוט לא עונה להודעות. תעבור על הקוד של whatsapp-webhook ועל הסודות שהגדרנו ותגיד לי מה לחפש בלוגים של הפונקציה ב-Supabase.

    ה-MCP של Meta: Claude Code מגדיר גם את החיבור

    Meta מתעדת שרת MCP רשמי בשם WhatsApp Business Tools. סוכן שמחובר אליו יכול לרשום מספרי טלפון, לנהל תבניות הודעה, להגדיר Webhooks ולשלוח הודעות, בשמכם ועל האפליקציות שאתם מנהלים. נכון ל-24 בספטמבר 2026 השרת בבטא ו-Meta מפעילה אותו בהדרגה.

    הוספת השרת ל-Claude Code
    claude mcp add --transport http whatsapp_business_tools https://mcp.facebook.com/whatsapp_business_tools

    אחרי ההוספה מקלידים /mcp בתוך Claude Code, בוחרים whatsapp_business_tools ומתחברים לחשבון Meta. במסך ההרשאות מסמנים רק את העסק ואת האפליקציה של הבוט. ב-Claude Desktop מוסיפים את אותה כתובת תחת Settings ואז Connectors ו-Add custom connector. בתיעוד יש הוראות גם ל-Codex ול-ChatGPT.

    הגדרת ה-Webhook דרך ה-MCP

    דרך whatsapp_business_tools: תגדיר ל-Webhook של האפליקציה של הבוט את הכתובת CALLBACK_URL עם ה-Verify token VERIFY_TOKEN, תרשום את השדה messages ותוודא שחשבון ה-WhatsApp מנוי ל-Webhooks של האפליקציה. לפני כל שינוי תראה לי מה אתה עומד לעשות.

    את הטוקן הקבוע השרת לא מייצר. הכלי whatsapp_biz_system_user_token מחזיר קישור לעמוד משתמשי המערכת והטוקן נוצר שם, בלוח של Meta.

    מה נבדק כאן

    בדקתי שהכתובת של השרת עונה ודורשת התחברות עם שלוש ההרשאות שבתיעוד: business_management, whatsapp_business_management ו-whatsapp_business_messaging. את הכלים עצמם לא הרצתי. אם השרת עוד לא זמין בחשבון שלכם, שלבים 10 עד 12 במסלול הידני עושים את אותו דבר בלחיצות.

    מסלול ידני: כל לחיצה וכל שורת קוד

    הצילומים של יצירת האפליקציה, מספר הבדיקה, הגדרת ה-Webhook והפרסום צולמו ב-24 בספטמבר 2026. שאר הצילומים צולמו ביוני 2026.

    חלק א׳

    אפליקציה ומספר בדיקה

    1יצירת האפליקציה

    ב-developers.facebook.com נכנסים ל-My Apps ולוחצים Create App. ממלאים שם ומייל. במסך Use cases מסמנים את Connect with customers through WhatsApp. בשלב Business בוחרים את התיק העסקי, במסך Requirements לוחצים Next ובסוף Create app.

    אשף יצירת האפליקציה של Meta במסך Use cases, עם הסימון על Connect with customers through WhatsApp
    מקור: developers.facebook.com. ① השימוש שמתאים לבוט.
    המילה WhatsApp אסורה בשם האפליקציה

    Meta חוסמת שמות שכוללים את הסימנים המסחריים שלה. כשניסיתי לקרוא לאפליקציה RT-AI WhatsApp bot הופיעה השגיאה Certain terms like "whatsapp" are not allowed והשם RT-AI guide bot עבר בלי בעיה.

    שדה שם האפליקציה עם הערך RT-AI WhatsApp bot והודעת השגיאה של Meta מתחתיו
    מקור: developers.facebook.com. השגיאה שמופיעה כשהשם כולל את המילה whatsapp.

    2מספר בדיקה וטוקן זמני

    בתפריט של האפליקציה עוברים ל-Use cases, לוחצים Customize ליד WhatsApp ובתפריט Basic setup בוחרים Step 1. Try it out. Meta מקצה מספר בדיקה חינמי ולידו שני מזהים: Phone Number ID, שהשרת צריך ו-WhatsApp Business account ID. הכפתור Generate token מייצר טוקן זמני לבדיקה מהירה.

    המקטע Claim a WhatsApp test number: מספר הבדיקה, Phone Number ID ו-WhatsApp Business account ID מוסתרים והכפתור Generate token
    מקור: developers.facebook.com. ① המזהים של מספר הבדיקה, מוסתרים בצילום ② Generate token.
    הטוקן הזמני פג תוך שעות

    Meta מתעדת שטוקן כזה פג מהר ושצריך לייצר חדש כל כמה שעות. בוט שרץ לאורך זמן צריך טוקן של משתמש מערכת, בחלק ב׳.

    3הוספת נמען לבדיקות

    באותו עמוד, תחת Send a message from your test number, פותחים את רשימת Recipient ומוסיפים מספר. לפי החלון של Meta אפשר להגדיר עד 5 מספרים שמקבלים הודעות בדיקה בחינם. מזינים את הטלפון שלכם ולוחצים Next.

    חלון Add a recipient phone number עם שדה הטלפון והכפתור Next
    מקור: developers.facebook.com. ① מספר הטלפון ② Next.

    4אימות הנמען

    Meta שולחת לוואטסאפ של המספר קוד בן 5 ספרות. מקלידים אותו ולוחצים Next ומעכשיו המספר מקבל הודעות בדיקה.

    חלון Verify your phone number עם תיבות הקוד והכפתור Next
    מקור: developers.facebook.com. ① הקוד מהוואטסאפ ② Next.
    חלק ב׳

    טוקן קבוע של משתמש מערכת

    טוקן של משתמש מערכת (System User) הוא מה שמריץ את הבוט לאורך זמן. יוצרים אותו בהגדרות העסק ב-business.facebook.com: הגדרות, משתמשים ואז משתמשי מערכת.

    5משתמש מערכת עם גישה לאפליקציה

    בעמוד משתמשי המערכת לוחצים הוספה, נותנים שם (למשל whatsapp-bot) ובוחרים תפקיד Admin. על המשתמש החדש לוחצים הקצאת נכסים, בוחרים את סוג הנכס אפליקציות ומסמנים את האפליקציה. תחת גישה מלאה מפעילים את ניהול אפליקציה ולוחצים הקצאת נכסים.

    חלון בחירת נכסים והקצאת הרשאות עם סוג הנכס אפליקציות ורשימת בחירת האפליקציה
    מקור: business.facebook.com. ① בחירת האפליקציה ② הקצאת נכסים.
    הרשאת ניהול אפליקציה מופעלת תחת גישה מלאה
    מקור: business.facebook.com. ① ניהול אפליקציה, גישה מלאה ② הקצאת נכסים.

    6גישה לחשבון ה-WhatsApp

    חוזרים על אותו תהליך עם סוג הנכס חשבונות WhatsApp. בצילום הופעלו שתי הרשאות חלקיות, "ניהול מספרי טלפון ותבניות של הודעות" ו"הודעות". במדריך של Meta מופיעה גישה מלאה, Manage WhatsApp Business accounts, שכוללת גם אותן.

    הקצאת גישה לחשבון WhatsApp עם שתי הרשאות חלקיות מופעלות
    מקור: business.facebook.com. ① ההרשאות לחשבון ה-WhatsApp ② הקצאת נכסים.
    WhatsApp account ו-Messaging account

    לפי התיעוד העדכני של Meta, בחלק מהחשבונות יש שני נכסים נפרדים, WhatsApp account ו-Messaging account. משתמש המערכת צריך גישה לשניהם. בממשק שבדקתי ב-24 בספטמבר 2026 הופיעו רק חשבונות WhatsApp. אם אצלכם מופיע גם Messaging account, מקצים גם אותו.

    7יצירת הטוקן: בחירת האפליקציה

    עכשיו לוחצים יצירת אסימון, בוחרים את האפליקציה ולוחצים הבא.

    אשף יצירת אסימון בשלב בחירת האפליקציה
    מקור: business.facebook.com. ① בחירת האפליקציה ② הבא.

    8תוקף הטוקן

    Meta מסמנת את 60 ימים כאפשרות המומלצת. טוקן כזה צריך לחדש כל חודשיים, אחרת הבוט מפסיק לענות. טוקן עם תוקף "אף פעם" לא פג. לכן חשוב עוד יותר לשמור אותו רק בסודות של השרת. בוחרים ולוחצים הבא.

    בחירת תוקף האסימון: 60 ימים, שמסומן כמומלץ, או אף פעם
    מקור: business.facebook.com. ① התוקף, כאן ברירת המחדל של 60 ימים ② הבא.

    9הרשאות ויצירת הטוקן

    Meta מפרטת שלוש הרשאות לטוקן: whatsapp_business_messaging לשליחה ולקבלה של הודעות, whatsapp_business_management לשאר ההגדרות ו-business_management. מסמנים את שלושתן ולוחצים יצירת אסימון. בצילום סומנו שתי ההרשאות של WhatsApp.

    רשימת ההרשאות עם whatsapp_business_management ו-whatsapp_business_messaging מסומנות והכפתור יצירת אסימון
    מקור: business.facebook.com. ① ההרשאות ② יצירת אסימון.
    מעתיקים את הטוקן מיד

    מעתיקים את הטוקן ברגע שהוא מופיע ושומרים אותו במקום בטוח. הוא נכנס לשרת כסוד בשם WHATSAPP_TOKEN ולא נכתב בקוד ולא נשלח בצ'אט.

    מסך אין הרשאות זמינות באשף יצירת האסימון
    מקור: business.facebook.com. אם מופיע המסך הזה, למשתמש המערכת עוד לא הוקצו נכסים. חוזרים לשלבים 5 ו-6.

    דבר אחרון מהלוח של Meta לפני השרת: ה-App Secret, המפתח שבעזרתו השרת בודק שהבקשות באמת הגיעו מ-Meta. בלוח של האפליקציה נכנסים ל-App settings ואז Basic ולוחצים Show ליד App secret.

    חלק ג׳

    השרת על Supabase

    ה-Webhook הוא כתובת HTTPS אחת. בבקשת GET היא מוכיחה ל-Meta שהיא שלכם ובבקשת POST היא מקבלת הודעות ועונה עליהן. הקוד רץ כ-Edge Function של Supabase.

    Supabase ממליצה להתקין את ה-CLI כתלות של הפרויקט ולהריץ אותו דרך npx. בתיקייה ריקה:

    התקנה ויצירת הפונקציה
    npm install supabase --save-dev
    npx supabase login
    npx supabase init
    npx supabase link --project-ref PROJECT_REF
    npx supabase functions new whatsapp-webhook

    הפקודה האחרונה יוצרת את הקובץ supabase/functions/whatsapp-webhook/index.ts. מחליפים את התוכן שלו בקוד הזה:

    supabase/functions/whatsapp-webhook/index.ts
    // EdgeRuntime comes from the Supabase runtime and keeps working after the response is sent
    declare const EdgeRuntime: { waitUntil(promise: Promise<unknown>): void };
    
    const VERIFY_TOKEN = Deno.env.get("WHATSAPP_VERIFY_TOKEN")!;
    const WHATSAPP_TOKEN = Deno.env.get("WHATSAPP_TOKEN")!;
    const PHONE_NUMBER_ID = Deno.env.get("WHATSAPP_PHONE_NUMBER_ID")!;
    const APP_SECRET = Deno.env.get("WHATSAPP_APP_SECRET")!;
    const GRAPH = "https://graph.facebook.com/v26.0/";
    
    Deno.serve(async (req) => {
      const url = new URL(req.url);
    
      // 1) One-time verification: Meta sends a GET and expects hub.challenge back
      if (req.method === "GET") {
        const ok = url.searchParams.get("hub.mode") === "subscribe" &&
          url.searchParams.get("hub.verify_token") === VERIFY_TOKEN;
        return ok
          ? new Response(url.searchParams.get("hub.challenge"), { status: 200 })
          : new Response("Forbidden", { status: 403 });
      }
      if (req.method !== "POST") return new Response("Method Not Allowed", { status: 405 });
    
      // 2) Every message is signed with the App Secret. Check it before anything else
      const raw = await req.text();
      const signature = req.headers.get("x-hub-signature-256") ?? "";
      if (!(await validSignature(raw, signature))) {
        return new Response("Invalid signature", { status: 401 });
      }
    
      // 3) Answer Meta right away and keep working in the background
      EdgeRuntime.waitUntil(handle(JSON.parse(raw)).catch((err) => console.error(err)));
      return new Response("EVENT_RECEIVED", { status: 200 });
    });
    
    async function handle(body: any) {
      const msg = body?.entry?.[0]?.changes?.[0]?.value?.messages?.[0];
      if (!msg || msg.type !== "text") return; // status updates, images and so on
    
      // A customer with a WhatsApp username may arrive without a phone number
      const to: Record<string, string> = msg.from
        ? { to: msg.from }
        : { recipient: msg.from_user_id };
      await sendText(to, "קיבלתי: " + msg.text.body);
    }
    
    async function sendText(to: Record<string, string>, text: string) {
      const res = await fetch(GRAPH + PHONE_NUMBER_ID + "/messages", {
        method: "POST",
        headers: {
          "Authorization": "Bearer " + WHATSAPP_TOKEN,
          "Content-Type": "application/json",
        },
        body: JSON.stringify({
          messaging_product: "whatsapp",
          recipient_type: "individual",
          ...to,
          type: "text",
          text: { body: text },
        }),
      });
      // Without this line an expired token or a wrong Phone Number ID fails silently
      if (!res.ok) console.error("send failed", res.status, await res.text());
    }
    
    async function validSignature(raw: string, header: string) {
      const key = await crypto.subtle.importKey(
        "raw", new TextEncoder().encode(APP_SECRET),
        { name: "HMAC", hash: "SHA-256" }, false, ["sign"],
      );
      const mac = await crypto.subtle.sign("HMAC", key, new TextEncoder().encode(raw));
      const hex = [...new Uint8Array(mac)].map((b) => b.toString(16).padStart(2, "0")).join("");
      return header === "sha256=" + hex;
    }

    שלושה דברים בקוד שכדאי להבין. החתימה נבדקת על הגוף הגולמי ולפני כל עיבוד, כי כל מי שמגלה את הכתובת יכול לשלוח אליה בקשות. ה-200 חוזר ל-Meta לפני שהתשובה נכתבת: Meta שולחת שוב, עד 7 ימים, כל הודעה שלא אושרה. לכן עבודה איטית רצה ברקע. ולקוח שבחר שם משתמש בוואטסאפ עלול להגיע בלי מספר טלפון ואז התשובה יוצאת למזהה from_user_id שלו.

    עכשיו ארבעה סודות, מהערכים ששמרתם בחלקים א׳ ו-ב׳. את WHATSAPP_VERIFY_TOKEN ממציאים: כל מחרוזת שתבחרו ואותה תדביקו אחר כך גם בלוח של Meta.

    הסודות של הפונקציה
    npx supabase secrets set WHATSAPP_TOKEN=PERMANENT_TOKEN
    npx supabase secrets set WHATSAPP_PHONE_NUMBER_ID=PHONE_NUMBER_ID
    npx supabase secrets set WHATSAPP_VERIFY_TOKEN=ANY_SECRET_STRING
    npx supabase secrets set WHATSAPP_APP_SECRET=APP_SECRET

    ומעלים:

    העלאה
    npx supabase functions deploy whatsapp-webhook --no-verify-jwt --use-api

    למה --no-verify-jwt

    ברירת המחדל של Supabase היא לדרוש JWT בכל בקשה לפונקציה. Meta לא שולחת JWT, אז בלי הדגל הבקשות שלה נחסמות. במקום JWT הקוד בודק את החתימה של Meta. אפשר גם לקבוע verify_jwt = false לפונקציה בקובץ supabase/config.toml. הדגל --use-api מעלה את הקוד בלי Docker במחשב.

    כתובת ה-Callback שתדביקו בלוח של Meta, עם ה-project ref שלכם:

    Callback URL
    https://PROJECT_REF.supabase.co/functions/v1/whatsapp-webhook

    שדרוג: Claude עונה במקום ההד

    הקוד שלמעלה מחזיר "קיבלתי:" ואת ההודעה. כדי שהבוט יענה בעצמו, מוסיפים קריאה ל-Claude:

    שדרוג עם Claude
    // At the top of the file
    import Anthropic from "npm:@anthropic-ai/sdk";
    const claude = new Anthropic({ apiKey: Deno.env.get("ANTHROPIC_API_KEY") });
    
    // Inside handle, instead of the "קיבלתי" sendText line
    const reply = await claude.beta.messages.create({
      model: "claude-opus-5-5",
      max_tokens: 2048,
      output_config: { effort: "low" },
      betas: ["server-side-fallback-2026-07-01"],
      fallbacks: "default",
      system: "אתה עונה ללקוחות בוואטסאפ בשם העסק. תשובות קצרות וברורות, בשפה שבה הלקוח כתב.",
      messages: [{ role: "user", content: msg.text.body }],
    });
    const answer = reply.content.find((block) => block.type === "text")?.text;
    if (answer) await sendText(to, answer);

    המודל כאן הוא claude-opus-5-5. מי שהעלות חשובה לו יכול לעבור ל-Sonnet 5 או ל-Haiku 4.5, עם המזהים claude-sonnet-5 או claude-haiku-4-5. ההגדרה effort: "low" מתאימה לתשובות קצרות. ההגדרה fallbacks: "default" מעבירה בקשה שהמודל דחה למודל חלופי ש-Anthropic בוחרת. התשובה נשלפת לפי סוג הבלוק ולא מהמקום הראשון, כי במודלים האלה הבלוק הראשון יכול להיות בלוק חשיבה. וואטסאפ מקבלת עד 4,096 תווים בהודעת טקסט ולכן ההוראה לענות בקצרה חשובה.

    המפתח של Anthropic
    npx supabase secrets set ANTHROPIC_API_KEY=YOUR_ANTHROPIC_KEY
    חלק ד׳

    החיבור ב-Meta ובדיקה

    10הגדרת ה-Webhook

    בלוח של האפליקציה, באותו תפריט של WhatsApp, בוחרים Step 2. Production setup. ב-Callback URL מדביקים את כתובת הפונקציה וב-Verify token את אותה מחרוזת שהגדרתם ב-WHATSAPP_VERIFY_TOKEN. לוחצים Verify and save.

    המקטע Configure Webhooks עם שדות Callback URL ו-Verify token, הכפתור Verify and save והודעה כתומה על אפליקציה שלא פורסמה
    מקור: developers.facebook.com. ① Callback URL ② Verify token ③ Verify and save. ההודעה הכתומה מסבירה למה צריך את שלב 13.

    11Webhook מאומת

    אם שתי המחרוזות זהות והפונקציה עלתה בלי JWT, מופיע סימן ירוק ליד Configure Webhooks.

    שלב Production setup עם סימן ירוק ליד Configure Webhooks ורשימת המשימות הבאות
    מקור: developers.facebook.com. ① הסימן הירוק: Meta קיבלה מהשרת את ה-challenge.

    12רישום לשדה messages

    מתחת לטופס מופיעה רשימת שדות. מפעילים את messages עד שהוא מסומן Subscribed. בלי השדה הזה לא מגיעות הודעות נכנסות, גם כשהאימות הצליח. ליד כל שדה יש כפתור Test ששולח לשרת אירוע בדיקה.

    רשימת שדות ה-Webhook עם השדה messages במצב Subscribed
    מקור: developers.facebook.com. ① השדה messages במצב Subscribed.

    13פרסום האפליקציה

    כל עוד האפליקציה לא פורסמה, Meta מעבירה ל-Webhook רק אירועי בדיקה מהלוח שלה, כמו שכתוב בהודעה הכתומה בשלב 10. הודעה אמיתית מהטלפון לא מגיעה לשרת, גם לא מהטלפון של מי שמנהל את האפליקציה. בתפריט הצד לוחצים פרסום. Meta מבקשת קודם כתובת למדיניות פרטיות, שמוסיפים ב-App settings ואז Basic. אחר כך הכפתור Publish בתחתית המסך נפתח.

    עמוד Publish של האפליקציה עם הדרישה Privacy policy URL והקישור Go to app settings
    מקור: developers.facebook.com. ① המעבר להגדרות, שם מוסיפים את כתובת מדיניות הפרטיות.

    14בדיקה

    שולחים הודעה מהטלפון שהוספתם בשלב 3 למספר הבדיקה. התשובה "קיבלתי: ..." מגיעה תוך שניות. את מה שקרה בשרת רואים בלוח של Supabase: Edge Functions, הפונקציה whatsapp-webhook ואז Logs.

    ממספר בדיקה למספר של העסק

    מספר הבדיקה שולח רק לנמענים שאימתתם בשלבים 3 ו-4. כדי לענות ללקוחות רושמים מספר של העסק ב-Step 2. Production setup, תחת Register your WhatsApp phone number. לפי Meta, מספר שכבר פעיל בוואטסאפ צריך להימחק מהאפליקציה לפני הרישום. ברישום מגדירים שם תצוגה וקוד PIN לאימות דו-שלבי.

    מספר שעובד היום באפליקציית WhatsApp Business אפשר לחבר ל-Cloud API בלי למחוק אותו, לפי Meta, דרך Embedded Signup, התהליך שהיא מספקת לשותפים טכנולוגיים. בהקמה ישירה כמו במדריך הזה זה לא חלק מהתהליך.

    אחרי שלקוח כותב, יש 24 שעות לענות לו בהודעה חופשית וכל הודעה שלו מאפסת את השעון. מחוץ לחלון הזה אפשר לפנות אליו רק בהודעת תבנית שאושרה מראש. אימות עסקי לא נדרש כדי להתחיל והוא משפיע על מגבלת הפניות היזומות: תיק עסקי חדש יכול לפנות ביוזמתו ל-250 לקוחות שונים ביממה והאימות הוא אחת הדרכים להעלות את המגבלה ל-2,000. תשובות בתוך חלון 24 השעות לא נספרות במגבלה הזו.

    כמה זה עולה

    Meta גובה לפי הודעה שנמסרה והמחיר נקבע לפי סוג ההודעה והמדינה של הלקוח. הודעות שלקוחות שולחים לעסק לא עולות כלום. מ-1 באוקטובר 2026 Meta גובה גם על תשובות חופשיות בתוך חלון 24 השעות, אחרי 1,000 כאלה בחינם בכל חודש, לכל מספר טלפון של העסק. בוט שעונה עם Claude נספר כאן בדיוק כמו נציג אנושי.

    המחירים ללקוחות בישראל, בדולרים, לפי המחירון של Meta שבתוקף מ-1 באוקטובר 2026:

    סוג ההודעהמחיר להודעה שנמסרה
    תשובה חופשית בתוך חלון 24 השעות (הודעת שירות)1,000 בחודש חינם לכל מספר ואחר כך $0.0053
    תבנית utility: אישור הזמנה, תזכורת, עדכון$0.0053
    תבנית authentication: קוד אימות$0.0053
    תבנית marketing: מבצעים ופרסום$0.0353

    בוט קטן יכול להישאר בתוך 1,000 התשובות החינמיות. בוט שעונה ל-5,000 הודעות בחודש משלם על 4,000 מהן, כ-21 דולר, לפני העלות של Claude. Meta מעדכנת את המחירון עד פעם ברבעון והמחירים העדכניים נמצאים במקורות שבסוף המדריך.

    בלי אמצעי תשלום הבוט עלול להפסיק לענות

    לפי עמוד המחירים, בחשבון בלי אמצעי תשלום Meta תמסור הודעות שירות רק בתוך 1,000 החינמיות. בעמוד נפרד על העדכון היא כותבת שעסק שלא הוסיף אמצעי תשלום עד 30 בספטמבר 2026 יפסיק לקבל מסירה של הודעות שירות מ-1 באוקטובר. כדי לא להיתקע, מוסיפים אמצעי תשלום ב-Billing Hub של Meta.

    Meta מציעה גם סוכן AI משלה לעסקים, Meta Business Agent, שמחויב לפי טוקנים. לפי Meta, תשובה שלו עולה בערך 4 עד 5 סנט. העלות של Claude בבוט שבונים כאן נפרדת, לפי השימוש בחשבון Anthropic. ובצד של השרת: בתוכנית החינמית של Supabase יש 500,000 הפעלות של פונקציות בחודש. לפי Supabase פרויקט חינמי מושהה אחרי שבוע בלי פעילות.

    תקלות נפוצות

    • Verify and save

      האימות בלוח של Meta נכשל

      ה-Verify token בלוח לא זהה בדיוק ל-WHATSAPP_VERIFY_TOKEN, גם רווח בסוף נחשב, או שהפונקציה עלתה בלי --no-verify-jwt ונחסמה. מתקנים ומעלים שוב.

    • 401 Invalid signature

      כל הודעה נדחית בבדיקת החתימה

      ה-App Secret שגוי, או שהקוד קורא את הגוף כ-JSON לפני הבדיקה. החתימה מחושבת על הטקסט הגולמי, בדיוק כמו שהגיע.

    • האימות עבר והודעות מהטלפון לא מגיעות

      האפליקציה עוד לא פורסמה (שלב 13), השדה messages לא מסומן (שלב 12), או שהטלפון לא נמצא ברשימת הנמענים של מספר הבדיקה.

    • send failed 401

      ההודעה נכנסת ואין תשובה

      הטוקן פג או שה-Phone Number ID שגוי. הקוד כותב ללוגים את השגיאה של Graph API ושם רואים את הסיבה. טוקן זמני מחליפים בטוקן של משתמש מערכת.

    • הבוט עונה פעמיים לאותה הודעה

      Meta מתעדת שניסיונות חוזרים יכולים ליצור כפילויות. שומרים את msg.id של כל הודעה שטופלה, למשל בטבלה ב-Supabase ומדלגים על מזהה שכבר עבר.

    • לקוח עם שם משתמש לא מקבל תשובה

      קוד שעונה רק ל-msg.from נכשל כשהשדה חסר. הקוד במדריך עונה במקרה כזה ל-from_user_id, דרך השדה recipient.

    • תשובה נכשלת כעבור יום

      עברו יותר מ-24 שעות מההודעה האחרונה של הלקוח. מחוץ לחלון שולחים רק הודעת תבנית מאושרת.

    • תשובה ארוכה של Claude לא נשלחת

      וואטסאפ מקבלת עד 4,096 תווים בהודעת טקסט. מבקשים מ-Claude תשובות קצרות, או מחלקים תשובה ארוכה לכמה הודעות.

    שאלות ותשובות

    האם ה-Cloud API חינמי?

    הבדיקות חינמיות. בפרודקשן Meta גובה לפי הודעה, לפי סוג ההודעה והמדינה של הלקוח. מ-1 באוקטובר 2026 היא גובה גם על תשובות בתוך חלון 24 השעות, אחרי 1,000 תשובות חינמיות בחודש לכל מספר. מעבר להן, כל תשובה ללקוח בישראל עולה 0.0053 דולר.

    צריך אימות עסקי כדי להפעיל בוט WhatsApp?

    לא כדי להתחיל. תיק עסקי שלא אומת יכול ליצור אפליקציה, לקבל מספר בדיקה ולרשום מספר של העסק. האימות הוא אחת הדרכים להעלות את מגבלת הפניות היזומות מ-250 ל-2,000 לקוחות ביממה.

    למה הודעות מהטלפון לא מגיעות לשרת?

    כל עוד האפליקציה לא פורסמה, Meta מעבירה ל-Webhook רק אירועי בדיקה מהלוח שלה. מוסיפים כתובת למדיניות פרטיות, מפרסמים את האפליקציה ובודקים שהשדה messages מסומן.

    מה ההבדל בין טוקן זמני לטוקן קבוע?

    הטוקן הזמני נוצר בלוח של Meta ופג תוך שעות. טוקן של משתמש מערכת עם תוקף "אף פעם" לא פג והוא מה שמריץ את הבוט לאורך זמן.

    Claude Code יכול להגדיר גם את הצד של Meta?

    חלק גדול ממנו. דרך שרת ה-MCP הרשמי של Meta, WhatsApp Business Tools, סוכן יכול להגדיר Webhooks, לרשום מספרים ולשלוח הודעות. את האפליקציה ואת הטוקן הקבוע יוצרים בלוח של Meta. נכון לספטמבר 2026 השרת בבטא.

    אפשר להשתמש ב-Codex במקום Claude?

    כן. ההוראות במסלול האוטומטי עובדות עם כל סוכן קוד ובתיעוד של ה-MCP של Meta יש הוראות חיבור גם ל-Codex ול-ChatGPT.

    המקורות הרשמיים

    הירשמו לעדכונים במייל

    רוצים להישאר צעד אחד קדימה?

    עדכונים על כלי AI, מדריכים וטיפים - ישר למייל. בלי ספאם.

    הפרטים משמשים לשליחת עדכוני תוכן בלבד, לא מועברים לצד שלישי, וניתן להסיר את הרישום בכל עת מהקישור שבתחתית כל מייל. מדיניות הפרטיות