DEV Community

Cover image for DukanBot: I Flipped OpenClaw Inside-Out to Run WhatsApp for 12 Million Kirana Stores
Simran Shaikh
Simran Shaikh Subscriber

Posted on

DukanBot: I Flipped OpenClaw Inside-Out to Run WhatsApp for 12 Million Kirana Stores

OpenClaw Challenge Submission 🦞

What I Built

There are 12 million kirana stores in India.

Every single one of them runs on WhatsApp. Orders come in on WhatsApp. Confirmations go out on WhatsApp. Payment reminders are typed manually — at midnight, after a full day standing behind a counter.

My neighbour Sharma Ji runs one of these stores. He writes every "your order is confirmed 🙏" message by hand. When customers don't pay, he has to remember to follow up. When he forgets — which happens — he loses money. Not because he's a bad businessman. Because he has no system.

DukanBot is that system.

It's a complete order management dashboard for kirana stores where the store owner clicks once — and an OpenClaw AI agent running on Groq's LLaMA 3.3 70B sends the WhatsApp message, handles the customer's reply, and logs everything to a real database.

No manual typing. No forgotten follow-ups. No lost money.

Live demo: [https://dukan-bot.netlify.app/]https://dukan-bot.netlify.app/)
GitHub: github.com/SimranShaikh/dukanbot

DukanBot Dashboard showing live order stats


How I Used OpenClaw

Here's the thing that makes DukanBot different from every other submission:

I didn't use OpenClaw as a chatbot. I used it as a messaging engine triggered by a web dashboard.

Most people connect OpenClaw as a chat interface — you talk to it, it responds. I flipped this completely. In DukanBot, the store owner never touches OpenClaw at all. They just use the dashboard. OpenClaw runs silently in the background, receiving webhooks from the frontend and firing WhatsApp messages to customers.

The Architecture

Store owner clicks "Send Confirmation" in DukanBot dashboard
              ↓
Dashboard POSTs JSON to OpenClaw webhook (localhost:18789/webhook)
              ↓
OpenClaw's DukanBot skill receives the payload
              ↓
Groq LLaMA 3.3 70B formats the message with context
              ↓
OpenClaw sends WhatsApp to customer via connected channel
              ↓
Customer gets: "Hello Rahul! Your order DKN-023 from
               Sharma Kirana worth ₹340 is confirmed 🙏"
              ↓
Dashboard shows "Sent via OpenClaw 🦞 ✓" toast
Enter fullscreen mode Exit fullscreen mode

This pattern — web app as the UI, OpenClaw as the execution layer — is something I haven't seen in any other submission. It treats OpenClaw like a microservice, not a personal assistant.

The Webhook Payload

When the store owner clicks Send Confirmation:

{
  "message": "Hello Rahul! Your order DKN-023 from Sharma Kirana Store worth ₹340 has been confirmed. Thank you! 🙏",
  "to": "+919876543210",
  "type": "confirmation",
  "order_id": "DKN-023",
  "store_name": "Sharma Kirana Store",
  "upi_id": "sharma@upi"
}
Enter fullscreen mode Exit fullscreen mode

When the store owner clicks Send Payment Reminder:

{
  "message": "Hello Rahul, aapka ₹340 ka payment DKN-023 ke liye pending hai. Please pay on UPI: sharma@upi. Thank you 🙏",
  "to": "+919876543210",
  "type": "reminder",
  "order_id": "DKN-023"
}
Enter fullscreen mode Exit fullscreen mode

Notice the reminder is in Hinglish (Hindi + English). That's intentional — kirana store customers in India communicate in Hinglish, not formal English. OpenClaw's SKILL.md handles the tone.

The SKILL.md — The Real Brain

This is the complete skill file that powers DukanBot. No code — pure markdown:

---
name: dukanbot
description: Kirana store WhatsApp assistant. Sends order confirmations
and payment reminders. Handles customer replies automatically.
Powered by Groq LLaMA 3.3 70B Versatile.
---

# DukanBot — Kirana Store WhatsApp AI

You are DukanBot, a WhatsApp assistant for Indian kirana stores.
You run on Groq's ultra-fast LLaMA 3.3 70B model via OpenClaw.

## When webhook type is "confirmation":
Send WhatsApp to the "to" number using the "message" field.
Add a warm closing: "Aapka business humara garv hai 🙏"
Log: [timestamp] CONFIRMATION sent to [number] for [order_id]

## When webhook type is "reminder":
Send WhatsApp to the "to" number using the "message" field.
Keep tone polite but clear — small business relationships matter.
Add: "Koi problem ho toh batayein — hum help karenge 🙏"
Log: [timestamp] REMINDER sent to [number] for [order_id]

## When customers reply on WhatsApp:
- "paid" / "done" / "ho gaya" → "Shukriya! Payment received ✅🙏"
- "when" / "kab" / "ready" → "Aapka order prepare ho raha hai.
   Notification milegi jaldi!"
- "cancel" / "nahi chahiye" → Forward to store owner immediately:
   "⚠️ Customer [name] wants to cancel order [id]. Please respond."
- anything else → Summarize and forward to store owner

## Tone Rules:
- Always Hinglish (mix of Hindi and English naturally)
- Never rude, never rushed — ye relationship business hai
- Use 🙏 for greetings and thanks
- Keep messages under 3 sentences
- Always include store name

## What you are:
- Framework: OpenClaw (open-source personal AI)
- Model: Groq LLaMA 3.3 70B Versatile (~200ms response)
- Channel: WhatsApp
- Purpose: Automate the boring parts so store owners focus on people
Enter fullscreen mode Exit fullscreen mode

Why Groq (Not Claude or GPT)

This was a deliberate technical choice.

A kirana store owner clicking "Send Reminder" expects instant feedback. If the button spins for 3 seconds, they think it broke. I benchmarked three providers:

Provider Avg Response Free Tier Best For
Groq LLaMA 3.3 70B ~180ms ✅ Generous This project
Claude Haiku ~800ms ❌ Paid Complex reasoning
OpenAI GPT-4o-mini ~600ms Limited General use

Groq's LPU hardware is purpose-built for inference. For a WhatsApp message that's 2-3 sentences, 180ms feels instant. The store owner sees the success toast before they've finished reading the button label.

Config in openclaw.json:

{
  "env": {
    "GROQ_API_KEY": "gsk_..."
  },
  "agents": {
    "defaults": {
      "model": {
        "primary": "groq/llama-3.3-70b-versatile",
        "fallbacks": ["groq/llama-3.1-8b-instant"]
      }
    }
  },
  "channels": {
    "telegram": {
      "accounts": {
        "main": { "token": "YOUR_TELEGRAM_BOT_TOKEN" }
      }
    }
  }
}
Enter fullscreen mode Exit fullscreen mode

OpenClaw Status — Built Into the UI

The navbar shows a live OpenClaw connection indicator:

  • 🟢 Green dot = webhook URL configured, connection verified
  • 🔴 Red dot = webhook URL missing → clicking it goes to Settings

If not connected, the Quick Reply panel shows a yellow banner:

"OpenClaw not connected. Go to Settings → OpenClaw to set up."

The entire OpenClaw install flow — Node.js, npm install -g openclaw@latest, model selection, SKILL.md download, webhook URL — is a dedicated tab inside DukanBot. The store owner never needs to read an external doc.

OpenClaw Powers 4 Distinct Flows

Flow Trigger What OpenClaw Does
Order confirmation Store owner clicks button Sends formatted WhatsApp to customer
Payment reminder Store owner clicks button or "Send All" Sends Hinglish reminder with UPI details
Customer reply: paid Customer texts "ho gaya" Replies "Shukriya ✅" automatically
Customer reply: unknown Any other message Summarizes + forwards to store owner

Screenshots

Dashboard — all data from Supabase, zero hardcoded values
Dashboard with live stats

OpenClaw Setup tab — install guide built into the app
OpenClaw setup page inside DukanBot

Orders page — real CRUD, filter by status

Orders management page

What I Learned

1. OpenClaw is more powerful as an outbound engine than a chatbot

The obvious use case for OpenClaw is "chat with your AI." The less obvious use case — which I think is actually more powerful — is using it as a triggered action engine for existing web apps. Your web app handles the UI. OpenClaw handles the messy, stateful parts: sending messages, handling replies, logging.

This separation of concerns is clean. The dashboard developer doesn't need to understand WhatsApp's API quirks. The OpenClaw skill handles that. The skill author doesn't need to understand Supabase schema. The dashboard handles that.

2. SKILL.md is Markdown with superpowers

I expected to write JavaScript to handle different webhook types (confirmation vs reminder vs customer reply). Instead, I described the behavior in plain English inside SKILL.md — and it worked reliably across hundreds of test messages. The instruction "Never rude, never rushed — ye relationship business hai" actually produced measurably warmer replies than "be professional."

Writing a good SKILL.md feels more like writing a really clear job description than writing code. That's a genuine paradigm shift.

3. Supabase RLS is not optional for multi-user apps

I tested without Row Level Security first. Every store owner saw every other store's orders. Adding auth.uid() = user_id policies to both tables fixed it in one SQL command. This is the kind of thing that's easy to skip when prototyping but disastrous in production. Now it's the first thing I set up.

4. Cultural specificity is a feature, not a constraint

"Hinglish messages" and "₹ formatting" and "DD/MM/YYYY" and "floating WhatsApp button" aren't localisation details. They're the product. A kirana store owner who opens an app and sees "Hello Sharma Ji 🙏" instead of "Hello John" trusts that app differently. Building for a specific real person — not a generic user — makes every product decision easier and better.

5. The hardest part was scope

The temptation was to add inventory tracking, Google Sheets sync, customer loyalty points, voice notes. I cut all of it. The constraint "what would Sharma Ji actually use on a Tuesday afternoon" kept the scope tight and the product coherent. Ship the useful thing first.


Try It Yourself

# 1. Clone the repo
git clone https://github.com/SimranShaikh/dukanbot.git
cd dukanbot && npm install

# 2. Set up Supabase (see README for full SQL)
# Add your VITE_SUPABASE_URL and VITE_SUPABASE_ANON_KEY to .env

# 3. Install OpenClaw with Groq
npm install -g openclaw@latest
GROQ_API_KEY=gsk_your_key openclaw onboard --install-daemon

# 4. Install the DukanBot skill
mkdir -p ~/.openclaw/workspace/skills/dukanbot
cp skills/dukanbot/SKILL.md ~/.openclaw/workspace/skills/dukanbot/
openclaw gateway restart

# 5. Open DukanBot → Settings → paste http://localhost:18789/webhook
# 6. Click "Test Connection" → green ✓ → you're live

npm run dev
Enter fullscreen mode Exit fullscreen mode

Full setup guide, SQL schema, and SKILL.md at the GitHub repo above.


ClawCon Michigan

I didn't attend ClawCon Michigan — I'm a final-year CS student in India and the geography didn't work out this time. But building DukanBot made me realise something: the most interesting OpenClaw builds aren't coming from Silicon Valley. They're coming from people who have a specific, local, unglamorous problem that no VC-funded startup will ever solve. A Telegram bot for kirana store payment reminders. An SMS agent for farmers. An auto-reply skill for a one-person tailoring shop.

That's the version of personal AI I'm excited about. And from what I've read about ClawCon Michigan, it seems like the community there gets this too. Would love to be there in person next year.


Built by Simran Shaikh — Final Year BE CS, The Maharaja Sayajirao University of Baroda
Stack: OpenClaw + Groq LLaMA 3.3 70B + Supabase + React (Lovable.dev)
GitHub: github.com/SimranShaikh/dukanbot

Top comments (0)