Need help? Message us on WhatsAppWhatsApp us+1 (279) 243-3696Open chat
All integrationsBase44 + Whatsable

Base44 WhatsApp integration: your own number

You can connect the WhatsApp Business number you already have to your Base44 app with Whatsable. Base44 gives each in-app agent a new assigned WhatsApp number.

Keep your number. Keep the WhatsApp Business app. Message customers first with approved templates.

Start free trial

Official Meta Tech Provider · Keep WhatsApp Business app

Two numbers, two owners

What Base44 gives you today, and what Whatsable adds

Base44's built-in WhatsApp channel and your own number can run side by side. The built-in channel gives you a new number per agent. Whatsable adds the one your customers already have saved.

Base44 today: an assigned number

Each in-app agent in Base44 is assigned its own new WhatsApp number.

  • A total of 3 in-app agents can be connected to WhatsApp across all your apps. Superagents have their own separate pool.
  • People must send the first message. Base44 sets this rule to help prevent spam.
  • Each message sent or received uses 1 integration credit, plus more credits for agent actions such as LLM calls. The feature is free on all Base44 plans.

“Connect your own WhatsApp Business numbers.”

Whatsable: the number you already have

Whatsable connects the WhatsApp Business number you already use to your Base44 app through Meta's official WhatsApp Business Platform. Base44's assigned number keeps working next to it.

  • Use your own WhatsApp Business number or the US phone number included with every plan. You can keep using the WhatsApp Business app on your number.
  • You don't delete the WhatsApp Business app. With Coexistence your team keeps replying from the phone on the same number.
  • To message a customer first, or more than 24 hours after their last message, send an approved template. Meta doesn't deliver marketing templates to WhatsApp users in the US; utility and authentication templates still deliver.
  • A Base44 backend function reads your Whatsable API key from Base44 Secrets. It's yours to set up, not a button Base44 flips for you.
Documented path

Base44 backend function → Whatsable → your own WhatsApp Business number

Setup takes four steps, and it is a documented path, not a native connector or a one-click toggle.

  1. 1Connect your number — Connect your WhatsApp Business number in Whatsable with Meta's sign-up flow. You don't delete the WhatsApp Business app. With Coexistence your team keeps replying from the phone on the same number.
  2. 2Create your API key — In Whatsable, open Settings → API keys and click Create API key. Copy the key. The Whatsable API and webhooks are on Pro and Agency, not Bulk Message.
  3. 3Store the key in Base44 Secrets — In Base44, open Dashboard → Secrets → Add Secret and save the key as WHATSABLE_API_KEY. Or run base44 secrets set WHATSABLE_API_KEY=your_key. Backend functions need a Base44 Builder plan or higher. Keep the key out of chat and frontend code.
  4. 4Send and receive — Add the backend functions below. They read the key with secrets.get() inside the handler and call the Whatsable API. Deploy the function, then copy its URL: https://<your-app-domain>/functions/whatsappWebhook. In Whatsable, open Settings → Webhooks, click Add endpoint, paste the URL. Under Send to, pick Your own server for incoming messages. To also get messages you send, pick Make, Zapier or n8n.
Backend functions

Three Base44 functions, one for each job

Base44 backend functions run on Deno. Each one gets its own HTTPS endpoint, so the same project can send messages and receive them.

Send a message

This function reads your Whatsable API key with secrets.get() inside the handler and sends a free-text message. Use it inside the customer service window.

base44/functions/sendWhatsAppText/entry.ts
import { secrets } from "base44:runtime";

export default async function (req: Request): Promise<Response> {
  const { phone, text, idempotencyKey } = await req.json();
  const apiKey = secrets.get("WHATSABLE_API_KEY");

  const res = await fetch(
    "https://api.whatsable.app/v1/messages",
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${apiKey}`,
        "Content-Type": "application/json",
        // Optional. Reuse a key only to retry a send that got no answer.
        "Idempotency-Key": idempotencyKey ?? crypto.randomUUID(),
      },
      body: JSON.stringify({
        to: phone,                   // E.164, e.g. "+15551234567"
        type: "text",
        text: { body: text },
      }),
    },
  );

  const data = await res.json();
  // Refused before sending (key, scope, closed 24-hour window...): HTTP error with data.error.
  if (!res.ok) {
    return Response.json({ ok: false, error: data.error }, { status: 502 });
  }
  // 201 means recorded, not sent. A WhatsApp refusal is status "failed" with data.error.
  if (data.status === "failed") {
    return Response.json({ ok: false, error: data.error }, { status: 502 });
  }
  return Response.json({ ok: true, messageId: data.id, status: data.status });
}

Message a customer first with a template

A Meta-approved template lets your app start the conversation. Use it for the first message or when the customer service window has closed.

base44/functions/sendWhatsAppTemplate/entry.ts
import { secrets } from "base44:runtime";

export default async function (req: Request): Promise<Response> {
  const { phone, templateName, language, variables, idempotencyKey } = await req.json();
  const apiKey = secrets.get("WHATSABLE_API_KEY");

  const res = await fetch(
    "https://api.whatsable.app/v1/messages",
    {
      method: "POST",
      headers: {
        Authorization: `Bearer ${apiKey}`,
        "Content-Type": "application/json",
        // Optional. Reuse a key only to retry a send that got no answer.
        "Idempotency-Key": idempotencyKey ?? crypto.randomUUID(),
      },
      body: JSON.stringify({
        to: phone,                   // E.164, e.g. "+15551234567"
        type: "template",
        template: {
          name: templateName,
          language: language,        // e.g. "en_US"
          // Keyed by the template's variables[].key, e.g. { "1": "Ana", "2": "#1042" }
          variables: variables ?? {},
        },
      }),
    },
  );

  const data = await res.json();
  // Refused before sending (key, scope, unapproved template...): HTTP error with data.error.
  if (!res.ok) {
    return Response.json({ ok: false, error: data.error }, { status: 502 });
  }
  // 201 means recorded, not sent. A WhatsApp refusal is status "failed" with data.error.
  if (data.status === "failed") {
    return Response.json({ ok: false, error: data.error }, { status: 502 });
  }
  return Response.json({ ok: true, messageId: data.id, status: data.status });
}

Receive incoming messages

Whatsable POSTs a JSON payload to this function's endpoint. Direct HTTP calls have no logged-in user, so use asServiceRole when accessing Base44 resources that require it.

base44/functions/whatsappWebhook/entry.ts
export default async function (req: Request): Promise<Response> {
  const payload = await req.json();

  // Messages you send arrive with incoming_message set to false. Skip them here.
  if (payload.incoming_message === false) {
    return Response.json({ ok: true });
  }

  const phone = String(payload.phone_number);
  const name = payload.recipient_name ?? "";
  const text = payload.last_message_of_user ?? "";

  // Save or act on the message here. Answer quickly with a 2xx.
  return Response.json({ ok: true, phone, name, text });
}
Where this fits

Two ways Base44 builders use their own number

Order updates from your own number

Your Base44 app tracks orders for customers who already text your business WhatsApp number.

Outcome: A backend function sends an approved template from that number. When the customer replies, free text works inside the customer service window.

Prototype to production

Your Base44 agent proved the idea with an assigned number, and now customers need to reach you on the number they know.

Outcome: Add a backend function and a webhook to the same Base44 project. The assigned number keeps working alongside.

FAQ

Base44 and WhatsApp, answered

Yes. Each Base44 in-app agent is assigned its own WhatsApp number. A total of 3 in-app agents can be connected across all your apps, and people must send the first message.

Yes, through Whatsable. Base44 still shows Custom Numbers as Coming Soon in its own docs, so this is a documented path: a backend function in your app calls the Whatsable API.

Yes. You don't delete the WhatsApp Business app. With Coexistence your team keeps replying from the phone on the same number. Replies typed in the app reach your webhook too, once outgoing is turned on.

Yes. To message a customer first, or more than 24 hours after their last message, send an approved template. Meta doesn't deliver marketing templates to WhatsApp users in the US; utility and authentication templates still deliver. Base44's own agent channel requires the person to write first.

No. Whatsable connects your own number through Meta's sign-up flow and sends and receives on Meta's official WhatsApp Cloud API. It doesn't use QR-code pairing or WhatsApp Web libraries such as Baileys.

Through a webhook that points at a backend function. Each Base44 function has its own HTTPS endpoint. Deploy the function, then copy its URL: https://<your-app-domain>/functions/whatsappWebhook. In Whatsable, open Settings → Webhooks, click Add endpoint, paste the URL. Under Send to, pick Your own server for incoming messages. To also get messages you send, pick Make, Zapier or n8n.

No. It's a documented path, not a native connector: save your Whatsable API key in Base44 Secrets and call the Whatsable API from a Base44 backend function.

No. They are separate channels. Base44's assigned number keeps working for the agents that use it, and your own number runs next to it.

The Whatsable API and webhooks are on Pro and Agency, not Bulk Message. Base44 backend functions also need a Base44 Builder plan or higher.

Your own number, on the same Base44 app

Keep the WhatsApp Business app, message customers first with templates, and let Base44's assigned number keep working too.

Start Free Trial
Chat