AWRA OpsHub Search

Three Limits and a Colour

Discord rejects an embed whose title runs one character over its limit. It does not trim it — it refuses the whole message. So the connector trims first, to a number deliberately below the documented one, and the margin between the two is the interesting part.

Integrations & Data AWRA OpsHub Team 11 min read

There are two ways to handle a provider's length limit. You can send whatever you have and let them deal with it, which works right up until the day a supplier with a long name and a purchase order with a long reference produce a title of two hundred and fifty-eight characters. Or you can trim before sending, which requires knowing the number — and choosing one that is not quite the number they published.

Refusal, not truncation

The important property is what happens on overflow, and it is worth being exact about it because it decides everything else.

Discord does not shorten an over-long field. It rejects the request. The entire message — title, detail, link, source line — does not appear, and what comes back is a validation error naming the field.

That is the correct behaviour for an API and the worst possible behaviour for a notification. A truncated alert still tells somebody an approval is waiting. A rejected one tells nobody anything, and it fails precisely on the records with the most going on — the long supplier name, the reference with a project code in it, the order with a note attached.

The messages that overflow are the messages about the complicated records, which are the ones somebody most needs to see.

Because overflow refuses rather than trims, the trim has to happen before the request goes.
Because overflow refuses rather than trims, the trim has to happen before the request goes.

Three fields, three caps

So each of the three text fields is trimmed on the way in, with an ellipsis marking the cut.

Field What it carries Roughly
Title The one line that has to work alone A long sentence
Description The detail underneath it Several paragraphs
Footer The small source line at the bottom A couple of sentences

Every one of those is generous relative to what an operational alert actually contains. The description cap alone is longer than most of the notifications this system sends put together. They exist for the outlier, and the outlier is what a limit is for.

Why the numbers are not the published numbers

Here is the detail worth the post. Each cap used is a little below the one Discord documents — a handful of characters on the title, a couple of hundred on the description.

That margin is not caution for its own sake. It exists because the number of characters in a string is not a single well-defined quantity, and the two parties can count differently.

  1. An emoji is not one character

    Depending on how you count, a single emoji is one thing, two, or four. A flag or a family emoji is several code points joined together, and a limit measured in one unit is not a limit measured in another.

  2. An accent may be one character or two

    The same visible letter can be a single code point or a letter followed by a combining mark. Both are correct, both are common in real data, and they count differently.

  3. The ellipsis has a length too

    Trimming to exactly the limit and then adding a marker produces a string one longer than the limit, which is the most embarrassing way to fail a length check.

  4. A limit can be silently tightened

    A provider that reduces a documented maximum affects everybody sitting exactly on it and nobody sitting under it. The margin is what makes that somebody else's incident.

The cost of the margin is a few characters of detail on the longest notifications anybody sends. The cost of not having it is a rejected message on an unpredictable subset of records. That trade is not close, and it is the general shape of every good limit decision: give up something you can measure to avoid a failure you cannot predict.

The colour is a number

A small, genuinely surprising thing. The coloured bar down the left edge of a Discord embed is set as a decimal integer rather than as a colour string.

So a brand colour written the way every designer, stylesheet and design tool writes it has to be converted into a large plain number before it means anything to Discord. Send the familiar string and the field is invalid.

It is stored converted, once, with the original written beside it in a comment — because a large decimal number in isolation is unreadable, unsearchable and impossible to check against a brand guide. Six months later, nobody can tell whether it is right without doing arithmetic.

That is a tiny instance of a habit worth having generally: when a value has to be stored in a form people cannot read, keep the readable form next to it. The comment is not documentation, it is the only version anybody can verify.

And the title is the link

One structural difference from the other chat destinations. Slack and Teams put the link on a button underneath the message. A Discord embed has no button — instead, giving the embed an address makes its title clickable.

The practical result is the same and the visual result is not, which is the honest description. The reader gets one obvious way through to the record; it is the headline rather than a separate control.

It also means the link is always attached to the part of the message that survives everything — the title is what shows in a notification, in a preview, and in the message list. The one element that cannot be missed is the one carrying the way through.

What is in place, layer by layer

The Discord connector as it stands

Every text field trimmed before sending

Title, detail and source line are each capped with an ellipsis, so a long record produces a shortened notification rather than a rejected one.

Built in

Caps set below the documented maxima

A deliberate margin, because character counting differs between the two parties on emoji and accented text and a limit can be tightened without notice.

Built in

A rich embed rather than plain text

A coloured bar, a heading, the detail and a subtle source line, so a channel carrying several a day stays scannable.

Built in

The brand colour stored as the provider wants it

Converted to the numeric form Discord requires, with the readable form recorded beside it so it can be checked against a brand guide.

Built in

A clickable title where there is a destination

The embed carries the link on its heading, which is the element that survives every preview and notification.

Built in

Optional parts genuinely omitted

No detail means no description; no link means an ordinary title. A short notification arrives short rather than padded.

Built in

No escaping, deliberately

Embed fields are structured values rather than markup, so an ampersand in a supplier name is passed through as itself.

Built in

A bounded wait

A twelve-second ceiling, so a slow response cannot hold up the work that raised the notification.

Built in

The provider's rejection surfaced

A refused message reports Discord's own status and body, which names the offending field rather than reporting a generic failure.

Built in

A successful Discord send returns no content at all — the status is the entire answer, which is why success here is judged on the status rather than on anything in the body.

Three positions held on purpose

  • Trimming happens on our side rather than being left to the provider. A shortened alert still does its job; a rejected one reaches nobody, and it fails on exactly the records that were most worth a notification.
  • The caps sit below the published limits. The few characters given up are measurable and small; the failure avoided is unpredictable and total, and that is not a close trade.
  • A value stored in a form people cannot read keeps its readable form beside it. A large decimal integer is unverifiable six months later, and the comment is the only version anyone can check against a brand guide.

Five questions about provider limits

What happens to an over-long message?

A good answer sounds like

Trimmed, not refused.

What ours actually is

Each field is capped with an ellipsis before sending, so a long record still produces a notification.

Are the caps the documented ones?

A good answer sounds like

Slightly under, on purpose.

What ours actually is

A deliberate margin, because the two sides can count characters differently and a maximum can be tightened.

Does an emoji in a supplier name break it?

A good answer sounds like

No.

What ours actually is

The margin exists for exactly that case, where one visible symbol counts as several units.

How is the brand colour handled?

A good answer sounds like

Converted, and recorded.

What ours actually is

Stored in the numeric form the provider requires, with the readable form kept beside it.

Can the reader reach the record?

A good answer sounds like

Yes.

What ours actually is

The embed's heading is the link, which is the element that survives every preview.

Our take

Length limits are the most boring thing an integration has to handle and one of the few that fail on real data rather than on test data. Test data has short names. Production has a supplier whose registered name runs to nine words, a project code stapled to a purchase order reference, and somebody who put an emoji in a note because it was faster than typing urgent. Sitting a comfortable distance under a published limit costs a handful of characters on the longest message you will ever send, and it removes an entire category of failure that would otherwise arrive without warning on the busiest week of your year.

Alerts for teams that live in Discord

Approvals, exceptions and deadlines as native embeds, trimmed to arrive rather than sized to be refused.

Talk through operational alerts

Frequently asked questions

Will a long notification be cut off?

Only if it is genuinely enormous — the detail cap alone is longer than most operational alerts put together. Where a message does run over, the title survives intact and the detail is trimmed with an ellipsis, so the notification still says what happened.

Why does the Discord message have no button?

A Discord embed does not offer one. Giving the embed an address makes its heading clickable instead, which reaches the same record with one click and attaches the link to the element that shows in every preview.

Can we change the colour of the bar?

It is a fixed value rather than a per-workspace setting, chosen so alerts from this system are recognisable at a glance in a channel that carries several sources. Discord takes it as a numeric value, which is worth knowing if you are ever comparing it against a brand guide.

What does a successful send look like?

A response with no content at all — Discord answers with a status and an empty body. That is why success here is judged on the status alone, unlike one of the other chat connectors whose provider can answer healthily and still decline.

Do emoji in our data cause problems?

No, and they are the reason the caps sit below the documented limits. A single visible emoji can count as several units depending on how it is measured, so a message sitting exactly on a limit could be over it by the provider's count. The margin absorbs that.

Help Center

Need a quick answer while you read?

Run inventory, procurement, assets, sales, and field work with approved AWRA guidance for setup, migration, integrations, security, pricing, and support.

Search all approved AWRA public help articles.

Open Help Center