Why MIS Takes 15 Days (And How We're Fixing It)
An internal memo from January 23, 2026 — what I sent when my boss asked why month-end MIS takes 15 days. Reproduced as sent, with vendor names genericized and the response thread trimmed.
Updated May 2026: the plan below is from January. Current status at the end →
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 (AWS) │
│ ┌─────────────┐ │
│ │ Zoho │── Bill date: Feb 3 ──────────────► ✅ In Zoho │
│ │ Books │ Service: January BUT WRONG │
│ └─────────────┘ MONTH │
│ │
│ 4. PREPAID AMORTIZATION (SaaS subs, office rent) │
│ ┌─────────────┐ │
│ │ Excel │── ₹12L paid Apr-24 ──────────────► ❌ Not in │
│ │ tracker │ Jan portion = ₹1L Zoho │
│ └─────────────┘ (manual JV needed) │
│ │
│ 5. PAID ADVANCE, SERVICE NOT STARTED │
│ ┌─────────────┐ │
│ │ Bank │── Paid ₹6L 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 ₹1L advance ──────────────► ❓ Untracked│
│ │ │ Bill came ₹1.05L (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 (Salesforce contract amendment) │
│ ┌─────────────┐ │
│ │ Vendor │── Jan invoice: ₹10L ─────────────► ❓ Jan │
│ │ │ Mar credit note: ₹2L 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: "AWS 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.
- SVB 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?"