Overview
The Email Subscription API allows users to subscribe to daily Bhagavad Gita verse emails delivered at 8am in their local timezone. Emails are sent via Resend using a cron job system.Daily Delivery
Emails sent at 8am in user’s selected timezone
Smart Selection
Prioritizes unseen verses from user’s query history
One-Click Unsubscribe
Every email includes an unsubscribe link
30+ Timezones
Support for all major worldwide timezones
Check Subscription Status
Check if the current user is subscribed to daily emails
Authentication
Required: Yes (Clerk session token)Rate Limit
10 requests per minuteResponse
Always “success”
true if subscribed, false otherwiseUser’s selected timezone (e.g., “America/New_York”) or
null if not subscribedExample Request
Example Response
Subscribe to Daily Emails
Subscribe the current user to daily verse emails
Authentication
Required: Yes (Clerk session token)Rate Limit
10 requests per minuteRequest Body
IANA timezone identifier (e.g., “America/New_York”, “Europe/London”, “Asia/Tokyo”)See List of Timezones for all valid values.
Response
Always “success”
Confirmation message
Example Request
Example Response
Unsubscribe from Emails
Unsubscribe the current user from daily emails
Authentication
Required: Yes (Clerk session token)Rate Limit
10 requests per minuteResponse
Always “success”
Confirmation message
Example Request
Example Response
One-Click Email Unsubscribe
Unsubscribe via the token included in email links (no authentication required)
Query Parameters
Unsubscribe token included in email footer links
Response
Returns an HTML page confirming the unsubscription (not JSON).Example Request
Email Delivery System
Cron Job Endpoint
Daily emails are sent via an automated cron job: Endpoint:POST /api/daily-emailAuthentication: Requires
CRON_SECRET environment variableSchedule: Runs every hour to catch all timezones The cron job:
- Queries all subscriptions where it’s 8am in their timezone
- Fetches their daily verse (prioritizing unseen verses)
- Sends email via Resend
- Updates last_sent timestamp
Email Content
Each daily email includes:- Chapter and verse reference
- Full verse translation
- Brief AI-generated summary
- Link to view full verse on GitaChat
- One-click unsubscribe link
Supported Timezones
GitaChat supports 30+ worldwide timezones including:- Americas: America/New_York, America/Chicago, America/Denver, America/Los_Angeles, America/Toronto, America/Vancouver, America/Mexico_City, America/Sao_Paulo
- Europe: Europe/London, Europe/Paris, Europe/Berlin, Europe/Madrid, Europe/Rome, Europe/Amsterdam, Europe/Brussels, Europe/Stockholm
- Asia: Asia/Kolkata, Asia/Dubai, Asia/Tokyo, Asia/Shanghai, Asia/Hong_Kong, Asia/Singapore, Asia/Seoul, Asia/Bangkok, Asia/Jakarta
- Pacific: Australia/Sydney, Australia/Melbourne, Pacific/Auckland, Pacific/Fiji
- Africa: Africa/Cairo, Africa/Johannesburg
Database Schema
Subscriptions are stored in Supabaseemail_subscribers table:
| Field | Type | Description |
|---|---|---|
| user_id | text | Primary key (Clerk user ID) |
| text | User’s email address | |
| timezone | text | IANA timezone identifier |
| subscribed_at | timestamp | Subscription timestamp |
| last_sent | timestamp | Last email sent timestamp |
Error Codes
| Status Code | Description |
|---|---|
| 200 | Success |
| 400 | Invalid timezone or missing parameters |
| 401 | Unauthorized (authentication required) |
| 429 | Rate limit exceeded (10/minute) |
| 500 | Database error or email service failure |
Usage Notes
Users must have a verified email address in Clerk to receive daily emails.
Implementation Reference
Source Files:- Subscription API:
frontend/app/api/email-subscription/route.ts - Unsubscribe:
frontend/app/api/unsubscribe/route.ts - Cron job:
frontend/app/api/daily-email/route.ts - Settings UI:
frontend/app/settings/page.tsx