Product Developer — Chatwoot

Bangalore, India · Aug 2021 — Aug 2022

Developed a chat widget builder and contributed to product features, reporting capabilities, enhancements, and bug fixes.

IMAP Email Channel — built an inbox-ingestion channel so teams could connect an existing support email address to Chatwoot for the first time, closing a feature request that had been open since June 2021.

  • Implemented IMAP inbox fetching via a background job and SMTP-based outbound replies, configurable per inbox, with existing default mail handling preserved for inboxes that didn't opt in.
  • Built conversation-threading logic to match inbound replies to the correct existing conversation instead of spawning duplicates; verified it manually against five reply scenarios — including replies to an earlier message in a chain and a conversation that predated the Chatwoot inbox — before requesting final review.
  • Added a safeguard, requested during review, to stop Chatwoot's own automated notification emails from being picked up and replied to by the IMAP fetcher, preventing an infinite email loop.
  • Added a scheduled cron job to poll IMAP inboxes on an interval, tuned during review from an initial aggressive setting to a safer default.
  • Delivered backend (Rails) and frontend (Vue.js) changes across 30 commits over about a month; merged by a co-founder, since I didn't yet have merge rights on the repo at that point.

Widget Builder — built a no-code, live-preview builder for the website chat widget in response to a recurring request from product and clients for customization without a developer.

  • Built a dashboard page letting admins edit widget avatar, name, welcome heading/tagline, reply-time text, color, bubble position/type, and launcher title, with a live preview pane reflecting changes before save.
  • Persisted the chosen styles on the backend and applied them to the live widget on load.
  • Addressed three rounds of frontend/CSS review feedback — wrapping radio groups in clickable labels, fixing radio-button alignment with flexbox, matching the "Powered by Chatwoot" branding component to the one used elsewhere in the app, and fixing a preview height jump between builder states — requesting re-review after each fix rather than batching them.
  • Recorded a Loom walkthrough of the live-editing flow as test evidence, since the feature's value was inherently visual.
  • Merged the PR myself, the first of my features I had merge rights for — a change from the IMAP PR ten months earlier. Still ships today as a documented settings tab in the product.

Live Agent Load Report API — built a reporting endpoint so admins could see real-time conversation load account-wide or per agent, without manually digging through the conversation list.

  • Built GET /api/v2/accounts/:id/reports/conversations, returning open/unattended/unassigned conversation counts scoped to the account, all agents, or a single agent via a user_id filter.
  • Refactored existing private helper methods out of V2::ReportBuilder into a new shared ReportHelper module rather than duplicating logic, then built the new metrics logic on top of it.
  • Manually tested all three scopes via Postman and included response screenshots as evidence in the PR description.
  • Fixed failing specs flagged in review, added three new controller specs covering the three scopes, and wrote full Swagger/OpenAPI documentation for the endpoint in the same PR.
  • Seeded a feature area that expanded shortly after into what's now the account-level and per-agent workload views on Chatwoot's Reports Overview page.