Better Invoice runs a set of automated invoice review rules against every ConnectWise PSA invoice before you send it. Each rule inspects one aspect of the invoice — margin, tax setup, time notes, expenses, credit memos — and raises a flag when something looks wrong. This page is the comprehensive reference for all twelve rules: what each checks, the exact condition that triggers it, its severity, whether it ships on or off, and every config option with exact defaults and ranges.
Rules evaluate against pre-extension ConnectWise data — the canonical CW field values, before any display rewrites. When a rule matches against a work-type or product-type name, it matches the raw ConnectWise name.
For how flags surface in the review pane, see Understanding flags. To turn rules on or off and adjust thresholds, see Configure review rules. For where this fits in your workflow, see What is invoice review.
How review rules relate to ConnectWise Invoice Routing
ConnectWise’s native pre-send approval feature is Invoice Routing — a manual sequence of members who must approve an invoice on the Routing tab or via My Invoices. Invoice Routing tells you who should look at an invoice, but not what to look for.
Better Invoice review is the modern upgrade: it automatically inspects the invoice content and flags real problems, then routes it to the right people. When Better Invoice first pulls an invoice, it seeds its reviewer list directly from that invoice’s existing ConnectWise Invoice Routing entries, so your current approval chain carries over without re-entry. See Reviewers and approvals.
Severity, defaults, and dismissal
Every flag carries a severity: error, warning, or info. Errors and warnings can block a finalizing approval (a soft gate prompts you before you approve with open flags); info flags are advisory.
Each rule ships with a default on/off state. Profitability and core billing-accuracy checks are on by default. Rules that depend on tenant-specific policy — tax requirements, expense thresholds, keyword watch lists — ship off so you opt in.
Flags persist by a stable identity: (review, rule, target type, target id). On rescan, a flag whose target still fires is preserved — including any dismissal you made — while a flag whose underlying issue was fixed upstream disappears. Marking a flag Marked OK dismisses it without deleting it.
Defaults and thresholds at a glance
| Rule | Setting | Default | Unit / range |
|---|---|---|---|
| Low profit margin | Margin threshold | 20 | %, 0–100 |
| Low profit margin | Minimum line amount | 0 | $, ≥ 0 |
| Insufficient ticket notes | Minimum lines per hour | 6 | lines/hour, ≥ 0 |
| Insufficient ticket notes | Maximum lines | 50 | lines, ≥ 1 |
| Insufficient ticket notes | Amount floor | 0 | $, ≥ 0 |
| Non-billable time on invoice | Minimum hours | 2 | hours, ≥ 0 |
| Stale time entries | Maximum age | 60 | days, ≥ 1 |
| Large expense | Threshold | 500 | $, ≥ 0 |
| Keyword on the invoice | Keywords | TODO, FIXME | strings, max 50 |
| Substantive note line | Minimum length | 10 | characters |
| Agreement / credit memo | Comparison epsilon | 0.01 | $ |
Profitability rules
Low profit margin
- What it checks: Product lines whose unit margin (profit ÷ unit price) falls below your threshold. Below-cost lines escalate to errors.
- Triggers when: A line has unit price ≠ 0, cost ≠ 0, extended price ≥ the minimum line amount, and margin below the threshold. With the threshold set to 0, only below-cost (negative-margin) lines flag, as errors.
- Severity: Warning, or error for below-cost items.
- Default: On.
- Config options:
- Margin threshold — percent floor below which lines flag. Default 20, range 0–100.
- Product types — limit evaluation to selected ConnectWise catalog types. Default empty (all types).
- Minimum line amount — skip small lines below this extended price. Default 0 dollars.
- Why it matters: Catches below-cost lines and margin leaks before the invoice goes out. Flags deep-link to the product in ConnectWise.
Billing accuracy rules
Agreement invoice amount changed
- What it checks: Recurring (Agreement type) invoices. Compares the current total to the prior invoice on the same agreement.
- Triggers when: The current total differs from the previous agreement invoice by $0.01 or more. Fires only if a prior invoice exists.
- Severity: Info.
- Default: On.
- Config options: None.
- Why it matters: Surfaces unexpected drift in recurring billing — a subscription amount that quietly changed since last cycle. The flag deep-links to the previous invoice in ConnectWise.
Credit memo has a positive total
- What it checks: Credit memo invoices. Confirms the total is zero or negative, since a credit reduces a balance.
- Triggers when: A CreditMemo-type invoice has a total greater than $0.01. A positive total means the memo is charging instead of crediting — almost always a data-entry error.
- Severity: Error.
- Default: On.
- Config options: None.
- Why it matters: Blocks a memo from accidentally charging a customer when it should credit them.
No tax code on invoice
- What it checks: Whether the invoice document has a tax code assigned.
- Triggers when: The tax code is explicitly null in the captured ConnectWise data. If the field was never captured in the snapshot (undefined), the rule stays silent rather than guess.
- Severity: Error.
- Default: Off (opt in — not all jurisdictions require codes).
- Config options: None.
- Why it matters: An unset tax code means tax was not calculated. Turning this on blocks invoices with missing tax configuration.
Product not marked taxable
- What it checks: Product line items with the Taxable checkbox cleared. Group-header rows are skipped.
- Triggers when: A line is not a group header and its taxable value is false. You can optionally narrow to specific product types.
- Severity: Error.
- Default: Off (opt in — not all MSPs require every product taxable).
- Config options:
- Product types — limit to selected ConnectWise catalog types. Default empty (all types).
- Why it matters: Catches products that should be taxable but aren’t, preventing tax shortfalls. Flags deep-link to the product in ConnectWise.
Time and labor rules
Non-billable time on invoice
- What it checks: Time entries marked NoCharge or DoNotBill with hours greater than zero — work being given away. The threshold is on hours, not dollars, because non-billable entries usually carry a zeroed rate.
- Triggers when: Total non-billable hours on the invoice reach or exceed the minimum.
- Severity: Info.
- Default: On.
- Config options:
- Minimum hours — floor below which non-billable time is ignored. Default 2 hours, step 0.5.
- Why it matters: Highlights unbilled work so you can decide whether to write it off or rebill. One consolidated flag per invoice.
Stale time entries
- What it checks: Billable time entries logged more than a threshold number of days before the invoice date. Only billable entries with a parseable date count — NoCharge and DoNotBill are ignored.
- Triggers when: A billable entry’s age, in whole days from entry date to invoice date, exceeds the maximum.
- Severity: Info.
- Default: On.
- Config options:
- Maximum age — days after which an entry is stale. Default 60 days, step 1.
- Why it matters: Old invoiced work invites customer pushback. This prompts you to add justification or supporting notes. One consolidated flag per invoice listing all stale entries.
Flagged work type billed
- What it checks: Service sections on the first page of the invoice (the summary rollup, not the Time Detail page) for work types on a watch list. Emits one flag per matched work type.
- Triggers when: Any time entry in a service section has a work-type name on your configured watch list. Matches against canonical ConnectWise work-type names, not display-rewritten values.
- Severity: Warning.
- Default: Off (opt in — the watch list is tenant-specific).
- Config options:
- Flagged work types — the ConnectWise work types to watch, for example Admin or Pre-Sales. Default empty.
- Why it matters: Alerts you when overhead or business-development work (admin, pre-sales) slips onto a client invoice. Work-type flags aren’t deep-linkable, so each uses a stable id derived from the work-type name — the same name keeps the same flag and any dismissal across rescans.
Documentation quality rules
The two notes rules — Ticket billed with no notes and Insufficient ticket notes — both read the rendered Time Detail page, so they see exactly what the customer will see. They share three behaviors worth understanding before you tune either one: what counts as a substantive note line, how rendered buckets map to the Time Detail page, and the gating rule that skips both when the template hides notes.
Ticket billed with no notes
- What it checks: Rendered Time Detail buckets that have billable hours but zero note text.
- Triggers when: A rendered bucket has billable hours above 0, a target entry id, empty note text, and not every work type in the bucket is on the ignore list.
- Severity: Warning.
- Default: On.
- Config options:
- Ignore work types — ConnectWise work types to skip. Default empty.
- Why it matters: Unwritten labor looks suspicious to customers. This ensures billed tickets carry supporting notes. One consolidated flag per invoice lists every offending ticket.
Insufficient ticket notes
- What it checks: Rendered Time Detail buckets where the count of substantive note lines is low relative to hours billed.
- Triggers when: A rendered bucket has billable hours above 0, non-empty notes, substantive lines fewer than (minimum lines per hour × billable hours), billed amount at or above the amount floor, substantive lines below the maximum-lines cap, and not every work type ignored.
- Severity: Info.
- Default: On.
- Config options:
- Minimum lines per hour — required substantive lines per billable hour. Default 6.
- Maximum lines — a count at or above which a ticket is never flagged, so thoroughly documented tickets are exempt. Default 50.
- Amount floor — minimum billed amount to evaluate. Default 0 dollars.
- Ignore work types — ConnectWise work types to skip. Default empty.
- Why it matters: Prevents thin, vague notes on expensive time entries, so documentation quality scales with the bill. One consolidated flag per invoice.
What counts as a substantive note line
A substantive (or “meaningful”) line is the unit both notes rules count. A line qualifies when, after trimming whitespace, it is:
- at least 10 characters long, and
- contains at least one alphanumeric character.
So blank lines, separator rows like ---, and bare bullet points (•) don’t count toward documentation quality — only real sentences do. This is why a note that’s mostly formatting can still trip Insufficient ticket notes even though it looks long.
How rendered buckets map to the Time Detail page
Both rules operate on displayed note buckets — one bucket per row as it actually renders on the Time Detail page. The mapping respects your template’s mergeBy grouping:
- With the default config (no grouping), each time entry is its own bucket.
- When you group by ticket or by work type, a bucket is the aggregate of all entries in that group — its hours, amount, work types, and note text are summed and joined across the source entries.
Because the rules read the rendered buckets, they evaluate the same grouping your customer sees. A per-ticket rollup is judged as one ticket, not as the individual entries underneath it.
Notes rules only run when the template displays notes
This is the key gating rule. Neither notes rule evaluates anything if the active template doesn’t show notes. If your template config has Time Detail hidden (timeDetail.visible off) or Show notes turned off (showNotes off), both rules skip silently and contribute no flags.
That’s intentional: if the customer never sees the notes, there’s nothing to flag. The same gating applies to the notes surface of the Keyword on the invoice rule below.
Content rules
Keyword on the invoice
- What it checks: Two surfaces — product descriptions (one flag per product) and displayed Time Detail note buckets (one consolidated flag). It searches for case-insensitive substring matches.
- Triggers when: A product description or customer description contains a watch keyword, or a displayed note bucket’s text contains one. The notes surface follows the same display gating as the notes rules — if notes aren’t displayed, it contributes nothing.
- Severity: Info.
- Default: Off (opt in — the watch list is tenant-specific).
- Config options:
- Keywords — words to flag, matched case-insensitively as substrings. Default
TODOandFIXME. Free-form, deduplicated, capped at 50 entries.
- Keywords — words to flag, matched case-insensitively as substrings. Default
- Why it matters: Keeps internal reminders (TODO, FIXME, temp placeholders) from reaching customers.
- Tip: Use it deliberately — when a product description isn’t finished, drop in a placeholder like
XXXorTBD, add that word to your keyword list, and review flags any invoice that still has it before you send.
Large expense
- What it checks: Expense entries whose amount exceeds a dollar threshold.
- Triggers when: Any expense amount is greater than the threshold.
- Severity: Warning.
- Default: Off (opt in — the threshold is tenant-specific).
- Config options:
- Threshold — dollar amount above which an expense flags. Default $500.
- Why it matters: Prompts you to verify high-dollar receipts before invoicing. One consolidated flag per invoice (there’s no per-expense target type).
Applying rule changes to existing invoices
When you change a rule’s config or toggle it on or off, Better Invoice re-evaluates that rule across your existing reviews immediately, using each invoice’s stored ConnectWise data — no new ConnectWise calls are needed. Dismissed flags that still fire are preserved. See Configure review rules for the settings UI.
Frequently asked questions
What invoice review rules does Better Invoice run before sending?
Better Invoice runs twelve automated review rules: low profit margin, agreement invoice amount changed, credit memo has a positive total, no tax code on invoice, product not marked taxable, non-billable time on invoice, stale time entries, flagged work type billed, ticket billed with no notes, insufficient ticket notes, keyword on the invoice, and large expense. Each raises an error, warning, or info flag in the review pane.
Which review rules are on by default?
On by default: low profit margin, agreement invoice amount changed, credit memo has a positive total, non-billable time on invoice, stale time entries, ticket billed with no notes, and insufficient ticket notes. Off by default (opt in): no tax code on invoice, product not marked taxable, flagged work type billed, keyword on the invoice, and large expense.
Why aren’t my ticket-notes rules flagging anything?
The notes rules only evaluate when your invoice template actually displays notes. If Time Detail is hidden or Show notes is turned off in the template config, both Ticket billed with no notes and Insufficient ticket notes skip silently. Turn notes on in the template, then the rules evaluate the rendered Time Detail buckets.
How is Better Invoice review different from ConnectWise Invoice Routing?
ConnectWise Invoice Routing is a manual approval sequence — it controls who signs off, not what gets checked. Better Invoice review automatically inspects invoice content (margin, tax, notes, expenses, credit memos) and flags real problems, then seeds its reviewer list from your existing ConnectWise routing so your approval chain carries over.
Will adjusting a rule’s threshold re-flag invoices already in review?
Yes. Changing a rule’s config or enabling it re-runs that rule across your existing reviews right away, using stored ConnectWise data. Flags you previously dismissed that still match are kept, so you don’t lose your earlier decisions.