WhatsappElixir

WhatsappElixir is an Elixir library for interacting with the WhatsApp API. It allows you to handle incoming messages and send responses efficiently using a clean and simple API.

Installation

To use WhatsappElixir in your project, add it to your mix.exs dependencies:

def deps do
  [
    {:whatsapp_elixir, "0.1.10"}
  ]
end

Configuration

Configure your WhatsApp credentials in config/config.exs:

  config :whatsapp_elixir,WhatsappElixir.HTTP,
    token: System.get_env("WHATSAPP_TOKEN"),
    phone_number_id: System.get_env("WHATSAPP_PHONE_NUMBER_ID"),
    verify_token: System.get_env("VERIFY_TOKEN")

"""

Config can be left blank if you wish to pass the config at the app.

Usage

sending whatsapp message example this only works with users with existing sessions to send message first time use templated message on user reply session will be created.

messages & templated message

defmodule MyModule do
alias WhatsappElixir.Messages

def send_message(mobile_number) do
 Messages.send_message(mobile_number, "Hello World")
end

def send_templated(mobile_number) do
Messages.send_template("hello_world", mobile_number, [] )
end

end

Sends an image message to a WhatsApp user.

Args

 iex> WhatsappElixir.send_image("https://i.imgur.com/Fh7XVYY.jpeg", "5511999999999")
 

Send Template Message

defmodule MyModule do
  alias WhatsappElixir.Messages

  def send_templated(mobile_number) do
    Messages.send_template("hello_world", mobile_number, [])
  end
end

Handling inbound webhooks (phone numbers, BSUIDs and usernames)

Users who adopt a WhatsApp username may arrive without a phone number. In that case contacts[0].wa_id and messages[0].from are missing, and the user is identified by a business-scoped user ID (BSUID) such as "KE.984051547420197". Use get_sender/1:

alias WhatsappElixir.{Messages, Static}

def handle_webhook(params) do
  %{wa_id: wa_id, user_id: user_id, username: username, name: name} = Static.get_sender(params)

  # Every field can be nil. Store user_id as the stable key for username users.
  recipient = wa_id || user_id

  Messages.send_message(recipient, "Hi #{name || username}!")
end

Every send function takes either a phone number (sent as "to") or a BSUID (sent as "recipient"); see WhatsappElixir.Recipient. For status webhooks, use Static.get_status_recipient/1, which returns %{recipient_id: ..., recipient_user_id: ...}.

Send a WhatsApp Flow

Send a Flow as an interactive message inside the 24-hour customer service window:

flow = %{
  flow_id: "1234567890",
  flow_token: "booking-42",          # returned to you in the user's reply
  flow_cta: "Book now",              # max 20 characters
  header: "Appointments",            # optional
  body: "Pick a time that suits you.",
  footer: "Takes 1 minute",          # optional
  screen: "BOOKING",                 # optional first screen
  data: %{"branch" => "nairobi"}     # optional, sent with the screen
  # mode: "draft"                    # to test an unpublished flow
}

{:ok, response} = WhatsappElixir.Flows.send_flow("254700000000", flow)

When the user submits the Flow, parse the reply webhook:

case WhatsappElixir.Static.get_flow_response(params) do
  {:ok, flow_token, answers} -> handle_answers(flow_token, answers)
  :error -> :not_a_flow_reply
end