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.

Deterministic Code
StripeAttioGoogle SheetsSlackSalesFinanceOperationsData SyncNotifications & Alerts

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?
Every successful payment. As soon as Stripe confirms a charge has gone through, the workflow runs end to end. Refunds, failed charges, and disputes are not included by default.
How does it know which Attio person matches a Stripe customer?
It uses the customer's email address as the join key. If a person with that email already exists in Attio, the record is updated. If not, a new one is created.
Will this create duplicate companies in Attio?
No. Companies are matched by domain, so repeated buyers at the same employer all roll up under one company record.
Can I use this with personal Gmail addresses?
Yes, but the company step works best for business email domains. For consumer addresses like gmail.com you may want to skip the company creation or route those records to a separate list.
Do I need to be technical to set this up?
No. You connect Stripe, Attio, Google Sheets, and Slack with logins, point the workflow at your sheet and channel, and it runs whenever a new payment happens.

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.