🛠 APIs & SDKs

Inbound Normalization


What is Inbound Normalization?

How do users respond to your multi-channel messages? In some cases they may click a link, some may hit a button that fires a webhook, and others may send you a quick reply of "approved". There are a myriad of ways for users to engage with you on many channels across many providers – Courier has been there to help you with sending in these complex environments, now we're here to help with receiving, too!

By routing your inbound links, webhooks, and messages through Courier, we'll help you to:

  1. Standardize your own inbound webhook footprint, so you can deal with a normalized payload that works across all channels & providers

  2. Intelligently measure user engagement across action types – not just "clicks"

  3. Trigger automations off of replies to e.g. fire a webhook call off alongside an email after an expense report was approved

How do I use it?

To use Inbound Normalization:

  1. Register an Inbound handler for each supported provider from your Courier account's Integrations page

  2. Take the unique URL generated for your Inbound handler and register that URL as the webhook destination within your corresponding provider – refer to your provider-specific documentation for details

  3. Lastly register your server's webhook URL within Courier's Webhook Settings page if you have not already done so and optionally enable signature verification (recommended)

You'll now receive inbound webhook events with the following format (subject to change prior to release):

  "data": {
    "id": "1-6143cf63-4f27670f6304f465462695f2",
    "ts": 1631833955972,

    "from": {
      "channel": "sms",
      "user": "c156665c-a76c-4440-9676-f25c1b04ba93", // if mapped
      "address": "+15558675309" // normalized but still varies by channel
    "to": {
      "channel": "sms",
      "address": "+14159937363"

    "context": {
      "intent": "approve", // if mapped
      "text": "Yes, please",

      "reply_to": "1-6160d318-18f695fb5385b17a1ab08768", // if mapped
      "value": "expense-report-42", // if mapped

      "channel": "sms",
      "provider": "twilio",
      "request": { /* varies by provicer */ }
  "type": "inbound:message" // or inbound:click
Powered by LaunchNotes