💡 Inspiration

Last summer I interned at a D2C haircare brand. Every morning I watched the ops team do the same thing: log into Blinkit, Zepto, Instamart, Nykaa and Tira, download purchase orders, and retype every line by hand into spreadsheets, a warehouse email and the WMS.

Each PO took 8–15 minutes. Across five channels, that was 5–6 hours a day of copying numbers from one screen to another before a single box shipped. One typo meant overselling. One missed PO meant a lost order and a fill-rate penalty from the channel.

The brand was paying a vendor ₹80,000/month to partly automate this, and it still needed people. So I asked myself: what if the ops team never had to retype a PO again?

👤 The user and the barrier

User: an operations executive at a fast-growing Indian beauty brand selling on 5+ quick-commerce and marketplace channels.

Barrier: channel portals are built for humans to read, not for machines to connect to. Every portal has its own login (often with an OTP), its own file format and its own SKU codes, and most offer no PO API. So the "integration layer" ends up being a tired person with a spreadsheet.

⚙️ What it does

Orqestra turns every purchase order, from any channel, into an inventory-checked, approved warehouse order without any retyping.

  1. Captures POs automatically. Channel syncs run every 3 hours (Blinkit, Zepto, Instamart, Nykaa, Tira). They log in on their own and read the OTP from the inbox. A Gmail poller runs every 10 minutes for POs that arrive by email.
  2. Reads messy documents with AI. Claude turns unstructured PO, dispatch, GRN and delivery emails into structured, schema-validated records.
  3. Maps every channel's SKU to the brand's own SKU. It tries a 3-step chain: exact code match, then text similarity, then AI matching for the rest. Anything below 85% confidence goes to a human review queue instead of being guessed.
  4. Checks live stock. A live "Available to Promise" panel rolls up every channel's version of a product into one number and compares it with today's demand.
  5. Suggests allocations. AI proposes quantities, which are snapped to case packs. Taxable values are validated before anything leaves.
  6. One-click approval. The ops executive reviews a spreadsheet-style grid and approves. The warehouse gets its instruction email with PO documents attached, and the sales order is pushed to the WMS.
  7. Reconciles what the channel actually received. Goods-received notes are compared with what was shipped. Short receipts, excess receipts and rejections are flagged with their ₹ impact, and debit notes and invoices are generated as PDFs.
  8. Tracks everything. Fill rate, dispatch time, GRN acceptance and inventory cover per channel, plus an append-only audit log of every action.

The change for the user: instead of five portals and a pile of PDFs, they open one calm queue showing what needs approval and what needs fixing. That's it.

📈 Impact

📈 Impact

5–6 hours/day of manual PO work × 60%+ automated × ~26 operating days/month

= Approximately 80–90 hours saved per brand, per month.

₹24 lakh saved in hiring costs at Moxie Beauty. By automating purchase order processing, inventory workflows, reconciliation, and other repetitive operational tasks, Orqestra helped the D2C beauty brand avoid ₹24 lakh in planned additional hiring expenses.

That's about half of a full-time role's capacity freed up from manual PO work alone, allowing the team to focus on decisions that require human judgment rather than repetitive data entry.

Orqestra is deployed in production at Moxie Beauty and is used daily by its operations team, delivering measurable time savings, lower operational costs, and a more scalable workflow without proportionally increasing headcount.

🛠️ How I built it

  • Full-stack: Next.js 14 (App Router, strict TypeScript) with Tailwind and shadcn/Radix UI. 15 screens, 57 API routes.
  • Data: PostgreSQL via Prisma, with 21 models covering the full chain: PO line → dispatch line → GRN line → discrepancy → invoice.
  • AI: Claude for document parsing, priority scoring and allocation suggestions, with every response validated against a Zod schema. Gemini 2.0 Flash handles the last step of SKU matching.
  • Channel connectors: one module per channel, with automated login, OTP reading over IMAP, and Playwright (headless Chromium) for portals without an API.
  • Outputs: PDFKit for invoices and debit notes, AWS S3 for storage, Resend/Nodemailer for email, Twilio WhatsApp for alerts.
  • Engineering choices:
    • A strict layered architecture (UI → API → services → integrations). server-only imports make it a build error for secrets to reach the browser.
    • Graceful degradation: the app boots with only a database URL. Each integration switches on when its keys are added.
    • Shipped with Docker on Coolify, with in-process schedulers.

🧗 Challenges I ran into

  • A real production incident: 15 POs emailed to the warehouse twice. A batch failed halfway through a 30-PO bulk send, and the retry re-sent orders that had already gone out. I redesigned the flow:
    • Every send is now idempotent, and the server rejects duplicates (HTTP 409) unless a person explicitly confirms.
    • The UI rebuilds its state from server truth instead of browser memory.
    • Every email records who sent it.
  • "96% fill rate, zero discrepancies" — both couldn't be true. The reconciliation engine was silently skipping POs that had no dispatch record, which is the norm on quick-commerce. I rebuilt it as a variance engine:
    • Each line is checked against the best baseline available: dispatched, then assigned, then ordered.
    • A SKU missing from the GRN counts as zero received.
    • Small per-line losses that add up to more than 2% at PO level are now caught.
  • Two people allocating the same PO. I added an atomic claim, written as a single conditional SQL UPDATE, with a 30-second heartbeat. The lock frees itself if someone closes the tab.
  • Channel re-syncs overwriting human work. Allocation is now a one-way latch: once a person has acted on a PO, later syncs can't overwrite it.
  • Every channel speaks a different language. Blinkit item IDs, Zepto product-variant IDs, EANs, Nykaa codes. A single SKU master plus the confidence-gated mapping chain solved this without hard-coding.

📚 What I learned

  • Ops teams buy hours saved and errors prevented, not dashboards.
  • Trust is a feature. Nobody hands over channel logins without an approval step and an audit trail, and those are what got the tool adopted.
  • Integrate, don't replace. Sitting on top of the brand's existing WMS and inbox meant they could start using it without migrating anything.
  • Production is the best teacher. My best design decisions came from real incidents, not from planning.

🚀 What's next

  • Multi-tenant, so any brand can onboard in under 14 days
  • Amazon and Flipkart connectors
  • AI anomaly alerts: unusual PO quantities, channels slipping on fill rate, repeat shortages on the same SKU
  • Paid pilots with 3 brands, to prove one workflow fits many companies

👋 About me

I'm Vedant Moghe, a 3rd-year B.Tech student at IIT Bombay. I like building products around real, unglamorous problems, and I've won 6+ hackathons. I built Orqestra after seeing this problem up close during my internship, and it now runs in production.

Orqestra is backed by a ₹30,000 grant from the Groww Foundation through IIT Bombay's INV.ENT program. That grant is funding the first pilots, but taking this from one brand to many needs more runway: cloud and AI costs, new channel connectors (Amazon, Flipkart), and onboarding pilot brands. If you run a consumer brand, invest at the early stage, or know someone who does, I'd love to talk. Every brand selling on quick-commerce in India faces this problem every single day.

📝 Disclosure

  • Pre-existing work: Orqestra began as "Moxie Ops", an internal tool I built during my summer 2026 internship (June–July). It's in production and used daily by that brand's ops team.
  • Built during Taskforge (Oct 20–24): I turned it into a shareable open release: rebranded it to Orqestra, removed all credentials and internal company files, replaced staff and warehouse contacts with placeholders, replaced real prices and GSTINs with synthetic data, and rewrote the documentation. The repo README's Provenance section lists exactly what changed. Added feature of Reconciliation to help Operation Guys to focus on handling the logistics rather than just sending emails.
  • AI assistance: the product was built with help from AI coding assistants (Claude Code), and the original build prompt is included in the repo. This write-up was drafted with help from Claude. At runtime the product uses the Claude and Gemini APIs.
  • Data: the demo uses sample data only. No real customer or company data is shown.

Built With

Share this project:

Updates

Submission history