This project is a hands-on practice product that matches Devin's stack:
- Zoho CRM (Leads)
- AI email / call script generator (stub, no external AI)
- Voice notes (stub, local demo audio file)
- Mock Instantly.ai-style outreach queue
- Zoho widget UI
The goal is to teach you end-to-end Zoho app development: backend ⇄ Deluge ⇄ widget ⇄ Leads module.
zoho_ai_full_product/
backend/ # Node.js server (Express)
server.cjs
package.json
.env.example
public/
audio/
demo.mp3 # placeholder audio (empty file, replace with real mp3)
data/
prospects.json # created automatically
widget/ # Zoho widget UI
index.html
style.css
widget.js
deluge_examples/ # Deluge functions you can paste into Zoho
ai_email_from_backend.deluge.txt
voice_note_from_backend.deluge.txt
outreach_from_backend.deluge.txt
cd backend
cp .env.example .env # or create manually
npm install
npm startThe server listens on http://localhost:3000 by default.
-
Test in Postman / curl:
curl -X POST http://localhost:3000/api/ai/email \ -H "Content-Type: application/json" \ -d '{ "name": "William", "company": "Samplepop", "email": "test@example.com" }'
curl -X POST http://localhost:3000/api/voice \ -H "Content-Type: application/json" \ -d '{ "text": "This is a demo" }'
For voice: put any small mp3 file in backend/public/audio/demo.mp3
and restart the server.
ngrok http 3000Copy the HTTPS URL, e.g.:
https://brenda-prosthionic-randal.ngrok-free.app
- Put this into:
backend/.envasPUBLIC_BASE_URLwidget/widget.jsasBACKEND_BASE_URL- Deluge function URLs (instead of
http://localhost:3000).
In Setup → Modules and Fields → Leads → Layout add:
AI_Subject(Single line)AI_Email(Multi-line)Voice_Note_URL(URL or Text)Outreach_Prospect_Id(Single line)Outreach_Status(Single line)
The exact API names will be visible when you edit the field.
-
Zip the contents of the
widget/folder (its files directly at root of zip). Example:cd widget zip -r ../zoho-voice-widget.zip .
-
In Zoho CRM:
- Setup → Developer Hub → Widgets → Create Widget
- Type: Record (or Web Tab while testing)
- Hosting: Zoho
- Upload:
zoho-voice-widget.zip - Index page:
/index.html - Save.
-
Associate the widget with the Leads module record page.
When you open any Lead record, you should see the widget panel with:
- Lead name / company / email
- AI email section with a Generate / Refresh button
- Voice note section with Generate from email
- Outreach section with Send to mock Instantly.ai
-
Widget loads lead data using
ZOHO.CRM.API.getRecord. -
Buttons call your Node backend:
/api/ai/email→ returns subject & body/api/voice→ returnsaudioUrl/api/outreach/add-prospect→ returnsprospectId+status
-
Widget saves data back to Zoho with
ZOHO.CRM.API.updateRecord.
Import the code from deluge_examples/*.txt into Zoho functions and
call them from Workflow Rules (e.g. on lead create).
This lets you practise serverless automation + HTTP integration.
- Replace the stub email generator with a real LLM (Ollama, OpenAI, etc).
- Replace
/api/voicewith real TTS (ElevenLabs or an open-source model). - Call real Instantly.ai / other outreach APIs instead of the mock queue.
- Add logging & error panels to the widget.
- Create a Deals or Calls view that shows all prospects & their status.
This repo is intentionally small but hits all of Devin's requirements: Zoho + AI + voice + outreach + widgets + Deluge + Node backend.