Sync new Stripe payments into Attio and announce them in Slack

By General Input

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.

Integrations

  • Stripe
  • Attio
  • Google Sheets
  • Slack

Type

Deterministic Code

Categories

  • Sales
  • Finance
  • Operations

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.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageWin back LiveChat visitors whose chats went unansweredLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveCustomer lifecycle inspector for Loops, Stripe and PostHogiMessage campaign console with pre-flight checks and delivery boardChat quality review board for LiveChat support leadsLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 days