47 days
Avg DSO in professional services
1 in 4
B2B invoices rejected due to errors
3โ7%
Revenue lost to O2C leakage annually
80%
Of those errors are preventable
1
Order Intake + CRM Update
Trigger: New form submission, email order, or inbound PO
Every O2C cycle starts when a customer places an order. Without automation, someone manually copies data from an email or form into a CRM -- that's where the first errors enter the pipeline. Automating this step captures the PO number, billing entity, and deal value in the right place from the very first second.
n8n Workflow Canvas
โ๏ธ
Code Node
Extract PO, amount, company
๐
IF Node
Customer exists in CRM?
๐
HubSpot
Create / Update Deal
๐
QuickBooks
Upsert Customer record
Make.com Scenario
๐
Webhooks
Receive form POST
๐
Text Parser
Regex: PO + amount
๐
Router
New vs existing
๐
HubSpot
Create Contact + Deal
๐
QuickBooks
Create Customer
๐ฌ
Slack
Alert #new-orders
โ Common failure point: "Acme Ltd" vs "Acme Limited" creates duplicate customers in QBO. Normalize company names before lookup using a Code node (n8n) or Text Parser module (Make) -- strip "Ltd", "Inc", "Corp", lowercase, trim spaces.
2
Contract Generation + E-Signature
Trigger: CRM deal moves to "Closed Won"
The gap between a verbal yes and a signed contract costs days -- sometimes weeks. Automated contract generation pulls deal data (billing entity, payment terms, PO number) directly into the document template and fires it to the signer. A second workflow watches for the completion webhook and updates every downstream system.
n8n Workflow Canvas: Part 1 - Send Contract
๐
HubSpot Trigger
Deal stage to "Closed Won"
๐
HubSpot
Get deal + contact props
๐
PandaDoc
Create doc from template
โ๏ธ
PandaDoc
Send to signer email
๐ฌ
Slack
Notify #contracts sent
n8n Workflow Canvas: Part 2 - On Signed
๐
Webhook
PandaDoc "doc.completed"
๐
HubSpot
Update deal: signed_date, contract_url
๐
Google Sheets
Log to revenue tracker
๐ฌ
Slack
Alert finance: ready to invoice
Make.com Scenario: Contract + DocuSign
๐
HubSpot
Watch Deal Stage Changes
๐
Filter
Stage = closedwon
๐
DocuSign
Create Envelope
โ๏ธ
DocuSign
Send Envelope
๐ฌ
Slack
Notify #contracts
๐กStore these on the CRM deal before contract fires: PO number, payment terms (Net 30/45), billing entity name, AP contact email. These merge into the contract and later into the invoice from one source of truth. This prevents the PO mismatch that causes 1 in 4 invoice rejections.
3
Invoice Generation + Delivery
Trigger: Contract signed, milestone hit, or billing date (scheduled)
Invoicing is where most revenue leaks silently -- wrong amounts, wrong billing entity, missing PO number, sent to the wrong contact. Automated invoice generation pulls directly from your signed contract data in the CRM, removes the copy-paste step entirely, and sets the due date from the payment terms field.
n8n Workflow Canvas
๐
Webhook
Contract signed event
๐
HubSpot
Get deal: amount, PO#, net terms
โ๏ธ
Code Node
Calc due_date = today + net_days
๐
QuickBooks
Create Invoice + set PO in Memo
๐ง
QuickBooks
Send Invoice to AP contact
๐
Sheets
Log inv#, amount, due date
Make.com Scenario
๐
DocuSign
Watch Completed
๐
HubSpot
Get Deal by ID
๐
Router
Fixed / Recurring / Milestone
๐
QuickBooks
Create Invoice
๐ง
QuickBooks
Send Invoice
๐
Airtable
Log to revenue tracker
โ PO mismatch = 10โ20 extra days on DSO: Always map the PO number into the QBO invoice Memo/Reference field. The customer's AP team processes payment by PO number. If it's missing, the invoice routes to exceptions -- guaranteed delay.
๐กRecurring billing: Use n8n's Schedule trigger (cron: 0 8 1 * *) or Make.com's Scheduling to fire on the 1st of each month. Pull active client list from a filtered HubSpot view. Each invoice inherits payment terms from the original contract record.
4
Payment Follow-up + AR Automation
Trigger: Daily schedule -- checks all open invoices in QBO/Xero
AR follow-up is the most time-consuming and most avoided task in finance ops. Automated reminders sent at the right intervals reduce DSO by 8โ15 days on average without a single manual email. The second half of this workflow catches payment received events and stops the reminder sequence automatically.
n8n Workflow Canvas: AR Reminder Engine
๐
QuickBooks
List unpaid invoices
โ๏ธ
Code Node
Calc days_overdue per invoice
๐
Switch Node
T-3 / T+0 / +7 / +30 days
๐ง
Gmail / SMTP
Send reminder email (templated)
๐
HubSpot
Log reminder on deal timeline
๐ฌ
Slack
Escalate 30+ days to controller
Make.com Scenario: AR Follow-up
๐
QuickBooks
Search Invoices (Balance > 0)
๐
Iterator
Loop each invoice
๐
Router
4 overdue brackets
๐ง
Gmail
Send reminder email
๐
HubSpot
Create Note on deal
๐ฌ
Slack
Escalate 30+ days
| When | Tone | Subject Line | If No Response |
|---|
| T - 3 days | Friendly reminder | "Invoice #1042 due in 3 days" | Log sent, no escalation |
| T + 0 | Polite, clear | "Invoice #1042 is due today" | Log sent in CRM |
| T + 7 days | Direct, ask for update | "Following up: Invoice #1042 past due" | CC account owner |
| T + 14 days | Firm, reference terms | "Action required: 14 days overdue" | Slack alert to controller |
| T + 30 days | Escalation | "Urgent: Invoice #1042 requires attention" | Flag for manual intervention |
๐กPayment received handler: Build a second scenario that watches QBO for payments received. When a payment matches an open invoice, it stops the reminder loop, updates the CRM deal to "Collected", and posts to Slack. Prevents reminders firing after payment is already made.
n8n vs Make.com vs Zapier: Which for O2C?
| Factor | n8n | Make.com | Zapier |
|---|
| Self-hosting | Yes -- free on your server | Cloud only | Cloud only |
| Ease of use | Moderate -- steeper curve | Visual, fast to start | Easiest for non-technical |
| Custom code / logic | Full JS/Python Code node | Basic functions only | Code step (limited) |
| QBO + HubSpot | Both native | Both native | Both native |
| Cost at scale | Near zero (self-hosted) | Scales by operations | Most expensive at scale |
| Best O2C use case | Invoice + AR (date logic, dedup) | Contract + CRM triggers | Quick wins, simple triggers |
โนHybrid approach: Run Make.com for event-driven flows (contract sent, deal updated) and n8n self-hosted for the daily scheduled jobs (AR aging, invoice generation). They work together via webhook handoffs.
Find Out Where Your O2C Cycle Is Leaking
Run a free stack gap audit with RevExOS. We map your tools, find the integration gaps, and show exactly where revenue slips through.
Get Your Free O2C AuditNo migration. No new software. Zero sensitive data on our servers.