These scenarios embody the autonomous AI operations manager. Each scenario monitors external services, performs intelligent analysis, makes decisions, and pushes outcomes to Supabase via webhooks.
Remember: The frontend is PASSIVE. It only observes what Make.com does.
- ✅ Make.com account (free tier works)
- ✅ Google account (Gmail, Calendar, Drive access)
- ✅ OpenAI API key
- ✅ AssemblyAI API key (for transcription)
- ✅ Supabase project with webhook endpoints deployed
- ✅ Webhook secret configured
Purpose: Autonomously analyze incoming emails and extract tasks
Gmail: Watch Emails (every 15 min)
↓
Router: Filter work-related emails
↓
OpenAI: Analyze email content
↓
JSON: Parse AI response
↓
HTTP: POST /task-batch (create tasks)
↓
HTTP: POST /ai-action-log (log action)
- Connection: Your Gmail account
- Folder:
INBOX - Criteria:
is:unread - Max results:
10
- Condition: Subject contains work keywords
- Or: From specific clients
- Model:
gpt-4o-mini - System message:
You are an autonomous AI operations manager analyzing freelancer emails.
Extract actionable tasks, deadlines, and priorities.
- User message:
Analyze this email:
From: {{1.from.name}} <{{1.from.address}}>
Subject: {{1.subject}}
Body: {{1.textPlain}}
Return JSON:
{
"has_tasks": boolean,
"tasks": [
{
"title": "string",
"description": "string",
"priority": 1-3,
"due_date": "YYYY-MM-DD or null"
}
],
"client_name": "string or null",
"requires_response": boolean
}
- Response format:
json_object
- JSON string:
{{3.choices[1].message.content}}
- Filter:
{{4.has_tasks}}equalstrue
- URL:
https://YOUR_PROJECT.supabase.co/functions/v1/task-batch - Method:
POST - Headers:
Content-Type:application/jsonx-webhook-secret:YOUR_SECRET
- Body:
{
"user_id": "YOUR_USER_ID",
"source": "gmail_analysis",
"tasks": {{4.tasks}}
}- URL:
https://YOUR_PROJECT.supabase.co/functions/v1/ai-action-log - Method:
POST - Headers: (same as above)
- Body:
{
"user_id": "YOUR_USER_ID",
"action_type": "email_processed",
"description": "Analyzed email from {{1.from.name}} and created {{length(4.tasks)}} tasks",
"context": {
"email_subject": "{{1.subject}}",
"from": "{{1.from.address}}",
"tasks_created": {{length(4.tasks)}}
}
}Purpose: Autonomously draft email responses for user approval
Gmail: Watch Emails
↓
OpenAI: Analyze if response needed
↓
Router: Filter responses needed
↓
OpenAI: Draft professional response
↓
HTTP: POST /email-draft (pending approval)
↓
HTTP: POST /ai-action-log
Analyze if this email requires a response:
From: {{1.from.name}}
Subject: {{1.subject}}
Body: {{1.textPlain}}
Return JSON:
{
"requires_response": boolean,
"response_urgency": "low" | "medium" | "high",
"suggested_tone": "formal" | "friendly" | "technical",
"context_summary": "brief summary"
}
Draft a professional response to this email.
Context: {{previous AI response}}
From: {{1.from.name}}
Original email: {{1.textPlain}}
Write a clear, professional response that:
- Acknowledges their request
- Sets clear expectations
- Maintains freelancer professionalism
Return only the email body text.
{
"operation": "create",
"user_id": "YOUR_USER_ID",
"to_email": "{{1.from.address}}",
"subject": "Re: {{1.subject}}",
"body": "{{OpenAI response}}",
"context": {
"original_email_id": "{{1.id}}",
"drafted_reason": "{{AI analysis.context_summary}}"
}
}Purpose: Autonomously transcribe meetings and extract tasks
Drive: Watch Files (Meet Recordings folder)
↓
Drive: Download File
↓
AssemblyAI: Transcribe Audio
↓
OpenAI: Extract action items & decisions
↓
HTTP: POST /task-batch
↓
HTTP: POST /ai-action-log
- Folder:
/Meet Recordings/(or your folder) - File type:
.mp4, .webm
- Audio URL: Download URL from Drive
- Speaker labels:
true - Punctuation:
true
Analyze this meeting transcript and extract action items:
{{AssemblyAI.text}}
Return JSON:
{
"action_items": [
{
"title": "string",
"description": "string",
"assigned_to": "string or null",
"deadline": "YYYY-MM-DD or null",
"priority": 1-3
}
],
"key_decisions": ["string"],
"follow_up_needed": boolean
}
Purpose: Autonomously detect deadline risks and surface insights
Schedule: Every 6 hours
↓
HTTP: GET tasks from Supabase
↓
OpenAI: Analyze for risks
↓
Router: Filter if risks found
↓
HTTP: POST /agent-insight
- URL:
https://YOUR_PROJECT.supabase.co/rest/v1/tasks - Method:
GET - Headers:
apikey:YOUR_SUPABASE_ANON_KEYAuthorization:Bearer YOUR_SUPABASE_ANON_KEY
- Query parameters:
user_id=eq.YOUR_USER_ID&status=neq.completed
Analyze these tasks for deadline risks:
{{HTTP response.data}}
Identify:
- Overdue tasks
- Tasks approaching deadline with no progress
- Conflicting deadlines
- Workload imbalance
Return JSON:
{
"has_risks": boolean,
"insights": [
{
"type": "risk" | "opportunity",
"title": "string",
"description": "string",
"confidence": 0.0-1.0,
"affected_tasks": ["task_ids"]
}
]
}
{
"user_id": "YOUR_USER_ID",
"insight_type": "{{item.type}}",
"title": "{{item.title}}",
"description": "{{item.description}}",
"confidence_score": {{item.confidence}},
"context": {
"affected_tasks": {{item.affected_tasks}},
"detection_time": "{{now}}"
}
}Purpose: Actually send emails after user approval
Webhook: Receive approval from frontend
↓
HTTP: GET draft from Supabase
↓
Gmail: Send Email
↓
HTTP: POST /email-draft (mark sent)
↓
HTTP: POST /ai-action-log
- Name:
email-approval-handler - Expected data:
{
"user_id": "string",
"draft_id": "string",
"action": "send"
}- URL:
https://YOUR_PROJECT.supabase.co/rest/v1/email_drafts - Query:
id=eq.{{1.draft_id}}&user_id=eq.{{1.user_id}} - Get:
to_email,subject,body
- To:
{{HTTP response.to_email}} - Subject:
{{HTTP response.subject}} - Body:
{{HTTP response.body}}
{
"operation": "mark_sent",
"user_id": "{{1.user_id}}",
"draft_id": "{{1.draft_id}}"
}Purpose: Autonomously sync calendar events to dashboard
Google Calendar: Watch Events
↓
HTTP: POST /meetings (custom endpoint)
↓
HTTP: POST /ai-action-log
- Calendar: Primary
- Event types: All
{
"user_id": "YOUR_USER_ID",
"title": "{{1.summary}}",
"start_time": "{{1.start.dateTime}}",
"end_time": "{{1.end.dateTime}}",
"attendees": {{1.attendees}},
"meeting_url": "{{1.hangoutLink}}"
}-
USER_ID (your Firebase UID)
- Get from:
/get-uidpage - Store as: Data store or variable
- Get from:
-
WEBHOOK_SECRET
- Same as Supabase
- Store as: Make.com variable
-
SUPABASE_PROJECT_URL
- Your project URL
- Store as: Variable
URL: {{SUPABASE_PROJECT_URL}}/functions/v1/endpoint
Headers: x-webhook-secret: {{WEBHOOK_SECRET}}
Body: user_id: {{USER_ID}}
For each scenario:
- ✅ Test with sample data
- ✅ Verify webhook calls succeed
- ✅ Check Supabase Edge Function logs
- ✅ Confirm data appears in database
- ✅ Verify frontend updates via realtime
- ✅ Test error cases
- ✅ Monitor execution history
-
Error Handling:
- Add error handlers to each module
- Log failures to Supabase
- Set up email alerts
-
Rate Limiting:
- Gmail: 15-minute intervals (free tier)
- Don't overwhelm APIs
-
Cost Management:
- Use
gpt-4o-mini(cheapest) - Cache common responses
- Set operation limits
- Use
-
Monitoring:
- Review execution history daily
- Check for failed scenarios
- Monitor API costs
External World
↓
Make.com (brain)
↓
Webhooks (nervous system)
↓
Supabase (memory)
↓
Realtime (perception)
↓
Frontend (eyes)
↓
User (observer)
The AI does the work. You observe.
- Create scenarios one by one
- Test each thoroughly
- Deploy to production
- Monitor for a week
- Refine based on patterns
- Add more scenarios as needed
Remember: You're building an autonomous AI employee, not a task manager.