Observe the flow
GET /v1/interactions accepts template_id, action_id, since, limit and offset.
GET /v1/interactions/{id} returns the selected outcome. Results expose safe component type/status
and timestamps, delivery status, timing and retry metadata. They omit arbitrary component data,
webhook request/response bodies, URLs, error text and raw idempotency keys.
GET /v1/modal-submissions accepts modal_definition_id, since, limit and offset. Organization
access is checked through both the owning modal and interaction log. It returns submitted values,
which can themselves contain sensitive customer input, but excludes private metadata. List responses
use data and pagination: { total, limit, offset }; since is inclusive ISO 8601 with a timezone.
Track link-button clicks
Enable Track clicks only beside the URL in the button editor, or setaction_config.tracking_only: true. The URL still opens in the user’s browser. Slack sends an
interaction for URL buttons too; LithoBlocks acknowledges it and records the click without calling
another destination, opening a modal or updating the message. See the
Slack button contract.
actions block or section accessory. It also works without a URL as a
simple acknowledgement. Tracking only cannot be combined with a webhook destination/route,
modal, or enabled message update. The editor requires those effects to be removed first.
Use a distinct action ID for each button you want to distinguish; the editor supplies one if missing.
Save the channel and message_ts returned by send, then query:
list_interactions and the TypeScript SDK’s existing interactions
list operation. Add slack_team_id to disambiguate Slack workspaces. The result contains who clicked,
when, the exact action ID and message coordinates, and a click_tracking component with success.
It uses existing interactions:read permissions and organization isolation. pagination.total
counts records matching the filters; paginate to collect records and deduplicate slack_user_id
locally if you want unique people. New clicks by the same person count again. since is inclusive;
when polling, overlap the time window and deduplicate by interaction id.
Slack retries with the same team, channel, message, user, action ID and exact action timestamp share
one stored record. Distinct clicks count separately, even in the same millisecond. No webhook
destination, webhook idempotency key, extra credit or background delivery worker is needed.
This records receipt of a click, not a page view, successful page load, read receipt, or conversion.
URL navigation can succeed even if tracking is unavailable; failed persistence is not acknowledged
as successful, and collection is not guaranteed during outages. There is no automatic alert subscription
or aggregate analytics endpoint currently. Receipt protection lasts while interaction history
is retained; deletion removes that protection. Buttons in messages sent before tracking was enabled
keep their original configuration—publish a version and send a new message to enable it.
Read Modal submissions before interpreting a closed modal as successful delivery.
