Overview
Stripe Invoicing brings invoice creation into the company record where your team already works. Instead of context-switching to the Stripe dashboard, an account manager can open any company in Attio, pick the Create Invoice action, and assemble a draft invoice in a few clicks - choosing or creating a Stripe customer, adding line items from your existing Stripe products and prices (or entering custom ones), setting a due date, and either finalizing the invoice or finalizing and emailing it to the customer in the same step.
The app is built for revenue, finance, and customer success teams who run their book of business inside Attio and bill through Stripe. It eliminates the copy-paste between systems that usually accompanies one-off invoicing: customer details flow from the company record, products and prices come straight from the Stripe catalog, and the hosted Stripe invoice URL is returned as soon as the invoice is finalized so the operator can share it immediately.
Stripe Invoicing is workspace-scoped. It uses your existing Stripe API key, requires no separate Stripe account, and never stores invoice or customer data outside of Stripe. It is well suited to professional services, agencies, B2B SaaS teams that bill custom amounts, and any company that uses Attio as its source of truth for customer relationships and Stripe as its source of truth for billing.
How it works
Stripe Invoicing adds a single Create Invoice action to the companies object. The action appears on every company record and is the only entry point for the app - there are no background jobs, no field writes back into Attio, and no global navigation surface.
When an operator triggers the action on a company record, the app opens a dialog and uses a GraphQL query against the Attio workspace to pre-fill the company name and first team email. From there the dialog steps through four pieces of data.
- A Stripe customer. The operator can pick an existing Stripe customer (the dialog lists every customer in the connected Stripe account) or create a new one inline using the pre-filled name and email from the company record.
- Line items. Each line item references a Stripe product and price. The dialog reads the connected Stripe account's product catalog and the prices attached to each selected product. If the operator needs a one-off line item, they can type a custom product name and a custom unit price; the app will create a Stripe product and a one-off Stripe price for that line on the fly.
- A due date. Translated into days-until-due on the Stripe invoice, with a one-day floor so a same-day invoice still validates.
- A delivery choice. The operator chooses between "finalize and email" (Stripe sends the hosted invoice email to the customer) and "finalize only" (the operator receives the hosted invoice URL and can share it manually).
All Stripe calls happen in server modules suffixed with .server.ts, never directly from the dialog. Errors are surfaced as toasts back to the operator and logged with console.error so they appear at the correct severity in the Developer Portal Logs tab. The app uses the standard useAsyncCache and useForm hooks from the SDK to keep the dialog responsive and to validate input before any Stripe call is made.
Configure
Stripe Invoicing requires a Stripe API key scoped to the resources the app touches: customers, products, prices, invoice items, and invoices. Follow these steps to install and configure the app.
- Install Stripe Invoicing from the Attio App Store into the workspace where you want to create invoices.
- 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. Read access alone is not sufficient, because the app creates draft invoices and optionally creates new customers, products, and prices on the operator's behalf.
- 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.
- Open any company record in Attio. The Create Invoice action will appear in the record action menu. Trigger it once to confirm that the dialog loads your Stripe customers and products - this is the end-to-end smoke test for the connection.
- Optional. If your workflow always uses the same line items or due-date defaults, capture those conventions in your team's internal playbook for now; future versions of the app may expose workspace defaults.
To uninstall, remove the app from the workspace's installed apps page. Revoking the Stripe API key from the Stripe dashboard immediately disables every call the app can make.



