<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>DEV Community: Shrisab Shrestha</title>
    <description>The latest articles on DEV Community by Shrisab Shrestha (@shrisab_shrestha_ba84e9a3).</description>
    <link>https://dev.to/shrisab_shrestha_ba84e9a3</link>
    <image>
      <url>https://media2.dev.to/dynamic/image/width=90,height=90,fit=cover,gravity=auto,format=auto/https:%2F%2Fdev-to-uploads.s3.us-east-2.amazonaws.com%2Fuploads%2Fuser%2Fprofile_image%2F3210620%2F30e82509-2f2b-4cff-8bc0-4c1ea7225174.jpg</url>
      <title>DEV Community: Shrisab Shrestha</title>
      <link>https://dev.to/shrisab_shrestha_ba84e9a3</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/shrisab_shrestha_ba84e9a3"/>
    <language>en</language>
    <item>
      <title>Turn one devlog into posts for every channel with n8n + AI</title>
      <dc:creator>Shrisab Shrestha</dc:creator>
      <pubDate>Tue, 14 Jul 2026 07:33:43 +0000</pubDate>
      <link>https://dev.to/shrisab_shrestha_ba84e9a3/turn-one-devlog-into-posts-for-every-channel-with-n8n-ai-35dp</link>
      <guid>https://dev.to/shrisab_shrestha_ba84e9a3/turn-one-devlog-into-posts-for-every-channel-with-n8n-ai-35dp</guid>
      <description>&lt;p&gt;If you're a solo game developer, you know the drill: you ship an update, write a devlog… and then you have to rewrite it four times. A punchy tweet. A longer Reddit post that doesn't sound like an ad. A casual Discord ping. A newsletter blurb. By the third rewrite you've lost the will to post at all.&lt;/p&gt;

&lt;p&gt;I automated the rewriting with &lt;strong&gt;n8n&lt;/strong&gt;, &lt;strong&gt;Google Gemini&lt;/strong&gt;, and &lt;strong&gt;Notion&lt;/strong&gt;. I write the devlog once, hit run, and get channel-ready drafts waiting in Notion. It &lt;strong&gt;doesn't auto-post&lt;/strong&gt;, it makes drafts I review and send myself, which keeps everything authentic and inside each platform's rules.&lt;/p&gt;

&lt;p&gt;Here's a short demo of the finished workflow:&lt;br&gt;
👉 &lt;a href="https://www.loom.com/share/f108f0a003b448b2bc414a8be742d772" rel="noopener noreferrer"&gt;https://www.loom.com/share/f108f0a003b448b2bc414a8be742d772&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;For one devlog you paste in, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Sends your update to &lt;strong&gt;Gemini&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Reformats it for &lt;strong&gt;four channels&lt;/strong&gt;: Twitter/Bluesky, Reddit, Discord, newsletter&lt;/li&gt;
&lt;li&gt;Parses the result into separate fields&lt;/li&gt;
&lt;li&gt;Saves them as &lt;strong&gt;one Notion row&lt;/strong&gt; with a draft per channel&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Manual Trigger
  → Devlog Input
  → AI Reformat (Gemini)
  → Parse Drafts
  → Save Drafts to Notion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt; running locally (Docker is easiest)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Notion&lt;/strong&gt; account + an internal integration&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Google Gemini&lt;/strong&gt; API key (free tier is fine to start)&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Step 1 - Run n8n
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create n8n_data

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; n8n &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5678:5678 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; n8n_data:/home/node/.n8n &lt;span class="se"&gt;\&lt;/span&gt;
  docker.n8n.io/n8nio/n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt; and create your account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - The devlog input
&lt;/h2&gt;

&lt;p&gt;Add a &lt;strong&gt;Code&lt;/strong&gt; node where you write your update once. Keeping it in a Code node means you just edit two variables each time:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;devlog_title&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Update 0.3 — Online Co-op&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;devlog_body&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s2"&gt;`We just shipped online co-op for up to 4 players,
fixed the save-corruption bug, and added 2 new levels.
Next up: controller support and a Steam demo.`&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt; &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="nx"&gt;devlog_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="nx"&gt;devlog_body&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;(Later you can swap this for a &lt;strong&gt;Form Trigger&lt;/strong&gt; so you get a little web form, or a &lt;strong&gt;Notion Trigger&lt;/strong&gt; that fires when you add a devlog page.)&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 - Reformat with Gemini
&lt;/h2&gt;

&lt;p&gt;Add the &lt;strong&gt;Google Gemini&lt;/strong&gt; node. The trick is to make it return &lt;strong&gt;strict JSON&lt;/strong&gt; so the next node can split it cleanly:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight json"&gt;&lt;code&gt;&lt;span class="err"&gt;You&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;are&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;social&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;media&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;manager&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;solo&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;indie&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;game&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;developer.&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Here&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;is&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;a&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;devlog&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;update:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Title:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$json.devlog_title&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;Body:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;{{&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;$json.devlog_body&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;}}&lt;/span&gt;&lt;span class="w"&gt;

&lt;/span&gt;&lt;span class="err"&gt;Rewrite&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;it&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;for&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;each&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;channel.&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;Return&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;ONLY&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;valid&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;(no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;markdown,&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;code&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;fences,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;no&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;text&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;outside&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;the&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;JSON)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;with&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;these&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;exact&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="err"&gt;keys:&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"twitter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"280 characters max, punchy, 1-2 relevant hashtags"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"reddit"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"friendly longer post for r/IndieDev, first person, no hashtags, no hard selling"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"discord"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"casual short announcement for a community server, 1-2 emojis ok"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt;
  &lt;/span&gt;&lt;span class="nl"&gt;"newsletter"&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;"2-3 sentence email blurb"&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="w"&gt;
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 4 - Parse the drafts
&lt;/h2&gt;

&lt;p&gt;LLMs sometimes wrap JSON in code fences, so a small &lt;strong&gt;Code&lt;/strong&gt; node cleans and parses it, with a fallback so you never lose output:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;$json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;content&lt;/span&gt;&lt;span class="p"&gt;?.&lt;/span&gt;&lt;span class="nx"&gt;parts&lt;/span&gt;&lt;span class="p"&gt;?.[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]?.&lt;/span&gt;&lt;span class="nx"&gt;text&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="c1"&gt;// \x60 is a backtick (char code 96). This strips a code fence&lt;/span&gt;
&lt;span class="c1"&gt;// if the model wraps its JSON output in one.&lt;/span&gt;
&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;clean&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;60&lt;/span&gt;&lt;span class="se"&gt;{3}&lt;/span&gt;&lt;span class="sr"&gt;json&lt;/span&gt;&lt;span class="se"&gt;\s&lt;/span&gt;&lt;span class="sr"&gt;*/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/^&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;60&lt;/span&gt;&lt;span class="se"&gt;{3}\s&lt;/span&gt;&lt;span class="sr"&gt;*/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;replace&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/&lt;/span&gt;&lt;span class="se"&gt;\x&lt;/span&gt;&lt;span class="sr"&gt;60&lt;/span&gt;&lt;span class="se"&gt;{3}&lt;/span&gt;&lt;span class="sr"&gt;$/&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;trim&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;

&lt;span class="kd"&gt;let&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="k"&gt;try&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;JSON&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;parse&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;clean&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;catch &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;e&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
  &lt;span class="nx"&gt;parsed&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;reddit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;raw&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;discord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;newsletter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt; &lt;span class="p"&gt;};&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Devlog Input&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;devlog_title&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;devlog_title&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;twitter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;twitter&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;reddit&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;reddit&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;discord&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;discord&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;newsletter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;parsed&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;newsletter&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;""&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 5 - Save to Notion
&lt;/h2&gt;

&lt;p&gt;Create a Notion database called &lt;strong&gt;Devlog Drafts&lt;/strong&gt; with these properties: &lt;strong&gt;Name&lt;/strong&gt; (title), &lt;strong&gt;Twitter&lt;/strong&gt; (text), &lt;strong&gt;Reddit&lt;/strong&gt; (text), &lt;strong&gt;Discord&lt;/strong&gt; (text), &lt;strong&gt;Newsletter&lt;/strong&gt; (text), &lt;strong&gt;Status&lt;/strong&gt; (text), &lt;strong&gt;Created&lt;/strong&gt; (date).&lt;/p&gt;

&lt;p&gt;Create an internal integration at notion.so/my-integrations, connect it to the database, then map the fields in n8n's &lt;strong&gt;Notion&lt;/strong&gt; node. Set the title to &lt;code&gt;{{ $json.devlog_title }}&lt;/code&gt; and each channel field to its matching value (&lt;code&gt;{{ $json.twitter }}&lt;/code&gt;, etc.).&lt;/p&gt;

&lt;p&gt;Run the workflow and you'll get a new row with four drafts - review, tweak, and post whenever you like.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;All text lands in the Reddit field&lt;/strong&gt; → the model didn't return clean JSON that run. Re-run, or tighten the prompt ("Return ONLY valid JSON"). The fallback in Step 4 keeps your output safe.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty Notion rows&lt;/strong&gt; → property names must match &lt;em&gt;exactly&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Very long drafts&lt;/strong&gt; → normal devlogs are fine; extremely long posts may get truncated in Notion text fields.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Want the done-for-you version?
&lt;/h2&gt;

&lt;p&gt;I packaged this, plus a Steam competitor-tracking workflow - into an importable pack with setup guides, the AI prompts, troubleshooting, and example screenshots:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://shrisab.gumroad.com/l/indie-launch-ops/LAUNCH" rel="noopener noreferrer"&gt;https://shrisab.gumroad.com/l/indie-launch-ops/LAUNCH&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Either way, write the devlog once, and stop dreading the four rewrites. Questions welcome in the comments.&lt;/p&gt;

</description>
      <category>n8n</category>
      <category>gamedev</category>
      <category>automation</category>
      <category>notion</category>
    </item>
    <item>
      <title>Automate weekly Steam competitor research with n8n, Gemini, and Notion</title>
      <dc:creator>Shrisab Shrestha</dc:creator>
      <pubDate>Mon, 13 Jul 2026 14:37:09 +0000</pubDate>
      <link>https://dev.to/shrisab_shrestha_ba84e9a3/automate-weekly-steam-competitor-research-with-n8n-gemini-and-notion-2m1a</link>
      <guid>https://dev.to/shrisab_shrestha_ba84e9a3/automate-weekly-steam-competitor-research-with-n8n-gemini-and-notion-2m1a</guid>
      <description>&lt;p&gt;If you're a solo game developer, you probably &lt;em&gt;mean&lt;/em&gt; to keep an eye on your Steam competitors - player counts, review trends, what people praise or complain about. And then you don't, because opening five store pages every week is boring.&lt;/p&gt;

&lt;p&gt;I automated the whole thing with &lt;strong&gt;n8n&lt;/strong&gt;, &lt;strong&gt;Steam's public APIs&lt;/strong&gt;, &lt;strong&gt;Google Gemini&lt;/strong&gt;, and &lt;strong&gt;Notion&lt;/strong&gt;. No Steam API key required, and it runs on free tiers. Here's exactly how it works, so you can build your own, and if you'd rather skip the wiring, there's a ready-to-import pack at the end.&lt;/p&gt;

&lt;p&gt;Here's a 2-minute demo of the finished workflow:&lt;br&gt;
👉 &lt;a href="https://www.loom.com/share/4edd443f3ae341088dfa025d55efcc34" rel="noopener noreferrer"&gt;https://www.loom.com/share/4edd443f3ae341088dfa025d55efcc34&lt;/a&gt;&lt;/p&gt;
&lt;h2&gt;
  
  
  What it does
&lt;/h2&gt;

&lt;p&gt;Once a week (or on demand), for every competitor you list, it:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;Pulls the &lt;strong&gt;current player count&lt;/strong&gt; from Steam&lt;/li&gt;
&lt;li&gt;Pulls &lt;strong&gt;review score + total reviews&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Calculates a simple &lt;strong&gt;popularity score&lt;/strong&gt;
&lt;/li&gt;
&lt;li&gt;Writes a short &lt;strong&gt;AI brief&lt;/strong&gt; (what players care about, risks, one lesson for a solo dev)&lt;/li&gt;
&lt;li&gt;Saves &lt;strong&gt;one Notion row per game&lt;/strong&gt;
&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The flow looks like this:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight plaintext"&gt;&lt;code&gt;Schedule Trigger
  → Competitor List
  → Loop Over Items
      → Get Player Count (Steam)
      → Get Reviews (Steam)
      → Calculate Score
      → AI Summary (Gemini)
      → Save to Notion
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  What you need
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;n8n&lt;/strong&gt; running locally (Docker is easiest)&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Notion&lt;/strong&gt; account + an internal integration&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;Google Gemini&lt;/strong&gt; API key (free tier is fine to start)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;No Steam API key, the endpoints we use are public.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 1 - Run n8n
&lt;/h2&gt;



&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight shell"&gt;&lt;code&gt;docker volume create n8n_data

docker run &lt;span class="nt"&gt;-d&lt;/span&gt; &lt;span class="nt"&gt;--name&lt;/span&gt; n8n &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-p&lt;/span&gt; 5678:5678 &lt;span class="se"&gt;\&lt;/span&gt;
  &lt;span class="nt"&gt;-v&lt;/span&gt; n8n_data:/home/node/.n8n &lt;span class="se"&gt;\&lt;/span&gt;
  docker.n8n.io/n8nio/n8n
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Open &lt;a href="http://localhost:5678" rel="noopener noreferrer"&gt;http://localhost:5678&lt;/a&gt; and create your account.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 2 - The competitor list
&lt;/h2&gt;

&lt;p&gt;Add a &lt;strong&gt;Code&lt;/strong&gt; node that returns the games you want to track. The &lt;code&gt;app_id&lt;/code&gt; is the number in a game's Steam store URL (&lt;code&gt;store.steampowered.com/app/APP_ID/...&lt;/code&gt;):&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;games&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;game_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;PlateUp!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;1687950&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;game_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Unrailed!&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;754150&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="na"&gt;game_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;Overcooked! 2&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="na"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;728880&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
&lt;span class="p"&gt;];&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nx"&gt;games&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;map&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;({&lt;/span&gt; &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;g&lt;/span&gt; &lt;span class="p"&gt;}));&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Feed it into a &lt;strong&gt;Loop Over Items&lt;/strong&gt; node so each game runs through the pipeline.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 3 - Current players (no API key)
&lt;/h2&gt;

&lt;p&gt;An &lt;strong&gt;HTTP Request&lt;/strong&gt; node:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://api.steampowered.com/ISteamUserStats/GetNumberOfCurrentPlayers/v1/
  ?appid={{ $json.app_id }}
  &amp;amp;format=json
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;Returns &lt;code&gt;{"response":{"player_count":1234,"result":1}}&lt;/code&gt;. A 404 means a bad App ID, double-check the number.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 4 - Reviews
&lt;/h2&gt;

&lt;p&gt;Another &lt;strong&gt;HTTP Request&lt;/strong&gt; node hits Steam's public review summary:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight http"&gt;&lt;code&gt;&lt;span class="err"&gt;GET https://store.steampowered.com/appreviews/{{ $json.app_id }}
  ?json=1
  &amp;amp;language=english
  &amp;amp;num_per_page=0
&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;You get &lt;code&gt;query_summary.total_reviews&lt;/code&gt; and &lt;code&gt;review_score_desc&lt;/code&gt; (e.g. "Very Positive").&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 5 - A simple popularity score
&lt;/h2&gt;

&lt;p&gt;A &lt;strong&gt;Code&lt;/strong&gt; node combines players and reviews so a game with lots of players &lt;em&gt;and&lt;/em&gt; lots of reviews ranks higher:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight javascript"&gt;&lt;code&gt;&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Loop Over Items&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;players&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Get Player Count&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;response&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{}).&lt;/span&gt;&lt;span class="nx"&gt;player_count&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;review&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nf"&gt;$&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="s1"&gt;Get Reviews&lt;/span&gt;&lt;span class="dl"&gt;'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;item&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;json&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;query_summary&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="p"&gt;{};&lt;/span&gt;
&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;total_reviews&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;

&lt;span class="kd"&gt;const&lt;/span&gt; &lt;span class="nx"&gt;popularity&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;round&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;players&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt; &lt;span class="nb"&gt;Math&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;log10&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;total&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;));&lt;/span&gt;

&lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;[{&lt;/span&gt;
  &lt;span class="na"&gt;json&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="na"&gt;game_name&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;game_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;player_count&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;players&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;review_score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;review&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;review_score_desc&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;No score&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;total_reviews&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;total&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;popularity_score&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;popularity&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="na"&gt;steam_link&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;`https://store.steampowered.com/app/&lt;/span&gt;&lt;span class="p"&gt;${&lt;/span&gt;&lt;span class="nx"&gt;game&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;app_id&lt;/span&gt;&lt;span class="p"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;`&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="p"&gt;}&lt;/span&gt;
&lt;span class="p"&gt;}];&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 6 - AI brief with Gemini
&lt;/h2&gt;

&lt;p&gt;Add the &lt;strong&gt;Google Gemini&lt;/strong&gt; node and give it a focused prompt so you get solo-dev insight, not marketing fluff:&lt;br&gt;
&lt;/p&gt;

&lt;div class="highlight js-code-highlight"&gt;
&lt;pre class="highlight markdown"&gt;&lt;code&gt;You are a game market analyst helping a solo indie developer.

Game: {{ $json.game_name }}
Current players: {{ $json.player_count }}
Review score: {{ $json.review_score }}
Total reviews: {{ $json.total_reviews }}

Write short markdown:
&lt;span class="p"&gt;1.&lt;/span&gt; What players likely care about (3 bullets)
&lt;span class="p"&gt;2.&lt;/span&gt; Possible complaints or risks (2 bullets)
&lt;span class="p"&gt;3.&lt;/span&gt; One lesson a solo dev could learn from this game

Under 180 words. Be practical, not hype.
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;h2&gt;
  
  
  Step 7 - Save to Notion
&lt;/h2&gt;

&lt;p&gt;Create a Notion database with these properties: &lt;strong&gt;Name&lt;/strong&gt; (title), &lt;strong&gt;AI Summary&lt;/strong&gt; (text), &lt;strong&gt;Steam App ID&lt;/strong&gt; (text), &lt;strong&gt;Player Count&lt;/strong&gt; (number), &lt;strong&gt;Review Score&lt;/strong&gt; (text), &lt;strong&gt;Popularity Score&lt;/strong&gt; (number), &lt;strong&gt;Steam Link&lt;/strong&gt; (URL), &lt;strong&gt;Last Updated&lt;/strong&gt; (date).&lt;/p&gt;

&lt;p&gt;Create an internal integration at notion.so/my-integrations, connect it to the database, then map the fields in n8n's &lt;strong&gt;Notion&lt;/strong&gt; node. The Gemini text lands in &lt;strong&gt;AI Summary&lt;/strong&gt;.&lt;/p&gt;

&lt;h2&gt;
  
  
  Step 8 - Put it on a schedule
&lt;/h2&gt;

&lt;p&gt;Add a &lt;strong&gt;Schedule Trigger&lt;/strong&gt; (e.g. every 7 days), connect it to the Competitor List, and set the workflow &lt;strong&gt;Active&lt;/strong&gt;. Now Notion updates itself while you build your game.&lt;/p&gt;

&lt;h2&gt;
  
  
  Gotchas
&lt;/h2&gt;

&lt;ul&gt;
&lt;li&gt;
&lt;strong&gt;404 on player count&lt;/strong&gt; → wrong App ID.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Empty Notion rows&lt;/strong&gt; → property names must match &lt;em&gt;exactly&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;
&lt;strong&gt;Duplicate rows each week&lt;/strong&gt; → this version appends history; upsert-by-App-ID is a later enhancement.&lt;/li&gt;
&lt;/ul&gt;

&lt;h2&gt;
  
  
  Want the done-for-you version?
&lt;/h2&gt;

&lt;p&gt;If you'd rather import a tested workflow than wire eight nodes, I packaged this with a setup guide, troubleshooting doc, the AI prompt, and example screenshots:&lt;/p&gt;

&lt;p&gt;👉 &lt;strong&gt;&lt;a href="https://shrisab.gumroad.com/l/indie-launch-ops/LAUNCH" rel="noopener noreferrer"&gt;https://shrisab.gumroad.com/l/indie-launch-ops/LAUNCH&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Either way, automate the boring launch chores so you can spend the time making your game. Questions welcome in the comments.&lt;/p&gt;

</description>
      <category>gamedev</category>
      <category>automation</category>
      <category>n8n</category>
      <category>notion</category>
    </item>
  </channel>
</rss>
