Apify + n8n Creator Research Workflow: Step-by-Step Build

Build a Weekly Creator Research Inbox with Apify and n8n

Creator research quietly eats whole afternoons. Scrolling TikTok, YouTube and Instagram, copying view counts into a sheet, then losing the one post that actually mattered.

A weekly creator research inbox kills that routine.

Apify Actors scrape public creator posts, and an n8n automation workflow scores every post, flags outliers and asks an AI model to spot hook patterns.

Then a clean digest lands in Gmail on the same day every week, ready before your first coffee.

Below is the full build, node by node, from Actor inputs and engagement scoring logic to AI content summaries and error alerts. No theory, just a system you can copy.

AIMOJO's Quick Verdict

Best setup: Apify handles scraping, n8n handles scheduling, scoring, AI analysis and delivery.
Build effort: one afternoon with three Store Actors, two Code nodes and one Gmail node.
Biggest win: an outlier score per creator surfaces posts beating their own baseline, not just big accounts.
Main limit: public data only. Hidden like counts and platform changes will create gaps now and then.

What Lands in Your Inbox Every Week

Before touching a node, lock down the output. A research inbox only works when every email answers the same questions in the same order.

Digest SectionWhat It ShowsSource Node
Top OutliersPosts with the highest views versus the creator's usual medianScoring Code node
Engagement LeadersPosts with the strongest likes, comments and shares per viewScoring Code node
Pattern NotesRecurring hooks, formats and topics across winning postsBasic LLM Chain
Content IdeasThree ideas your team can test this weekBasic LLM Chain
Raw Log LinkGoogle Sheet with every scraped post for later filteringGoogle Sheets node

Agencies use this to brief clients, brand teams use it for influencer partnership scouting, and solo creators use it to track competitors without opening a single app.

The data flow stays simple:

Google Sheets holds the creator roster.
Apify scrapes the last seven days of public posts per platform.
n8n merges, cleans, scores, dedupes and summarizes everything.
Gmail delivers the HTML digest while Sheets keeps the history.

Choosing Apify Actors for Creator Data

Apify Store hosts ready scrapers called Actors. Three of them cover most creator research needs, and each exposes date filters that keep a weekly pull lean.

ActorKey Input FieldsOutput Fields Worth Keeping
YouTube Scraperstreamers/youtube-scraperstartUrls, maxResults, maxResultsShorts, maxResultStreams, sortVideosBy, oldestPostDatetitle, url, date, viewCount, likes, commentsCount, channelName, numberOfSubscribers
TikTok Scraperclockworks/tiktok-scraperprofiles, resultsPerPage, profileSorting, excludePinnedPosts, oldestPostDateUnifiedtext, webVideoUrl, createTimeISO, playCount, diggCount, commentCount, shareCount, collectCount, authorMeta.fans
Instagram Scraperapify/instagram-scraperdirectUrls, resultsType, resultsLimit, onlyPostsNewerThancaption, url, shortCode, timestamp, likesCount, commentsCount, videoViewCount, ownerUsername

A few details matter here. YouTube Scraper's date range only applies to channel URLs, and setting any type limit to 0 skips that format entirely.

TikTok Scraper's profileSorting accepts latest, popular or oldest. Its date filters are marked as charged filters on the Actor page, so check that before enabling them.

Need follower counts and bios for Instagram? Add Instagram Profile Scraper (apify/instagram-profile-scraper) with a usernames array. It returns followersCount, biography, verified and latestPosts.

Transcripts are optional extras. YouTube Scraper's transcriptionAndSubtitle and TikTok Scraper's downloadSubtitlesOptions pull spoken hooks, which makes AI pattern notes far sharper.

Inside the Official Apify Node for n8n

Apify ships a verified community node, @apify/n8n-nodes-apify. On n8n Cloud, search “Apify” in the nodes panel and install it, provided verified community nodes are allowed in the Admin Panel.

On self-hosted n8n, open Settings > Community Nodes, paste the package name and install. The node needs n8n 1.57.0 or later.

ResourceOperations AvailableUse in This Build
ActorsExecute an Actor, execute an Actor and get its dataset, Web Fetch, get latest executionMain scraping step
Actor TasksExecute a task, execute a task and get its datasetCleaner inputs saved in Apify
Actor ExecutionsFetch one, fetch many, abortDebugging and cleanup
StorageGet dataset items, get key-value store recordPull results by defaultDatasetId
TriggerOn new Apify Event (Succeeded, Failed, Aborted, Timed Out, Any)Split version of the inbox for big rosters

Authentication works two ways. Apify API credentials take your API token from Apify Console, while Apify OAuth2 API connects with a single click on n8n Cloud only.

The Actor operation also exposes Custom input (JSON), Timeout in seconds, Memory in megabytes, Build Tag and Wait for finish.

Leave custom input empty and the Actor uses its saved default input.

Step by Step Guide to the Weekly Creator Research Workflow

Step 1: Set Up the Creator Roster in Google Sheets

Create a sheet named Creator Roster with these columns. Teammates can add or pause creators straight from Sheets without ever opening n8n.

platform with values youtube, tiktok or instagram
handle such as mkbhd, without the @ symbol
profile_url such as https://www.youtube.com/@mkbhd/videos
niche for grouping inside the digest
active set to yes or no to pause a creator

Add a second tab called Post Log. Every scored post gets written there, giving you history for better baselines over time.

Step 2: Save Each Scraper as an Apify Actor Task

Open each Actor in Apify Console, set sensible limits and click Save as a new task.

Apify Actor tasks store input plus timeout and memory, so the n8n side stays tidy.

YouTube task: maxResults 15, maxResultsShorts 15, maxResultStreams 0, sortVideosBy NEWEST
TikTok task: resultsPerPage 20, profileSorting latest, excludePinnedPosts true
Instagram task: resultsType posts, resultsLimit 20

Keep every download toggle off. Video files, covers and avatars add weight without helping research.

Step 3: Connect Apify, Google Sheets and Gmail Credentials

Install the Apify node, then add three credentials in n8n: Apify API, Google Sheets OAuth2 and Gmail OAuth2. Test each one before building further.

A broken credential halfway through a workflow wastes scraping effort, so this check pays off.

Step 4: Configure the n8n Schedule Trigger

Configure the n8n Schedule Trigger

Drop in a Schedule Trigger node with these settings:

FieldValue
Trigger IntervalWeeks
Weeks Between Triggers1
Trigger on WeekdaysMonday
Trigger at Hour7am
Trigger at Minute0

Set a timezone under Workflow Settings. Without one, n8n falls back to the instance timezone, and self-hosted installs default to America/New_York.

Prefer cron? Use Custom (Cron) with 0 7 * * 1. Either way, the n8n Schedule Trigger only fires after the workflow is saved and published.

Step 5: Build Platform Inputs With a Code Node

Add a Google Sheets node (Get Row(s), tab Creator Roster), then a Code node. That Code node turns roster rows into one input object per platform.

const rows = $input.all().map(i => i.json).filter(r => r.active === 'yes');

const since = $now.minus({ days: 7 }).toFormat('yyyy-MM-dd');

const pick = p => rows.filter(r => r.platform === p);

return [{ json: {

  youtube: {

    startUrls: pick('youtube').map(r => ({ url: r.profile_url })),

    maxResults: 15, maxResultsShorts: 15, maxResultStreams: 0,

    sortVideosBy: 'NEWEST', oldestPostDate: since

  },

  tiktok: {

    profiles: pick('tiktok').map(r => r.handle),

    resultsPerPage: 20, profileSorting: 'latest',

    excludePinnedPosts: true, oldestPostDateUnified: since

  },

  instagram: {

    directUrls: pick('instagram').map(r => r.profile_url),

    resultsType: 'posts', resultsLimit: 20, onlyPostsNewerThan: since

  }

}}];

$now is n8n's built-in Luxon date, so the window of seven days rolls forward automatically each week. No manual date edits, ever.

Step 6: Execute Three Apify Actors in Parallel

Branch the Code node into three Apify nodes. Choose the Actor Tasks resource with the operation that executes a task and returns its dataset items.

In Custom input, pass the matching object as an expression:

{{ JSON.stringify($json.youtube) }}

Repeat with $json.tiktok and $json.instagram. Custom input overrides the saved task input, while timeout and memory still come from the task.

Prefer two separate nodes? Execute the Actor with Wait for finish on, then add Get dataset items using {{ $json.defaultDatasetId }}. Both paths return identical data.

Step 7: Merge and Normalize Into One Schema

Connect all three Apify nodes to a Merge node set to Append. Every platform names fields differently, so a Code node maps them into one shared shape.

const out = [];

for (const { json: p } of $input.all()) {

  if (p.error) continue; // skip failed inputs

  if (p.webVideoUrl) {

    out.push({ platform: 'tiktok', post_id: p.id, creator: p.authorMeta?.name,

      url: p.webVideoUrl, caption: p.text, published: p.createTimeISO,

      views: p.playCount, likes: p.diggCount, comments: p.commentCount,

      shares: p.shareCount });

  } else if (p.shortCode) {

    out.push({ platform: 'instagram', post_id: p.shortCode, creator: p.ownerUsername,

      url: p.url, caption: p.caption, published: p.timestamp,

      views: p.videoViewCount ?? null, likes: p.likesCount,

      comments: p.commentsCount, shares: null });

  } else if (p.viewCount !== undefined) {

    out.push({ platform: 'youtube', post_id: p.id, creator: p.channelName,

      url: p.url, caption: p.title, published: p.date,

      views: p.viewCount, likes: p.likes, comments: p.commentsCount,

      shares: null });

  }

}

return out.map(json => ({ json }));

YouTube Scraper writes error items for deleted videos or missing channels. The p.error check drops those before they skew any score.

Step 8: Score Every Post With Outlier and Engagement Math

Raw views flatter big accounts. A creator outlier score compares each post against that creator's own median, so a small channel's breakout stands out.

MetricFormulaWhat It Tells You
Outlier Scorepost views ÷ creator median viewsHow far a post beat its own baseline
Engagement Rate(likes + comments + shares) ÷ views × 100How hard viewers reacted
Instagram Fallbackpost likes ÷ creator median likesWorks for image posts with no view count
const items = $input.all().map(i => i.json);

const base = it => it.views || it.likes || 0;

const groups = {};

for (const it of items) (groups[it.creator] ??= []).push(base(it));

const median = a => { const s = [...a].sort((x, y) => x - y), m = Math.floor(s.length / 2);

  return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2; };

return items.map(it => {

  const med = median(groups[it.creator]) || 1;

  const eng = it.views ? ((it.likes || 0) + (it.comments || 0) + (it.shares || 0)) / it.views * 100 : null;

  return { json: { ...it, outlier: +(base(it) / med).toFixed(2),

    engagement: eng === null ? null : +eng.toFixed(2) } };

}).sort((a, b) => b.json.outlier - a.json.outlier);

One week of posts makes a thin baseline. After a few weeks, read the Post Log tab and compute medians from trailing history instead.

Step 9: Block Repeats With the Remove Duplicates Node

Add a Remove Duplicates node after scoring. Set operation to Remove Items Processed in Previous Executions and Keep Items Where to Value Is New.

Value to Dedupe On: {{ $json.platform }}_{{ $json.post_id }}
Scope: Node
History Size: default 10,000 is plenty for most rosters

This persistent dedupe stops a manual retrigger from emailing the same posts twice. Clear Deduplication History resets it while testing.

Step 10: Add the AI Pattern Analysis Layer

Use a Limit node to keep the top 15 posts, then an Aggregate node set to All Item Data. That hands the whole batch to AI as one item.

Next, add a Basic LLM Chain with any chat model you already use, such as OpenAI, Anthropic or Gemini.

Turn on Require Specific Output Format and attach a Structured Output Parser.

You are a short-form content strategist.

Below are this week's top creator posts as JSON, ranked by outlier score.

Return JSON with:

– “patterns”: 3 recurring hooks or formats, each citing post URLs

– “topics”: topics appearing in 2+ winning posts

– “ideas”: 3 content ideas our team can film this week

Use only evidence from the data. If a pattern is weak, say so.

{{ JSON.stringify($json.data) }}

Captions alone miss the spoken hook, which usually decides a short video's fate.

With transcripts switched on in the YouTube or TikTok task, carry the opening lines of subtitle text into the normalized item.

Trim that text to roughly the first 300 characters. The model then compares real opening lines across winners, and token usage stays small.

The “use only evidence” line matters. It keeps AI content pattern analysis anchored to real posts instead of generic trend chatter.

Step 11: Assemble the HTML Digest and Send Through Gmail

A final Code node pairs scored posts with AI output and builds the email body:

const posts = $('Limit').all().map(i => i.json);

const ai = ('BasicLLMChain').first().json.output;constrows=posts.map(p=>`<tr><td>{p.platform}</td><td>p.creator</td><td><ahref="{p.url}">(p.caption||'').slice(0,70)</a></td><td>{p.outlier}x</td><td>p.engagement??'–'%</td></tr>`).join('');consthtml=`<h2>TopOutliers</h2><tableborder="1"cellpadding="6">{rows}</table>

  <h2>Patterns</h2><ul>${ai.patterns.map(x => `<li>${x}</li>`).join('')}</ul>

  <h2>Ideas</h2><ul>${ai.ideas.map(x => `<li>${x}</li>`).join('')}</ul>`;

return [{ json: { html } }];const items = $input.all().map(i => i.json);

const base = it => it.views || it.likes || 0;

const groups = {};

for (const it of items) (groups[it.creator] ??= []).push(base(it));

const median = a => { const s = [...a].sort((x, y) => x - y), m = Math.floor(s.length / 2);

  return s.length % 2 ? s[m] : (s[m - 1] + s[m]) / 2; };

return items.map(it => {

  const med = median(groups[it.creator]) || 1;

  const eng = it.views ? ((it.likes || 0) + (it.comments || 0) + (it.shares || 0)) / it.views * 100 : null;

  return { json: { ...it, outlier: +(base(it) / med).toFixed(2),

    engagement: eng === null ? null : +eng.toFixed(2) } };

}).sort((a, b) => b.json.outlier - a.json.outlier);

Then add a Gmail node with these settings:

Resource: Message, Operation: Send
Subject: Creator Research Inbox · Week {{ $now.weekNumber }}
Email Type: HTML, with Message set to {{ $json.html }}
Options: switch off Append n8n Attribution, add CC for teammates

Step 12: Log Posts to Google Sheets and Publish

Branch from the Remove Duplicates node into a Google Sheets node using Append or Update Row on the Post Log tab. Match on post_id so refreshed stats overwrite older rows.

Set mapping to Map Automatically, since normalized field names already match the columns. Execute once manually, check the email, then publish the workflow.

Scaling Up With Apify Schedules and Event Triggers

A single scheduled workflow suits rosters of a few dozen creators. Past that, long scraping jobs keep n8n executions open for minutes and one slow platform stalls the rest.

The fix splits work across both platforms:

Apify Schedules launch all three tasks with cron 0 6 * * 1 and your timezone. One schedule holds up to 10 tasks.
n8n Workflow A uses the On new Apify Event trigger, watching each task for Succeeded, then normalizes and appends posts to Post Log.
n8n Workflow B fires an hour later, reads the week's rows from Sheets, scores, summarizes and emails.
FactorSingle WorkflowSplit Workflow
Setup timeFasterSlightly longer
Long scraping jobsExecution waits throughoutNo waiting inside n8n
One platform failsCan block the digestOthers still land
Self-hosted needsNone extraPublic WEBHOOK_URL for the trigger

New Apify schedules start disabled, so enable yours after saving. Apify also emails you when a scheduled task fails to start.

Keeping the Pipeline Healthy Week After Week

Silent failures are the real enemy here. An empty inbox looks exactly like a quiet week, so build alerts in from day one.

Retry On Fail: enable inside each Apify node's settings with two or three tries and a wait between attempts.
Error output: set On Error to Continue (using error output) so one failed platform doesn't kill the whole digest.
Error workflow: build a small workflow with an Error Trigger node that sends a Gmail or Slack alert, then pick it under Workflow Settings.
Empty data guard: add an IF node after Merge. Zero items should trigger an alert, not a blank email.
Weekly sanity check: compare item counts per platform in the Post Log. A sudden drop for one platform usually points to a broken input URL or a renamed handle.
Apify Timeout field: set a sane ceiling so a stuck job never burns resources for hours.

Usage stays lean through input limits alone. Tight date windows, capped results per profile and transcripts only where needed keep each weekly pull small.

Where Creator Scraping Hits Real Limits

Every automation pitch skips this part, so here it is plainly.

Hidden metrics happen. Instagram creators can hide like counts, and image posts carry no view count. Expect blanks and let the fallback score handle them.
Platforms change markup. Store Actors get maintained, yet breakage still occurs. Check an Actor's Issues tab when output suddenly looks thin.
Small samples mislead. A creator posting twice a week gives a shaky median. Trust outlier scores more once history builds up.
Public data only. Scrape public posts and metrics, skip private accounts, and respect each platform's terms.
Personal data rules apply. Creator names and handles are personal data under GDPR and similar laws, so store only what research needs.

Treat the inbox as a research assistant, not an oracle. A human still decides which pattern deserves a shoot day.

Quick Answers on Apify and n8n Creator Research

Can n8n trigger Apify Actors without code?

The official Apify node executes Actors or tasks, waits for results and returns dataset items, all configured through fields in n8n.

Which creators can this workflow track?

Any public YouTube channel, TikTok profile or Instagram account. Swap in other Apify Store Actors to add more platforms.

Does the Apify node work as an AI Agent tool?

Add the Apify Tool under an AI Agent's tools so a model can trigger scrapes on demand from a chat.

Conclusion

Creator research rewards whoever spots a pattern first. Manual scrolling makes that a full time job, and most teams quietly give up after a few weeks.

Apify and n8n hand that job to a system.

Store Actors pull fresh public posts, Code nodes score them against each creator's own baseline, and an AI layer turns numbers into briefs.

Start with the single scheduled workflow and five creators you already follow. Once the digest proves useful, grow the roster and move to the split setup with Apify Schedules.

Give it three or four weeks of logged history. That's when outlier scores sharpen and your Monday inbox starts beating any trend report you could buy.

Leave a Reply

Your email address will not be published. Required fields are marked *

This site uses Akismet to reduce spam. Learn how your comment data is processed.

Join the Aimojo Tribe!

Join 76,000+ members for insider tips every week! 
🎁 BONUS: Get our $200 “AI Mastery Toolkit” FREE when you sign up!

Trending AI Tools
Bulin AI

Turn Any Photo into the Viral Bulin 47 Freestyle Performance in Seconds The AI video generator built for one iconic street scene.

Instantly

Scale Your Cold Email Outreach and Turn Leads Into Revenue on Autopilot The all in one sales engagement platform built for high volume B2B prospecting

Listimo

The AI Tool That Turns One Product Photo into a Full Amazon Listing in Minutes Your all in one Amazon listing, image and video generator

Verla

AI Academic Workspace That Turns Assignment Briefs into Submission Ready Drafts AI powered assignment writing, detection, and humanisation

PixelCrew AI

Turn Any Design Brief into Production Ready HTML with AI Agents AI design workspace that replaces your creative pipeline from research to shipped code

© Copyright 2023 - 2026 | Become an AI Pro | Made with ♥