FeaturesTemplatesShowcaseTownie
AI
BlogDocsPricing
Log inSign up
charmaine

charmaine

attio-slack-summaries

Remix of stevekrouse/attio-slack-summaries
Public
Like
attio-slack-summaries
Home
Code
10
attio
3
README.md
C
alert.ts
auth.ts
openai.ts
scratch.ts
setup.ts
slack.ts
sqlite.ts
H
webhook.ts
Branches
1
Pull requests
Remixes
History
Environment variables
2
Val Town is a collaborative website to build and scale JavaScript apps.
Deploy APIs, crons, & store data – all from the browser, and deployed in milliseconds.
Sign up now
Code
/
README.md
Code
/
README.md
Search
8/27/2025
README.md

Attio Slack Summaries

This val summarizes recent Attio events on Slack.

It receives webhooks from Attio, stores them in a SQLite database, and periodically sends AI-generated summaries of recent activity to Slack. The system uses OpenAI to transform raw webhook data into human-readable summaries, helping teams stay informed about CRM activity without being overwhelmed by individual notifications.

Set up

  1. Remix this val
  2. Get a Slack webhook & set it as SLACK_WEBHOOK_URL in this val's Environment variables in the left sidebar
  3. Get an Attio Access Token (with all read & write permissions) & set it as ATTIO_API_KEY in this val's Environment variables in the left sidebar
  4. Go to setup.ts and click run to set up the events database and Attio webhook
  5. Go trigger some Attio events and see the message in Slack!

Files

  • attio/hydrate.ts - Converts raw webhook events into human-readable descriptions
  • attio/webhook.ts - Attio webhook management and secret handling
  • attio/webhook-payload-types.ts - Complete TypeScript types for all Attio webhook events
  • alert.ts - Cron job that processes recent events and sends Slack summaries
  • auth.ts - Webhook signature verification middleware
  • openai.ts - AI-powered event summarization using OpenAI
  • scratch.ts - Development scratchpad for testing functions
  • setup.ts - One-time setup script to initialize database and Attio webhook
  • slack.ts - Utility to send messages to Slack via webhook
  • sqlite.ts - Database operations for storing and retrieving Attio events
  • webhook.ts - HTTP endpoint that receives webhooks from Attio

Attio webhooks

Attio webhooks return thin events, which contain a bunch of IDs, but no human-readable data, such as:

{ event_type: "record.merged", id: { workspace_id: "b6c564a6-2cf7-49ab-9320-dea013196bd7", object_id: "a87cf74e-5ca1-4a8d-b8d3-fcca5413d4c3", record_id: "d64ff9f2-d1f1-424c-8be6-e41129e35697" }, duplicate_object_id: "a87cf74e-5ca1-4a8d-b8d3-fcca5413d4c3", duplicate_record_id: "112b5c78-1ffe-457a-8366-181b482888b4", actor: { type: "system", id: null } }

The trickiest part of this val was hydrating these events into human readable form, like "Steve commented on OpenAI: they're using Val Town!"

After trying and failing (for hours!) to get LLMs to write this code for me, I eventually bit the bullet and wrote it by hand. I only handled some of the more common event types, and left myself comments of other example events of types I haven't handled yet.

In theory, Attio has a better way to handle this, analgous to Stripe's method to fetch data for thin events, but I wasn't able to find it. If you figure it out, please send me a pull request or let me know at steve@val.town.

Get started with a template:
FeaturesVersion controlCode intelligenceCLI
Use cases
TeamsAI agentsSlackGTM
ExploreDocsShowcaseTemplatesNewestTrendingAPI examplesNPM packages
PricingNewsletterBlogAboutCareersBrandhi@val.townStatus
X (Twitter)
Discord community
GitHub discussions
YouTube channel
Bluesky
Terms of usePrivacy policyAbuse contact
© 2025 Val Town, Inc.