# Channel Compatibility

This guide defines the normative capability matrix across nativeMsg-supported channel types, provides channel identifier reference strings, and specifies the rules for designing experiences that degrade gracefully across channels.

## Channel Identifier Strings

The following strings are used in the action `channel` property and the condition `channelTypes` field.

| Identifier | Channel Type                | Description                                                  |
| ---------- | --------------------------- | ------------------------------------------------------------ |
| `rcs`      | Rich Communication Services | RCS Business Messaging over the native Android messaging app |
| `dsc`      | DSC                         | Direct-to-consumer messaging channel with rich card support  |
| `dlc`      | DLC                         | 10DLC SMS/MMS messaging (limited formatting)                 |

{% hint style="info" %}
Channel identifier strings are case-sensitive. `"RCS"` and `"rcs"` are not equivalent in condition or action channel fields.
{% endhint %}

## Feature × Channel Capability Matrix

The table below lists every schema feature and its support status per channel. Where a feature is supported, the exact maximum or constraint is stated. Where a feature is unsupported, the degradation behavior is noted.

| Feature                                  | RCS                             | DSC                   | DLC                                                                           |
| ---------------------------------------- | ------------------------------- | --------------------- | ----------------------------------------------------------------------------- |
| **Text message**                         | ✓ Max 3072 chars                | ✓ Max 3072 chars      | ✓ Max 160 chars per SMS segment; longer messages split into multiple segments |
| **Message title**                        | ✓ Max 200 chars                 | ✓ Max 200 chars       | ✗ Ignored                                                                     |
| **Media — image**                        | ✓ JPEG, PNG, GIF, WebP          | ✓ JPEG, PNG, GIF      | ✓ MMS only; file size limits apply per carrier                                |
| **Media — video**                        | ✓ MP4, WebM                     | ✓ MP4                 | ✗ Not supported                                                               |
| **Media — audio**                        | ✓ MP3, OGG, WAV                 | ✗ Not supported       | ✗ Not supported                                                               |
| **Media — file**                         | ✓ PDF and common document types | ✓ PDF                 | ✗ Not supported                                                               |
| **Buttons — total per message**          | Max 4                           | Max 4                 | ✗ Not supported                                                               |
| **Button type: weburl**                  | ✓                               | ✓                     | ✗                                                                             |
| **Button type: postback**                | ✓                               | ✓                     | ✗                                                                             |
| **Button type: call**                    | ✓                               | ✓                     | ✗                                                                             |
| **Button type: text**                    | ✓                               | ✓                     | ✗                                                                             |
| **Button type: location**                | ✓                               | ✗                     | ✗                                                                             |
| **Button type: viewLocation**            | ✓                               | ✗                     | ✗                                                                             |
| **Button type: calendar**                | ✓                               | ✗                     | ✗                                                                             |
| **Button type: datetime**                | ✓                               | ✗                     | ✗                                                                             |
| **Button title max**                     | 25 chars                        | 25 chars              | N/A                                                                           |
| **Button payload max**                   | 1000 chars                      | 1000 chars            | N/A                                                                           |
| **Quick replies**                        | ✓ Max 13                        | ✓ Max 13              | ✗ Not supported                                                               |
| **Quick reply title max**                | 25 chars                        | 25 chars              | N/A                                                                           |
| **Quick reply — image**                  | ✓ (`imageUrl`)                  | ✓ (`imageUrl`)        | ✗                                                                             |
| **Quick reply type: location**           | ✓                               | ✗                     | ✗                                                                             |
| **Quick reply type: datetime**           | ✓                               | ✗                     | ✗                                                                             |
| **Quick reply type: calendar**           | ✓                               | ✗                     | ✗                                                                             |
| **Carousel**                             | ✓ Min 2, Max 10 cards           | ✓ Min 2, Max 10 cards | ✗ Not supported                                                               |
| **List**                                 | ✓ Min 2, Max 4 items            | ✓ Min 2, Max 4 items  | ✗ Not supported                                                               |
| **Rich card (standalone)**               | ✓                               | ✓                     | ✗ Not supported                                                               |
| **Rich card — VERTICAL orientation**     | ✓                               | ✓                     | ✗                                                                             |
| **Rich card — HORIZONTAL orientation**   | ✓                               | ✓                     | ✗                                                                             |
| **Rich card title max**                  | 200 chars                       | 200 chars             | N/A                                                                           |
| **Rich card description max**            | 2000 chars                      | 2000 chars            | N/A                                                                           |
| **Rich card buttons max**                | 4                               | 4                     | N/A                                                                           |
| **mediaHeight: SHORT**                   | ✓                               | ✓                     | ✗                                                                             |
| **mediaHeight: MEDIUM**                  | ✓                               | ✓                     | ✗                                                                             |
| **mediaHeight: TALL**                    | ✓                               | ✓                     | ✗                                                                             |
| **imageAlignment: LEFT / RIGHT**         | ✓ (HORIZONTAL only)             | ✓ (HORIZONTAL only)   | ✗                                                                             |
| **waitFor: text**                        | ✓                               | ✓                     | ✓                                                                             |
| **waitFor: number**                      | ✓                               | ✓                     | ✓                                                                             |
| **waitFor: datetime**                    | ✓                               | ✓                     | ✓ (typed by user)                                                             |
| **waitFor: coordinates**                 | ✓                               | ✓                     | ✗                                                                             |
| **waitFor: file**                        | ✓                               | ✓                     | ✗                                                                             |
| **waitFor: quick reply**                 | ✓                               | ✓                     | ✗                                                                             |
| **waitFor: multi select**                | ✓                               | ✓                     | ✗                                                                             |
| **send.email**                           | ✓                               | ✓                     | ✓                                                                             |
| **send.request**                         | ✓                               | ✓                     | ✓                                                                             |
| **send.note**                            | ✓                               | ✓                     | ✓                                                                             |
| **send.rss**                             | ✓                               | ✓                     | ✗                                                                             |
| **assignTags**                           | ✓                               | ✓                     | ✓                                                                             |
| **assignAttributes**                     | ✓                               | ✓                     | ✓                                                                             |
| **updateSettings.conversation.priority** | ✓                               | ✓                     | ✓                                                                             |
| **updateSettings.rcsExperience.enabled** | ✓                               | ✗                     | ✗                                                                             |
| **subscribe**                            | ✓                               | ✓                     | ✓                                                                             |
| **Webview (webviewViewMode)**            | ✓ full, half, tall              | ✓ full, half, tall    | ✗                                                                             |

{% hint style="warning" %}
Features listed as ✗ for a channel are silently ignored or cause a degraded experience — they do not produce a runtime error. Always test your experience on each target channel before deploying.
{% endhint %}

## Designing for Cross-Channel Compatibility

### Normative Rules

1. **Channel-restrict rich actions.** Any action that uses a feature not supported on all target channels MUST include either a `channel` property (restricting execution to the capable channel) or a `conditions` array with a `channelTypes` filter.
2. **Always provide a text fallback.** For every rich-content action (`carousel`, `list`, `richCard`, `buttons`), a parallel action restricted to non-rich channels MUST be defined, sending equivalent information as plain text.
3. **Do not rely on button-triggered `execute` on DLC.** On DLC channels, buttons are not rendered and their `execute` callbacks never fire. All workflow branching on DLC MUST be driven by user-typed text or keyword matching.
4. **Quick replies MUST NOT be the only navigation mechanism.** Any workflow that relies on quick reply selection for progression MUST include a `waitFor` step accepting `"text"` in addition to `"quick reply"`, so text-only channel users can respond.
5. **Test DLC text length.** Messages intended for DLC MUST be designed to fit within 160 characters where possible, or explicitly planned for multi-segment delivery. Attribute placeholder substitution happens before length evaluation; account for the expanded text length.

### Channel-Restriction Pattern

Use the `channel` property on actions to serve channel-appropriate content from a single workflow:

```json
{
  "name": "Cross-Channel Announcement",
  "workflows": [
    {
      "name": "send-announcement",
      "intents": ["announcement"],
      "actions": [
        {
          "name": "rich-announcement-rcs",
          "channel": "rcs",
          "send": {
            "message": {
              "title": "New Feature: Live Order Tracking",
              "text": "Track your order in real time with our new interactive map.",
              "mediaType": "image",
              "media": "https://cdn.acme.com/features/live-tracking-preview.jpg",
              "richCard": {
                "cardOrientation": "VERTICAL",
                "mediaHeight": "MEDIUM"
              },
              "buttons": [
                {
                  "type": "weburl",
                  "title": "Try it now",
                  "payload": "https://shop.acme.com/track"
                }
              ]
            }
          }
        },
        {
          "name": "rich-announcement-dsc",
          "channel": "dsc",
          "send": {
            "message": {
              "title": "New Feature: Live Order Tracking",
              "text": "Track your order in real time with our new interactive map.",
              "buttons": [
                {
                  "type": "weburl",
                  "title": "Try it now",
                  "payload": "https://shop.acme.com/track"
                }
              ]
            }
          }
        },
        {
          "name": "text-announcement-dlc",
          "channel": "dlc",
          "send": {
            "message": {
              "text": "New: Live order tracking is here! Visit acme.com/track to try it. Reply STOP to opt out."
            }
          }
        }
      ]
    }
  ]
}
```

### Condition-Based Channel Routing

Use `conditions` with `channelTypes` when you need to branch execution logic (not just content) by channel:

```json
{
  "name": "check-rcs-capable",
  "conditions": [
    {
      "channelTypes": ["rcs", "dsc"]
    }
  ],
  "send": {
    "message": {
      "text": "Choose an option below:",
      "quickReplies": [
        { "type": "text", "title": "Option A", "payload": "opt_a" },
        { "type": "text", "title": "Option B", "payload": "opt_b" }
      ]
    }
  }
}
```

```json
{
  "name": "dlc-text-prompt",
  "conditions": [
    {
      "channelTypes": "dlc"
    }
  ],
  "send": {
    "message": {
      "text": "Reply A for Option A or B for Option B."
    }
  }
}
```

### RSS Feed Channel Restriction

RSS feed rendering (`send.rss`) is only supported on RCS and DSC. Always restrict this action and provide a fallback:

```json
{
  "name": "send-news-rcs",
  "channel": "rcs",
  "send": {
    "rss": {
      "url": "https://blog.acme.com/feed.xml",
      "preferedLayout": "carousel"
    }
  }
}
```

```json
{
  "name": "send-news-dlc",
  "channel": "dlc",
  "send": {
    "message": {
      "text": "Read our latest articles at blog.acme.com"
    }
  }
}
```


---

# Agent Instructions: Querying This Documentation

If you need additional information that is not directly available in this page, you can query the documentation dynamically by asking a question.

Perform an HTTP GET request on the current page URL with the `ask` query parameter:

```
GET https://playbook.nativemsg.com/rcs-experience-schema/guides/channel-compatibility.md?ask=<question>
```

The question should be specific, self-contained, and written in natural language.
The response will contain a direct answer to the question and relevant excerpts and sources from the documentation.

Use this mechanism when the answer is not explicitly present in the current page, you need clarification or additional context, or you want to retrieve related documentation sections.
