<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Volodymyr Fursov</title>
    <description>The latest articles on DEV Community by Volodymyr Fursov (@furs).</description>
    <link>https://dev.to/furs</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3872017%2Fa35f785c-3d4e-4cee-afa4-f77dec8dd136.jpg</url>
      <title>DEV Community: Volodymyr Fursov</title>
      <link>https://dev.to/furs</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/furs"/>
    <language>en</language>
    <item>
      <title>How I Built an AI Booking Chat for Salons with Next.js, Supabase and Groq</title>
      <dc:creator>Volodymyr Fursov</dc:creator>
      <pubDate>Fri, 10 Apr 2026 15:09:30 +0000</pubDate>
      <link>https://dev.to/furs/how-i-built-an-ai-booking-chat-for-salons-with-nextjs-supabase-and-groq-45hm</link>
      <guid>https://dev.to/furs/how-i-built-an-ai-booking-chat-for-salons-with-nextjs-supabase-and-groq-45hm</guid>
      <description>&lt;p&gt;Most booking systems for salons look the same: pick a date, pick a time, pick a service, fill in your name, confirm. Five steps minimum.&lt;br&gt;
I wanted to build something different. What if customers could just type "Tomorrow 3pm haircut" and the system would understand it?&lt;br&gt;
The Problem&lt;br&gt;
I'm building term-in — a booking system for hair salons, beauty studios and barbershops in Germany. The DACH market (Germany, Austria, Switzerland) has around 80,000 salons, and the majority still rely on phone calls and paper calendars.&lt;br&gt;
The biggest pain points:&lt;/p&gt;

&lt;p&gt;Most booking attempts happen outside business hours — evenings, weekends, holidays&lt;br&gt;
No-show rates of 10-20% are common, costing salons thousands per month&lt;br&gt;
Salon owners want simple tools, not complex enterprise software&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;The Stack&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next.js with App Router and TypeScript&lt;br&gt;
Supabase (PostgreSQL) on EU servers for GDPR compliance&lt;br&gt;
Groq AI with Llama 3.3 70B for natural language understanding&lt;br&gt;
Twilio for SMS reminders&lt;br&gt;
Stripe for subscriptions&lt;br&gt;
Hetzner VPS + Cloudflare + PM2 + Nginx&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;How the AI Booking Works&lt;/strong&gt;&lt;br&gt;
The key insight: the AI only handles understanding, not flow control.&lt;br&gt;
javascriptconst userMessage = "Morgen 15 Uhr Haare schneiden bei Anna"&lt;/p&gt;

&lt;p&gt;const parsed = await groq.parse(userMessage)&lt;br&gt;
// { service: "Haarschnitt", date: "2026-04-11", time: "15:00", staff: "Anna" }&lt;/p&gt;

&lt;p&gt;if (parsed.service &amp;amp;&amp;amp; parsed.date &amp;amp;&amp;amp; parsed.time) {&lt;br&gt;
  const slot = await checkAvailability(parsed)&lt;br&gt;
  if (slot.available) {&lt;br&gt;
    await createBooking(slot)&lt;br&gt;
    await sendConfirmation(customer)&lt;br&gt;
  }&lt;br&gt;
}&lt;br&gt;
The AI never decides what happens next — it just extracts structured data from natural language. A state machine handles all business logic. This makes it reliable and predictable.&lt;br&gt;
Why separate AI from flow control? Because AI hallucinations in a booking context mean double-bookings, wrong times, or lost customers. The state machine catches anything the AI gets wrong before it reaches the database.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Why Groq + Llama?&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Speed: Groq returns responses in 200-400ms. For a chat interface, this feels instant.&lt;br&gt;
Cost: Significantly cheaper than GPT-4 for structured extraction tasks&lt;br&gt;
German language: Llama 3.3 70B handles German surprisingly well — including abbreviations like "Do 14h Schnitt" (Thursday 2pm haircut)&lt;br&gt;
No vendor lock-in: The extraction prompt is model-agnostic. I can swap to any model that handles German without changing business logic.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;SMS Reminders: The Highest ROI Feature&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;The biggest ROI feature isn't the AI booking — it's automatic SMS reminders 24 hours before each appointment.&lt;br&gt;
A simple text: "Hallo Frau Müller, Ihr Termin morgen um 14 Uhr bei Anna. Wir freuen uns auf Sie!"&lt;br&gt;
Industry data suggests SMS reminders can significantly reduce no-shows. At an average appointment value of €40-50, even preventing a few no-shows per week covers the entire cost of the software.&lt;br&gt;
The implementation is simple: a cron job runs every hour, queries upcoming appointments for the next 24 hours, and sends a Twilio SMS to each customer who hasn't been reminded yet. Total code: about 40 lines.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;GDPR: Not Optional in Germany&lt;/strong&gt;&lt;br&gt;
Building for the German market means GDPR compliance from day one:&lt;/p&gt;

&lt;p&gt;EU servers only: Supabase project in Frankfurt. No data leaves the EU.&lt;br&gt;
Cookie Consent Mode v2: Google Analytics loads but doesn't collect data until the user consents.&lt;br&gt;
Local fonts: No Google Fonts CDN. The Landgericht München ruled in 2022 (Az. 3 O 17493/20) that loading Google Fonts externally without consent is a GDPR violation.&lt;br&gt;
Data processing agreement: AV-Vertrag included out of the box.&lt;br&gt;
Right to deletion: One click deletes all customer data.&lt;/p&gt;

&lt;p&gt;In Germany, "DSGVO-konform" on your landing page is a real selling point.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Architecture: Standalone Deployment&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Next.js standalone output is great for VPS deployment:&lt;br&gt;
javascript// next.config.ts&lt;br&gt;
export default {&lt;br&gt;
  output: 'standalone',&lt;br&gt;
}&lt;br&gt;
This produces a self-contained server that runs with just node server.js. Combined with PM2 for process management and Nginx as a reverse proxy, it's a solid production setup.&lt;br&gt;
The deployment flow:&lt;/p&gt;

&lt;p&gt;Build locally: npm run build&lt;br&gt;
SCP the standalone folder + static assets to the VPS&lt;br&gt;
PM2 restarts the process&lt;/p&gt;

&lt;p&gt;Total deployment time: under 60 seconds.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Free Tools as Lead Magnets&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Instead of cold outreach, I built free tools that salon owners discover through search:&lt;/p&gt;

&lt;p&gt;Salon Digital Check — scores your salon's online presence in 60 seconds&lt;br&gt;
DSGVO Check — scans any website for GDPR violations&lt;br&gt;
No-Show Calculator — estimates how much no-shows cost your salon&lt;br&gt;
Booking Benchmark — compares your booking setup with other salons&lt;/p&gt;

&lt;p&gt;Each tool provides immediate value without requiring signup. An optional email wall after the results feeds into a nurture sequence.&lt;br&gt;
Current Status&lt;/p&gt;

&lt;p&gt;Pre-revenue, recently launched&lt;br&gt;
1,500+ SEO pages across 4 domains&lt;br&gt;
Building backlink profile through content and directory listings&lt;br&gt;
Pricing: €29/month (Pro), €79/month (Business), €499/month (Enterprise)&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;What I Learned&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;AI for understanding, not for flow control. Use it for NLU, use state machines for logic.&lt;br&gt;
SMS beats email for local businesses. Salon owners check their phone between clients.&lt;br&gt;
GDPR is a feature, not a burden. Build it in from day one and use it as a differentiator.&lt;br&gt;
Free tools beat cold outreach. A salon owner who discovers a problem through your tool is far more receptive than one who gets a cold email.&lt;br&gt;
Standalone Next.js + VPS is underrated. A €10/month Hetzner VPS handles everything for early-stage SaaS.&lt;/p&gt;

&lt;p&gt;Would love feedback from anyone building B2B SaaS for traditional industries. How did you get your first customers?&lt;br&gt;
term-in.app&lt;/p&gt;

</description>
      <category>ai</category>
      <category>webdev</category>
      <category>saas</category>
      <category>nextjs</category>
    </item>
  </channel>
</rss>
