Quay lại blog
ai10 phút đọc

Claude Code + Cursor: Startup 2 Người Ra Mắt SaaS Trong 30 Ngày

Hai nhà sáng lập Việt Nam không có nền tảng kỹ thuật xây dựng một SaaS quản lý phòng khám nha khoa đầy đủ — đặt lịch, hồ sơ bệnh nhân, hóa đơn, nhắc hẹn SMS — trong 30 ngày dùng Claude Code và Cursor. 15 phòng khám trả phí trong tháng đầu. Gọi vốn pre-seed dựa trên traction.

V
Bởi Ventra Rocket Team
·Đăng ngày 5 tháng 5, 2026
#Claude Code#Cursor#AI#SaaS#Startup

Hai nhà sáng lập. Không có nền tảng kỹ thuật. Không có vốn đầu tư. Một vấn đề domain họ hiểu sâu sắc — quản lý phòng khám nha khoa tại Việt Nam — và 30 ngày để xây dựng thứ gì đó mà các phòng khám thực sự sẽ trả tiền. Đây là cách Ventra Rocket hướng dẫn họ xây dựng một sản phẩm SaaS đầy đủ sử dụng Claude Code và Cursor như bộ máy kỹ thuật.

Bối Cảnh: Vấn Đề Thực, Không Có Kinh Nghiệm Code

Hai nhà sáng lập đã dành nhiều năm làm việc liên quan đến các phòng khám nha khoa — một người bán vật tư y tế, một người quản lý hành chính phòng khám. Họ hiểu vấn đề rất rõ:

  • Các phòng khám dùng hệ thống đặt lịch bằng giấy hoặc nhóm WhatsApp
  • Hồ sơ bệnh nhân trong file Excel, cập nhật không nhất quán
  • Hóa đơn thủ công, dễ sai, không có theo dõi thanh toán
  • Nhắc lịch hẹn được gửi thủ công qua Zalo

Các giải pháp phần mềm đã tồn tại nhưng đắt tiền (>$200/tháng), phức tạp và được thiết kế cho các bệnh viện lớn — không phải phòng khám nhỏ 2–5 ghế.

Cơ hội: một SaaS đơn giản, giá cả phải chăng được xây dựng riêng cho các phòng khám nha khoa Việt Nam.

Ràng buộc: không nhà sáng lập nào có thể viết code.

Cách Tiếp Cận: Phán Đoán Kỹ Thuật Thay Vì Giờ Kỹ Thuật

Lời khuyên của Ventra Rocket cho các nhà sáng lập rất rõ ràng: bạn không cần học code. Bạn cần học cách làm Product Manager, chuyên gia domain và QA Lead — và để AI xử lý tạo code. Công việc của bạn là phán đoán, không phải cú pháp.

Bộ công cụ:

  • Claude Code: Quyết định kiến trúc, logic phức tạp, debug, review code
  • Cursor: Triển khai tính năng nhanh, AI hỗ trợ trong editor
  • Next.js + Supabase + Stripe: Stack hiện đại, tài liệu tốt, nhiều training data AI
  • Vercel: Triển khai không cần cấu hình
  • Twilio: SMS nhắc lịch qua API

Tuần 1: Nền Tảng — Chạy Được Thứ Gì Đó

Các nhà sáng lập bắt đầu bằng cách mô tả sản phẩm chi tiết cho Claude Code. Claude Code trả về kiến trúc kỹ thuật đầy đủ:

nha-khoa-saas/
├── app/
│   ├── (auth)/login/ và register/
│   ├── (dashboard)/
│   │   ├── patients/
│   │   ├── appointments/
│   │   ├── invoices/
│   │   └── settings/
│   └── api/appointments/, patients/, invoices/, sms/
├── lib/
│   ├── supabase/, stripe/, twilio/
└── components/
    ├── ui/, calendar/, forms/

Claude Code sau đó tạo schema cơ sở dữ liệu Supabase:

CREATE TABLE clinics (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  name text NOT NULL,
  address text,
  phone text,
  subscription_status text DEFAULT 'trial',
  stripe_customer_id text,
  created_at timestamptz DEFAULT now()
);

CREATE TABLE patients (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  clinic_id uuid REFERENCES clinics(id),
  full_name text NOT NULL,
  phone text,
  date_of_birth date,
  medical_history jsonb DEFAULT '{}',
  created_at timestamptz DEFAULT now()
);

CREATE TABLE appointments (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  clinic_id uuid REFERENCES clinics(id),
  patient_id uuid REFERENCES patients(id),
  doctor_name text,
  scheduled_at timestamptz NOT NULL,
  duration_minutes int DEFAULT 30,
  status text DEFAULT 'scheduled',
  notes text,
  treatment_type text,
  reminder_sent_at timestamptz,
  created_at timestamptz DEFAULT now()
);

CREATE TABLE invoices (
  id uuid PRIMARY KEY DEFAULT gen_random_uuid(),
  clinic_id uuid REFERENCES clinics(id),
  patient_id uuid REFERENCES patients(id),
  appointment_id uuid REFERENCES appointments(id),
  line_items jsonb NOT NULL,
  total_amount decimal(10,2),
  status text DEFAULT 'pending',
  paid_at timestamptz,
  stripe_payment_intent_id text,
  created_at timestamptz DEFAULT now()
);

Cuối Tuần 1: đăng nhập, danh sách bệnh nhân và lịch hẹn đang chạy — đã triển khai trên Vercel.

Tuần 2: Tính Năng Cốt Lõi với Cursor

Với nền tảng đang chạy, các nhà sáng lập dùng Cursor để triển khai tính năng nhanh. Quy trình làm việc:

  1. Mô tả tính năng bằng tiếng Việt đơn giản cho Cursor chat
  2. Review code được tạo bằng cách nhờ Claude Code giải thích bất kỳ phần nào không hiểu
  3. Test thủ công dựa trên các tình huống phòng khám thực tế họ biết từ kinh nghiệm
  4. Báo lỗi bằng cách paste thông báo lỗi vào Claude Code để chẩn đoán

Ví dụ: Tính năng nhắc lịch SMS

Các nhà sáng lập mô tả: "Khi lịch hẹn còn 24 giờ, tự động gửi SMS nhắc bệnh nhân với ngày, giờ và tên bác sĩ."

Cursor tạo ra:

// app/api/reminders/route.ts
import { createClient } from '@/lib/supabase/server';
import twilio from 'twilio';

const twilioClient = twilio(
  process.env.TWILIO_ACCOUNT_SID,
  process.env.TWILIO_AUTH_TOKEN
);

export async function POST() {
  const supabase = createClient();

  const tomorrow = new Date();
  tomorrow.setHours(tomorrow.getHours() + 24);
  const dayAfter = new Date(tomorrow);
  dayAfter.setHours(dayAfter.getHours() + 1);

  const { data: appointments } = await supabase
    .from('appointments')
    .select('*, patients(full_name, phone), clinics(name)')
    .gte('scheduled_at', tomorrow.toISOString())
    .lte('scheduled_at', dayAfter.toISOString())
    .eq('status', 'scheduled')
    .is('reminder_sent_at', null);

  const results = await Promise.allSettled(
    (appointments ?? []).map(async (apt) => {
      const patient = apt.patients as { full_name: string; phone: string };
      const clinic = apt.clinics as { name: string };

      const scheduledDate = new Date(apt.scheduled_at);
      const timeStr = scheduledDate.toLocaleString('vi-VN', {
        timeZone: 'Asia/Ho_Chi_Minh',
        hour: '2-digit', minute: '2-digit',
        day: '2-digit', month: '2-digit',
      });

      await twilioClient.messages.create({
        body: `Nhắc lịch hẹn: ${patient.full_name} có lịch khám tại ${clinic.name} lúc ${timeStr} với BS ${apt.doctor_name}. Vui lòng đến đúng giờ.`,
        from: process.env.TWILIO_PHONE_NUMBER,
        to: `+84${patient.phone.replace(/^0/, '')}`,
      });

      await supabase
        .from('appointments')
        .update({ reminder_sent_at: new Date().toISOString() })
        .eq('id', apt.id);
    })
  );

  const sent = results.filter(r => r.status === 'fulfilled').length;
  return Response.json({ sent, total: appointments?.length ?? 0 });
}

Endpoint này sau đó được kích hoạt qua Vercel Cron Job mỗi giờ.

Tuần 3: Thanh Toán và Billing

Tích hợp Stripe là phần phức tạp nhất — billing đăng ký multi-tenant. Các nhà sáng lập mô tả mô hình giá; Claude Code tạo ra toàn bộ tích hợp Stripe:

// lib/stripe/subscriptions.ts
import Stripe from 'stripe';

const stripe = new Stripe(process.env.STRIPE_SECRET_KEY!);

export async function createClinicSubscription(clinicId: string, email: string) {
  const customer = await stripe.customers.create({
    email,
    metadata: { clinic_id: clinicId }
  });

  const subscription = await stripe.subscriptions.create({
    customer: customer.id,
    items: [{ price: process.env.STRIPE_PRICE_ID }],
    trial_period_days: 14,
    payment_behavior: 'default_incomplete',
    payment_settings: { save_default_payment_method: 'on_subscription' },
    expand: ['latest_invoice.payment_intent'],
  });

  return {
    customerId: customer.id,
    subscriptionId: subscription.id,
    clientSecret: (subscription.latest_invoice as Stripe.Invoice)
      .payment_intent
      ? ((subscription.latest_invoice as Stripe.Invoice).payment_intent as Stripe.PaymentIntent).client_secret
      : null,
  };
}

Tuần 4: Hoàn Thiện, QA và Ra Mắt

Tuần cuối là đóng góp quan trọng nhất của các nhà sáng lập: QA dựa trên domain expertise. Họ test từng tính năng dựa trên các tình huống phòng khám thực tế:

  • Điều gì xảy ra khi bệnh nhân hủy lịch 30 phút trước khi hẹn?
  • Bác sĩ có thể vô tình có lịch hẹn chồng chéo không?
  • Nếu hóa đơn được thanh toán một phần thì sao?

Claude Code sửa từng lỗi được báo cáo. Các nhà sáng lập không cần hiểu cách sửa — họ chỉ cần xác minh nó hoạt động.

Cuối Tuần 4: Triển khai lên production. Mời 5 chủ phòng khám quen biết tham gia beta testing.

Kết Quả

| Chỉ Số | Kết Quả | |--------|---------| | Thời gian đến MVP | 30 ngày | | Dòng code (do AI tạo) | ~8,500 (~80%) | | Tính năng đã ship | Đặt lịch, hồ sơ bệnh nhân, hóa đơn, SMS nhắc lịch, billing Stripe | | Phòng khám beta | 5 | | Phòng khám trả phí sau tháng 1 | 15 | | MRR tháng 1 | $900 | | Gọi vốn pre-seed | Thành công — dựa trên traction |

Bài Học Quan Trọng

AI Coding Tools Làm Cho Phán Đoán, Không Phải Code, Trở Thành Nút Thắt

Các nhà sáng lập hầu như không viết code. Những gì họ đóng góp là không thể thay thế: domain expertise (cách các phòng khám nha khoa Việt Nam thực sự hoạt động), quyết định UX (màn hình nào phòng khám cần), và phán đoán QA (test dựa trên các tình huống thực tế). AI không thể làm bất kỳ điều nào trong số này. Nó chỉ có thể viết code cho một sản phẩm mà người khác đã nghĩ ra.

Stack Phù Hợp Cho Phát Triển Hỗ Trợ AI

Chọn công nghệ có tài liệu mạnh và training data AI phong phú. Next.js, Supabase, Stripe và Twilio đều được đại diện tốt trong dữ liệu training của Claude. Điều này có nghĩa là code được tạo ra chính xác, theo idiom và sẵn sàng cho production với sửa chữa tối thiểu.

Cursor Cho Tốc Độ, Claude Code Cho Chiều Sâu

Quy trình nổi lên: Cursor cho triển khai tính năng nhanh (gợi ý inline, chỉnh sửa nhanh), Claude Code cho các quyết định kiến trúc và debug các vấn đề phức tạp. Chúng bổ sung, không thay thế nhau.

Validate Trước Khi Xây Dựng

Các nhà sáng lập dành Tuần 0 (trước khi có code) nói chuyện với 20 chủ phòng khám và xác nhận sẵn sàng trả tiền. Việc xây dựng 30 ngày nhanh vì yêu cầu sản phẩm đã được validate. AI coding tools khuếch đại tốc độ thực thi — chúng không thay thế việc validate thị trường.

Kết Luận

Hai nhà sáng lập không có kỹ thuật xây dựng SaaS production trong 30 ngày, có 15 khách hàng trả phí trong tháng đầu và gọi vốn pre-seed — tất cả bằng cách dùng Claude Code và Cursor như đội kỹ thuật.

Kết luận không phải là kỹ năng kỹ thuật không còn quan trọng. Mà là AI coding tools đã hạ ngưỡng kỹ năng kỹ thuật tối thiểu để thực thi một ý tưởng sản phẩm được xác định rõ ràng. Domain expertise và phán đoán sản phẩm giờ đây có tính phân biệt hơn kiến thức cú pháp.

Ventra Rocket giúp các nhà sáng lập và đội nhóm điều hướng phát triển hỗ trợ AI — từ kiến trúc đến ra mắt. Liên hệ với chúng tôi để xây dựng sản phẩm của bạn.

Bài viết liên quan