A Communication App on Salla lets you take over message delivery for any merchant who installs your app. When Salla needs to send an SMS, Email, or WhatsApp message to a customer, it fires an event that calls your App Function. Your function receives the full message payload, calls your chosen provider (Twilio, SendGrid, 360dialog, Unifonic, or any other), and returns the result.Merchants benefit from using their own provider accounts, sender IDs, and templates. You control the routing and delivery logic entirely through code.
It is a must to have a good foundational background in App Functions
Already familiar with App Functions?
Jump directly to Build Your App Function if you already have your app created and your provider set up.
Good to know
If you are new to App Functions, read the App Functions reference first. It covers execution types, the Resp utility class, runtime constraints, and how to use the Partner Portal editor. This guide assumes that foundation and focuses entirely on Communication Apps.
When a store event occurs, an order status change, a new customer registration, an OTP request, Salla intercepts it and, instead of sending the message itself, fires an event to your App Function. Your function receives the full message payload, calls your provider, and returns the result. Salla never touches the delivery layer.The diagram below shows the full lifecycle of a single outgoing message.
Each channel maps to a Supported Feature you declare in the Partner Portal and a dedicated App Function event. The Supported Feature is what makes your app appear on the merchant side as the active handler for that message type — once selected, your app takes full ownership of all messages for that feature.
Supported Feature
Event name
What your app handles
Local SMS
communication.sms.send
SMS messages to KSA numbers (+966...)
International SMS
communication.sms.send
SMS messages to numbers outside KSA
Email
communication.email.send
All email messages
WhatsApp
communication.whatsapp.send
All WhatsApp messages
Important
Local SMS and International SMS both arrive through the same communication.sms.send event. If you select both Supported Features, your app handles all SMS traffic regardless of destination. You can inspect notifiable[0] to apply provider-specific routing by number prefix if needed.
Every communication event delivers the same payload shape inside context.payload.data. These fields are all you need to route and deliver a message through your provider.
Field
Type
Description
notifiable
string[]
One or more recipients (phone numbers or email addresses)
type
string
Why this message is being sent (e.g. auth.otp.verification, order.status.updated)
content
string
The ready-to-send message body
entity
object | null
Related store entity (order, shipment, product, etc.) or null