---
name: month-end-reconciliation
description: Pull payouts, match them against the ledger line by line, and surface only the exceptions. Use this skill when: Runs on a schedule — The 1st at 7:00 AM, or on demand from Slack.
---

# Reconcile the month-end close

Goal: reconcile the month-end close and surface only the exceptions.

Connected tools this skill uses: stripe, googlesheets, gmail.

## When to use

- Runs on a schedule — The 1st at 7:00 AM, or on demand from Slack.
- Or when the user asks directly to reconcile the month-end close and surface only the exceptions.

## Method

Reconcile the month-end close for {{period}}.

1. List every payout from Stripe for the period.
2. Match each payout against the master ledger in Google Sheets, line by line.
3. Flag any that are over the $1,000 approval threshold, missing an invoice,
   or appear to be duplicates.
4. Email me the exceptions with a one-line reason each, and post the matched
   entries to the ledger.
5. Save a reconciliation report to reports/{{period}}-close.md.

Do not post anything that failed a check, surface it for my sign-off instead.

## Ledger matching

Match every payout to exactly one ledger line, or flag it as an exception.

## Method
1. Pull every payout and charge for the period from Stripe.
2. Pull the master ledger for the same period from Google Sheets.
3. Build a match key from date, amount, and counterparty or reference ID for each payout.
4. Match each payout to the ledger line whose key and amount agree within tolerance.
5. Re-check near-misses — same amount with a different date, or same date with a different amount — before ruling out a match.
6. Mark any payout with no ledger line, and any ledger line with no payout, as unmatched.
7. Pass matched pairs through to posting; pass unmatched items to the exception policy.

## Rules
- A match requires the reference ID or counterparty to agree, plus amount within tolerance (set on first run, then stored in memory).
- Never merge two partial matches to force a tie-out.
- Unmatched ledger lines count as exceptions too, not only unmatched payouts.
- Treat same-amount, same-counterparty, same-day pairs as possible duplicates, not automatic matches.

## Output
A matched-pairs list (payout ID, ledger line ID, amount) and an unmatched-items list, each with a one-line reason, handed to the exception policy.

## Exception policy

Apply the approval thresholds and hold anything that fails a check for sign-off.

## Method
1. Run every matched and unmatched payout through the checks below.
2. Check whether the amount is at or over the approval threshold.
3. Check whether an invoice is on file for the payout.
4. Check whether the payout looks like a duplicate of another this period.
5. Tag each failed item with the check it failed and a one-line reason.
6. Hold every failed item from posting; route it to the exceptions email.
7. Post only items that passed every check.

## Rules
- The approval threshold is $1,000 (set on first run, then stored in memory); at or above it always holds for sign-off.
- A payout with no matching invoice is always an exception, regardless of amount.
- Same amount, same counterparty, same day is flagged as a possible duplicate, never auto-dismissed or auto-merged.
- Never post anything that failed a check — surface it for sign-off instead.
- Every exception carries a one-line reason; no unexplained flags.

## Output
An exceptions list (amount, check failed, one-line reason) emailed for sign-off, separate from the entries posted to the ledger.

## Close checklist

Run the reconciliation steps in the same order, every period, and confirm totals tie out before closing.

## Method
1. Confirm the period and pull the payouts for it.
2. Run ledger matching to produce matched and unmatched lists.
3. Run the exception policy checks on the full set.
4. Post the clean, matched entries to the ledger.
5. Email the exceptions for sign-off.
6. Save the reconciliation report to reports/{{period}}-close.md.
7. Confirm the report totals tie to the ledger before marking the period closed.

## Rules
- Steps run in this order every time; never post before matching and checking are complete.
- The period stays open until every exception is resolved or explicitly signed off.
- A totals mismatch between the report and the ledger blocks close and reopens the exception queue.
- Checklist progress is stored so a rerun resumes from where it left off, not from scratch.

## Output
reports/{{period}}-close.md, containing matched count, exception count, ledger totals, and a close status of open or closed.

## Recurring jobs

This skill pairs with scheduled jobs. Offer to set each one up; only create the ones the user approves:

- Month-end close run (The 1st of every month at 7:00 AM) — https://eluu.ai/cookbook/month-end-reconciliation/jobs-setup/month-end-close-run.md
