Turn meeting talk into shipped tasksβautomatically.
Every meeting β Clear actions β Posted to Slack β In your task tool.
- AI Action Extraction: GPT-4 automatically identifies tasks, decisions, and owners from meeting transcripts
- Multi-Platform Integration: Zoom, Slack, Linear, Asana, Jira
- Real-Time Processing: Summaries and tasks created within 2 minutes of meeting end
- Beautiful Dashboard: Track meetings, actions, and team performance
- Flexible Billing: Free tier + Pro ($19/mo) + Team ($99/mo) with Stripe & Paystack (Africa)
- Frontend: Next.js 14 (App Router), TypeScript, Tailwind CSS, Shadcn UI
- Backend: Next.js API Routes
- Database: PostgreSQL (Supabase)
- Auth: Clerk (Google, Microsoft, Slack OAuth)
- AI: OpenAI GPT-4 Turbo
- Payments: Stripe + Paystack (Africa)
- Hosting: Vercel
- Node.js 18+ and npm
- Supabase account
- Clerk account
- OpenAI API key
- Stripe account (for payments)
- Zoom/Slack/Linear accounts (for integrations)
cd meeting-actions
npm installCreate .env.local in the root directory:
# App
NEXT_PUBLIC_APP_URL=http://localhost:3000
# Clerk Auth
NEXT_PUBLIC_CLERK_PUBLISHABLE_KEY=pk_test_...
CLERK_SECRET_KEY=sk_test_...
NEXT_PUBLIC_CLERK_SIGN_IN_URL=/sign-in
NEXT_PUBLIC_CLERK_SIGN_UP_URL=/sign-up
NEXT_PUBLIC_CLERK_AFTER_SIGN_IN_URL=/dashboard
NEXT_PUBLIC_CLERK_AFTER_SIGN_UP_URL=/onboarding
# Supabase
NEXT_PUBLIC_SUPABASE_URL=https://your-project.supabase.co
NEXT_PUBLIC_SUPABASE_ANON_KEY=your-anon-key
SUPABASE_SERVICE_ROLE_KEY=your-service-role-key
# OpenAI
OPENAI_API_KEY=sk-...
# Anthropic (optional)
ANTHROPIC_API_KEY=sk-ant-...
# Zoom
ZOOM_WEBHOOK_SECRET_TOKEN=your-secret
ZOOM_CLIENT_ID=your-client-id
ZOOM_CLIENT_SECRET=your-client-secret
# Slack
SLACK_CLIENT_ID=your-client-id
SLACK_CLIENT_SECRET=your-client-secret
SLACK_SIGNING_SECRET=your-signing-secret
# Linear
LINEAR_CLIENT_ID=your-client-id
LINEAR_CLIENT_SECRET=your-client-secret
# Stripe
NEXT_PUBLIC_STRIPE_PUBLISHABLE_KEY=pk_test_...
STRIPE_SECRET_KEY=sk_test_...
STRIPE_WEBHOOK_SECRET=whsec_...
STRIPE_PRICE_ID_PRO=price_...
STRIPE_PRICE_ID_TEAM=price_...
# Paystack (Optional - For African Markets)
PAYSTACK_SECRET_KEY=sk_test_...
PAYSTACK_PUBLIC_KEY=pk_test_...Run the SQL schema in Supabase:
# Copy contents of lib/supabase/schema.sql
# Paste into Supabase SQL Editor
# Run the query- Create app at clerk.com
- Enable Google, Microsoft OAuth providers
- Copy API keys to
.env.local - Set redirect URLs:
- Sign-in:
http://localhost:3000/sign-in - Sign-up:
http://localhost:3000/sign-up - After sign-in:
http://localhost:3000/dashboard
- Sign-in:
- Create app at Zoom Marketplace
- Enable webhooks for:
recording.completedmeeting.ended
- Set webhook URL:
https://your-domain.com/api/webhooks/zoom - Copy client ID, secret, webhook token to
.env.local
- Create app at Slack API
- Add OAuth scopes:
chat:write,channels:read,groups:read - Set redirect URL:
http://localhost:3000/api/integrations/slack/callback - Copy client ID, secret, signing secret to
.env.local
- Go to Linear Apps
- Create OAuth application
- Set redirect URL:
http://localhost:3000/api/integrations/linear/callback - Scopes:
read,write - Copy client ID and secret to
.env.local
- Create account at Stripe
- Create products:
- Pro: $19/month
- Team: $99/month
- Copy price IDs to
.env.local - Set webhook URL:
https://your-domain.com/api/webhooks/stripe - Listen for events:
checkout.session.completedcustomer.subscription.createdcustomer.subscription.updatedcustomer.subscription.deleted
Why Paystack? Better conversion rates in Nigeria, Ghana, South Africa, and Kenya.
- Create account at Paystack
- Get your API keys from Settings > API Keys & Webhooks
- Add to
.env.local:PAYSTACK_SECRET_KEY=sk_test_your_key_here PAYSTACK_PUBLIC_KEY=pk_test_your_key_here
- Set webhook URL:
https://your-domain.com/api/webhooks/paystack - Supported currencies:
- π³π¬ Nigeria (NGN): β¦45,000 (Pro) / β¦235,000 (Team)
- π¬π Ghana (GHS): GHβ΅120 (Pro) / GHβ΅625 (Team)
- πΏπ¦ South Africa (ZAR): R350 (Pro) / R1,825 (Team)
- π΅ USD: $19 (Pro) / $99 (Team)
Payment Methods: Cards, Bank Transfer, USSD, Mobile Money
npm run dev# Install Vercel CLI
npm i -g vercel
# Deploy
vercel
# Set environment variables in Vercel dashboard
# Update webhook URLs to production domainUpdate these in Vercel:
NEXT_PUBLIC_APP_URLβ Your production domain- All webhook URLs β Point to production domain
- Use production keys for Stripe, Zoom, etc.
Receives meeting recordings and transcripts. Triggered by Zoom after meeting ends.
Handles subscription events (created, updated, canceled).
Handles payment events (charge.success, subscription.create, subscription.disable).
Start: GET /api/integrations/slack?workspace_id={id}
Callback: GET /api/integrations/slack/callback
Start: GET /api/integrations/linear?workspace_id={id}
Callback: GET /api/integrations/linear/callback
meeting-actions/
βββ app/
β βββ (auth)/
β β βββ sign-in/
β β βββ sign-up/
β βββ dashboard/
β β βββ page.tsx # Main dashboard
β β βββ integrations/ # Connect tools
β β βββ meetings/ # Meeting history
β β βββ actions/ # Action items
β βββ api/
β β βββ webhooks/
β β β βββ zoom/ # Zoom webhook
β β β βββ stripe/ # Stripe webhook
β β βββ integrations/
β β βββ slack/ # Slack OAuth
β β βββ linear/ # Linear OAuth
β βββ page.tsx # Landing page
βββ lib/
β βββ supabase/
β β βββ schema.sql # Database schema
β β βββ client.ts # Supabase client
β βββ openai.ts # AI extraction
β βββ stripe.ts # Billing
β βββ types.ts # TypeScript types
β βββ config.ts # App config
βββ components/
βββ ui/ # Shadcn components
- Connect Zoom: Authorize MeetingActions to receive meeting transcripts
- Connect Slack: Choose channels for meeting summaries
- Connect Linear (optional): Auto-create tasks from action items
- Have meetings: MeetingActions processes automatically
- Review actions: Check dashboard for extracted items
- Update status: Mark actions as complete
import { extractActions, generateSummary } from '@/lib/openai';
const actions = await extractActions(transcript, meetingTitle);
const summary = await generateSummary(transcript, meetingTitle);const response = await fetch('/api/integrations/slack', {
method: 'POST',
body: JSON.stringify({
workspace_id: 'xxx',
channel_id: 'C12345',
text: 'Meeting summary...',
}),
});- Zoom integration
- Slack integration
- Linear integration
- Google Meet integration
- Asana integration
- Jira integration
- Microsoft Teams integration
- Custom action types
- AI-powered meeting insights
- Recurring meeting patterns
- Export to PDF/CSV
MIT License - Build whatever you want!
PRs welcome! Please open an issue first to discuss changes.
- Email: support@meetingactions.com
- Docs: docs.meetingactions.com
- Issues: GitHub Issues
Built with β€οΈ by developers who hate losing track of follow-ups.