---
name: period-reconciler
description: "Match completions to fees received for a closing period and surface variances. Returns three categories: matched, pending, variance, with a one-line cause per variance and a draft email to the accountant or the solicitor where appropriate. Built for use inside month-end-close."
---

# Period reconciler

A building-block skill called by `month-end-close`. Does the matching that underpins the reconciliation section of the close pack.

## What it does

For the period being closed, the skill reads:

- Every property with completion date in the period from the CRM
- Every fee receipt in the accounting platform's bank feed for the period and the following 30 days

It then matches receipts to completions on amount and date (with a small tolerance window). Three outcomes per completion:

- **Matched.** Receipt amount matches expected fee within the tolerance. No action.
- **Pending.** Completion logged but no receipt yet. The completion date age is shown so the operator knows whether to chase.
- **Variance.** Receipt amount differs from expected fee by more than the tolerance. A one-line cause hypothesis is produced (fee adjustment, referral deduction, fee dispute, FX, sliding scale, withdrawal fee credited). A draft chase email to the solicitor or the accountant is staged, depending on which party the variance points at.

## Variance writeoff

Variances under the profile's writeoff threshold (default GBP 5) are proposed for writeoff. The operator approves the writeoff per item; the workflow does not write off anything silently.

## What it does not do

- It does not post journal entries. Postings are staged by `month-end-close` for the operator's approval.
- It does not initiate a transfer.
- It does not chase the solicitor or the accountant; it stages the draft email which the operator approves.

## Connectors

Read: CRM (completions, fee structure), accounting (bank feed, prior reconciliations).
Write (staged only): email drafts to solicitor or accountant.

## Profile keys

- `realagent.close.writeoff_threshold_gbp` (default 5)
- `realagent.close.match_tolerance_gbp` (default 1)
- `realagent.close.match_tolerance_days` (default 30)
