Slack messages have limits at several levels: blocks, text objects, interactive elements and API throughput. Distinguish an API limit from a readability recommendation, and distinguish Slack’s rules from the limits enforced by your template tool.

Start with the surface

Slack permits up to 50 blocks in a message and 100 in a modal view. Repeated sections, dividers and action rows all use that allowance. A long array can consume it much faster than a small sample suggests. See Slack’s block overview.

Before rendering an unbounded list, decide how many items the reader needs. Summarize the rest and link to a full report. A threaded follow-up is another message, with its own delivery behavior and cost.

Common text limits

FieldLimit or guidance
Section text object3,000 characters
Header text150 characters
Button label75 characters
Button value2,000 characters
Action ID255 characters
Top-level message textAim for 4,000 characters; Slack documents truncation beyond 40,000

The top-level text field is not subject to a hard 4,000-character ceiling. Its job alongside blocks is to provide a useful fallback, including notification and accessibility content. Include the information someone needs without depending on a visual layout. Slack can also attempt to construct accessible text from supported blocks when top-level text is omitted; do not assume that every omission produces an empty notification. Slack’s message documentation.

Actions: capacity is not a design target

An actions block supports up to 25 elements, not five. A message with one primary action and a few secondary choices is usually easier to read. That is a design recommendation, not a different API limit. An overflow menu is for secondary actions, not for hiding paragraphs of content. Actions block reference.

Rate limits are a separate problem

chat.postMessage has special rate limits. Slack generally permits one message per second to a particular channel, with additional workspace-wide limits and burst behavior. It is not a Tier 3 method limited to one call per second per workspace.

Honor rate-limit responses and their retry timing. For a LithoBlocks operation with an uncertain outcome, inspect its result before starting a new operation. Where supported, preserve the same idempotency key and request body for a retry.

What LithoBlocks handles

The builder makes block usage visible, and compilation handles supported text truncation and directive overflow. These features help with common limits; they do not guarantee that every payload can be delivered. Invalid structure, oversized metadata, missing context, destination permissions and Slack errors can still stop a send.

Use free authoring validation for diagnostics, then inspect a rendered preview when needed. A standalone compile uses 1 credit; sending that result through a separate template-send operation is another metered operation. Read returned warnings instead of silently discarding them.

A useful preflight

  1. Preview an empty dataset, a typical dataset and a large one.
  2. Test long text and missing values.
  3. Check the fallback content and primary action on desktop and mobile.
  4. Decide what should be summarized or linked out.
  5. Inspect validation diagnostics and any truncation warnings.

The LithoBlocks limits guide and block schema describe application constraints. For tables, use the current table guide. For noisy streams of events, a digest queue can reduce notification volume before rendering begins.