Reconcile partner commissions between HubSpot and Introw
Open one board at month end to find every closed deal missing a commission, every commission with no deal behind it, and every amount that does not add up.
I want an app my partner ops team opens at the end of every month to reconcile partner commissions between HubSpot and Introw. Our commission spreadsheet always drifts from the CRM, so this is the catch-up audit surface where a human reviews each gap and approves the correction. HubSpot is read only in this app: the only records it writes are Introw commission lines and one Slack summary.
The main screen is a reconciliation table for a chosen date range, defaulting to the last complete calendar month, with a period picker at the top and three tabs. Tab one, Missing commission: HubSpot deals that closed won inside the period with no matching Introw commission line. Tab two, Orphan lines: Introw commission lines in the period with no matching closed won deal. Tab three, Amount mismatch: matched pairs where the commission amount does not equal the expected percentage of deal value, or where the currencies differ. Each tab shows a count badge, and the header shows totals for the period: number of gaps, total value at risk, and how many rows are still unresolved.
Handlers build the picture from both sides. On the HubSpot side, use Search Deals filtered to closed won deals with a close date inside the selected period, paging through all results. For each deal, use Get Deal with associations to resolve the associated partner company, then Get Company to read that company's domain and name. Let me configure in a settings panel which association label or deal property identifies the partner company, since some teams tag the partner as a second associated company and others use a custom deal property carrying the partner domain. On the Introw side, use List Partners to build a directory of partners keyed by their domain, and List Commission Lines to pull the current commission picture for the period. Both Introw list endpoints are cursor paginated with a limit between 1 and 100, so page until the next cursor is null, and back off and retry when a rate limit response comes back.
Match the two sides on partner domain, normalising to lowercase and stripping protocol and any www prefix before comparing. Within a matched partner, link a commission line to a specific deal when the line description or reference contains the deal name or deal id, and fall back to matching on partner plus close date proximity inside the period. Deals where no partner company could be resolved go into their own Unmatched deals group rather than being dropped silently, so the reviewer can see what the app could not classify.
Expected commission is deal amount multiplied by the commission rate, which I set globally in settings with optional overrides per partner tier. Introw amounts are decimal strings such as 500.00 paired with an ISO 4217 currency code, so parse them as decimals rather than floats, compare with a configurable rounding tolerance, and treat a currency code that differs from the deal currency as a mismatch in its own right instead of converting. Show both the recorded amount and the expected amount side by side on every mismatch row, with the difference highlighted.
Every row has inline actions. On a missing commission row, Create commission line opens a dialog prefilled with the partner, the expected amount formatted as a decimal string, the deal currency, and the deal name as the description, and calls Create a Commission Line once the reviewer confirms. On a mismatch row, Correct amount calls Update a Commission Line to set the amount and currency to the expected values, writing an internal note that records the reconciliation period and who approved it. On an orphan row, Decline line calls Decline a Commission Line with a categorised reason chosen from a dropdown, with a free text note. Every action needs an explicit click, and the row updates in place to show its new state.
Respect the commission line status rules. Statuses are EXPECTED, PENDING, IN_PAYOUT, and VOIDED. Voided lines cannot be edited, so render them read only with a Voided badge and no actions at all. Warn before editing a line that is already IN_PAYOUT, since it is attached to a payout in flight. Declining only works on a line attached to a payout and returns a validation error otherwise, so check attachment first and explain the situation in the row rather than firing a call that will fail. If declining a line would empty its payout, tell the reviewer in the confirm dialog that the payout itself will be declined too.
Add an Investigate this gap button on each row that kicks off a background agent. The agent pulls the full history of the deal with Get Deal and looks for related deals at the same company with Search Deals, then pulls that partner's other commission lines with List Commission Lines and reads individual lines with Get a Commission Line where it needs detail. It decides whether the gap is a genuine miss, a duplicate of a line logged against another deal, or a timing difference where the commission landed in an adjacent period, and writes a short recommendation with its reasoning and a confidence level back into the row. The recommendation appears inline under the row with a timestamp, and the reviewer can still take any action regardless of what it concluded. Several investigations can run at once and each row shows its own progress.
Persist reconciliation state per period so the team can work across several sittings: which rows have been actioned, which were dismissed as acceptable and why, agent recommendations, and reviewer notes. Keep a record of who did what and when. When the reviewer marks the period reconciled, require every row to be either actioned or explicitly dismissed with a reason, then post a summary to a configurable Slack channel with Send a Message, covering commission lines created, amounts corrected, lines declined, total value moved, rows dismissed, and who signed the period off. Lock the period read only afterwards, with a way to reopen it that is recorded in the audit trail.
What does this prompt do?
- Pick a date range and work three tabs: closed won deals with no commission recorded, commission lines with no matching deal, and pairs where the amount does not match your agreed rate.
- Fix each row without leaving the page: add the missing commission, correct a wrong amount, or decline a line that should not be there with a categorised reason.
- Press Investigate this gap on any row and an assistant reviews the deal history and that partner's other commissions, then writes back whether it looks like a genuine miss, a duplicate, or just a timing difference.
- When the period balances, mark it reconciled and a summary of everything that changed posts to your Slack channel.
What do I need to use this?
- An Introw account with your partners and commission lines in it
- A HubSpot login where partner deals are marked closed won
- A Slack workspace and a channel for month end summaries
- Your agreed commission rate, plus any partner specific rates, so the board knows what each line should have been
How can I customize it?
- Change the default period, from last calendar month to a quarter or any custom range
- Set the commission rate globally or per partner tier, and choose how much rounding difference is worth ignoring
- Pick the Slack channel and decide what the reconciliation summary includes
FAQs
Does this change anything in my CRM?
What happens to commission lines that have already been voided?
What if a partner is paid in a different currency to the deal?
Can I reconcile the same period more than once?
Do I have to do what the assistant recommends?
Will this work if some deals have no partner attached?
Related templates
Pick a client and a date range to see sent, replies, meetings booked and the real deal value your cold email produced, campaign by campaign.
Work every partner tier decision from one board, with the revenue and commission numbers, clear promotion thresholds, and AI review briefs.
See warmup status, daily send volume, and bounce risk for every sending account in one grid, with the riskiest mailboxes floating to the top.
Open one board each morning to see which of your accounts are hiring, what they are building, and where your product fits the roles they just opened.
Review Introw partner payouts line by line, approve them from one board, raise the matching bill in Xero, and post every approval to Slack.
Open a live deal, see the market pay range for that role and city, set your markup, and write the agreed numbers straight back onto the deal.
Stop reconciling partner commissions in a spreadsheet.
Put your CRM and your partner commissions on one screen at month end, and fix every gap in the same place you found it.