xMatix
Sign in Request demo
xMatix
PRODUCTS
SalesField Sales & SFACRMRewardsClaimsInventoryProcurementWarehouse ManagementField ServiceServiceSupportTelephony & MessagingFinance & AccountingPayrollExpense ManagementCommercePortalsAnalytics & ReportingData StudioMobile AppSee all products →
PLATFORM
Platform overviewApp BuilderAutomationIntegrationsSecurity & GovernanceChange ManagementDevelopers
SENSE AI
Sense AI overviewSense AssistSense ControlSense VisionAI StudioTrust & governanceIn Claude & ChatGPTUse cases
SOLUTIONS
Auto DMSConsumer Goods DMSSales Force Automation (SFA) FMCG & DistributionManufacturing & Dealer NetworksAutomotive & DealershipsPharma & HealthcareConsumer DurablesAgri-InputsBuilding MaterialsService NetworksWarehousing & 3PLFinancial AccountingERP SoftwareIndia GST ComplianceUAE VAT & e-InvoicingSaudi ZATCA & VATAll solutions →
RESOURCES
Knowledge CenterDeveloper & CLIBlogGuidesWhat is xMatix?Company facts
COMPANY
AboutCareersPartnersEventsContactAuthorsLegal
Sign in Request demo
Home/Docs/Telephony & Messaging/Messaging channels and the message log
HOW-TO · Last reviewed

Messaging channels and the message log

Messaging channels are the routes xMatix uses to send messages: email, in-app notifications, mobile push, SMS and chat apps. The Message Log shows what happened to each message. Business rules, workflows, automation scripts, approvals, reminders and report or dashboard subscriptions all send through one shared pipeline. An administrator connects the channels that need a provider account and then uses the log to confirm delivery, resend failures and release messages the flood guard has held.

Overview

Every outbound message goes through the same steps:

  1. A sender (a business rule, a workflow step, a subscription and so on) asks for a message on one or more channels to one or more recipients.
  2. xMatix renders the content once, from a template or from inline text.
  3. It writes one log row for each channel and recipient pair. The row starts as Queued, or as Held if the flood guard stops it.
  4. A background delivery worker sends the row, retries it if the failure is temporary, and records the result.

You manage two screens:

ScreenMenu pathWhat you do there
Messaging channelsSetup → Feature Hub → Platform → Messaging channelsConnect a provider account for a channel, set its sender, switch it on or off, set quiet hours and a rate limit, and send a test message
Message LogSetup → Platform → Monitoring → Message LogSee every outbound message, filter by channel, status, recipient and date, resend failed messages and release held ones

When to use it

  • Before a rule or workflow sends SMS or chat messages. These channels have no carrier until you add a channel row with a provider account.
  • When a user says a notification never arrived. The log shows whether the message was ever created, whether it failed (with the provider's reason) or whether the flood guard held it.
  • When an organization-wide alert says outbound messaging was paused. The flood guard has tripped. Find the cause and then release the held messages.
  • To keep messages out of the night. Set quiet hours or an hourly rate limit on a channel.

How xMatix handles it

The channels

ChannelHow it is carriedWho the recipient isNeeds a channel row?
EmailThe platform's email sending serviceAn email addressNo. A row only adds quiet hours and a rate limit (see Configuration)
In-appThe notification bell in the web app and the mobile appA userNo
PushNotifications to the user's signed-in mobile devicesA userNo
SMSYour organization's SMS provider accountA phone numberYes
Business chat appYour organization's business-messaging provider accountA phone numberYes

The Channel list on the channel dialog also offers two team-chat apps. You can save rows for them, but the delivery service does not carry them yet, so their messages end as Failed (see Common problems).

What happens to a message

  • Recipients are resolved when the message is submitted. A recipient that resolves to nothing (an empty field, say) is skipped: no log row is written and the sender's diagnostics count it as skipped. Phone numbers have spaces, dashes and brackets removed, and a leading + is kept.
  • Attachments are email only. Messages that carry attachments, such as report and dashboard subscriptions, are sent straight away instead of through the queue. They still get a log row that shows Sent or Failed.
  • Temporary failures are retried. Examples are a provider that is busy (429), a provider error (5xx), a network error, or any error from the email service. xMatix makes up to five attempts, waiting 1, 2, 4 and then 8 minutes between them. Permanent failures go straight to Failed. Examples are an incomplete channel set-up, a channel that is switched off, a 4xx rejection from the provider, or a user with no registered mobile device for push.
  • Stuck messages recover on their own. If a delivery worker stops while sending, or a queue hand-off is lost, a recovery sweep sends the message again once it is more than 10 minutes overdue. Delivery is at least once: in rare cases a recipient can receive the same message twice.
  • Delivered needs a receipt from the provider. SMS and business-chat providers can report back, which moves Sent to Delivered. A later "undelivered" or "failed" report moves the message to Failed. Email and push never report back, so they stop at Sent.

Statuses

StatusMeaning
QueuedWaiting for the delivery worker. A message deferred by quiet hours or a rate limit, or waiting for a retry, stays Queued until it is due
SendingA delivery attempt is in progress
SentThe provider accepted the message. For in-app messages, the notification has been posted to the user's bell
DeliveredThe provider confirmed delivery (SMS and business chat only)
FailedAttempts ran out, the failure was permanent, or the provider reported it undelivered. The Error column holds the reason
HeldStopped by the flood guard and waiting for an administrator. Nothing is sent until you release it

The Status filter also lists Skipped, but delivery never writes that status. Skipped recipients never get a row.

Flood protection

The flood guard is always on and runs when a message is submitted:

  • Organization-wide circuit breaker. If your organization has already sent 5,000 messages in the past hour, every new message is Held. Your system administrators also get a critical alert headed "Outbound messaging paused — flood guard tripped".
  • Per-recipient limits. Once one address on one channel has received 30 messages in the past hour or 100 in the past day, further messages to it are Held. Replies in a chat conversation with someone who has written to you in the last 24 hours use a separate limit of 200 per hour instead.
  • What counts. Only Queued, Sending, Sent and Delivered messages count towards these limits. Held and Failed messages don't, so a quarantine can't keep itself tripped.

These limits are platform defaults that your organization cannot change. A message you release is not checked against the flood guard again.

Opt-outs

Users can switch channels on and off under Notification settings on the notification bell (web), and on the Notifications screen of the mobile app. The switches are In-app, Push, Email, SMS and the business chat app. Only the In-app and Push switches are enforced: messages to a user who has switched those off are skipped. Email, SMS and chat-app messages are addressed to an email address or phone number, not to a user, so the user's switch for those channels does not stop them.

Test traffic

Messages created by an automated test run send only the in-app notification. Email, SMS, push and chat messages are dropped, so tests never reach real people. A dry run sends nothing on any channel.

Prerequisites

  • The Manage messaging channels capability to set up channels, and View message log to open the log (see Permissions).
  • For SMS or the business chat app: an account with your provider, the sender number it issued, and the account's credential.
  • For SMS or the business chat app: an integration app with a Secrets section where you can store the credential (see Credentials and rotation).

Procedure

Step 1 — Store the provider credential

Open the integration app that holds your messaging credentials under Setup → Platform → Integrations, select Secrets, and add the provider's auth token under a reference name you choose, for example sms-auth-token. The value can't be read back afterwards. xMatix finds the credential by its reference name. If more than one integration app has a secret with the same reference name, the channel can't tell which one to use, so keep each reference name unique.

Step 2 — Add the channel

  1. Go to Setup → Feature Hub → Platform → Messaging channels and select New in the page header.
  2. Enter a Label such as Marketing SMS. The Name fills in from the label and can't be changed after you create the row.
  3. Choose the Channel (for example SMS) and the Provider.
  4. Enter From (sender number / address), the sender number your provider issued, in international format, for example +15551234567.
  5. Enter the Secret name, the reference name from Step 1, not the credential itself.
  6. In Settings JSON, enter the provider settings. The SMS provider needs its account identifier, for example {"accountSid":"AC…"}. Add quiet hours or a rate limit here as well (see Configuration).
  7. Leave Enabled on and select Create.

The row appears in the table with its Label, Channel, Provider, From and Enabled values, and the toast says "Channel created."

Step 3 — Send a test message

On the channel's row, select Test send in the actions column. Enter a recipient (a phone number for SMS, an email address for Email) and select Send. The Test send result window shows queued: and skipped: counts and any diagnostics, such as "in quiet hours; delivery deferred to …".

A queued count of 1 means the message was accepted, not that it was delivered. Open the Message Log, type test in the search box (it matches the Category column), and check that the row reaches Sent (or Delivered). If it shows Failed, hover over View in the Error column to read the reason.

Step 4 — Send messages from a rule or workflow

Channels are used by the features that send messages. Two examples:

  • A business rule with the SendMessage action takes a directive such as template=OrderConfirmed;channels=email;to=field:CustomerEmail;category=orders. Here to= takes field:<path> (a field on the record), owner, user:<user id> or a literal address, separated by |. See Business rules.
  • A workflow's Send Message step does the same from a workflow. See Workflows.

Use the channel keys email, inapp, push and sms in a directive. Templates are chosen by name; see Messaging templates.

Step 5 — Follow delivery in the Message Log

  1. Go to Setup → Platform → Monitoring → Message Log. It opens on the last seven days.
  2. Narrow the list with the filters on the second header row: Channel, Status, Recipient (any part of the address; press Enter) and the date range. The search box on the first row searches the rows already loaded, including subject, category and error text.
  3. Read each row: Created (hover for the exact time), Channel, Status, Recipient, Subject, Attempts, Category and Error (hover over View to read it). In-app and push recipients show as the user's name, with their email address on hover. A user who has since been removed shows as "Unknown user".

Step 6 — Resend a failed message

Fix the cause first: switch the channel on, correct the sender or credential, or ask the user to sign in on the mobile app. Then select Resend on the Failed row. The toast says "Message re-queued for delivery." and the row goes back to Queued. The attempt count carries on from where it stopped. A message that had already used all five attempts gets a single attempt and is not retried again.

Step 7 — Release held messages

  1. Filter Status to Held and work out what produced the volume. The Category column and the subject point to the sender, for example a business rule or a subscription.
  2. Fix the source first, for example by deactivating the rule or correcting its condition. Released messages are sent without another flood check.
  3. Release one message with Release on its row ("Message released for delivery."), or all of them with Release held in the page header. If a Channel filter is selected, Release held releases only that channel's held messages. Each click releases up to 1,000 of the oldest held messages and reports "Released N held message(s)." Click again if more remain.

Fields

Channel dialog

FieldWhat it meansNotes
LabelThe name shown in the tableRequired
NameThe row's stable keyFills in from the label; read-only after creation
ChannelWhich channel this row configures: SMS, Email, the business chat app, or one of the two team-chat appsRequired. Keep one row per channel: delivery reads the first row it finds for the channel
ProviderThe provider account that carries the channelRequired. The list holds the supported SMS and chat-app providers, an email option and a REST connector option
From (sender number / address)The sender number or addressNeeded for SMS and chat apps; delivery fails without it
Secret nameThe reference name of the stored credentialNever the credential itself. See Step 1
Settings JSONProvider settings plus throttling keysSaved as entered; a value that isn't valid JSON is ignored when messages are sent
EnabledWhether the channel may sendSwitched-off SMS and chat-app channels make their messages Failed at delivery, not skipped

When you pick the business chat app, the dialog also shows a section for customers messaging you (inbound ordering). That feature is not covered on this page.

Message Log columns

ColumnWhat it meansNotes
CreatedWhen the message was submittedRelative time; hover for the exact date and time
ChannelEmail, In-app, Push, SMS or the chat app
StatusSee Statuses
RecipientThe address, or the user's name for in-app and push
SubjectThe rendered subjectEmpty for messages sent with no subject
AttemptsHow many delivery attempts were madeUp to five, plus one per resend
CategoryThe kind of sender, for example Business rule or TestSet by the sender; business rules default to Business rule
ErrorThe last error or noteA Sent row can carry a note, for example when something sent with the message was refused

Business rules

  • One row is written per channel and recipient. The same address listed twice in one request gets only one row.
  • If both a template and inline text are given, the template's subject and body win. Inline text fills anything the template leaves empty. If the template can't be found, the inline content is used and the diagnostics say so.
  • A request with no subject and no body creates nothing ("No content — supply a template or inline subject/body.").
  • An email that has no HTML body is wrapped in the standard branded layout.
  • Quiet hours and the rate limit defer the first attempt. They never drop a message.
  • Resend works only on Failed and Held rows. Any other row returns "Only failed or held messages can be re-driven."

Example

A distributor wants an SMS to each customer when their order ships, with no texts at night.

  1. The administrator stores the SMS provider's auth token as sms-auth-token in the messaging integration app's Secrets.
  2. Under Messaging channels they create Shipping SMS: Channel SMS, the SMS provider, From +15550100200, Secret name sms-auth-token, and Settings JSON {"accountSid":"AC…","quietHoursStart":21,"quietHoursEnd":8,"quietHoursTz":"Asia/Kolkata","rateLimitPerHour":500}.
  3. Test send to their own mobile number returns queued: 1. The Message Log row shows Sent, then Delivered a few seconds later.
  4. A business rule on shipment goes live with the directive channels=sms;to=field:<phone field>;body=Your order has shipped.;category=shipping, where <phone field> is the record field that holds the customer's mobile number.
  5. At 22:30 local time a shipment is saved. The message is created as Queued and deferred to 08:00 the next morning, when it is sent.

Training

Practice exercise

In a sandbox, create an Email channel row with Settings JSON {"quietHoursStart":0,"quietHoursEnd":23,"quietHoursTz":"UTC"}. Then use Test send to your own address. Expected result: the result window shows queued: 1 and a diagnostic that the channel is in quiet hours, with the time delivery is deferred to. The Message Log shows the row as Queued with category Test until 23:00 UTC. If you run the exercise between 23:00 and midnight UTC, the message is sent at once instead. Delete the row afterwards.

Quick reference

  • Channels: Setup → Feature Hub → Platform → Messaging channels. Log: Setup → Platform → Monitoring → Message Log.
  • Email, in-app and push need no channel row. SMS and the business chat app need one.
  • The secret name is a reference; store the value in an integration app's Secrets.
  • Five attempts, 1–2–4–8 minutes apart, for temporary failures only.
  • Held = flood guard: 5,000 an hour organization-wide, 30 an hour or 100 a day per recipient per channel.
  • Fix the source before Release held; released messages skip the flood check.
  • Delivered appears only for SMS and the business chat app.
  • Only the In-app and Push opt-outs stop messages.

Permissions

Both capabilities are granted on a security profile's Entitlements tab. The built-in SystemAdmin profile has both. See Security profiles.

CapabilityFeatureWhat it opensWithout it
Manage messaging channelsMetadata AdministrationThe Messaging channels screen, its New, Edit and Delete actions, and Test sendThe menu entry is missing and its requests are refused
View message logPlatform DiagnosticsThe Message Log, including Resend, Release and Release heldThe menu entry is missing and its requests are refused

Anyone who can view the log can also resend and release messages, so grant View message log only to people you trust to make that call.

Configuration

Throttling keys in Settings JSON

Add these keys to a channel row's Settings JSON. They work on every channel that has a row, including Email.

KeyMeaningExample
quietHoursStartHour (0–23) when quiet hours begin21
quietHoursEndHour (0–23) when quiet hours end; may be earlier than the start, so a window can run overnight8
quietHoursTzTime zone for the two hours above. If it is empty or not recognized, UTC is used"Asia/Kolkata"
rateLimitPerHourThe most messages the channel may create in any rolling hour; the first attempt of later messages waits until the window frees500

During quiet hours, a new message's first attempt waits until the quiet window ends. If both apply, the later of the two times wins.

What an Email row does and doesn't change

Email is always sent through the platform's email service. An Email row's throttling keys apply, but its Provider, From, Secret name and Enabled switch don't change how email is sent. Email content and layout come from messaging templates.

  • Templates: Setup → Feature Hub → Platform → Email Templates. A sender's template= refers to a template by name.
  • Senders: Business rules (SendMessage action), Workflows (Send Message step), automation scripts, approval notifications and report and dashboard subscriptions.

Common problems

The test send says queued, but nothing arrives

The test only queues the message. Open the Message Log and find the row with category Test:

  • Queued with a future time means quiet hours or the rate limit deferred it.
  • Failed carries the reason in Error.
  • Held means the flood guard stopped it.

"Channel 'sms' is not configured/enabled for this tenant."

There is no Messaging channels row for that channel, or its Enabled switch is off. Add the row or switch it on, then Resend the failed messages.

SMS fails with "config incomplete (need accountSid, auth-token secret, and from address)"

This SMS or chat-app row is missing its account identifier in Settings JSON (accountSid), its From number, or a credential that resolves from Secret name. Check the reference name against the integration app's Secrets list, fix the row, then resend.

A push message failed with "No registered devices for the recipient user."

The user has never signed in on the mobile app, or has signed out on every device. Push can only reach a device the user is signed in on. Ask them to sign in, then resend. In-app notifications still reach them on the web.

A message to the record owner never appears in the log

For email, owner resolves only when the record holds the owner's email address. Otherwise the recipient is skipped and no row is written. Use field:<a field that holds the email address> instead. For in-app and push, owner resolves to the owner user.

Messages for a team-chat channel fail with "Connector registry is not available in this host."

The delivery service does not carry the two team-chat channels yet, whatever you configure on their rows. Use email, in-app or SMS for these notifications instead.

Every new message is Held

The organization-wide breaker tripped. Filter the log to Held, find the sender behind the volume (Category, Subject), fix it, and then select Release held. Messages created after the past hour's count drops below the limit are sent normally again.

Common questions

Why does a message stay at Sent and never reach Delivered?

Delivered needs a delivery receipt from the provider. Only the SMS and business-chat providers send receipts, so email, push and in-app messages correctly stop at Sent. A message that stays at Sent on those channels has not failed: failures always show as Failed with an error. For SMS, a message that stays at Sent usually means the provider has not reported back yet. If the provider later reports it undelivered, the row moves to Failed with the provider's reason.

Can I raise the flood guard limits for my organization?

No. The organization-wide limit (5,000 messages an hour) and the per-recipient limits (30 an hour and 100 a day per channel, or 200 an hour within a live chat conversation) are platform settings. Your organization can't change them. What you control is what happens when they trip: review the held messages, fix the rule or workflow that produced them, and then release them from the Message Log. To spread a large legitimate send, set rateLimitPerHour on the channel. That defers messages instead of holding them.

If I switch a channel off, are its messages skipped?

Not for SMS and the business chat app. Messages are still created as Queued, and each one fails at delivery with "is not configured/enabled for this tenant". When you switch the channel back on, you need to resend them. For email, in-app and push the switch has no effect, because those channels don't depend on a channel row. To stop a sender, deactivate the rule, workflow or subscription itself.

Does a user's opt-out stop email?

No. The bell's notification settings and the mobile Notifications screen offer switches for every channel, but only In-app and Push are enforced. Email, SMS and chat messages go to an address or phone number rather than a user, so the switches for those channels are saved but not applied. To stop a user receiving an email, remove them from the sender's recipients.