Install AttiBooks in Attio
AttiBooks lives inside your Attio workspace as a native app. Open Attio, click your workspace name, then Settings → Apps → Browse, search for AttiBooks, and install it. You will need workspace admin permissions.
Now live on the Attio Marketplace. You can also click Get started from the homepage to install through our authorized listing.
Link your AttiBooks account
Your Attio workspace is paired with an AttiBooks account — that’s what carries your plan, your invoice quota, and your automation history. Create the account first at attibooks.com/get-started and confirm the verification email we send you.
Then, in Attio, open AttiBooks → Workspace settings → AttiBooks Account and press “Link Account”. A dialog opens with a one-time link — follow it to attibooks.com, confirm the workspace, and you’re paired. The button’s description line then reads Linked to you@company.com (free plan).
One workspace, one account
A workspace can only be linked to a single AttiBooks account. If you see “Already linked elsewhere”, a colleague linked it first — email help@attibooks.com and we’ll move it. Same for unlinking — email us and we’ll unlink it for you.
Linking links: it doesn’t send AttiBooks your Attio API token or your QuickBooks credentials. The app authenticates with a per-workspace secret it mints itself; QuickBooks tokens never leave Attio.
Connect QuickBooks
Open AttiBooks in the left sidebar of Attio. The header shows a Connect QuickBooksbutton — clicking it triggers Intuit’s OAuth flow. Sign in to your QuickBooks Online account and authorize access. Attio handles token storage and refresh automatically; you never paste a key.
Once connected, open AttiBooks → Workspace settings → 1. QuickBooks Connection and press “Check Status”. You should see a green success toast with your QuickBooks Company ID. If it reads Not connected, repeat the OAuth flow from the app header.
Required: paste your Company ID
Scroll to 7. Advanced and paste your QBO Company IDinto the required field. Find it in QuickBooks under the gear icon → Additional info (a ~16-digit number). AttiBooks also tries to auto-capture it via OpenID userinfo, but the manual value is the source of truth.
Sandbox vs Production
AttiBooks detects this for you. When you authorize QuickBooks, the app probes Intuit’s userinfo endpoints and remembers which one answered, so sandbox tokens hit the sandbox API and production tokens hit production — even if the Environment field in Section 1 is blank or mistyped. That field is now only a fallback; set it to sandbox or production if you want to pin it explicitly. Re-authorize after switching companies.
Choose an invoice mode
AttiBooks ships with two ways to create invoices. You can switch anytime from settings.
Quick mode
One click. AttiBooks reads the record, builds the invoice, and submits it to QBO. Best for repeat work.
Custom mode
A dialog opens with the full invoice builder — add as many lines as you need, pick a QuickBooks product or service per line, set a tax code, discount and memo. Best for bespoke project work.
Set the invoice_mode field to quick or custom. Quick mode is best for repeatable services with consistent rates. Custom mode is best for project-based work where every invoice is bespoke.
Map your source fields
AttiBooks pulls invoice data from the Attio record you click on. Fill in 5. Source Fields (optional) in workspace settings — each field is a dropdown of the real attributes on your target objects, grouped by object. Leave blank to use the template defaults from Section 3.
source_customer_emailstringEmail QuickBooks sends to
Required if you want QBO to deliver the invoice automatically.
source_service_descriptionstringLine-item description
Falls back to the template default if empty.
source_ratestringUnit price (per unit)
Number attribute. Reads as the line item rate.
source_quantitystringQuantity / hours
Number attribute. Multiplied by rate to compute total.
source_currencystringThree-letter currency code
USD, EUR, GBP. Must exist in your QBO chart of accounts.
source_due_daysstringNet payment terms
Days from invoice date until due. e.g. 30.
Customer nameis read automatically from the record you act on — company name, person full name, deal name, or workspace record name. You don’t map it.
The dropdown lists attributes from the objects in 7. Advanced → Target Objects. Anything you type is also accepted — that’s how you enter a reference.attribute path like company.name to pull from a linked record one hop away, or a slug on an object outside that list.
Set template defaults
When a source field is missing on a record, AttiBooks falls back to these defaults — so you never get a half-built invoice.
template_service_descriptionstringDefault line description
e.g. "Consulting services"
template_ratenumberDefault unit price
e.g. 150
template_quantitynumberDefault quantity
e.g. 1
template_currencystringDefault currency
e.g. USD
template_due_daysnumberDefault net terms
e.g. 30 (days)
template_item_refstringDefault Products & Services item
QuickBooks item id. Keeps invoices posting to the right income account.
template_tax_codestringDefault tax code
TAX or NON on US companies; a tax code id elsewhere.
template_discount_percentnumberDefault discount
0–100. Adds a discount line to every invoice.
Quick mode uses these three for every invoice; custom mode pre-fills them and lets you change them per invoice.
Configure writeback fields
After QuickBooks accepts the invoice, AttiBooks writes data back to your Attio record so your CRM reflects reality. Create attributes on your source object and map each one here.
writeback_invoice_idstringQBO invoice ID
Internal Intuit identifier — keep for support.
writeback_invoice_numberstringInvoice number
The number your customer sees.
writeback_invoice_statusstatus / stringOpen, Paid, Voided
Updates live via webhook.
writeback_invoice_urlurlQBO deep link
Opens the invoice inside QuickBooks.
writeback_last_sync_attimestampLast successful sync
Helps debug stale data.
writeback_sync_errorstringLast error message
Empty on success. Read this first when something breaks.
writeback_balancenumberOutstanding balance
0 once the invoice is paid in full. Filter on it to find who owes you.
writeback_amount_paidnumberPaid so far
Total minus balance, refreshed on every sync, send, push, and reminder.
writeback_due_datedateDue date as QBO holds it
Use it to build an overdue view in Attio.
writeback_estimate_idstringQBO estimate ID
Set by the estimate action; read by the convert step.
writeback_estimate_numberstringEstimate number
The number your customer sees on the quote.
writeback_estimate_statusstatus / stringPending, Accepted, Converted
Becomes Converted when the estimate turns into an invoice.
writeback_estimate_urlurlQBO deep link to the estimate
Chase what's unpaid
Map writeback_balance and writeback_due_dateand your CRM can answer “who owes us money, and since when?” without opening QuickBooks — an Attio view filtered on balance greater than zero and due date in the past is your collections list. The reminder block (section 13) works off exactly those two fields.
Errors land in Attio
If QuickBooks rejects an invoice, AttiBooks writes the error directly to the record — no console required, no email missed. Look at writeback_sync_error.
Enable the Invoice object
Pro plans can store every invoice as its own Attio record. In 7. Advanced, turn on “Store invoices as Attio records”, then press “Run Setup”. AttiBooks provisions an invoices object with all standard attributes (doc number, status, totals, customer, QBO IDs, sync metadata).
Optionally set invoice_object_slugto point at an existing custom object — useful if you already model invoices and want AttiBooks to write to your schema.
Enabling this object also unlocks two record actions on invoices: Edit Invoice in QuickBooks and Void in QuickBooks (see section 10).
Requires Attio Pro for custom objects. Free Attio workspaces can still use writeback — just on the source record.
Create your first invoice
Open any record on a target object. In the actions menu, choose Create QuickBooks invoice. In Quick mode, the invoice is sent to QBO immediately and a success toast confirms the invoice number. In Custom mode, a dialog appears with the full builder: add lines, pick a Products & Services item for each, apply a tax code and a discount, and edit every field before submission.
Within seconds, your record refreshes with the QBO invoice number, status, and a clickable link straight to QuickBooks.
Edit and void from Attio
Once the Invoice object is enabled, open any invoice record in Attio and you’ll see two extra actions:
Edit Invoice in QuickBooksopens a dialog for controlled fields — due date and memo always, line items only while the invoice is unpaid. Submitting pushes the change straight to QBO.
Void in QuickBooksasks for confirmation, then voids the invoice via the QBO API and re-syncs so the Attio record reflects the voided state. This is explicit on purpose — AttiBooks never auto-deletes anything in QuickBooks.
QBO is source of truth
Financial fields (totals, balance, dates) are read-only in Attio. All writes flow through QBO, then back to Attio via sync — no two writers, no conflicts.
Quote first, invoice later
Not every deal starts with an invoice. AttiBooks can create a QuickBooks estimatefrom the same record data — same field mapping, same line items, tax and discount options — and turn it into an invoice when the deal closes.
Open any record and choose Create QuickBooks Estimate. The estimate number, status, and a link back to QuickBooks are written to the estimate writeback fields from section 7.
When the customer says yes, run the Convert estimate to invoiceworkflow block — typically on a deal reaching Closed Won. It copies the estimate’s lines into a new invoice and links the two together in QuickBooks, so the job reads as one story on their side.
Estimates are free
Creating an estimate doesn’t count against your monthly invoice limit — quote as much as you like. The quota is charged at conversion, because that’s the moment a customer is actually billed. AttiBooks refuses to convert the same estimate twice.
Keep invoices in sync
AttiBooks pulls updates from QuickBooks using the Change Data CaptureAPI — only invoices modified since the last run. The first sync backfills recent invoices; every subsequent sync is incremental.
There are three ways to trigger a sync:
Scheduled crondailyRuns on attibooks.com
Hits /api/cron/sync-invoices at 00:00 UTC every day. Zero config.
Settings buttonmanual6. Invoice Sync → Sync Now
Force a pull on demand from workspace settings. Useful while setting things up.
Record actionmanualSync Invoices from QuickBooks
Available on any record. Same effect as the settings button.
Each sync updates the Invoice object with the latest status, balance, dates, and customer info from QBO. Writes to QBO (creation, edits, voids) happen immediately through the corresponding record actions.
Requires the Invoice object to be enabled (Section 8). Sync is a no-op otherwise — writeback on the source record still works independently.
Automate it with Attio workflows
Everything above is a button someone presses. AttiBooks also ships seven workflow blocks so Attio can do it for you. Open Attio → Workflows → New workflow, pick a trigger (record created, stage changed, a scheduled run), then add a step and search for AttiBooks.
Create QuickBooks invoice
Builds an invoice from the record using your mapping and template defaults, then writes the number, status, and link back.
Record · Skip if already invoiced · Line description (optional) · Due in days (optional)
Skips when the record already has an invoice and the checkbox is on.
Sync invoice from QuickBooks
Re-reads the record's invoice in QBO and refreshes its status (Paid, Sent, Voided) in Attio.
Record
Skips when the record has no invoice ID.
Send invoice via QuickBooks
Emails the invoice to the customer through QuickBooks' own delivery, then writes the resulting status back.
Record · Send to (optional override address)
Skips when the record has no invoice ID. Uses the QBO invoice's email otherwise.
Push invoice to QuickBooks
Pushes a new due date and/or memo from Attio onto the existing QBO invoice.
Record · Due date (YYYY-MM-DD, optional) · Memo (optional)
Skips when both fields are empty, and when the values already match QuickBooks.
Remind about an unpaid invoice
Re-sends the invoice when it's overdue and still unpaid. Refreshes the balance either way, so a daily reminder workflow doubles as a payment sync.
Record · Days past due · Minimum days between reminders · Send to (optional)
Skips paid invoices, invoices not yet overdue, and anything reminded inside the cooldown.
Create QuickBooks estimate
Creates a quote from the record — same mapping as an invoice, same line/tax/discount options. Doesn't touch your monthly invoice limit.
Record · Skip if already estimated · Line items · Tax code · Discount % · Valid for (days)
Skips when the record already carries an estimate and the checkbox is on.
Convert estimate to invoice
Turns the record's estimate into an invoice, linked back to it in QuickBooks. Put it on 'deal reaches Closed Won'.
Record
Skips when there's no estimate, and when the record already has an invoice — converting twice would bill twice.
Each block reads the same workspace settings you filled in above — the field mapping, the writeback attributes, the template defaults. Nothing to configure twice. Every block writes its result back to the record, and failures land in writeback_sync_error exactly like manual runs do.
Blocks branch on their outcome, so you can chain them: create an invoice when a deal is won, send it, then sync it back on a schedule until it’s paid.
Loop protection
Create, send, push, remind, and estimate are each capped at 50 runs per hour per workspace, counted separately. A run over the cap is logged as rate cappedand retried later rather than dropped. Push also compares against QuickBooks first and skips when nothing actually changed — safe to wire straight onto a record-updated trigger.
Every run — created, synced, sent, pushed, skipped, failed — is recorded with its reason and shows up in your dashboard activity feed.
Invoices created by a workflow count against your monthly quota the same as manual ones — including an estimate you convert, since that’s the moment the customer is billed. Sync, send, push, remind, and creating an estimate don’t.
Your AttiBooks dashboard
Sign in at attibooks.com/login to see the account side of things: which Attio workspaces are linked, the plan on each one, invoices used this month against your limit, and the last runs of every automation with their status and skip reason.
Until setup is finished, the dashboard shows a checklist — verify email, link a workspace, connect QuickBooks, create your first invoice — and refreshes itself as you complete each step in Attio. Once it’s green, it turns into a status page.
Billing lives here too. Each workspace card carries Upgrade (monthly or yearly), Manage billing— which opens Stripe’s customer portal for invoices, card changes, and cancellation — and Unlink, which detaches that Attio workspace from your account. Unlinking stops AttiBooks working in that workspace until you link it again; invoices already in QuickBooks are untouched.
Tell me when something breaks
Turn on failure alertsper workspace and we email you when an automation run fails — or post it to a Slack incoming webhook, or both. You get at most one alert an hour, no matter how many runs fail in it, so a bad night doesn’t bury your inbox.
Plans & limits
Free
$0/mo
- 10 invoices per month
- Quick mode
- One-way QBO → Attio sync
Pro
$29/mo
- Unlimited invoices
- Custom mode + Invoice object
- Full two-way sync
Hit the free limit and AttiBooks blocks new invoice creation until next month or until you upgrade. Existing invoices keep syncing — nothing is locked retroactively.
Section 16
Every feature, briefly.
A quick reference to everything AttiBooks does — pin this section.
- 01
One-click invoice creation
From any Companies, Deals, or custom record.
- 02
Quick & Custom modes
Speed when you want it, control when you need it.
- 03
Seven workflow blocks
Create, sync, send, push, remind, estimate, and convert — from Attio workflows.
- 04
Multi-line invoices
As many lines as you need, each with a QuickBooks product or service.
- 05
Tax codes & discounts
Per-invoice tax code and a percentage or fixed discount line.
- 06
Estimates
Quote from a record, convert to an invoice when the deal closes.
- 07
Payment tracking
Balance, amount paid, and due date written back on every touch.
- 08
Overdue reminders
Re-send unpaid invoices on a schedule, with a per-invoice cooldown.
- 09
Attribute pickers
Map fields from a dropdown of your real Attio attributes.
- 10
Failure alerts
Email or Slack when a run fails, throttled to one an hour.
- 11
Self-serve billing
Upgrade, manage the subscription, or unlink a workspace yourself.
- 12
Loop-safe automations
Hourly caps per action, plus a no-change guard on push.
- 13
Send via QuickBooks
Email the invoice through QBO delivery — manually or automatically.
- 14
CDC pull sync
QBO Change Data Capture — only the invoices that actually moved.
- 15
Daily cron + manual sync
Scheduled pull at 00:00 UTC, plus button and record action.
- 16
Edit & Void from Attio
Controlled push-back to QBO on due date, memo, and line items.
- 17
Field mapping
Map any Attio attribute to any QBO invoice field.
- 18
Template defaults
Fallbacks for missing fields — invoices never break.
- 19
Multi-object support
Companies, Deals, or any custom object you create.
- 20
Invoice object (Pro)
Optional Attio object that stores every invoice.
- 21
Environment auto-detect
Sandbox or production resolved from the token itself.
- 22
Auto-refreshed OAuth
Attio handles token refresh — no key management.
- 23
Errors written to Attio
writeback_sync_error surfaces failures in your CRM.
- 24
Run history
Every automation run logged with status and skip reason.
- 25
Account dashboard
Onboarding checklist, plan, usage, and recent activity.
- 26
Usage metering
Free 10/mo, then unlimited on Pro. Tracked in real time.
- 27
Stripe billing
Self-serve upgrades & cancellations via customer portal.
“A good invoice is the one that gets paid —
a great one is the one you barely had to make.”