AI Randevu Web Sitenize E-posta Bildirimleri Ekleyin

Supabase, Resend ve Edge Functions kullanarak randevu onay e-postaları ve işletme sahibi bildirimleri gönderin.

Yol Haritası ve Kaynaklar

Yeni misiniz? Önce Buradan Başlayın

Bu rehber, AI Randevu Web Sitesi projesini otomatik e-posta bildirimleriyle yükseltir. Randevu web sitesini henüz oluşturmadıysanız, önce ana rehberle başlayın.

AI ile Randevu Web Sitesi Oluşturun

Ana rehberi açın

MAIN GUIDE

https://profitstudio.app/video/build-booking-website-ai

Randevu E-postaları İçin Resend'i Kurun

Resend Hesabınızı Oluşturun ve Yapılandırın

Resend'i açın

https://resend.com/

Resend hesabı oluşturun Resend API anahtarı oluşturun API anahtarını kopyalayıp güvenli bir yerde saklayın

ÖNEMLİ

Resend API anahtarını gizli tutun. Asla frontend koduna eklemeyin ve herkese açık şekilde paylaşmayın.

Gönderim Alan Adınızı Ekleyin ve Doğrulayın

Rezervasyon web sitenizin alan adını ekleyin En yakın bölgeyi seçin DNS kayıtlarını Resend'den kopyalayın Kayıtları alan adı sağlayıcınıza ekleyin Resend'e dönün ve alan adının doğrulandığını onaylayın

DNS doğrulaması, alan adı sağlayıcınıza bağlı olarak birkaç dakika veya daha uzun sürebilir.

Randevu E-postası Fonksiyonunu Oluşturun

Rezervasyon E-postası Edge Function'ını Oluşturun

Supabase'i açın

https://supabase.com/?utm_source=partner&utm_medium=social&utm_campaign=supasquad&dub_id=faVfKdcLWvKCbYNp

Supabase projenizi açın Edge Functions'ı açın Tarayıcı düzenleyicisini kullanarak yeni bir fonksiyon oluşturun Fonksiyona `send-booking-email` adını verin Varsayılan başlangıç kodunu silin

Fonksiyon Kodunu Özelleştirin ve Ekleyin

Sahibin e-posta adresini girin Doğrulanmış Resend alan adını girin Gönderen işletme adını girin Gerekirse e-posta şablonlarını özelleştirin Oluşturulan fonksiyon kodunu kopyalayıp yapıştırın

Randevu E-postası Fonksiyonu

import { serve } from "https://deno.land/std/http/server.ts"; serve(async (req) => { try { const body = await req.json(); const record = body.record || {}; const resendKey = Deno.env.get("RESEND_API_KEY"); const supabaseUrl = Deno.env.get("SUPABASE_URL"); const supabaseServiceRoleKey = Deno.env.get("SUPABASE_SERVICE_ROLE_KEY"); if (!resendKey) { return new Response( JSON.stringify({ error: "Missing RESEND_API_KEY secret" }), { status: 500, headers: { "Content-Type": "application/json" }, } ); } const ownerEmail = "YOUR_OWNER_EMAIL"; const customerEmail = record.email || ""; const customerName = record.full_name || record.name || "Customer"; const phone = record.phone || ""; const appointmentDate = record.appointment_date || record.date || ""; const startTime = record.start_time || record.time || ""; const endTime = record.end_time || ""; const notes = record.notes || ""; const status = record.status || "New"; let serviceName = record.service_name || record.service || record.service_title || ""; // If the appointment only has service_id, fetch the service name from the services table if (!serviceName && record.service_id && supabaseUrl && supabaseServiceRoleKey) { try { const serviceId = encodeURIComponent(record.service_id); const serviceResponse = await fetch( `${supabaseUrl}/rest/v1/services?id=eq.${serviceId}&select=name`, { method: "GET", headers: { apikey: supabaseServiceRoleKey, Authorization: `Bearer ${supabaseServiceRoleKey}`, "Content-Type": "application/json", }, } ); const serviceData = await serviceResponse.json(); if (Array.isArray(serviceData) && serviceData.length > 0) { serviceName = serviceData[0].name || ""; } } catch (_serviceError) { serviceName = ""; } } if (!serviceName) { serviceName = "Appointment"; } // 1) Email to business owner const ownerResponse = await fetch("https://api.resend.com/emails", { method: "POST", headers: { Authorization: `Bearer ${resendKey}`, "Content-Type": "application/json", }, body: JSON.stringify({ from: "Bookings <bookings@YOUR_DOMAIN_NAME>", to: [ownerEmail], subject: "OWNER_NOTIFICATION_SUBJECT", html: ` <h2>OWNER_NOTIFICATION_HEADING</h2> <p>OWNER_NOTIFICATION_INTRO</p> <p><b>Customer Name:</b> ${customerName}</p> <p><b>Email:</b> ${customerEmail}</p> <p><b>Phone:</b> ${phone}</p> <p><b>Service:</b> ${serviceName}</p> <p><b>Date:</b> ${appointmentDate}</p> <p><b>Start Time:</b> ${startTime}</p> <p><b>End Time:</b> ${endTime}</p> <p><b>Notes:</b> ${notes}</p> <p><b>Status:</b> ${status}</p> `, }), }); const ownerData = await ownerResponse.json(); // 2) Email to customer let customerData = null; if (customerEmail) { const customerResponse = await fetch("https://api.resend.com/emails", { method: "POST", headers: { Authorization: `Bearer ${resendKey}`, "Content-Type": "application/json", }, body: JSON.stringify({ from: "YOUR_BUSINESS_NAME <bookings@YOUR_DOMAIN_NAME>", to: [customerEmail], subject: "CUSTOMER_CONFIRMATION_SUBJECT", html: ` <h2>CUSTOMER_CONFIRMATION_HEADING</h2> <p>Hi ${customerName},</p> <p>CUSTOMER_CONFIRMATION_INTRO</p> <p><b>Service:</b> ${serviceName}</p> <p><b>Date:</b> ${appointmentDate}</p> <p><b>Start Time:</b> ${startTime}</p> <p><b>End Time:</b> ${endTime}</p> <p>If you need to make any changes, please contact us before your appointment.</p> <p>CUSTOMER_CONFIRMATION_CLOSING</p> `, }), }); customerData = await customerResponse.json(); } return new Response( JSON.stringify({ success: true, ownerEmailSent: ownerData, customerEmailSent: customerData, }), { headers: { "Content-Type": "application/json" }, } ); } catch (error) { return new Response( JSON.stringify({ success: false, error: String(error), }), { status: 500, headers: { "Content-Type": "application/json" }, } ); } });

İşletme Sahibi E-postası

owner@example.com

Doğrulanmış Resend Alan Adı

yourdomain.com

Gönderen İşletme Adı

Bright Diş Kliniği

İşletme Sahibi E-postası Konusu

İşletme Sahibi E-postası Başlığı

İşletme Sahibi E-postası Giriş Metni

Müşteri E-postası Konusu

Müşteri E-postası Başlığı

Müşteri E-postası Giriş Metni

Müşteri E-postası Kapanış Metni

Fonksiyonu Yayınlayın ve Yapılandırın

Fonksiyonu yayınlayın Fonksiyon ayarlarını açın `Verify JWT With Legacy Secret` seçeneğini kapatın Değişiklikleri kaydedin Webhook kurulumu için fonksiyonun endpoint URL'sini kopyalayıp saklayın

ÖNEMLİ

Database Webhook'un fonksiyonu çağırabilmesi için “Verify JWT With Legacy Secret” seçeneğini kapatın.

Resend API Anahtarını Supabase'e Ekleyin

Resend API Anahtarını Supabase Secret Olarak Ekleyin

Edge Function Secrets bölümünü açın Yeni bir secret oluşturun Adını `RESEND_API_KEY` olarak ayarlayın Resend API anahtarını yapıştırın Secret'ı kaydedin

ÖNEMLİ

Secret adını tam olarak `RESEND_API_KEY` şeklinde kullanın. En küçük bir yazım hatası fonksiyonun Resend'e erişmesini engeller.

E-postaları Yeni Randevulara Bağlayın

Rezervasyon E-postası Webhook'unu Oluşturun

Yeni bir randevu eklendiğinde rezervasyon e-posta fonksiyonunu tetikleyin.

Integrations Database Webhooks

Database Webhooks bölümünü açın Database Webhooks'u etkinleştirin Yeni bir webhook oluşturun Adını `send-booking-email-webhook` koyun `public.appointments` tablosunu seçin Olay olarak `Insert` seçin Tür olarak `HTTP Request` bırakın İstek yöntemi olarak `POST` kullanın Edge Function endpoint URL'sini yapıştırın Webhook'u oluşturun

Randevu E-postası Sistemini Test Edin

Rezervasyon E-posta Akışının Tamamını Test Edin

Rezervasyon akışının tamamını test edin ve her iki e-postanın da doğru şekilde iletildiğini doğrulayın.

Yayındaki rezervasyon web sitesini açın Test amaçlı bir randevu gönderin Rezervasyonun Supabase'e kaydedildiğini doğrulayın Müşteriye giden onay e-postasını kontrol edin İşletme sahibine giden bildirim e-postasını kontrol edin Rezervasyon bilgilerinin her iki e-postada da doğru olduğunu doğrulayın Rezervasyonun yönetim panelinde göründüğünü doğrulayın