Replacing Expensive Twilio: Integrating Domestic SMS Auth in 5 Minutes with Supabase Custom SMS Hook
Giving Up on SMS Auth Because of Paperwork?
If you're building a side project or a startup MVP with Supabase, you inevitably hit a wall: SMS Authentication (OTP).
While Supabase offers Twilio by default, sending SMS to South Korea via Twilio is notoriously expensive (often over $0.08 per message) and sometimes suffers from low delivery rates. If you turn to local Korean SMS APIs, you are immediately blocked by tedious paperwork—business registration certificates, proof of usage, and mandatory sender ID pre-registration.
In this article, we'll show you how to replace expensive Twilio and implement fast, cost-effective SMS authentication in just 5 minutes using EasyAuth and the Supabase Custom SMS Hook—with absolutely zero paperwork.
Why EasyAuth?
For solo developers and early-stage startups, navigating complex approval processes is a waste of precious time. EasyAuth is a developer-friendly, ultra-simple SMS API that offers the following benefits:
- No Paperwork Required: Sign up and start using the API immediately without a business registration certificate.
- Automatic Sender ID: Skip the annoying sender ID pre-registration process.
- Reasonable Pricing: Only 15
25 KRW per message, significantly cheaper than Twilio or local competitors (3050 KRW). - Free Trial: Get 10 free test messages the moment you sign up.
With just two endpoints (POST /send and POST /verify), integration is highly intuitive.
Supabase Custom SMS Hook Integration Guide
Supabase recently introduced Auth Hooks, allowing you to connect external SMS providers via the Send SMS Hook. Let's create an Edge Function to route Supabase's OTPs through the EasyAuth API.
Step 1: Create a Supabase Edge Function
First, use the Supabase CLI to create a new Edge Function.
supabase functions new send-sms-easyauth
Step 2: Write the Edge Function Code
Open the generated supabase/functions/send-sms-easyauth/index.ts file and add the following code. This logic receives the OTP generated by Supabase Auth and forwards it to EasyAuth's /send endpoint.
import { serve } from "https://deno.land/std@0.168.0/http/server.ts";
serve(async (req) => {
try {
// Payload provided by the Supabase Auth Hook
const { user, sms } = await req.json();
const { phone, otp } = sms;
// Convert E.164 format (+821012345678) to Korean local format (01012345678)
const formattedPhone = phone.replace('+82', '0');
// Call EasyAuth API
const response = await fetch("https://api.easyauth.io/send", {
method: "POST",
headers: {
"Content-Type": "application/json",
"Authorization": `Bearer ${Deno.env.get("EASYAUTH_API_KEY")}`
},
body: JSON.stringify({
phone: formattedPhone,
code: otp // Pass the OTP generated by Supabase
})
});
if (!response.ok) {
throw new Error("EasyAuth SMS dispatch failed");
}
return new Response(JSON.stringify({ success: true }), {
headers: { "Content-Type": "application/json" },
status: 200,
});
} catch (error) {
return new Response(JSON.stringify({ error: error.message }), {
headers: { "Content-Type": "application/json" },
status: 500,
});
}
});
Step 3: Set Secrets and Deploy
Register the API key obtained from EasyAuth as a Supabase environment variable (secret) and deploy the function.
supabase secrets set EASYAUTH_API_KEY="your_easyauth_api_key"
supabase functions deploy send-sms-easyauth
Step 4: Connect the Hook in Supabase Dashboard
- Navigate to your Supabase Dashboard.
- Go to Authentication > Hooks.
- Enable the Send SMS hook and select the
send-sms-easyauthEdge Function you just deployed.
Step 5: Request Login from the Client
Now, simply call the Supabase Auth method from your frontend code as usual! Supabase will handle the OTP verification automatically.
const { data, error } = await supabase.auth.signInWithOtp({
phone: '+821012345678',
});
Conclusion: Focus on Core Development
Authentication is crucial, but you shouldn't spend days implementing it or fighting with administrative red tape. Don't stress over submitting documents or registering sender IDs.
By combining Supabase with EasyAuth, which takes just 5 minutes to set up, you can build a secure, cost-effective (15~25 KRW/msg) SMS authentication system for everything from toy projects to startup MVPs.
Sign up for EasyAuth today and test it out yourself using the 10 free credits provided upon registration!