"AI marketing automation" doesn't mean a black-box tool posting on your behalf. It means a small AI program that runs on a schedule, does a specific bounded task, and queues the result for your review. Done right, you spend 20 minutes a week reviewing instead of 5 hours generating.
Three valid setups
Option A — Claude Code scheduled tasks
Claude Code supports running skills on a cron from your machine (or a small VPS). The skill executes, output goes to a file or an HTTP endpoint, you review later. Lowest setup; doesn't need a cloud host. Downsides: your machine must be on when the cron fires, or you skip that window.
Quick start:
- Install the skill (e.g.
~/.claude/skills/weekly-content-batch/SKILL.md) — see /skills for ready-made files - Configure a Claude Code scheduled task (see Claude Code docs; built-in feature) to run it Monday 09:00 with your brand brief as input
- Pipe the output to
/api/v1/draftsvia curl. Drafts appear in the calendar.
Option B — Vercel Cron + AI SDK + AI Gateway
A Next.js / Vercel Function on a cron schedule calls Claude (via AI Gateway with a "anthropic/claude-sonnet" provider string), processes the result, and POSTs into your database. Pros: runs 24/7, no laptop required. Cons: needs a hosted DB if you want persistence (current local-SQLite setup won't work on Vercel).
The route handler is just an app/api/cron/<name>/route.ts that calls generateText({model: "anthropic/claude-sonnet", ... }) and writes the output.
Option C — Your own crontab + Next.js route
A regular Unix cron (or launchd / Task Scheduler) hits a Next.js route on a schedule. The route runs the AI work and stores the result. This is what the existing scheduler uses for /api/cron/publish-due.
Example macOS crontab line:
0 9 * * 1 curl -fsS -H "Authorization: Bearer $CRON_SECRET" http://localhost:3000/api/cron/weekly-content-batchThree concrete recipes
Recipe 1 — Monday morning content batch
Goal: 7 days of social posts queued for review by 09:30 every Monday.
- Skill: weekly-content-batch
- Cron:
0 9 * * 1 - Skill output: JSON array of 7 draft posts, one per day, with text + suggested image keywords.
- Cron handler POSTs each one to
/api/v1/draftswith{ status: "draft" }. Drafts (not queued) until you explicitly approve. - You spend Monday morning reviewing in the Calendar UI. Approve ones you like, edit captions, delete bad ones. Approved → queued → published by the existing publisher cron.
Recipe 2 — Friday review digest
Goal: a 2-minute email every Friday summarizing the week's App Store reviews into themes.
- Fetch new reviews via the App Store Connect API (or scrape with
app-store-scraper— npm package) - Pipe through the app-store-review-digest skill
- Email the result to yourself via Resend (or post to a Slack / Discord webhook)
- Cron:
0 16 * * 5
Recipe 3 — Daily competitor signal
Goal: 5-minute daily digest of what competitors did.
- Pick 3-5 competitors. Add their RSS feeds (blog + changelog) + their X handles
- Cron fetches new items, dedupes against yesterday
- Pass new items to Claude with a prompt: "Summarize each into one sentence. Flag any pricing changes, new features, or PR mentions."
- Email yourself the digest. Cron:
0 8 * * *
MCP (Model Context Protocol) for marketing
MCP lets Claude in Claude Code reach external tools— your database, your analytics, your scheduler. Concretely: you can talk to Claude Code about "schedule a post for tomorrow with this caption" and Claude executes the API call without you copy-pasting.
To expose this app's /api/v1/* endpoints to Claude Code as an MCP server, drop the example config file at /skills/mcp-marketing-server.example.json into ~/.claude/mcp_servers.json. Now from any Claude Code session you can: "list my connected accounts", "create a draft tweet for Friday saying X", etc.
Safety + governance
- Default to draft, not queued. AI output is never published without your eyes on it.
- Log every cron run. Have an audit trail for what fired, with what input, and what came out.
- Cap rate-limits.If the AI generates 10 posts a day in a buggy loop, you don't want all 10 to publish. The scheduler's stale-post protection prevents this for the scheduler — apply similar caps elsewhere.
- Don't auto-reply to humans— even with AI. People can tell, and you'll torch trust to save 5 minutes.