π ACTION PLAN v1.0 β AGUSTUS 2026
Action Plan: Hermes AI Agent Γ Panorama Nur Mecca
From Manual to Automated β Step by Step
Hermes v0.17.0 β VM-1-102
Telegram Gateway: ACTIVE
agenumroh.my.id β VPS 200
0. Current State Assessment
Where we stand today β infrastructure, wins, and gaps
Infrastructure
π₯οΈ
Hermes v0.17.0 on VM-1-102-ubuntu
Telegram gateway: ACTIVE
Telegram gateway: ACTIVE
π
agenumroh.my.id on VPS 200
Laravel 11 + MariaDB
Laravel 11 + MariaDB
ποΈ
DB: agenumroh @ 43.157.241.200
SSH tunnel from current VPS
SSH tunnel from current VPS
Database Tables
π₯ jamaah β customer records
π¦ partner_packages β umrah packages
βοΈ kloters β departure groups
π umroh_registrations β bookings
πΊοΈ itineraries β trip schedules
π manasik_* β rituals guide
π¨ hotel_* β accommodation
π€ vendor_* β vendor data
What's Working Now
- Telegram bot responding (user 227752163)
- Cron: umroh clusters generator (daily 10am)
- agenumroh CRM: jamaah, packages, kloters
- SSH tunnel: current VPS β VPS 200 DB
- Hermes memory & skills framework ready
What's Missing
- No API bridge between Hermes and agenumroh DB
- No automated content pipeline
- No customer communication automation
- No reporting automation
- No multi-agent setup
Phase 1 β Quick Wins
Phase 1 Progress0%
1.1 Content Drafting Bot
TODO
Create skill
pnm-content-drafter in Hermes
Admin kirim ke Telegram: "Buat konten paket [nama paket]"
Hermes reads partner_packages from DB (via SSH + mysql command) β generates 3 caption variants (hard-sell, emotional, informatif) + posting schedule
Test dengan paket existing, check output quality
write_file, terminal (SSH mysql), memory
2 jam
Fernando β Minggu 1, Hari 1-2
1.2 Daily Booking Summary
TODO
Create cron job, schedule
0 8 * * *
"Query agenumroh DB for new registrations in last 24h, summarize by status (baru/dihubungi/jadi_jamaah/batal), count seats available per active kloter. Format as morning briefing."
Telegram to user (227752163)
SELECT status, COUNT(*) as cnt
FROM umroh_registrations
WHERE created_at >= NOW() - INTERVAL 1 DAY
GROUP BY status;
Check Telegram each morning for 1 minggu
1 jam
Fernando β Minggu 1, Hari 2-3
1.3 Document Checklist Monitor
TODO
Create cron job, schedule
0 9 * * 1 (setiap Senin)
"Kloter B3: 3 jamaah belum lengkap (2 belum vaksin, 1 belum upload foto)"
SELECT j.nama, j.dok_vaksin, j.dok_foto,
k.kode as kloter
FROM jamaah j
JOIN umroh_registrations r ON j.id = r.jamaah_id
JOIN kloters k ON r.kloter_id = k.id
WHERE (j.dok_vaksin IS NULL OR j.dok_foto IS NULL)
AND k.status != 'selesai';
Manual check against DB
1 jam
Fernando β Minggu 1, Hari 3
1.4 Weekly Financial Snapshot
TODO
Create cron job, schedule
0 8 * * 1 (Senin 8am)
Count registrations, estimate revenue dari partner_packages.harga_jual Γ registrations per kloter
Telegram summary card: total pax, revenue estimate, kloter breakdown
1 jam
Fernando β Minggu 1, Hari 3-4
Phase 2 β Core Automation
Phase 2 Progress0%
2.1 Build REST API Bridge
TODO
On VPS 200: Create simple Laravel API routes untuk Hermes query. Routes:
GET /api/v1/jamaah/stats, GET /api/v1/kloter/active, GET /api/v1/package/{id}/seats. Auth: API key di .env
routes/api.phpuse Illuminate\Http\Request;
use Illuminate\Support\Facades\DB;
Route::middleware('auth:api')->group(function () {
Route::get('/jamaah/stats', function () {
$stats = DB::select("
SELECT status, COUNT(*) as cnt
FROM umroh_registrations
GROUP BY status
");
return response()->json([
'registrations' => $stats,
'total' => array_sum(array_column($stats, 'cnt')),
]);
});
Route::get('/kloter/active', function () {
$kloters = DB::table('kloters')
->where('status', 'active')
->get();
return response()->json($kloters);
});
Route::get('/package/{id}/seats', function ($id) {
$pkg = DB::table('partner_packages')->find($id);
$booked = DB::table('umroh_registrations')
->where('package_id', $id)
->whereNotIn('status', ['batal'])
->count();
return response()->json([
'package' => $pkg->name,
'total_seats' => $pkg->kuota,
'booked' => $booked,
'available' => $pkg->kuota - $booked,
]);
});
});
curl -H "Authorization: Bearer $API_KEY" \
https://agenumroh.my.id/api/v1/jamaah/stats
3-4 jam
Fernando β Minggu 3, Hari 1-2
2.2 Itinerary Auto-Generator
TODO
Admin kirim: "Generate itinerary kloter [kode], hotel [nama]"
Hermes queries kloter + package data β uses itinerary_templates and template_days from DB β generates formatted itinerary (HTML/PDF)
File saved to workspace + Telegram notification with preview
4 jam
Fernando β Minggu 3, Hari 3-4
2.3 Auto-Reply FAQ Bot
TODO
Seseorang kirim pesan ke Telegram bot dengan pertanyaan umum
"Berapa harga?", "Kapan berangkat?", "Hotel mana?", "Dokumen apa saja?"
Hermes checks FAQ skill/knowledge base β auto-respond with data dari DB β escalate "Hubungi admin" untuk complex questions
3 jam
Fernando β Minggu 4, Hari 1-2
2.4 Lead Follow-Up Scheduler
TODO
umroh_registrations WHERE status='baru' AND first_contact_at IS NULL β generate follow-up draft
umroh_registrations WHERE status='dihubungi' AND last_contact_at > 3 hari β "Follow-up needed"
"3 leads baru perlu dihubungi: [names, phone, package]"
2 jam
Fernando β Minggu 4, Hari 3
Phase 3 β Intelligent Assistance
Phase 3 Progress0%
3.1 Customer Communication Pipeline
TODO
H-30 Welcome Message
H-14 Doc Checklist
H-7 Departure Briefing
H-3 Meeting Point
H-1 Final Reminder
Hermes generates draft β Telegram ke admin β admin approve β send ke jamaah. Uses jamaah + kloter data.
4 jam
Fernando β Minggu 5-6
3.2 Post-Trip Feedback Collection
TODO
Kloter status berubah ke 'selesai'
Auto-draft feedback survey β auto-send thank-you β aggregate responses β improvement report
3 jam
Fernando β Minggu 6-7
3.3 Content Calendar Automation
TODO
Weekly: Hermes generates 7-day content calendar based on upcoming departures, Islamic events, testimonials
Daily posting plan dengan captions ready. Admin approve Senin, Hermes auto-post sisa minggu
4 jam
Fernando β Minggu 7
3.4 Vendor Performance Tracker
TODO
Hotel vendors: room quality, response time, issues. Ticket partners: price, availability
Monthly report with recommendations
3 jam
Fernando β Minggu 8
Phase 4 β Full Integration
Phase 4 Progress0%
4.1 Multi-Agent Setup
TODO
Agent 1: Marketing
Agent 2: Operations
Agent 3: CS
Content, social media, campaigns
Itinerary, coordination, logistics
Customer inquiries, FAQ, follow-up
Via Kanban board. Each agent has own Hermes profile with specialized skills.
8 jam β Fernando β Minggu 9-10
4.2 Real-Time Dashboard
TODO
Active kloters, seat occupancy, revenue, pending tasks β accessible via browser
Via cron, Hermes regenerates HTML dashboard periodically
6 jam
Fernando β Minggu 10-11
4.3 WhatsApp Blast Automation
TODO
Fonnte/WABiz gateway. Hermes drafts β admin approve β auto-send to segment
Per kloter, per status, per location
Opt-out handling, message limits
4 jam
Fernando β Minggu 11-12
5. Prompt Library
Copy-paste ready prompts β tested, with SQL examples
1. Generate Caption for Paket
PHASE 1Prompt
Buat konten promosi untuk paket umroh berikut:
Nama: [NAMA_PAKET]
Harga: [HARGA]
Durasi: [HARI] hari
Hotel: [NAMA_HOTEL]
Maskapai: [MASKAPAI]
Keberangkatan: [TANGGAL]
Buat 3 varian caption:
1. Hard-sell (urgensi, harga, CTA)
2. Emotional (impian, perjalanan spiritual)
3. Informatif (detail lengkap, FAQ)
Sertakan 5 hashtag populer + jadwal posting ideal.
SQL Query
SELECT name, harga_jual, durasi_hari, hotel_name, maskapai,
tanggal_berangkatan, kuota, deskripsi
FROM partner_packages
WHERE name LIKE '%[NAMA_PAKET]%';
Customization
Ganti variabel dalam [] dengan data dari DB. Tambahkan brand voice guidelines di skill setup.
2. Morning Booking Summary
PHASE 1Prompt
Query agenumroh DB for new registrations in last 24 hours.
Summarize by status: baru, dihubungi, jadi_jamaah, batal.
Count seats available per active kloter.
Format as morning briefing for admin β concise, actionable.
SQL Query
-- Registrations last 24h
SELECT status, COUNT(*) as cnt
FROM umroh_registrations
WHERE created_at >= NOW() - INTERVAL 1 DAY
GROUP BY status;
-- Active kloters with seat count
SELECT k.kode, k.nama, p.kuota,
COUNT(CASE WHEN r.status != 'batal' THEN 1 END) as booked,
p.kuota - COUNT(CASE WHEN r.status != 'batal' THEN 1 END) as available
FROM kloters k
JOIN partner_packages p ON k.package_id = p.id
LEFT JOIN umroh_registrations r ON r.kloter_id = k.id
WHERE k.status = 'active'
GROUP BY k.id;
π Expected Output
Selamat Pagi Fernando! βοΈπ Booking Summary (24h)
β’ Baru: 2 | Dihubungi: 1 | Jadi Jamaah: 3 | Batal: 0
βοΈ Active Kloters
β’ A1 (14 Apr): 28/40 seat (12 tersisa)
β’ B3 (21 Apr): 35/35 seat β οΈ FULL
β’ C2 (28 Apr): 12/45 seat (33 tersisa)
3. Document Checklist for Kloter
PHASE 1Prompt
Cek kelengkapan dokumen jamaah untuk kloter [KODE_KLOTER].
Query dok_* fields, list jamaah dengan dokumen yang belum lengkap.
Format: per kloter, per jamaah, apa yang kurang.
SQL Query
SELECT j.nama, j.no_hp,
CASE WHEN j.dok_vaksin IS NULL THEN 'β Vaksin' ELSE 'β
Vaksin' END as vaksin,
CASE WHEN j.dok_paspor IS NULL THEN 'β Paspor' ELSE 'β
Paspor' END as paspor,
CASE WHEN j.dok_foto IS NULL THEN 'β Foto' ELSE 'β
Foto' END as foto,
CASE WHEN j.dok_ktp IS NULL THEN 'β KTP' ELSE 'β
KTP' END as ktp
FROM jamaah j
JOIN umroh_registrations r ON j.id = r.jamaah_id
JOIN kloters k ON r.kloter_id = k.id
WHERE k.kode = '[KODE_KLOTER]'
AND r.status != 'batal'
HAVING vaksin LIKE 'β%' OR paspor LIKE 'β%' OR foto LIKE 'β%' OR ktp LIKE 'β%';
π Expected Output
π Dokumen Kloter B3 β 3 jamaah belum lengkap:1. Ahmad Fauzi (0812xxx) β β Vaksin, β Paspor
2. Siti Rahma (0813xxx) β β Foto
3. Budi Santoso (0815xxx) β β KTP
4. Generate Itinerary for Kloter
PHASE 2Prompt
Generate itinerary untuk kloter [KODE_KLOTER].
Query data kloter, package, dan itinerary_templates dari DB.
Format: day-by-day schedule, waktu sholat, lokasi, hotel, catatan penting.
Output sebagai HTML yang bisa di-share ke jamaah.
SQL Query
SELECT k.kode, p.name as package, p.durasi_hari,
k.tanggal_berangkatan, k.tanggal_pulang,
h.nama as hotel, h.alamat as hotelAlamat
FROM kloters k
JOIN partner_packages p ON k.package_id = p.id
LEFT JOIN hotels h ON k.hotel_id = h.id
WHERE k.kode = '[KODE_KLOTER]';
-- Template hari
SELECT * FROM itinerary_templates
WHERE package_id = (SELECT package_id FROM kloters WHERE kode = '[KODE_KLOTER]')
ORDER BY hari_ke;
π Expected Output
π Itinerary Kloter B3 β Umroh 12 HariFile saved:
itinerary-B3-14Apr2026.htmlTelegram: Preview + link to download
5. Follow-Up Leads Status Baru
PHASE 2Prompt
Cek leads umroh yang perlu dihubungi:
1. Status 'baru' + first_contact_at NULL β generate draft pesan perkenalan
2. Status 'dihubungi' + last_contact_at > 3 hari β generate follow-up
Kirim ke admin Telegram dengan nama, no_hp, package info.
SQL Query
-- Leads baru, belum dihubungi
SELECT j.nama, j.no_hp, p.name as package, r.created_at
FROM umroh_registrations r
JOIN jamaah j ON r.jamaah_id = j.id
JOIN partner_packages p ON r.package_id = p.id
WHERE r.status = 'baru' AND r.first_contact_at IS NULL
ORDER BY r.created_at ASC;
-- Perlu follow-up (3+ hari)
SELECT j.nama, j.no_hp, p.name as package, r.last_contact_at
FROM umroh_registrations r
JOIN jamaah j ON r.jamaah_id = j.id
JOIN partner_packages p ON r.package_id = p.id
WHERE r.status = 'dihubungi'
AND r.last_contact_at < NOW() - INTERVAL 3 DAY;
6. Weekly Content Calendar
PHASE 3Prompt
Generate content calendar untuk minggu [TANGGAL_MINGGU].
Berdasarkan:
- Kloter yang berangkat minggu ini
- Event Islami mendatang
- Testimoni jamaah terakhir
- Tips perjalanan ibadah
Output: 7 hari Γ 2 konten (pagi + sore), lengkap dengan caption + hashtag + waktu posting.
π Expected Output
π
Content Calendar β Minggu 14-20 Apr 2026π’ Senin: Testimoni jamaah (pagi), Tips dokumen (sore)
π΅ Selasa: Countdown B3 (pagi), Manasik reminder (sore)
π£ Rabu: Hotel showcase (pagi), Doa perjalanan (sore)
...dst
7. Customer H-7 Reminder Draft
PHASE 3Prompt
Draft H-7 reminder untuk jamaah kloter [KODE_KLOTER].
Include:
- Tanggal keberangkatan
- Meeting point & waktu
- Dokumen yang harus dibawa
- Checklist barang bawaan
- Nomor darurat
- Doa perjalanan
Bahasa: friendly, ramah, tapi informatif.
π Expected Output
π± Draft untuk admin review:"Assalamualaikum Bapak/Ibu, π
InsyaAllah 7 hari lagi kita berangkat umroh!
π Berangkat: 14 April 2026, pukul 20:00
π Meeting Point: Terminal 3, Soekarno-Hatta
π Yang harus dibawa:
β’ Paspor + visa
β’ Bukti vaksin
β’ Uang saku
β’ ...
π Hubungi admin: 0812-xxxx-xxxx
Selamat bersiap! Semoga menjadi h yang mabrur π€²"
8. Monthly Performance Report
PHASE 3Prompt
Generate monthly performance report untuk [BULAN] [TAHUN].
Include:
- Total registrations (new vs last month)
- Revenue estimate (harga_jual Γ count)
- Kloter completion rate
- Document readiness rate
- Vendor performance summary
- Content metrics (if available)
- Recommendations for next month
SQL Query
-- Monthly registrations
SELECT status, COUNT(*) as cnt
FROM umroh_registrations
WHERE MONTH(created_at) = [BULAN]
AND YEAR(created_at) = [TAHUN]
GROUP BY status;
-- Revenue estimate
SELECT k.kode, p.name, p.harga_jual,
COUNT(r.id) as pax,
p.harga_jual * COUNT(r.id) as estimated_revenue
FROM kloters k
JOIN partner_packages p ON k.package_id = p.id
LEFT JOIN umroh_registrations r ON r.kloter_id = k.id AND r.status != 'batal'
WHERE MONTH(k.tanggal_berangkatan) = [BULAN]
GROUP BY k.id;
π Expected Output
π Monthly Report β April 2026π Registrasi: 45 (β12% dari Maret)
π° Revenue Est: Rp 850,000,000
βοΈ Kloter selesai: 2/3 (67%)
π Doc ready: 88% (40/45 jamaah)
β Hotel avg rating: 4.2/5
π‘ Rekomendasi: Fokus promosi kloter C2 yang masih banyak slot
6. KPI Dashboard
Target metrics per phase
5-8
Jam/Minggu
Phase 1 β Quick Wins
12-15
Jam/Minggu
Phase 2 β Core Automation
20-25
Jam/Minggu
Phase 3 β Intelligent
40+
Jam/Minggu
Phase 4 β Full Integration
10x
Response Time
From hours β minutes
3x
Content Output
15 β 45+ posts/month
95%
Doc Readiness
Before departure target
+20%
Revenue Impact
Through better follow-up
7. Risk Register
Identified risks and mitigation strategies
| # | Risk | Probabilitas | Impact | Mitigation | Owner |
|---|---|---|---|---|---|
| 1 | DB connection failure (SSH tunnel down) | MEDIUM | HIGH | Fallback to manual query via VPS 200 SSH. Auto-reconnect script. | Fernando |
| 2 | AI generates wrong information | HIGH | HIGH | Human review mandatory for all customer-facing content. Never auto-send without approval. | Fernando |
| 3 | Telegram rate limit | LOW | MEDIUM | Use batching for bulk messages. Respect 30 msg/sec limit. | Hermes |
| 4 | Staff resistance to AI tools | MEDIUM | MEDIUM | Start with quick wins (Phase 1). Demonstrate value before pushing automation. | Fernando |
| 5 | Data privacy breach | LOW | HIGH | Never expose credentials. API keys in .env only. SSH tunnel encrypted. | Fernando |
| 6 | API breaking changes (Laravel upgrade) | LOW | MEDIUM | Version pinning (v1 prefix). Test suite before production deploy. | Fernando |
8. Resources Needed
Investment breakdown β mostly sweat equity
| Item | Cost | Priority | Status |
|---|---|---|---|
| Hermes v0.17.0 (VM-1-102) | Free | P0 | β DONE |
| Telegram Bot | Free | P0 | β DONE |
| SSH Tunnel to VPS 200 | Free | P0 | β DONE |
| REST API on VPS 200 | Free (dev time: 3-4h) | P1 | TODO |
| Fonnte WA Gateway | ~50k/bulan | P2 | TODO |
| Additional Hermes profile (Marketing) | Free | P2 | TODO |
| Hosting dashboard (static) | Free (can use VPS) | P2 | TODO |
9. Timeline β 12 Week Gantt
Visual overview of all phases and tasks
| Task | W1 | W2 | W3 | W4 | W5 | W6 | W7 | W8 | W9 | W10 | W11 | W12 |
|---|---|---|---|---|---|---|---|---|---|---|---|---|
| Phase 1 β Quick Wins | ||||||||||||
| 1.1 Content Drafting Bot | ||||||||||||
| 1.2 Daily Booking Summary | ||||||||||||
| 1.3 Doc Checklist Monitor | ||||||||||||
| 1.4 Weekly Financial Snapshot | ||||||||||||
| Phase 2 β Core Automation | ||||||||||||
| 2.1 Build REST API Bridge | ||||||||||||
| 2.2 Itinerary Auto-Generator | ||||||||||||
| 2.3 Auto-Reply FAQ Bot | ||||||||||||
| 2.4 Lead Follow-Up Scheduler | ||||||||||||
| Phase 3 β Intelligent | ||||||||||||
| 3.1 Communication Pipeline | ||||||||||||
| 3.2 Post-Trip Feedback | ||||||||||||
| 3.3 Content Calendar | ||||||||||||
| 3.4 Vendor Tracker | ||||||||||||
| Phase 4 β Full Integration | ||||||||||||
| 4.1 Multi-Agent Setup | ||||||||||||
| 4.2 Real-Time Dashboard | ||||||||||||
| 4.3 WhatsApp Blast | ||||||||||||