{
  "name": "Run the monthly close reconciliation",
  "flow": [
    {
      "id": 1,
      "module": "quickbooks:getGlEntries",
      "metadata": {
        "designer": {
          "x": 0,
          "y": 0
        }
      },
      "parameters": {},
      "description": "Last month's general-ledger entries (or NetSuite)."
    },
    {
      "id": 2,
      "module": "bank-feed:getTransactions",
      "metadata": {
        "designer": {
          "x": 300,
          "y": 0
        }
      },
      "parameters": {},
      "description": "The month's bank transactions."
    },
    {
      "id": 3,
      "module": "array-aggregator:matchTransactions",
      "metadata": {
        "designer": {
          "x": 600,
          "y": 0
        }
      },
      "parameters": {},
      "description": "Match on amount, date, and reference."
    },
    {
      "id": 4,
      "module": "router:splitExceptions",
      "metadata": {
        "designer": {
          "x": 900,
          "y": 0
        }
      },
      "parameters": {},
      "description": "Split unmatched entries from probable duplicates.",
      "spion_notes": "Added by Spion: the exceptions are what a human needs; the matches are noise."
    },
    {
      "id": 5,
      "module": "google-sheets:writeExceptions",
      "metadata": {
        "designer": {
          "x": 1200,
          "y": 0
        }
      },
      "parameters": {},
      "description": "Write a Close Exceptions tab: each item, its amount, and why it was flagged for a human to clear."
    }
  ],
  "metadata": {
    "version": 1,
    "generated_by": "Spion",
    "generated_at": "2026-06-14T14:13:03.649Z",
    "description": "Pull the GL and bank feed, match transactions, flag unreconciled lines and likely duplicates, and write an exceptions tab."
  }
}