Deploy สลิป parser (parse สลิปธนาคารไทยเป็น JSON) ใน 5 นาที
ลูกค้าส่ง screenshot สลิป → API บอกได้ทันที: ใคร โอนเข้ามาจริงไหม จำนวนเท่าไหร่ เมื่อไหร่
ปัญหาที่ template นี้แก้
Thai e-commerce / SaaS ทุกแห่งเจอเหมือนกัน:
- Manual confirm payment — admin ต้อง check screenshot แต่ละ order
- Customer cheat — Photoshop สลิป (rare แต่เจอบ้าง)
- Slow refund/retry — เพราะ admin busy
- Cost — 100 orders/day × 2 min check × ฿200/hr labor = ฿200,000/yr labor cost
Solution: Slip parser API
- Customer ส่งสลิป → API extract สำคัญ: ผู้ส่ง / ผู้รับ / จำนวน / เวลา / transaction ref
- Cross-check transaction ref กับ bank API (Phase 4+)
- Auto-confirm payment ภายใน 5 วินาที
Template: slip-parser (฿599 premium)
| Detail | Value |
|---|---|
| Slug | slip-parser |
| Repo | `nirvadeploy/template-slip-parser` |
| Price | ฿599 one-time |
| Stack | Python + FastAPI + Claude API (Sonnet) |
| Banks supported | SCB, KBank (KPlus), BBL (BBL B+), KTB (Krungthai NEXT), TMB (TTB Touch), GSB (MyMo) |
| Avg parse time | 2-4 seconds |
| Accuracy | ~95% (ขึ้นกับคุณภาพรูป) |
Deploy ใน 3 ขั้นตอน
Step 1: ขอ Anthropic API key
ไปที่ console.anthropic.com → Create API key
ใส่ credit ขั้นต่ำ $5 (~฿180). Claude Sonnet สำหรับ image extraction:
- $3 per 1M input tokens, $15 per 1M output tokens
- Slip image ~1,000 tokens input + ~200 output = ~$0.006/slip
- 1,000 slips/mo = $6 (~฿216) — แค่ปานนั้น
Step 2: Deploy via Claude
"Deploy template slip-parser บน NirvaDeploy
ตั้ง ANTHROPIC_API_KEY=sk-ant-xxx"Claude:
- เรียก
nirvadeploy_deploy_template(slug="slip-parser", env={...}) - คืน service_id + URL
- Build เสร็จใน 60-90 วินาที
Step 3: ทดสอบ
# Upload สลิป image ผ่าน multipart
curl -X POST https://slip-parser.nirvadeploy.com/parse \
-F "[email protected]" \
-H "X-API-Key: your-key-here"Response:
{
"success": true,
"bank": "SCB",
"amount": 1500.00,
"currency": "THB",
"datetime": "2026-05-13T14:32:00+07:00",
"from": {
"name": "นาย สมชาย ใจดี",
"account_mask": "XXX-X-X1234"
},
"to": {
"name": "บริษัท เบสท์ จำกัด",
"account_mask": "XXX-X-X5678"
},
"transaction_ref": "SCB202605131432ABC123",
"qr_payload": null,
"confidence": 0.96,
"parsed_at": "2026-05-13T14:32:05Z"
}ใช้กับ e-commerce flow
Frontend (Next.js)
"use client";
import { useState } from "react";
export function SlipUploader({ orderId }: { orderId: string }) {
const [parsing, setParsing] = useState(false);
const [result, setResult] = useState<any>(null);
const handleUpload = async (file: File) => {
setParsing(true);
try {
const fd = new FormData();
fd.append("image", file);
fd.append("expected_amount", "1500.00");
fd.append("expected_account", "XXX-X-X5678"); // ของร้าน
const r = await fetch("/api/orders/confirm-slip", {
method: "POST",
body: fd,
});
const data = await r.json();
setResult(data);
} finally {
setParsing(false);
}
};
return (
<div>
<input
type="file"
accept="image/*,.pdf"
onChange={(e) => e.target.files && handleUpload(e.target.files[0])}
disabled={parsing}
/>
{parsing && <p>กำลังตรวจสอบสลิป...</p>}
{result?.success && (
<p>✅ ยืนยันการชำระเงินสำเร็จ ฿{result.amount}</p>
)}
{result?.success === false && (
<p>❌ {result.error} — ส่งสลิปใหม่หรือติดต่อ admin</p>
)}
</div>
);
}Backend route (Next.js)
// app/api/orders/confirm-slip/route.ts
export async function POST(req: Request) {
const formData = await req.formData();
const file = formData.get("image") as File;
const expectedAmount = parseFloat(formData.get("expected_amount") as string);
const expectedAccount = formData.get("expected_account") as string;
// Forward to slip-parser service
const fd = new FormData();
fd.append("image", file);
const r = await fetch("https://slip-parser.nirvadeploy.com/parse", {
method: "POST",
body: fd,
headers: { "X-API-Key": process.env.SLIP_PARSER_API_KEY! },
});
const slip = await r.json();
if (!slip.success || slip.confidence < 0.85) {
return Response.json({
success: false,
error: "ไม่สามารถอ่านสลิปได้ — กรุณาส่งรูปใหม่ที่ชัดเจน",
});
}
// Validate amount + receiver match
if (Math.abs(slip.amount - expectedAmount) > 0.01) {
return Response.json({
success: false,
error: `จำนวนไม่ตรง: สลิประบุ ฿${slip.amount} แต่ order ราคา ฿${expectedAmount}`,
});
}
if (!slip.to.account_mask.endsWith(expectedAccount.slice(-4))) {
return Response.json({
success: false,
error: "บัญชีผู้รับไม่ตรงกับร้าน",
});
}
// (Phase 4+) Cross-check with bank API for fraud prevention
// const verified = await verifyWithBankApi(slip.transaction_ref);
// if (!verified) return Response.json({ success: false, error: "Transaction ref ไม่พบในระบบธนาคาร" });
// Mark order paid
await prisma.order.update({
where: { id: orderId },
data: {
status: "PAID",
paid_at: new Date(slip.datetime),
payment_ref: slip.transaction_ref,
},
});
return Response.json({ success: true, amount: slip.amount });
}Limitations + edge cases
Quality of input image
- Best: screenshot ตรงจาก mobile banking app (highest quality)
- OK: ถ่ายรูปหน้าจอชัด แสงไม่สะท้อน
- Fail: รูปเบลอ, มุมเอียง, low resolution
Template strict mode: rejects images < 600px width.
Banks supported (Phase 2 — 6 banks)
✅ SCB, KBank, BBL, KTB, TMB, GSB
⏳ Phase 2.x will add:
- UOB Thailand
- CIMB Thai
- Krungsri (BAY)
- LH Bank
- TISCO
ถ้าธนาคารยังไม่ support → API returns:
{ "success": false, "error": "Unsupported bank: <name>", "bank_detected": "..." }Fraud prevention (Phase 4+)
Phase 2 = parse only — ไม่ verify ว่าเงินเข้าจริง Phase 4+ จะมี integration กับ:
- SCB Easy API (verify by reference)
- KBank K+ API
- TrueMoney webhook
จนกว่าจะมี integration → ลูกค้า cheat ด้วย Photoshop ได้ (rare แต่เป็นได้). Mitigation:
- Check transaction_ref uniqueness (ในของคุณเอง)
- Limit ครั้งแรกที่จำนวน < ฿5,000
- Manual admin review สำหรับ amount > ฿10,000
PDPA considerations
⚠️ สลิปคือ PII (ผู้ส่ง + ผู้รับ + บัญชี)
Template ตั้ง default:
- Image ไม่เก็บ หลัง parse (in-memory only)
- JSON response เก็บได้ — ระบุใน Privacy Policy ของคุณว่าเก็บนานเท่าไหร่
- Account number masked (XXX-X-X1234)
- Recommended retention: 90 วันสำหรับ payment dispute, ลบหลัง
ดู docs/affiliate-program.md PDPA section
ราคา + ROI
One-time: ฿599 (template purchase) Monthly (running):
- NirvaDeploy Hobby: ฿111/mo
- Claude API: ~฿200-500/mo (1K-5K slips)
- Total: ฿311-611/mo
ROI vs manual:
- 100 orders/day × 2 min × ฿200/hr = ฿200K/yr labor
- Slip parser: ฿7,332/yr (max scenario)
- Savings: ฿192K/yr
ใช้ใน production สำหรับ:
- ✅ E-commerce checkout (Shopee/Lazada/own site)
- ✅ Event ticket sales (Eventbrite Thailand alternative)
- ✅ Restaurant order confirmation (LINE OA bot)
- ✅ NGO donation receipt
- ✅ Educational fee payment
- ❌ ไม่เหมาะสำหรับ high-value transactions > ฿100K (ใช้ direct bank API แทน)
ลองเลย
Deploy template ที่ `/dashboard/templates` — paste slip-parser → enter Anthropic key → 3 มินาทีพร้อมใช้
หรือคุยกับ Claude: "Deploy slip-parser ให้ผมหน่อย"
คำถาม slip parser? Email [email protected] · Line OA `@nirvadeploy`
ชอบบทความนี้?
ลอง NirvaDeploy ฟรี
Free tier ตลอดชีพ · ไม่ต้องใส่บัตร · Sign in ด้วย Line/Google
เริ่มเลย →