# Marketing Automation All in One with SMS and WhatsApp

> Marketing automation over SMS and WhatsApp: journey steps sent through your own Twilio or Meta account, delivery status back, STOP honoured.

- **What it is:** Marketing automation over SMS and WhatsApp: journey steps sent through your own Twilio or Meta account, delivery status back, STOP honoured.
- **For:** Marketing
- **Odoo versions:** 16.0, 17.0, 18.0, 19.0, 20.0 - Community and Enterprise
- **Runs on:** Odoo.sh or Odoo you host yourself - not Odoo Online, which accepts no third-party apps
- **Price:** 208 EUR, one-time, on the Odoo Apps Store
- **Technical name:** bambooforge_ma_messaging
- **Not for:** Said before you buy, because it is the half that decides whether the app fits:; Start a WhatsApp conversation without an approved template - only a template can.; Move a status backwards - a late sent after delivered is ignored.
- **Manual:** https://docs.bambooforge.dev/bambooforge_ma_messaging/
- **Live demo:** https://demo20.bambooforge.dev/odoo/action-bambooforge_ma_messaging.action_bf_messaging_provider
- **Store page:** https://apps.odoo.com/apps/modules/20.0/bambooforge_ma_messaging
- **Manual last updated:** 2026-10-15

---
# Marketing Automation All in One with SMS and WhatsApp

An add-on for **BambooForge Marketing Automation** (17.0). Two journey
step types that send SMS and WhatsApp through **Twilio** or **Meta's
WhatsApp Cloud API** with your own account, plus a **Sandbox** to
rehearse on; a message log with delivery status coming back; STOP
honoured.

## Gateways

*Marketing Automation ▸ Gateways*. One record per sender:

- **Sandbox** - writes every send to the log with a fake reference;
  nothing leaves the server. Use it to rehearse a journey.
- **Twilio** - Account SID, auth token, and *From*: a Twilio number in
  E.164, a Messaging Service SID (`MG…`), or your approved WhatsApp
  number. Channel *SMS* or *WhatsApp* (a Twilio account doing both is
  two gateway records).
- **Meta WhatsApp Cloud API** - Phone number ID and a permanent access
  token. WhatsApp only.

**Send test** posts one message to the *Test number* and writes it to
the log: the way to prove a gateway before it meets a journey.

### Callbacks

Each gateway shows two URLs (with a secret token in the path):

- *Status callback* - Twilio: attached to every message automatically.
  Meta: statuses arrive on the webhook below.
- *Inbound / webhook* - Twilio: paste as the number's "A message comes
  in" webhook. Meta: paste as the app's webhook URL; it answers Meta's
  verification GET with the *Webhook verify token* shown on the record;
  subscribe to *messages*.

## Steps

Two new step types on a journey:

- **Send SMS (gateway)** - gateway + *Message* (inline placeholders:
  `Hi {{ object.name }}`).
- **Send WhatsApp** - gateway + either *Message* (a session message,
  only deliverable inside the 24-hour customer window) or a **WhatsApp
  template** name + language + *Template variables* (comma-separated
  inline expressions in `{{1}}, {{2}}` order). A template is the only
  way to *start* a conversation on WhatsApp; Meta approves them in
  your Business Manager, Twilio maps them to Content SIDs - name them
  as your provider expects.

What happens on a participant: the number is taken from *mobile*
then *phone* (19.0 dropped `res.partner.mobile`, so there it is
simply *phone*); no number → skipped with a note; a blacklisted number → the
participant **exits** the journey (STOP is regulatory); otherwise the
message is rendered and sent, the send is logged, a trace is written,
the journey advances. The **sending window** holds these steps like
e-mails. *Run Test* writes "would send SMS via …" and sends nothing.

## The log

*Marketing Automation ▸ Messages*: gateway, number, journey, step,
body, state (*queued → sent → delivered → read*, or *failed* with the
provider's error), reference, last status time. Statuses never go
backwards (a late "sent" after "delivered" is ignored). Tests sent with
the button are flagged and hidden by default.

## Retention

The message log is swept by Odoo's daily vacuum: rows older than
`bambooforge_ma_messaging.log_retention_days` (a system parameter,
365 by default) are deleted. Set it to **0** to keep everything - some
regulators ask for that, and then it is a decision rather than an
oversight.

## STOP

An inbound `STOP` (also `STOPALL`, `UNSUBSCRIBE`, `CANCEL`,
`END`, `QUIT`) on either platform adds the number to Odoo's phone
blacklist (`phone_validation` installed) and is logged; the next
gateway step for that number exits the participant.

## Honest about proof

Twilio and Meta were implemented against their published REST
contracts and are exercised by this module's tests against recorded
stubs. The screenshots and the video run on the Sandbox gateway. Live
delivery is proven on **your** account with *Send test*; no third-party
credentials were used to build this module, and none are shipped.

## Technical notes

- Uses Marketing Automation 1.10.0's hooks: `_messaging_step_types`
  (sending window), `_run_step_<type>` dispatch, `_dry_run_label`.
- Python dependency: `requests`.
- Community only. The external services are the ones you already pay
  for.

## How we make sure it works

Before every release, **33 automated checks** run against this app on Odoo 16, 17, 18, 19 and 20.
Among them:

- A gateway in use cannot be deleted.
- Dry run names the gateway and sends nothing.
- A normal reply is not a stop.
- No number is refused before any call.
- No number is skipped with a note.

The complete list is in the source you receive.

## What it does not do

Said before you buy, because it is the half that decides whether the app fits:

- Start a WhatsApp conversation without an approved template - only a template can.
- Move a status backwards - a late sent after delivered is ignored.

## Install

1. Copy `bambooforge_ma_messaging` into your addons path and update the app list, or install the ZIP from the Odoo Apps Store.
2. Install **Marketing Automation Suite: SMS & WhatsApp**.
3. Open **Gateways** - its menus are Messages.

## Questions people ask

****Which Odoo versions does it run on?****

Odoo 16.0, 17.0, 18.0, 19.0, 20.0, on the series you buy it for; each series is its own listing.

****Community or Enterprise?****

Both. It needs no Enterprise app.

****What does it need?****

The standard Web; marketing automation (BambooForge) must be installed first app. No extra Python package.

****Where does it show up?****

Under the **Gateways** menu (Messages).

****Does anything leave my server?****

It makes calls outside your server only where its manual says so - read the section on that service before you connect it.

****What happens if I uninstall it?****

Odoo drops the app's own tables and fields; the standard records it worked on (contacts, orders, products) stay as they are.
