Insert-between: OFF
Enter your access code
Click ▲ / ▼ to move a category up or down. Order saves automatically.
commas split tasks · @name assigns · #tag categorises · type "1 done" to tick off
Type orders freely — local parser handles math, AI fallback fills missing prices from catalog.
| ASIN | Product name | Size | Color | Qty |
|---|
| Product | Size | Color | Qty | Unit ₹ | Notes |
|---|
Upload an .xlsx, .xls, or .csv file. We'll map columns (name, size, color, price, stock, notes) automatically, show you all rows, flag duplicates, then import only what you approve. Choose AUTO to round-trip an exported inventory CSV — each row's id + category_name drive an update / insert with full diff preview.
Click any day to add a short note (meeting, visit, closure). Red shading marks weekends.
Pick a staff member on the left to see their attendance. The + button adds a new member.
Captain, C/O, Cadet). Group them by category for easier browsing.
Enter your admin PIN. Default is 1990 — change it in Settings.
Enter this month's staff and owner deposits per employee. Both add to the staff member's cumulative savings shown on every slip. Staff deposit is subtracted from net pay; owner deposit is held in savings only (does not affect monthly take-home). Re-saving the same month overwrites the previous entry.
Every salary slip ever generated is logged here with a unique SLIP-… ID. Click View to open the original — slips always render from their stored snapshot, so amendments to attendance or deposits never retro-mutate old slips.
Dump loose images here (WhatsApp screenshots, client photos, reference shots). Gemini auto-tags every upload with a category + keywords + short description so you can find them later. Click any image → "Assign to product" to link it into a product's 💾 Raw tab (no duplicate R2 upload).
Live view of your catalog. Numbers ignore empty rows.
API keys are stored in the database and used by the AI calculator and smart search.
Pick which AI suggests tags inside the inventory tag picker. "Both" shows Gemini vs OpenAI side-by-side. Uses the API keys configured below.
Get from aistudio.google.com/apikey — Gemini 2.5 Flash has a generous free tier (10 RPM · 500 req/day).
Get from platform.deepseek.com/api_keys
Get from platform.openai.com/api-keys
AI uses the USD rate to convert any "$" or "USD" amounts in the calculator.
Pre-filled URLs for the photo-drawer "Fetch images" dropdown — saves typing the same Amazon / Flipkart / Etsy / Meesho prefix every time. Drag rows to reorder.
Read-only token-authed API for your ecommerce site or WhatsApp bot to pull live product + photo data. Set a secret token below — clients send Authorization: Bearer <token> or ?api_key=<token>. CORS is open so any domain can call it; the token is the gate. Rate limit: 120 req/min/token.
GET /api/public/health
GET /api/public/categories
GET /api/public/products
?category_id= &tag= &q= &limit= &offset= &with_photos=1
GET /api/public/products/:id # single, full photos
GET /api/public/products/:id/seo # title, description, og_image, JSON-LD
GET /api/public/search?q=...
curl -H "Authorization: Bearer YOUR_TOKEN" https://staff.nodesurge.tech/api/public/health
The green 📲 button on every product row sends name + price + main-image link to this WhatsApp number via the existing Chatwoot inbox. Use your OWN phone number here — then forward manually to clients so it goes out as a personal message instead of from the business number.
product_share). Leave blank to fall back to free-form text.{{1}}, {{2}}, … in your approved template body. Order matters. Available: name, price, specs (size · color), size, color, stock. Example: a 2-variable template body "Order: {{1}} — {{2}}" should use name,price. Edit this field if Meta returns (#132000) Number of parameters does not match — change the comma-list until the count matches the {{n}} placeholders in your template.
{{n}} placeholders. Use the count to set "Template variables" above (e.g. name,price for a 2-var template, name,price,specs for 3-var).
Templates the panel knows how to send (defined in lib/templates.js). The status badge reflects the most recent whatsapp_log outcome — green = sent, red = last attempt failed. Click Test send to fire a sample send to the first admin's WhatsApp number; this proves the template is approved AND wired correctly without leaving the Settings page.
Connect your Chatwoot WhatsApp inbox so verified staff can run commands over WhatsApp with the #STAFF trigger.
Your Chatwoot instance URL (no trailing slash).
Found under Chatwoot → Profile Settings → Access Token, or create an Agent Bot token.
In Chatwoot: Inbox → Configuration → Webhook URL. Save the secret first.
Every WhatsApp message must start with this word to be processed. Default: #STAFF. Keep it short and unusual so regular chat doesn't trip it.
Names that show up as @mention autocomplete in Daily Work tasks and comments. Type a name + Enter to add. Full profile (phone, salary, PIN, etc.) is edited on the Staff tab.
Pick a visual palette. Saves instantly for everyone using this panel.
These appear on the salary-slip PDF. Upload a logo, paste both office addresses.
Appears above the salary-slip title. Optional.
Just the number shown on the slip — does not change salary math. Default 1.
Where all product images are stored. 10 GB free, unlimited egress. Create a bucket at dash.cloudflare.com/?to=/:account/r2 then paste the credentials below. All four fields required.
Used by the 🔍 Upscale button on any photo tile to 4× a low-res image via Real-ESRGAN. Get a free token at replicate.com/account/api-tokens. Cost is roughly ₹0.50–1.50 per image.
Second PIN that unlocks the Admin tab. Default 1990.
Tag management has its own page now — open the 🏷 Tags tab for category groups, search, and bulk-add.
Only these numbers can trigger #STAFF commands. Everyone else is ignored.
Dry-run a #STAFF command without sending anything via Chatwoot. Stock updates WILL apply if the intent is "receive_stock".
Bidirectional bot for the Daily Work module. Distinct from the legacy #STAFF webhook below — both can run side-by-side. Inbound URL for Chatwoot: POST /api/webhook/chatwoot.
Other bots can GET /api/internal/numbers (currently public per spec §9.11) to skip messages from registered staff. The token below is for future bearer-auth use.
Admins must start their message with this word for the bot to act on it. Staff numbers are captive — every message processed.
Every hit to the #STAFF webhook — including rejected and skipped ones. Use this to debug Chatwoot wiring.
Select categories to print. Stock column is blank for manual counting. ~30 rows per page.
Choose which fields to include. Labels follow each category's own column names.