All guides

Automations that work while you sleep (free, no Zapier)

Last updated July 2026 · 20 min · Free (AI calls cost cents) · Comfortable

Automations that work while you sleep (free, no Zapier)

You'll put your AI research on a timer: it runs at 7 in the morning and the results are waiting when you wake up. Twenty minutes of setup, no Zapier, no subscription.

To schedule AI tasks free you need two things: a timer and a place for code to run. Vercel gives you both at $0, and this is the exact setup my own morning research runs on.

What you'll have when you're done

  • A morning job at 7:00 that runs your niche research and messages you the result before you wake up
  • A second daily slot at 18:00 free for whatever you automate next
  • A cron setup where one broken task never takes down the others
  • Zero subscriptions: no Zapier, no Make, just a few cents of AI usage per run
  • [SCREENSHOT: the 7am briefing sitting in Discord]

Before you start

  • A free Vercel account, with any project deployed that can serve an API route. No project yet? Deploy Vercel's Next.js starter template first; it takes about five minutes. (Built the phase method app? Use that.)
  • An Anthropic API key from console.anthropic.com. It's pay-per-use; a daily scan costs cents.
  • A free Discord server (or anywhere that accepts webhooks) to receive the briefing.
  • 20 minutes.

Step 1: Understand the two-cron bundling trick

A cron job is a task that runs itself on a timer. Vercel's free plan gives you 2 of them, each firing once a day, and that constraint is actually the design: instead of one job per task, you make two routes and bundle.

  • Morning route (7:00): everything you want done before you wake up. Mine runs the research scan.
  • Evening route (18:00): everything end-of-day. Mine snapshots metrics and rolls up the week's numbers.

Every new automation you invent later just becomes one more task inside one of the two routes. No new infrastructure, ever.

Check it worked: you can say which of your ideas is a morning task and which is an evening task.

Step 2: Add the schedule file

In your project's root folder, create a file called vercel.json. This is the entire scheduling system:

{
  "crons": [
    { "path": "/api/cron/morning", "schedule": "0 7 * * *" },
    { "path": "/api/cron/evening", "schedule": "0 18 * * *" }
  ]
}

The strange "0 7 * * *" part is cron syntax, a five-slot pattern meaning "minute 0, hour 7, every day." Note the hours are UTC on Vercel, so shift them to match your timezone (Tokyo mornings mean "0 22 * * *" the night before, UTC).

Check it worked: vercel.json sits in your project root with both cron entries in it.

Step 3: Write the morning route

Create the API route the schedule points at. In a Next.js project that's a file at app/api/cron/morning/route.ts. The skeleton below is a trimmed version of my real morning route, and it has two load-bearing habits: it checks a secret before running, and it wraps each task in its own try/catch so one failure never kills the rest.

export async function GET(req: Request) {
  const auth = req.headers.get("authorization");
  if (auth !== `Bearer ${process.env.CRON_SECRET}`) {
    return Response.json({ error: "Unauthorized" }, { status: 401 });
  }

  const tasks: Record<string, unknown> = {};

  try {
    tasks.research = await runResearchScan();
  } catch (err) {
    tasks.research = { error: String(err) };
  }

  try {
    tasks.briefing = await sendToDiscord(String(tasks.research));
  } catch (err) {
    tasks.briefing = { error: String(err) };
  }

  return Response.json({ ranAt: new Date().toISOString(), tasks });
}

export const dynamic = "force-dynamic";

Now the two task functions, in the same file. The research call uses Claude's built-in web search, the same setup my daily scan runs on:

import Anthropic from "@anthropic-ai/sdk";

const client = new Anthropic();

async function runResearchScan(): Promise<string> {
  const response = await client.messages.create({
    model: "claude-sonnet-5",
    max_tokens: 4096,
    tools: [
      { type: "web_search_20260209", name: "web_search", max_uses: 5 },
    ],
    messages: [
      {
        role: "user",
        content:
          "My niche: [one sentence]. Search the web and scan the last " +
          "48 hours. Return a ranked list of 5-7 topics worth posting " +
          "about: topic, why it matters, one content angle, source link.",
      },
    ],
  });
  return response.content
    .filter((block) => block.type === "text")
    .map((block) => block.text)
    .join("");
}

async function sendToDiscord(briefing: string) {
  await fetch(process.env.DISCORD_WEBHOOK_URL!, {
    method: "POST",
    headers: { "content-type": "application/json" },
    body: JSON.stringify({ content: briefing.slice(0, 1900) }),
  });
  return { sent: true };
}

Run npm install @anthropic-ai/sdk in the project first. For the Discord side: in your server, open a channel's settings, go to Integrations, create a Webhook, and copy its URL.

My production version saves the scan to a database and shows it in a dashboard instead of Discord. Same trick, more plumbing. The webhook version gets you the wake-up-to-results experience with two functions.

Check it worked: the route file exists and the project still builds locally (npm run build passes).

Step 4: Add the secrets

Cron routes are public URLs, so they need a lock. Vercel handles this cleanly: if you set an environment variable called CRON_SECRET, Vercel automatically sends it as a Bearer token when the schedule fires, and the check at the top of your route does the rest.

In your Vercel project dashboard under Settings, then Environment Variables, add:

  • CRON_SECRET: any long random string
  • ANTHROPIC_API_KEY: your API key
  • DISCORD_WEBHOOK_URL: the webhook URL from step 3

Check it worked: all three variables show up in your Vercel project's environment settings.

Step 5: Deploy and test without waiting for 7am

Push the project (or run vercel deploy). Don't wait for tomorrow to find out if it works; trigger the route by hand:

curl -H "Authorization: Bearer YOUR_CRON_SECRET" https://your-app.vercel.app/api/cron/morning

You should get back a JSON report where each task says what happened, and the briefing should land in Discord a few seconds later. If one task shows an error, the others still ran; that's the isolation from step 3 doing its job. Then check Vercel's dashboard under Settings, then Cron Jobs, to confirm both schedules are registered.

Check it worked: the curl returns a JSON report, the briefing is in Discord, and both cron jobs show in the Vercel dashboard. Tomorrow it happens without you. [SCREENSHOT: cron jobs registered in Vercel]

Free download

The morning-briefing automation: script + walkthrough

Enter your email and it's yours. You'll also get the weekly newsletter. Unsubscribe anytime.

FAQ

Is this really free?

The scheduling is. Vercel's free plan includes cron jobs, and a Discord webhook costs nothing. The AI call itself is pay-per-use through the Anthropic API, and a daily research scan runs a few cents per day. There is no monthly subscription anywhere in the stack.

Why bundle tasks into two jobs instead of one job per task?

Vercel's free plan allows 2 cron jobs, each triggering once per day. So you bundle: one morning route that runs all your wake-up tasks, one evening route for the end-of-day tasks. Each task inside gets its own error handling, so one failure never kills the rest. Mine run exactly this way.

Do I need a Next.js app for this?

You need any project deployed on Vercel that can serve an API route. If you built an app with the phase method you already have one. If not, Vercel's Next.js starter template deploys in about five minutes and works fine as a home for your automations.

Why not just use Zapier or Make?

They're fine tools, but the free tiers are tight and AI steps usually sit behind paid plans. This stack gives you the same result with no subscription, plus you own the code, which means the automation can grow into anything: saving to a database, updating Notion, sending emails.

Can the schedule run more often than daily?

On Vercel's free plan, each cron job triggers once per day, which is exactly right for a morning briefing. If you outgrow that, paid plans unlock more frequent schedules, or you can trigger the same route manually anytime by visiting it with the secret header.

Related guides

Get the next build in your inbox

One email a week: the newest guides, plus one thing I only share with the list.

No spam. Unsubscribe anytime.

Build alongside others

Join the free community and share what you're shipping.

Jordan Hong Tai

Jordan Hong Tai

I've scaled products to over 500K users, and now I build AI systems in public from a balcony in Tokyo.