Why MIS Takes 15 Days (And How We're Fixing It)
An internal memo from January 23, 2026: what I sent when I was asked why month-end MIS takes 15 days. Reproduced as sent, with vendor names and amounts genericized and the response thread trimmed.
Updated May 2026: the plan below is from January. Current status at the end → A plain-words summary was added at the top in October 2026. The memo itself is unchanged.
In plain words
Month-end close took 15 to 20 days. I was asked to "just automate it." The report was never the slow part. The month's expenses were not all in one place, so there was nothing complete to report on.
The ledger held about 60 to 70 percent of the month. The rest sat in ten kinds of places:
- A vendor who has not sent the bill yet.
- A bill waiting in an approval queue with no deadline.
- A bill dated in the wrong month.
- A prepaid expense that needs spreading across months by hand.
- An advance paid for a service that has not started.
- A service in use that nobody has a bill for.
- A final bill that differs from the advance paid.
- One vendor, several services, one bill.
- A credit note that arrives months later.
- Normal posted bills, the only part you can query.
The plan was one tracker for all ten. It did not ship that way. The cases were solved inside other tools instead, and the status at the end says which. The larger lesson is in the last line: a faster close stops mattering once the question becomes how fast you can explain the numbers against the plan.
The memo below is the original, as sent.
The Question
"You have all the expense data. Just automate it. Why is MIS delayed?"
The Short Answer
The data you think exists in Zoho… doesn't exist in Zoho.
When I query "give me January expenses" from Zoho, I get maybe 60–70% of reality. The rest is scattered across 9 other places, vendor systems, Pazy queues, Excel sheets, and people's heads.
You can't automate a report if the underlying data doesn't exist in any single system.
The 10 Places Expense Data Gets Stuck
Here's the complete picture. Each case has a real example.
┌─────────────────────────────────────────────────────────────────┐
│ WHERE JANUARY EXPENSES ACTUALLY ARE │
├─────────────────────────────────────────────────────────────────┤
│ │
│ 1. VENDOR HASN'T SENT BILL │
│ ┌─────────────┐ │
│ │ Vendor │── "We'll send invoice next week" ──► ❌ Not in │
│ │ system │ (no SLA, no webhook, no visibility) Zoho │
│ └─────────────┘ │
│ │
│ 2. BILL STUCK IN PAZY APPROVAL │
│ ┌─────────────┐ │
│ │ Pazy │── L1 ✓ → L2 ✓ → L3 ⏳ → L4 ❓ ──► ❌ Not in │
│ │ queue │ (no timeout, no alert, no SLA) Zoho │
│ └─────────────┘ │
│ │
│ 3. BILL DATED WRONG MONTH — CUTOFF (cloud) │
│ ┌─────────────┐ │
│ │ Zoho │── Bill date: Feb 3 ──────────────► ✅ In Zoho │
│ │ Books │ Service: January BUT WRONG │
│ └─────────────┘ MONTH │
│ │
│ 4. PREPAID AMORTIZATION (SaaS subs, office rent) │
│ ┌─────────────┐ │
│ │ Excel │── A year paid upfront ───────────► ❌ Not in │
│ │ tracker │ Jan portion = 1/12 Zoho │
│ └─────────────┘ (manual JV needed) │
│ │
│ 5. PAID ADVANCE, SERVICE NOT STARTED │
│ ┌─────────────┐ │
│ │ Bank │── Paid in Jan ───────────────────► ❓ Where │
│ │ account │ Service starts April is it? │
│ └─────────────┘ (no state machine) │
│ │
│ 6. USING SERVICE, NO BILL │
│ ┌─────────────┐ │
│ │ Someone's │── "Oh we've been using this" ────► ❌ Not in │
│ │ head │ (discovered months later) Zoho │
│ └─────────────┘ (not anywhere) │
│ │
│ 7. BILL ≠ ADVANCE PAID (offsite events — 50% advance) │
│ ┌─────────────┐ │
│ │ Variance │── Paid 50% advance ──────────────► ❓ Untracked│
│ │ │ Bill came in 5% higher (no join) │
│ └─────────────┘ │
│ │
│ 8. SAME VENDOR, MULTIPLE SERVICES │
│ ┌─────────────┐ │
│ │ Vendor │── Service A: Jan-Dec ────────────► ❓ Mixed up │
│ │ │ Service B: Mar-Mar (no line │
│ └─────────────┘ One bill, two periods allocation)│
│ │
│ 9. CREDIT NOTE LATER (software contract amendment) │
│ ┌─────────────┐ │
│ │ Vendor │── Jan invoice: full ─────────────► ❓ Jan │
│ │ │ Mar credit note: 20% overstated │
│ └─────────────┘ (contract amendment) (no link) │
│ │
│ 10. NORMAL POSTED BILLS ✅ │
│ ┌─────────────┐ │
│ │ Zoho │── Posted bills only ─────────────► ✅ │
│ │ Books │ (this is the only part that works) Queryable │
│ └─────────────┘ │
│ │
└─────────────────────────────────────────────────────────────────┘
In Tech Terms
| # | Case | Tech Analogy | Why It Breaks |
|---|---|---|---|
| 1 | Vendor hasn't sent bill | External API with no webhook | Data doesn't exist in any system we control |
| 2 | Pazy stuck | Blocking human-in-the-loop | No timeout, no queue visibility, no SLA |
| 3 | Wrong month (cutoff) | Schema mismatch | bill_date ≠ service_period, Zoho doesn't know the difference |
| 4 | Prepaid amortization | Data in spreadsheet | No API, no sync, Excel is the "database" |
| 5 | Advance paid | Missing state machine | Payment ↔ Service ↔ Bill lifecycle not tracked |
| 6 | Unbilled service | Data in someone's head | Zero observability, discovered during incident |
| 7 | Bill ≠ Advance | No foreign key | Can't join payment to bill, different amounts, no reference |
| 8 | Multi-service vendor | No line-item allocation | One bill, multiple service periods, can't split |
| 9 | Credit note later | No linkage | Credit note doesn't reference original invoice period |
| 10 | Normal bills | ✅ Works | This is the only queryable data |
Summary: 1 out of 10 cases can be automated today. The other 9 require a system that doesn't exist.
The Pipeline View
What you think happens:
────────────────────────
All Data ──────────► Zoho ──────────► Report
│
"Just query it"
What actually happens:
──────────────────────
Vendor systems ─────────► ❌ (no push, no visibility)
Pazy queue ─────────────► ❌ (stuck, no alert)
Excel tracker ──────────► ❌ (no API)
Someone's head ─────────► ❌ (discovered too late)
Bank statement ─────────► ❌ (advance not linked to service)
Zoho Books ─────────────► ✅ Queryable (60–70% of reality)
It's like querying a database replica that's two weeks behind master. The data exists somewhere, just not in Zoho yet.
The MIS Timeline Today
January Month-End Close
Jan 31 Feb 1-5 Feb 5-10 Feb 10-15 Feb 15-20
│ │ │ │ │
▼ ▼ ▼ ▼ ▼
Month Bills still Chasing Finally MIS
Ends coming in Pazy approvals numbers Ready
are stable
| Blocker | Days Lost |
|---|---|
| Bills arrive late (no vendor SLA) | 5 days |
| Pazy approval queue (no timeout) | 3–7 days |
| Unbilled services (no visibility) | 2 days |
| Prepaid amortization (manual Excel → JV) | 1–2 days |
| Cutoff corrections | 2–3 days |
Total: 15–20 days after month-end.
What We're Building: Expense Lifecycle Tracker
One system that tracks all 10 cases.
Architecture
┌─────────────────────────────────────────────────────────────────┐
│ EXPENSE LIFECYCLE TRACKER │
│ (Observability + Automation) │
├─────────────────────────────────────────────────────────────────┤
│ │
│ DATA SOURCES OUR SYSTEM │
│ ──────────── ────────── │
│ │
│ Pazy ──────────────────────────► Bill status │
│ Excel (migrate) ───────────────► Service periods │
│ Manual entry ──────────────────► Unbilled services │
│ │
│ WE ADD: │
│ ├─ Service period (start/end dates) │
│ ├─ Payment ↔ Service ↔ Bill linkage │
│ ├─ Auto-amortization schedule │
│ ├─ Unbilled service registry │
│ └─ Alerts & anomaly detection │
│ │
│ OUTPUT: │
│ ├─ Dashboard: "What's missing for January close?" │
│ ├─ Alerts: "Cloud Jan service — Day 5, no bill" │
│ ├─ Alerts: "7 bills in Pazy > 5 days" │
│ └─ One-click JV generation → Zoho Books │
│ │
└─────────────────────────────────────────────────────────────────┘
What Each Case Gets
| # | Problem | Solution |
|---|---|---|
| 1 | No bill received | Alert on Day 5: "service registered, no bill received" |
| 2 | Pazy stuck | Dashboard: "bills in Pazy > 5 days" |
| 3 | Wrong month | Service period tracking → expense in correct month |
| 4 | Prepaid | Auto-generate monthly amortization JVs |
| 5 | Advance paid | State machine: advance → service started → bill received |
| 6 | Unbilled service | Register all services upfront, alert when no bill |
| 7 | Variance against advance | Link advance payment to final bill, show difference |
| 8 | Multi-service vendor | Separate line items per service period |
| 9 | Credit note | Link credit note to original, adjust correct period |
| 10 | Normal bills | ✅ Still works |
Expected Impact
| Metric | Today | After |
|---|---|---|
| Month-end close | Day 15–20 | Day 7–10 |
| MIS delivery | Day 20+ | Day 10–12 |
| Accuracy | "Final final v5" revisions | First version reliable |
| Manual JV entry | ~20 entries/month | Zero (automated) |
| Unbilled surprise | Discovered during close | Day 1 visibility |
Why not Day 3–5? Vendors will still send bills late (external). Pazy approvals still need humans (external). But we'll know what's missing on Day 1 instead of discovering it on Day 15.
Tech Stack
| Layer | Choice | Rationale |
|---|---|---|
| Frontend | React + Tailwind | Same as other Atlance modules |
| Database | Supabase (Postgres) | Free tier, Edge Functions, real-time |
| Integration | Zoho Books Journal API | Post JVs directly |
| Hosting | Cloudflare Pages | Already in use, free |
Build time estimate: 2–3 weeks to MVP with core features.
Timeline & Effort
| Phase | What | Target |
|---|---|---|
| Phase 1: Foundation | Core system, data model, dashboard | Feb mid |
| Phase 2: India | Zoho integration + Excel migration (~100 items) | Feb end |
| Phase 3: MENA | Zoho integration + Excel migration (~15 items) | Mar mid |
| Phase 4: USA & UK | Zoho integration + migrations | Mar 3rd week |
| Phase 5: Testing & Polish | UAT, edge cases, all 4 regions validated | Mar end |
Target: end of March 2026. All 4 regions live. April close is the first month-end using the new system.
Summary
- MIS delay isn't a reporting problem, it's a data completeness problem.
- 9 out of 10 expense scenarios can't be automated today because the data is scattered across vendor systems, Pazy queues, Excel, and people's heads.
- The Expense Lifecycle Tracker creates a single source of truth for expense lifecycle, from service registration to Zoho posting.
- Expected outcome: close in 7–10 days instead of 15–20. First MIS version is reliable.
Questions? Happy to walk through any of the 10 cases in detail.
Status, May 2026
The memo above is from January. Four months on, here's the honest state of what shipped and what didn't.
This plan didn't ship as a unified "Expense Lifecycle Tracker." We went up a level instead.
By March 2026, the goal had moved: variance, forecast vs actual, across 4 regions, in INR-equivalent, sub-200ms. Variance sits downstream of MIS (you can't compare actual to plan without reliable actuals), so building Variance became the forcing function, and several of the 10 cases got solved as a side effect.
What shipped that addresses cases from this memo:
- Variance dashboard (v0.12.x), Sheets → Supabase ETL, COGS / OpEx split parser, all 4 regions on a single canvas. The data-completeness checks for variance to even render forced cases 3 (cutoff), 5 (advance), and 9 (credit notes) to be resolved upstream.
- Prepaid Tracker, case 4 (amortization) automated.
- Corporate card expenses, case 6 (unbilled / undiscovered service) for card spend specifically.
- Dispute Tracker, case 9 (credit note linkage).
What's still on the to-do list:
- Cases 1, 2 (vendor SLA, Pazy queue alerts), partially addressed via Variance's anomaly surface, but no unified "alert on day 5" yet.
- A single "Expense Lifecycle Tracker" module as written, the 10 cases got distributed across Variance + the trackers above, instead of one unified system.
The headline: MIS close timeline improved, but that became table stakes the moment we asked the harder question, not "how fast can we produce the actual?" but "how fast can we explain it against the plan?"