> For the complete documentation index, see [llms.txt](https://docs.graspil.com/en/llms.txt). Markdown versions of documentation pages are available by appending `.md` to page URLs; this page is available as [Markdown](https://docs.graspil.com/en/app/broadcast/create-msg.md).

# Guide to designing a broadcast message in the bot

In graspil, when creating a broadcast, you see a regular text field. But that doesn't mean your messages can't look great! You can make text **bold**, *italic*, insert [links](https://www.google.com/search?q=http://google.com), ~~strike through text~~, and more.

To do this, you need to choose a **formatting mode** (the `parse_mode` field) and use special characters.

There are two main modes in total:

1. **HTML** (Recommended for beginners — simpler and more reliable)
2. **MarkdownV2** (Faster to write, but requires more attention to punctuation marks)

### Sending a broadcast in multiple languages

If your broadcast's recipients have different Telegram languages, you don't need a separate broadcast per language. There's a language switcher above the text field (or the photo/video caption field):

1. Click **"+"** next to the **"Default"** tab and pick a language — the list is built automatically from the languages your bot's users actually have.
2. On that language's tab, write your own text — it's a separate variant, not a copy of the default one.
3. You can add as many languages as you like. The rest of the settings (buttons, media, file) stay shared across all languages — only the text/caption switches.

When the broadcast sends, each recipient gets the variant matching their Telegram language; if there's no variant for their language, they get the "Default" text. If you don't use the language switcher at all, the broadcast behaves exactly as before and everyone gets the same text.

### Method 1: HTML (The simplest)

If you select **HTML** in the `parse_mode` field, your text works like a building kit. You "wrap" the words you need with special tags.

{% hint style="info" %}
**The main rule:** If you open a tag (for example, `<b>`), you must close it (`</b>`).
{% endhint %}

#### HTML cheat sheet

| What you want to do   | How to write it in the field                   | How the client sees it             |
| --------------------- | ---------------------------------------------- | ---------------------------------- |
| **Bold text**         | `<b>Important text</b>`                        | **Important text**                 |
| *Italic*              | `<i>Slanted text</i>`                          | *Slanted text*                     |
| \~\~Strikethrough\~\~ | `<s>Old price</s>`                             | ~~Old price~~                      |
| Link on a word        | `<a href="https://graspil.com">Click here</a>` | [Click here](https://graspil.com/) |
| Spoiler (hidden text) | `<tg-spoiler>Secret</tg-spoiler>`              | (Hidden noise)                     |

**Example ready-made message to paste in:**

{% code overflow="wrap" fullWidth="true" expandable="true" %}

```html
Hi! Today we have a <b>huge sale</b>.
We've lowered prices on <i>the entire summer collection</i>.

<s>Price: $50.</s>
<b>New price: $30.</b>

Hurry over to the site: <a href="[https://myshop.ru](https://myshop.ru)">Open the catalog</a>
```

{% endcode %}

### Full list of supported HTML tags

<table data-full-width="true"><thead><tr><th>What you want to do</th><th>How to write it in the field</th></tr></thead><tbody><tr><td>Underline</td><td><code>&#x3C;u>Underlined&#x3C;/u></code></td></tr><tr><td>Spoiler</td><td><p><code>&#x3C;span class="tg-spoiler">spoiler&#x3C;/span></code><br><strong>or</strong></p><p><code>&#x3C;tg-spoiler>spoiler&#x3C;/tg-spoiler></code></p></td></tr><tr><td>Custom emoji</td><td><code>&#x3C;tg-emoji emoji-id="5368324170671202286"></code>👍<code>&#x3C;/tg-emoji></code></td></tr><tr><td>Code</td><td><code>&#x3C;code>Code&#x3C;/code></code></td></tr><tr><td>Preformatted text</td><td><code>&#x3C;pre>Formatting&#x3C;/pre></code></td></tr><tr><td>Quote</td><td><code>&#x3C;blockquote>Quote&#x3C;/blockquote></code></td></tr><tr><td>Collapsible quote</td><td><code>&#x3C;blockquote expandable>Collapsible quote&#x3C;/blockquote></code></td></tr></tbody></table>

**The diagram below shows how each tag is displayed**

#### Emoji and custom emoji

You can simply copy and paste regular emoji directly into the text, but if you want to use custom emoji, you need to use this tag:

```html
<tg-emoji emoji-id="5368324170671202286">👍</tg-emoji>
```

Use the [@AdsMarkdownBot](https://t.me/AdsMarkdownBot) bot to get the emoji ID. Just launch the bot and send it your emoji, and in response you'll get a code containing the ID

### Testing

Be sure to test your message before sending it. Use the "send to myself" feature. If there's an error in the message, Telegram will report it — just read the error, translate it, consult an AI, or contact support — we'll always help you sort out the problem.

### Method 2: MarkdownV2 (For those who love symbols)

If you select `MarkdownV2`, formatting is done using special characters (asterisks, underscores, and tildes). It's faster, but there's a **very important caveat** (more on that below).

#### MarkdownV2 cheat sheet

| What you want to do   | How to write it in the field    | How the client sees it                                                                      |
| --------------------- | ------------------------------- | ------------------------------------------------------------------------------------------- |
| **Bold text**         | `*Bold text*`                   | **Bold text**                                                                               |
| *Italic*              | `_Slanted text_`                | *Slanted text*                                                                              |
| \~\~Strikethrough\~\~ | `~Old price~`                   | ~~Old price~~                                                                               |
| Link on a word        | `[Click here](https://сайт.ру)` | [Click here](https://www.google.com/search?q=https://%D1%81%D0%B0%D0%B9%D1%82.%D1%80%D1%83) |

#### ⛔ IMPORTANT: The exclamation mark problem (Bad Request error)

In **MarkdownV2** mode, many punctuation marks are treated as "reserved". Telegram thinks they're part of the markup. If you simply write:

❌ `Hi!` or `Discount up to 50%.`

**The message WON'T send**, and you'll get an error:

> *Bad Request: can't parse entities: Character '!' is reserved...*

**What do you do?** You need to put a "shield" in front of punctuation marks. This shield is the backslash: `\` . This is called "escaping".

✅ Write it like this: `Hi\!` `Discount up to 50%\.` `We've opened\.`

**List of characters that MUST be preceded by `\`:**

1. Period `.`
2. Exclamation mark `!`
3. Minus (hyphen) `-`
4. Brackets `(` `)` `[` `]` `{` `}`
5. Plus `+`
6. Equals `=`
7. Hash `#`
8. Pipe `|`

**Example of a correctly written MarkdownV2 message:**

```
Hi\! 👋
We have *great news*\!

We've launched a promo: \-20% off everything\.
Hurry, the offer is limited\.

[Get the discount](https://myshop.ru)
```

*(Note: there's a backslash before the exclamation marks, periods, and minus sign)*.

#### Full list of MarkdownV2 commands

| Name                   | How to write it (Syntax)      |
| ---------------------- | ----------------------------- |
| **Bold**               | `*Bold text*`                 |
| *Italic*               | `_Italic_`                    |
| \~\~Strikethrough\~\~  | `~Strikethrough~`             |
| \<u>Underline\</u>     | `__Underline__`               |
| Spoiler (Hidden)       | \`                            |
| Link                   | `[Link text](http://сайт.ру)` |
| Code (inline)          | `` `Code` ``                  |
| Code block (multiline) | text                          |
| Quote                  | `>Quote text`                 |
| Collapsible quote      | \`>Quote text                 |
| Custom emoji           | `![👍](tg://emoji?id=123456)` |

#### Emoji and custom emoji

You can simply copy and paste regular emoji directly into the text, but if you want to use custom emoji, you need to use this tag:

```html
![👍](tg://emoji?id=123456)
```

Use the [@AdsMarkdownBot](https://t.me/AdsMarkdownBot) bot to get the emoji ID. Just launch the bot and send it your emoji, and in response you'll get a code containing the ID

### Testing

Be sure to test your message before sending it. Use the "send to myself" feature. If there's an error in the message, Telegram will report it — just read the error, translate it, consult an AI, or contact support — we'll always help you sort out the problem.
