Skip to content
  • Home

  • Business growth

  • Marketing tips

Marketing tips

5 min read

I've been managing Zapier's YouTube channel for 6 years. I finally automated the worst part of it.

By David Quintanilla · March 26, 2026
A hero image of the Claude logo

Six years is a long time to do anything. Long enough to get good at it, long enough to build real systems, and long enough to become the bottleneck for things you never meant to own.

When I joined Zapier's video team, uploads were simple: we only had a couple people on the team, and just one YouTube channel. But over time, we worked hard to democratize video production across the company. We shipped cameras and microphones to people who needed them. We connected teams with editors. We built templates and gave feedback at every stage. It worked—a lot more people started making videos, which is exactly what we wanted.

But someone still has to upload the video, check the metadata, set whether it's public or private, and decide when it's going live—among the dozens of other small tasks and decisions.

That someone became me. At peak, I was fielding 15 to 20 upload requests a month. Each one involved its own Slack thread—"Can you change the title?" "The thumbnail is blurry, here's a new one." "Actually can we push the publish date?"—before the video ever went live. For a team that builds automation software for a living, it was embarrassing how manual this felt. So I decided to fix it with Claude Code.

Table of contents:

  • Removing the upload bottleneck without losing oversight

  • How I described the problem to Claude

  • Generating YouTube metadata with Claude

  • Bug reports and feature requests from the team

  • From upload bottleneck to self-serve system

Removing the upload bottleneck without losing oversight

I didn't want to eliminate my involvement in video launches entirely. I wanted to eliminate the friction: the back-and-forth, the credential sharing, and the "can you just log in and change this one thing for me" messages that ate up everyone's time.

A message in Slack asking David for help uploading a YouTube video
Someone asking David in Slack to change the name of a YouTube video

The idea was simple: a form where a team member could log in with their Google account, fill out a video's metadata, attach a thumbnail, upload the file, and hit submit—and the video would land on our YouTube channel without them ever touching a channel password. I'd still be in the loop on what goes up, but I wouldn't be the upload button anymore.

I'd been exploring AI tools across the whole video production workflow for a while: using Claude to help with outlines, converting blog posts into rough script drafts, leaning on Frame.io for post-production review, and testing the AI-powered audio cleanup tools in Adobe Premiere. But uploading was still stubbornly manual.

How I described the problem to Claude

I started with the constraint that was making this hard: two different types of users needed to be involved, and they needed completely different levels of access.

Uploaders needed to prove they were Zapier employees—nothing more. The YouTube channel itself needed separate, persistent credentials that I controlled and that nobody else ever saw.

My first prompt was basically that paragraph above, written out as plainly as I could manage. Claude proposed using two separate OAuth clients in the same Node.js server—one for identity (employee login via Google, email only), one for the channel (YouTube upload permissions, tied to me). The split was architecturally clean and exactly right.

What I hadn't accounted for was persistence. The app was running on Render, which can restart your server at any time—so anything stored in memory just vanishes. At first, everything seemed fine, but then it would randomly stop working the next day. When I asked Claude what was going on (and kept reminding it over and over that I am not a programmer), it walked me through things step by step and had me pull logs from Render.

That's when I started seeing refresh token errors. Turns out the token was resetting every 24 hours because the app didn't have the right permissions. I fixed that, only to have it break again a week later with the same issue, this time because the token had defaulted to a seven-day expiration. Adjusting that finally stabilized things.

Generating YouTube metadata with Claude

A big chunk of those 15–20 monthly requests wasn't really about the uploading process itself—it was about everything around the upload: things like titles, descriptions, and tags. YouTube SEO is hard, and most people who aren't deep in it default to titles that are either too vague or too clever to surface in search.

So I added a panel to the upload form. It uses Claude Haiku and a knowledge base of Zapier's SEO best practices to generate three title options and a full description optimized for search, based on whatever topic the uploader enters.

The prompt I had Claude write for this is specific about character counts, keyword placement, and even the year. And there's a line of defensive code right after the API call that strips Markdown formatting from the response—because Claude sometimes wraps JSON in code fences even when you tell it not to, and Claude apparently knows this about itself.

Bug reports and feature requests from the team

Once I shared the form, I got a mix of bug reports and feature requests. One of the bugs was YouTube's 2MB limit on thumbnails: if the file was too big, the upload would go through without a thumbnail and no error, so you didn't realize until later. 

After fixing that, I worked through a handful of quick feature requests: letting people drag in a video file, adding a confirmation message with a link to the uploaded video, and including a few extra fields. Most of those updates only took a few minutes to implement, but they made the tool feel a lot more complete.

Not everything was smooth. The session management Claude chose comes with a default that's not great for production. The deploy logs flagged it immediately.

The logs from Render

Claude used it without mentioning it was a development default. At our current scale, it's fine, but it's the kind of assumption that would bite you later if you weren't paying attention to your logs. Same deal with a session secret that falls back to change-me-in-production if the environment variable isn't set. I was learning that Claude is great at the happy path, but the edge cases and production caveats require you to ask (or to catch them yourself).

And the one thing the upload tool still couldn't solve was thumbnail creation. Getting a thumbnail into the form was easy, but actually designing one, on-brand, without knowing Figma or Canva was still a blocker for a lot of people on the team. Luckily, my teammate Donna had built an on-brand image generation tool: a way for anyone at Zapier to generate high-quality, flexible images that actually look like they belong on our site, without needing a designer in the loop for every request. So I built that into my form.

From upload bottleneck to self-serve system

A description of the tool

The tool is being used in the wild now: team members log in with Google, fill out the form, upload their video and thumbnail, and get a confirmation email with the YouTube link. I'm not the bottleneck anymore.

The final product

That means the entire video pipeline is AI-powered: outline, script, production, upload, SEO metadata, and now thumbnail design, all without a specialist required at every handoff. I'll keep iterating as more people use it and give feedback, but as first sprints go, I'll take it.

Related reading:

  • Claude MCP servers you can set up right now

  • What is Claude Cowork?

  • Claude API: How to get a key and use the API

Get productivity tips delivered straight to your inbox

We’ll email you 1-3 times per week—and never share your information.

tags
mentioned apps

Related articles

Improve your productivity automatically. Use Zapier to get your apps working together.

Sign up
See how Zapier works
A Zap with the trigger 'When I get a new lead from Facebook,' and the action 'Notify my team in Slack'