Choosing a BSP and reading the pricing honestly
You have two routes: Meta’s Cloud API directly, or a Business Solution Provider such as Qontak, WATI, 360dialog, or Twilio. Direct is cheaper and hands you the raw API. A BSP gives you an agent inbox, template management, a flow builder, and somebody to escalate to when your number gets flagged. For a company sending notifications out of ERPNext and handling replies with a small support team, the inbox alone usually justifies the markup.
Read the pricing carefully, because its shape changed. Meta charges per message by category rather than per conversation, with utility, marketing, authentication, and service messages priced differently. Indonesian utility messages sit in the low fractions of a US cent; marketing costs several times more. Twenty thousand utility notifications a month lands around Rp 3 to 6 juta at list price, before a BSP adds 10 to 30 percent and a platform fee.
Budget time for verification, not only money. Meta Business Verification wants your NIB, akta pendirian, and NPWP, plus a website and business email that match the legal entity. Display name review has firm opinions about names that read as promotional. Plan for two to three weeks, start it in week one of the project, and never let the go-live date depend on it clearing quickly.
One more consideration: use a dedicated number. Migrating the number the sales team has used on WhatsApp for six years means losing the chat history on that handset and disrupting live conversations during the switch. A new number costs you some recognition with existing customers and saves roughly a fortnight of confusion for everybody involved.
Template approval is where projects slip
Every message sent outside a live conversation window uses a pre-approved template, and each template carries a category that determines both price and rules. The most common rejection we see is promotional language inside a utility template. One sentence like buy again and save 20 percent turns an order confirmation into a marketing message, which can be recategorised without much ceremony and repriced along with it.
- Keep utility templates purely transactional: document number, amount, date, status, and one link
- Provide realistic sample values for every variable, or the review will bounce it back
- Do not put the whole invoice in the body — link to a portal page and keep the template short
- Create Indonesian and English versions of the same template name from the very start
- Version approved template text in your repository; it is production configuration, not marketing copy
The three flows worth building first
Do not build fifteen flows. Build three, measure them, then extend. In almost every ERPNext deployment the same handful earn their keep in the first fortnight, because they replace a person manually retyping information into WhatsApp several dozen times a day — which is also where the transcription errors come from.
- Order confirmation on Sales Order submit: number, total, expected delivery date, and a portal link
- Payment reminders from outstanding Sales Invoices at H-3, on the due date, and again at H+7
- Delivery status from Delivery Note plus the JNE or J&T tracking webhook, on dispatch and on arrival
- Claim acknowledgement from the Issue doctype, with a ticket number the customer can quote back
One implementation detail matters more than the rest: do not try to do this with the standard Notification doctype. Create a WA Message Log DocType holding the linked document, template name, parameters, provider message id, and delivery status, and send through a background job. You need that log for debugging, for cost attribution, and for the day a customer insists nobody told them about the delivery.
Send everything through a queue with a scheduler rather than inline on document submit. If the provider is slow or down, an inline call blocks the user saving a Sales Order, and warehouse staff will start blaming ERPNext for something WhatsApp did. Decoupling the send also gives you a natural place to enforce rate limits and daily caps.
Opt-in, opt-out, and UU PDP
Consent is not optional, and it is not implied by having somebody’s number in your customer master. Under UU 27/2022, marketing messages need consent you can evidence, with a timestamp and a source. Transactional notifications about an order the customer actually placed sit on firmer ground, but you still need an opt-out path and you still need to honour it the moment somebody uses it.
- Store consent status, timestamp, and source on the Contact and treat those as required fields
- Honour STOP and BERHENTI replies automatically, updating the record within the same minute
- Separate marketing consent from transactional notification consent — they are different questions
- Give support staff a one-click opt-out, because customers ask a human before they reply STOP
Operational reality: retries, logs, and cost control
Once messages send themselves, operational discipline becomes the product. Retry with exponential backoff on transient failures, but deduplicate on document name plus template so a retried job cannot send the same reminder twice. Cap sends per customer per day. Keep a test number and push every template through it before enabling it in production. Alert when the failure rate crosses two percent, because a rejected template shows up as silence.
Watch cost weekly for the first two months. The pattern we keep seeing is a reminder flow that quietly doubles in volume because one filter was slightly wrong, and nobody notices until the BSP invoice arrives. A daily count by template, posted into the same WhatsApp group the operations team already lives in, catches it on day two instead of day thirty.
