Stripe Invoicing

Stripe Invoicing

Automate billing with Stripe invoicing directly in Attio

Gallery thumbnail 1
Gallery thumbnail 2
Gallery thumbnail 3
Gallery thumbnail 4
Gallery thumbnail 5

Overview

Stripe Invoicing brings billing into the records where your team already works. From a person record, an operator can create a Stripe invoice using that person's email and name. From a company record, they pick one of the company's associated people and invoice them. Either way the Stripe customer is resolved from the email address: an existing customer with that email is reused, or a new one is created, so you never end up with duplicate customers. Line items come from your existing Stripe products and prices, or from one-off custom products and prices typed inline. The operator sets a due date and either finalizes the invoice or finalizes and emails it through Stripe in the same step.

The app can also sync Stripe invoices back into Attio. When sync is enabled it maintains an invoices object linked to people, registers a Stripe webhook, and mirrors invoices in real time as they are finalized, paid, fail payment, or are voided. Each synced invoice is matched to a person by the Stripe customer email, with an optional setting to create the person automatically when no match exists. A manual backfill pulls every historical invoice in, and a settings panel reports connection, webhook, and schema health, including a banner that lists any Stripe permissions the connected key is missing.

Stripe Invoicing also plugs into Attio workflows. It adds trigger blocks that start a workflow when a Stripe invoice is finalized, paid, fails payment, or is voided, and step blocks that create a Stripe customer, create a Stripe invoice, or update an invoice's status from inside a workflow. Teams can build automations such as notifying an owner the moment an invoice is paid or creating an invoice when a deal reaches a stage.

Stripe Invoicing is workspace-scoped and uses your existing Stripe API key. Teams that only want to send invoices can switch sync off entirely (send-only mode) and the create flow and workflow blocks keep working. Teams that want a billing mirror in Attio can map the sync onto a brand-new invoices object or onto an object they already have. It suits professional services, agencies, and B2B SaaS teams that run customer relationships in Attio and bill through Stripe.

How it works

Stripe Invoicing adds a Create Invoice action to both the people object and the companies object, plus a Sync Stripe Invoices action, a set of Stripe workflow blocks, and a workspace settings panel.

On a person record, the dialog reads the person's name and email and uses them directly. On a company record, the dialog lists the company's associated people and asks the operator to choose one; that person's name and email then drive the invoice. The Stripe customer is resolved server-side from the email: the app finds an existing customer with that email or creates one, matching on email rather than name so customers are not duplicated.

The operator then builds line items. Each line item references a Stripe product and price read from the connected account, or a one-off custom product and unit price typed inline (the app creates the Stripe product and price on the fly). A due date sets the payment terms, and the operator either finalizes and emails the invoice or finalizes only and shares the hosted invoice URL manually.

When sync is enabled, connecting the app creates an invoices object linked to people and asks Stripe to notify Attio whenever an invoice changes. (That notification is called a webhook: Stripe sends Attio a short message the moment an invoice is finalized, paid, fails payment, or is voided, so Attio stays up to date without anyone refreshing it.) The app confirms each message genuinely came from Stripe before acting on it, then creates or updates the matching invoice record. Records are keyed on the Stripe invoice id, so the same invoice is never duplicated and a late or out-of-order message cannot overwrite newer data; each record is linked to a person by the customer email. The Sync Stripe Invoices action imports your entire invoice history in the background and picks up where it left off if it is interrupted, so even a large back catalog imports reliably.

For automation, the app adds Stripe workflow blocks. Four trigger blocks start a workflow when a Stripe invoice is finalized, paid, fails payment, or is voided; they all listen through the same Stripe notification described above, so adding a trigger never opens a second connection to Stripe. Three step blocks run inside a workflow to create a Stripe customer (or update the one matched by email), create a Stripe invoice, or update an invoice's status: finalize, send, pay, void, or mark uncollectible.

The schema is configurable. If the target object already exists, the operator maps each synced field to their own names in workspace settings, and the app reuses that object and adds only the attributes that are missing. A master toggle turns sync off for send-only workspaces. When the app connects, it checks the Stripe key for any missing permissions and lists them in the settings panel rather than failing silently. Your Stripe and Attio credentials are never exposed in the dialog, and errors surface as clear messages to the operator.

Configure

Stripe Invoicing requires a Stripe API key scoped to the resources the app touches: customers, products, prices, invoice items, invoices, and (for sync) webhook endpoints. Follow these steps to install and configure the app.

  1. Install Stripe Invoicing from the Attio App Store into the workspace where you want to create invoices.

  2. Create a restricted Stripe API key in your Stripe dashboard at Developers, API keys, Create restricted key. Grant write access to Customers, Products, Prices, Invoice items, and Invoices, plus read and write on Webhook endpoints. Read access alone is not sufficient, because the app creates invoices and registers a webhook on your behalf.

  3. In the Attio workspace settings, open the Stripe Invoicing app page and paste the restricted Stripe API key into the connection field. The key is stored as a workspace-level connection and is only read by the app's server modules. Operators in the workspace never see the key. If the key is missing any permission the app needs, the settings panel shows a banner listing exactly which Stripe scopes to add; grant them in Stripe and reconnect.

  4. Decide whether to sync. On the settings page, the Sync invoices toggle controls everything sync-related. Leave it on to mirror invoices into Attio (the invoices object and webhook are set up automatically when you connect). Turn it off for send-only mode, where the app still creates and sends invoices but does not build an object or process sync events. After turning sync back on, reconnect the app so the webhook is registered.

  5. Optional advanced schema mapping. If you already have an object you want invoices to land in, turn on Show advanced schema mapping, edit the object slug and any attribute slugs to match your workspace, then click Save and set up schema. The app detects the existing object and verifies or creates attributes idempotently.

  6. Optional workflow automation. In Attio workflows, add a Stripe trigger block (invoice finalized, paid, payment failed, or voided) to start a workflow on that event, or add a Stripe step block (create customer, create invoice, update invoice status) inside a workflow. The trigger blocks reuse the same Stripe webhook set up at connection, so no extra configuration is needed beyond a connected key.

  7. Smoke test. Open a person record and trigger Create Invoice (it uses their email), then open a company record and trigger it (pick a person from the company). With sync on, finalize an invoice and confirm a record appears in the invoices object, then run Sync Stripe Invoices to backfill. If you built a workflow, confirm it runs when the matching invoice event fires.

To uninstall, remove the app from the workspace's installed apps page; this also removes the registered Stripe webhook. Revoking the Stripe API key from the Stripe dashboard immediately disables every call the app can make.