Sync new Stripe payments into Attio and announce them in Slack
Every successful Stripe charge becomes an Attio person and company, a note on the customer, a row in your revenue log, and a one-line celebration in Slack.
Build a deterministic code workflow that fans every successful Stripe payment out into Attio, a Google Sheets revenue log, and a Slack announcement. Every node has fixed inputs and outputs, so this is code rather than agent.
Trigger: a Stripe webhook on the charge.succeeded event. The webhook payload gives us the charge object, including amount, currency, description, charge ID, paid_at timestamp, and the customer ID.
Step 1 — Stripe: call Retrieve Customer with the customer ID from the webhook to load the customer's email, name, and metadata.
Step 2 — Attio person upsert: use Assert a Record on the people object with email_addresses as the matching attribute. Pass the Stripe email plus the name (split into first/last where possible) so existing people get updated and new ones get created. Use the email as the canonical join key between Stripe and Attio.
Step 3 — Attio company upsert: derive the company domain by taking the part of the email after the @. Skip or branch for common consumer domains (gmail.com, yahoo.com, outlook.com, icloud.com, hotmail.com) so personal addresses don't pollute the companies object. For business domains, call Assert a Record on the companies object with domains as the matching attribute. Capture the returned company record_id and link it to the person record from step 2 if Attio doesn't auto-link via the workspace's people→company relation.
Step 4 — Attio note: call Create a Note on the person record, summarizing this payment. The note should include the amount (formatted with currency, converted from cents), the product or charge description, the Stripe charge ID, and the paid-at timestamp. Plaintext or simple markdown is fine.
Step 5 — Google Sheets: append a row to the configured revenue log via Append Values. Columns should include paid_at, customer email, customer name, company domain, amount, currency, product/description, Stripe charge ID, and an annualized value where applicable (for example, if the description contains a monthly plan signal, multiply by 12; for one-time charges leave the annualized column blank).
Step 6 — Slack: call Send a Message in a configured revenue channel with a compact one-line celebration in the format "$X from {customer name}, {role if present} at {company}". Fall back to email if the name is missing, and to the email domain if no company name is available.
Make the Slack channel, the Google Sheet ID, the Sheet tab name, and the list of consumer email domains configurable so the user can tweak them without editing code. Treat each step's failure independently: if the Google Sheets append fails, still try to post to Slack, and surface a clear error per node.
Additional information
What does this prompt do?
- Listens for every successful payment in Stripe and creates or updates the matching person in Attio using their email as the join key.
- Builds the customer's company in Attio from their email domain, so each new buyer is linked to the right account without manual cleanup.
- Adds a note on the person summarizing the payment amount, product, and date, and appends a row to your Google Sheets revenue log with an annualized value where it applies.
- Posts a compact win line in your revenue Slack channel so the whole team sees the money the moment it lands.
What do I need to use this?
- A Stripe account with permission to read customers and configure webhooks.
- An Attio workspace where you want people, companies, and notes created.
- A Google Sheets revenue log with column headers ready for new rows.
- A Slack workspace and the channel where revenue wins should be announced.
How can I customize it?
- Change which Slack channel the win lands in, or tweak the one-line format to match how your team writes wins.
- Adjust the columns written to the Google Sheets revenue log, including how annualized value is calculated for subscriptions.
- Edit the note template attached to the person in Attio, for example to include the Stripe charge link or the product name.
Frequently asked questions
What kind of Stripe events does this react to?
How does it know which Attio person matches a Stripe customer?
Will this create duplicate companies in Attio?
Can I use this with personal Gmail addresses?
Do I need to be technical to set this up?
Stop letting new revenue slip past the team.
Connect Stripe, Attio, Google Sheets, and Slack once, and Geni files every paying customer and announces every win the moment Stripe confirms it.