# Hardik Zinzuvadiya > ERPNext specialist and AI software engineer. Five years inside Frappe and ERPNext. Certified Frappe Developer and Software Engineer II. I build AI agents that draft inside the ERP, the custom apps around them, and the servers that keep them up. Site: https://hardikzinzu.com. Contact: hardiktech7@gmail.com. Remote from India. Certified Frappe Developer, Frappe Technologies, March 2025. Eight merged pull requests across five Frappe repositories: https://github.com/frappe/frappe/pulls?q=is%3Apr+author%3AZ4nzu+is%3Aclosed Claude 101, Anthropic course completion, September 2026: https://academy.claude.com/verify/81be141f08e43e3f4d0d930cbb634b49 TryHackMe, security practice after hours: https://tryhackme.com/p/hardikzinzu Writing on Medium: https://medium.com/@hardikzinzu Frappe forum: https://discuss.frappe.io/u/hardik_zinzu GitHub: https://github.com/Z4nzu ## What I do ### Servers, hosting and hardening Two application servers, a primary MariaDB with a replica ready to take over, Docker, CI/CD and Grafana alerting, with hardening as the baseline. ### Version migrations and upgrades Compatibility audit of your custom apps, a migration rehearsed on a copy of production, data validation and a tested rollback plan. ### Custom Frappe apps and features Features ERPNext does not have, built as proper Frappe apps that survive upgrades instead of patches to core. ### Integrations and syncs Shopify, payment gateways, WhatsApp Business, e-invoicing and any REST or GraphQL API, with idempotent syncs and visible error queues. ### AI agents inside the ERP Assistants that answer from live ERP data and draft records for a person to approve, bounded by permissions and cost ceilings. ### Backend services and APIs The Python services and servers underneath: background workers, schedulers and push delivery from your own infrastructure. ### Database and query work MariaDB and PostgreSQL under real volume: slow queries, indexes and background workers, measured before and after. ### Code review and contribution Contributor to Frappe and ERPNext. AI writes a lot of the first draft here; every line still passes a review, a test and a security check. ## Services ### ERPNext implementation and setup for your company — https://hardikzinzu.com/services/implementation/ A production-ready ERPNext on AWS, GCP, Azure or your own servers, configured for how your business actually runs: companies, warehouses, workflows, print formats and users. Scope: Hosting on AWS, GCP, Azure or your own servers; Companies, warehouses and users set up the way you operate; Workflows and approvals; Print formats and documents; Imports rehearsed on a copy of the site and validated before go-live ### Custom Frappe apps and ERPNext features — https://hardikzinzu.com/services/custom-apps/ Features your team needs and ERPNext does not have, built as proper Frappe apps that survive upgrades: monitors, approval flows, document automation, dashboards. Scope: Monitors and dashboards; Approval flows; Document automation; Features ERPNext does not have, built as proper Frappe apps; Tested on ERPNext v14 to v16 ### Workflow automation and approvals — https://hardikzinzu.com/services/workflow-automation/ Approvals that reach the person who has to decide, document events that fire the next step, and scheduled jobs nobody has to remember, all under your permission rules. Scope: Approval inboxes: approve, deny, edit or snooze, with what happens on each spelled out; Triggers on schedules, document events, date fields, webhooks, inbound email or by hand; Notifications to the people who have to act, not to everyone; Every step runs as a real Frappe user, under the permission policy; Runs you can review before they are armed, and pause mid-way ### Reports and dashboards — https://hardikzinzu.com/services/reports-dashboards/ The number your team asks for every week, on a page that answers it: stock per warehouse, every order against its status, what is overdue and what to do about it. Scope: Query and script reports, with the filters people actually use; Role-based dashboards: one page per job, not one page for everyone; Stat cards counted from real records, with quick filters over them; Exception boards, where every problem is a record with a bucket and one next action; Tested on ERPNext v14 to v16 ### Integrations — https://hardikzinzu.com/services/integrations/ Shopify, payment gateways, WhatsApp Business, government e-invoicing, sFTP and any REST or GraphQL API, with idempotent syncs and visible error queues. Scope: Shopify orders, stock and invoices; Payment gateways; WhatsApp Business; Government e-invoicing; sFTP and any REST or GraphQL API; Idempotent syncs and visible error queues ### ERPNext version migration and upgrades — https://hardikzinzu.com/services/migration/ Compatibility audits of your custom apps, rehearsed migrations on a copy of production, data validation and a tested rollback plan. Scope: Compatibility audit of custom apps; Rehearsed migration on a copy of production; Data validation; Tested rollback plan; Odoo v13 to v19 migrations too ### Odoo customisation and migration — https://hardikzinzu.com/services/odoo/ Custom modules, report and invoice templates, integrations and version upgrades, in Community and Enterprise, from Odoo v13 to v19. Scope: Custom modules across Sales, Purchase, Stock, Accounting, CRM, Planning, Maintenance, Repair and Field Service; Report and document templates: order confirmations, invoices and receipts, including DIN 5008 and Swiss layouts; Website, eCommerce and eLearning customisation, down to checkout rules and course access; Version migration in both editions, v13 through v19, with your custom modules carried forward and re-tested; Integrations: WhatsApp messaging from CRM and Sales, payment gateways, and REST or file-based feeds; Odoo Online, Odoo.sh and your own servers, including deployment and the pipeline around it ### Hosting, high availability and monitoring — https://hardikzinzu.com/services/hosting/ Two application servers, a primary MariaDB with a replica ready to take over, Docker, CI/CD and Grafana alerting, with hardening as the baseline. Scope: Two application servers: one for the people using the system, one for API traffic and frequent cron; A primary MariaDB with a replica kept in sync and promoted when the primary fails; AWS, Azure or GCP — DNS, SSL, backups and scaling — or your own hardware; Docker images and Compose environments tuned for build and runtime, deployed by CI/CD without downtime; Grafana and Prometheus on every environment, alerting on symptoms users would feel, not on every metric; Key-only SSH, host firewalls, least-privilege database users, and backups restored on a schedule rather than only taken ### AI agents and document automation inside your ERP — https://hardikzinzu.com/services/ai-agents/ Assistants that answer from live ERP data and draft records for human approval, invoice and PDF extraction with review, bounded by permissions and cost ceilings. Scope: An agent in the Desk that answers from live records — aggregations, search, link tracing and saved reports — with no vector index to keep in step; Digital and scanned PDFs, photos and e-invoices read into draft Purchase Invoices and Expense Claims; Supplier and line-item matching, totals checks and a confidence score on every extraction; Every write is a draft a person approves, denies or edits; nothing posts on its own; Several LLM providers behind one interface, with failover, so one outage is not your outage; Bounded by the same permission rules as the user behind it, and by a cost ceiling you set ### Support and maintenance — https://hardikzinzu.com/services/support/ Bug fixes, performance work, upgrades and proactive monitoring for ERP systems already in production. Scope: Bug fixes and performance work on the system you are running now, custom apps included; Version upgrades planned as a rehearsal on a copy of production, not as an evening's work; Custom apps kept working across upgrades — the part that breaks when a major version lands; Monitoring and alerting that pages on what users would feel, with a runbook per environment; Backups verified by restoring them on a schedule; Taking over a system somebody else built, starting with a read of what is actually installed ## Work ### Frappe Copilot — https://hardikzinzu.com/work/frappe-copilot/ product, alpha, 2026. Frappe Copilot is an AI agent that lives inside ERPNext: ask questions in plain language, turn invoices into records, and approve every write before it lands. An AI agent inside ERPNext that answers from live data and drafts records for human approval. Stack: Python, Frappe v15/v16, React, SSE streaming 28 tools the agent can call 6 LLM providers with automatic failover Agent: - Chat inside the Desk that plans, calls tools, reads results and repeats until done - 28 tools for reading, analysing, drafting, extracting and navigating - Skills are records: write one in the Desk and the next message already uses it - Each skill can carry knowledge sources: your notes, a documentation URL, or a scan of a DocType - Book this invoice: reads the PDF, matches supplier and items, drafts, asks for approval - Mention any document with @ to pull it into the prompt Routing, caching and failover: - An intent router reads the message first and picks the smallest tool and skill set the executor will see - It ships off, and returning nothing is a supported answer, so an install behaves the same until you turn it on - Greetings and acknowledgements never reach it, so the cheapest messages cost no routing call - Prompt caching pins the stable layers: identity and moderation, then the skills block, then the tool catalogue - Long conversations compact themselves past 60% of the token budget; the last eight messages stay verbatim - The compacted block keeps figures bound to the tool and filter that produced them, so the next turn recovers state instead of re-reading prose - Rate limits and outages move to the next provider mid-run; an auth failure skips that provider outright Answers: - Records, aggregations, full-text search, document link tracing and saved reports - Sentences, sortable tables or charts, streamed over SSE as real UI components - No vector index to maintain and no stale copy of the database - Compact tool results use 40-60% fewer tokens than JSON Extraction: - Digital and scanned PDFs, photos and FatturaPA e-invoices become Purchase Invoices - Expense Claims from receipts through the same review card - Supplier and line-item matching, totals checks, confidence scores - Uncertain lines show ranked candidates; nothing is silently guessed Control: - Runs as the logged-in user: if you cannot open a record, Copilot cannot either - PrivacyGate masks sensitive fields before any prompt leaves the server - Every write is a draft card; nothing changes until you approve - A dry run validates each draft first, so errors show before you confirm - Analysis runs in a sandbox: restricted Python, masked output, and a rollback even on success - Admin centre: setup wizard, usage, traces, per-user quotas - Prompts are versioned records, moved from draft to canary to active to retired ### Shopify to ERPNext operations suite — https://hardikzinzu.com/work/shopify-erpnext-suite/ integration, production, 2026. Shopify to ERPNext integration: scheduled one-way order sync into Sales Orders, Invoices and Delivery Notes, with Order and Product monitors on the Desk. Shopify orders become submitted Sales Orders, Invoices and Delivery Notes on a schedule, with monitors for orders and products. Stack: Python, Frappe v16, ERPNext, Shopify REST 2025-10, Shopify GraphQL, Redis, RQ background jobs, MariaDB Order sync: - Shopify order becomes a submitted Sales Order; a Sales Invoice follows once paid - Delivery Note when Shopify reports a successful fulfilment, partials included - Cancellation in Shopify unwinds the order, all or nothing, only if nothing shipped - Shopify quantity variants map to pack sizes on one item via Item Sales Pack - Keyed on the Shopify order id: re-running a window never duplicates a document Monitors: - Order Monitor reads Shopify and checks each order against ERPNext documents - Sync, Re-sync and Import historical orders from the card - Product Monitor with Shopify, ERPNext and Inventory tabs and bulk sync - Sync Monitor maps 401, 403, 429, 5xx and timeouts to plain errors, flags stale runs Reliability: - Cron every 10 minutes over a watermark window with overlap, under a Redis lock - Cursor pagination against the Shopify API with a page cap per run - Client-credentials access token refreshed on a schedule - Historical import reconciled with compensating Stock Entries - Integration tests run against a real site with bench execute ### Product Inventory Monitor — https://hardikzinzu.com/work/product-inventory-monitor/ product, production, 2026. Product Inventory Monitor for ERPNext: actual, reserved and projected stock per warehouse, 8 quick filters, stock actions and an Inventory Exception board. Stock per warehouse, quick stock actions and a board for post-shipment exceptions, on one ERPNext page. Versions: ERPNext v15, ERPNext v16 Stack: Python, Frappe, ERPNext v15 and v16, JavaScript, SQL 8 quick filters 6 stat cards 5 exception buckets Stock overview: - 6 stat cards: total SKUs, in stock, out of stock, below reorder, stock value, reserved - Actual, reserved, ordered and projected quantity per warehouse - 8 quick filters, from in stock and out of stock to below reorder and negative stock - Template and variant grouping; Product Bundle support - Search by item code, name or barcode; company, item group and warehouse filters Stock actions: - Add, Move and Remove create draft Stock Entries; a reason is required on Remove - Movement history and open purchase and sales orders per item - Draft Sales Order quantity shown against available stock - Downloadable xlsx template and bulk Stock Reconciliation from the same file Settings and performance: - Page size 25, 50 or 100, default view mode and excluded warehouses in PIM Settings - Feature toggles per site - Pagination and caching for thousands of SKUs Exception board: - 5 buckets: cancel, product issue, delivery issue, wrong quantity, wrong item - Kanban columns Awaiting Return, Received · Decide, In Repair, Ready to Ship, Resolved - Follow-up date with overdue flag; chargeback decision: courier, customer or absorb - Returns, repair and scrap warehouses and a return window in settings Stock postings: - Inbound goods are Stock Entries, never a return Delivery Note - Resends are over-delivery Delivery Notes on the original Sales Order - The original Delivery Note is only flagged, never cancelled or edited - Every board button posts the ERPNext documents; nobody opens them by hand ### Sales Order Monitor — https://hardikzinzu.com/work/sales-order-monitor/ product, production, 2026. Sales Order Monitor is an ERPNext page tracking each order through delivery, invoicing and payment, with 6 summary stats, 9 quick filters and item comparison. One ERPNext page that shows every Sales Order with its delivery, invoice and payment status and the next action. Versions: ERPNext v14, ERPNext v15, ERPNext v16 Stack: Python, Frappe, ERPNext v14 to v16, JavaScript, CSS, SQL 9 quick filters 6 summary stats Dashboard: - 6 stats: total, awaiting delivery, invoice or payment, outstanding, overdue invoices - Date range and customer filters, search by order number or customer - 9 quick filters: draft, missing or partial delivery, missing or partial invoice, and more Order cards: - Three columns: identity, process flow, financial - Delivery, invoice and payment progress as percentages - Grand total, outstanding, days remaining or overdue - Next recommended action per order Item tracking: - Ordered versus delivered versus invoiced per item - Delivery Note returns and credit notes netted into the quantities - Status badges; 50 items per page Linked documents: - Delivery Notes, Sales Invoices, Payment Entries and returns on the card - Sales Invoices with their outstanding amount, payments with mode and date - One-click submit for drafts Performance: - One optimised SQL fetch, then client-side filtering - Modals load lazily - Installs with bench get-app on-premise or on Frappe Cloud ### Attachment Manager for Frappe — https://hardikzinzu.com/work/attachment-manager/ product, production, 2026. Attachment Manager for Frappe: card and list views, inline preview of PDF, DOCX, XLSX, images, video and code, and zip download inside any form. Card and list views, inline preview for 15+ file formats, and zip download of every attachment inside any Frappe form. Versions: ERPNext v14, ERPNext v15, ERPNext v16 Stack: Frappe, Python, JavaScript, HTML/CSS, docx-preview, xlsx, canvas-datagrid, CodeMirror 15+ file formats previewed inline Views and navigation: - Card and list view toggle - Preview, download and delete on every file - Carousel navigation between attachments - Images render inline on the card - Responsive on desktop and mobile Search and filter: - Search by name, type or extension - Category filter: images, videos, documents - Download All as zip, respecting the active filters - File type detection Document preview: - PDF viewer with page controls, zoom and fit-to-width - DOCX via docx-preview - XLSX and CSV with sheet tabs - Text and code via CodeMirror Media and quick actions: - Image zoom and drag-to-pan; native audio and video; SVG - Right-click context menu - Drag and drop upload, multiple files at once - Inline refresh; Download All with a progress indicator Integrations: - Optional Open in OnlyOffice when that app is installed - Works on any DocType with attachments - Installs with bench get-app on-premise or on Frappe Cloud ### Web Push Notifications for Frappe — https://hardikzinzu.com/work/web-push-notifications/ product, production, 2026. Web Push Notifications for Frappe: rules on 8 document events or timed reminders, 4 recipient types, Jinja templates, and no third-party push service. Rule-based browser push from document events and timed reminders, sent from your own server with no third-party relay. Versions: ERPNext v14, ERPNext v15, ERPNext v16 Stack: Python, Frappe v14 to v16, JavaScript, Web Push and VAPID, Jinja, Frappe scheduler 8 event types 4 recipient types Notification rules: - 8 event types: new, save, submit, cancel, delete, days or minutes before or after - 4 recipient types: user, role, docfield, all assignees - Optional Python condition per rule - No Update Since X Days helper for stale records Time-based reminders: - Days before or after a date field, minutes before or after a datetime - Driven by the Frappe scheduler - Sent reminders clean themselves up Messages and fallback: - Jinja title and body with the document in scope, for example {{ doc.name }} - Rich text - Parallel in-app system notification, configurable per rule - Lands in the Frappe notification centre when push is unavailable Subscription, security and setup: - Guided opt-in that walks the user through the browser permission prompt - Subscription stored per user; users manage their own - VAPID keys generated and stored in settings; no external relay - Test notification from the settings page ### FrappeKit — https://hardikzinzu.com/work/frappekit/ product, production, 2026. FrappeKit is a Chrome extension for Frappe teams: project-grouped sites, account switching, health checks, push alerts, PIN lock and 4 developer tools. A Chrome extension that keeps every Frappe site, account and environment one click away, with alerts and developer tools. Stack: JavaScript, Chrome Extension API, Frappe REST API, ERPNext 4 developer tools 4 environment types Projects and sites: - Sites grouped by project - Production, staging, development and local labels; the active tab is highlighted - Search, open, switch, or open in incognito Accounts and login: - Password and API-key credentials per site - Quick login pills on the Frappe login page - Auto-detected login card; bulk delete and filter Alerts and health: - Frappe system notifications delivered as desktop push, even with the browser closed - Latest first; open the linked record in one click - Polling health checks with status and response time per site Developer tools: - DocType Inspector with deep links from Link and Table fields - Field Metadata Overlay - Custom Field Highlighter - Child-table support throughout Security: - PIN lock with masked input - Auto-lock timeout, including until the browser closes - Lock state synced across login page, popup and options - Encrypted credential storage, all client-side - Light and dark theme ### TapToDesk — https://hardikzinzu.com/work/taptodesk/ backend, production, 2026. TapToDesk sends text and passwords from phone to desktop: scan a QR code, encrypt with a per-session RSA-2048 key, relay over WebSocket, never plaintext. Send a password or snippet from phone to browser through a QR session, encrypted end to end, nothing stored. Stack: Python, FastAPI, Redis, WebSockets, Web Crypto API, Chrome Extension API, PWA RSA-2048 per-session keys 0 data stored on the server Security: - RSA-OAEP 2048 key pair generated per session in the extension - End to end: the server relays ciphertext and never sees plaintext - Sessions locked to the first device - Keys in Redis expire on a TTL; HTTPS required Desktop extension: - Generates the key pair on demand and shows the QR code - Messages arrive over WebSocket and are decrypted locally - Configurable session duration and message limit Mobile: - Progressive web app with offline support - Built-in QR scanner; works with the native camera too - Encrypts with the Web Crypto API before sending - Redirects automatically when the session expires Performance: - No polling: WebSocket delivery - Redis-backed sessions with TTL cleanup - Multiple messages per session ### High-availability ERP infrastructure — https://hardikzinzu.com/work/ha-infrastructure/ infrastructure, production, 2025. Fault-tolerant ERPNext hosting: two application servers, a primary MariaDB with a synced replica and failover, CI/CD, and Grafana plus Prometheus monitoring. Two application servers, a primary MariaDB with a replica promoted on failure, and Grafana alerting on every environment. Stack: MariaDB replication, Docker, CI/CD, Grafana, Prometheus, Ansible, AWS, Azure, GCP 99%+ uptime 2 + 2 application and database servers Topology: - Two application servers: one serves users, one serves API traffic and frequent cron jobs - One primary MariaDB connected to both application servers - A replica kept in sync and promoted when the primary fails - AWS, Azure and GCP: DNS, SSL, backups, scaling Delivery: - Custom Dockerfiles and Compose environments tuned for build and runtime - CI/CD pipelines with zero-downtime deployments - Documented runbooks for every environment Observability: - Grafana and Prometheus across all managed environments - Alerts on database health, queue depth, disk, TLS expiry and application errors - Alerts page on symptoms users would feel, not on every metric ## Industries - Manufacturing: End-to-end ERPNext for a bakery manufacturer: production, stock and invoicing on a primary and replica pair. (https://hardikzinzu.com/services/implementation/) - Distribution and logistics: A trading business with thousands of SKUs across warehouses, and freight handling for international shipments. (https://hardikzinzu.com/services/implementation/) - Retail and e-commerce: Shopify orders becoming submitted Sales Orders, Invoices and Delivery Notes on a schedule. (https://hardikzinzu.com/work/shopify-erpnext-suite/) - Service and hospitality: ERPNext and custom Frappe apps for service businesses. These engagements are not published. (https://hardikzinzu.com/services/custom-apps/) ## Profiles - github: https://github.com/Z4nzu - linkedin: https://linkedin.com/in/hardikzinzu - medium: https://medium.com/@hardikzinzu - frappe: https://discuss.frappe.io/u/hardik_zinzu - youtube: https://www.youtube.com/@hardikzinzu - tryhackme: https://tryhackme.com/p/hardikzinzu