<?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: HaveAGoodOne</title>
    <description>The latest articles on DEV Community by HaveAGoodOne (@movevaluefast).</description>
    <link>https://dev.to/movevaluefast</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%2F3912198%2Fc4439593-1a63-493c-841e-f715f70863e3.jpg</url>
      <title>DEV Community: HaveAGoodOne</title>
      <link>https://dev.to/movevaluefast</link>
    </image>
    <atom:link rel="self" type="application/rss+xml" href="https://dev.to/feed/movevaluefast"/>
    <language>en</language>
    <item>
      <title>How I track revenue across AdMob, AdSense, YouTube, and RevenueCat without ten tabs</title>
      <dc:creator>HaveAGoodOne</dc:creator>
      <pubDate>Sun, 28 Jun 2026 09:51:58 +0000</pubDate>
      <link>https://dev.to/movevaluefast/how-i-track-revenue-across-admob-adsense-youtube-and-revenuecat-without-ten-tabs-1n14</link>
      <guid>https://dev.to/movevaluefast/how-i-track-revenue-across-admob-adsense-youtube-and-revenuecat-without-ten-tabs-1n14</guid>
      <description>&lt;p&gt;If you earn from more than one source, you already know the ritual. Open AdSense. Switch tabs. Open AdMob. Another tab for YouTube. Open RevenueCat. Repeat for every account you manage. You do this every morning, and you still cannot answer one simple question: how much did I make yesterday, across everything?&lt;br&gt;
I ran into this managing several AdMob and AdSense accounts alongside subscription revenue. After enough mornings lost to tab-switching and mental math, I started treating it as a real problem instead of a chore. Here is what I learned, and the approach that finally fixed it.&lt;br&gt;
The actual problem is not earning, it is reconciliation&lt;br&gt;
The money is not the hard part. Trusting the total is. Three things make a combined number surprisingly difficult to get right.&lt;br&gt;
First, every platform reports on its own timeline. AdSense, AdMob, and YouTube all show estimated earnings that get revised before payout. RevenueCat subscription revenue lives in a completely separate system with its own refund and proration logic. The number you see at 9am is rarely the number that lands.&lt;br&gt;
Second, the data is fragmented by design. Native dashboards are siloed on purpose. There is no single place that shows ad revenue and subscription revenue side by side, so you stitch it together yourself.&lt;br&gt;
Third, multi-account makes it worse fast. The moment you run a second AdMob account, or a separate Google login for a different property, you lose the single view entirely. Each account is its own login, its own report, its own export.&lt;br&gt;
This is the fragmentation tax. It is the daily gap between what your accounts show and what you will actually receive.&lt;br&gt;
Track at the account level, not the platform level&lt;br&gt;
The single most useful shift for me was to stop thinking in platforms and start thinking in accounts.&lt;br&gt;
When your total moves, "AdSense is down" is not actionable. "AdSense account 2 on the recipes site is down 30 percent while account 1 is flat" is. Revenue problems almost always live in a specific account, not a whole platform, so that is the level you want visibility at. Build your tracking so you can answer "which account moved" in seconds, not after ten minutes of digging.&lt;br&gt;
The options, from cheapest to most complete&lt;br&gt;
For a single account, the official AdMob app or the AdSense report is genuinely fine. Do not overbuild.&lt;br&gt;
For a few sources, a spreadsheet plus the reporting APIs gets you far. AdMob and AdSense both have APIs that return revenue, impressions, clicks, and eCPM per account and per ad unit. RevenueCat has a clean API too. You can pull these into one sheet on a schedule. The cost is maintenance, because every account adds another connection to babysit.&lt;br&gt;
For many accounts or genuinely mixed revenue, the spreadsheet becomes the problem it was meant to solve. At that point you want a layer that aggregates everything into one view and keeps it in sync for you.&lt;br&gt;
What I ended up building&lt;br&gt;
I built Aperio because nothing covered ad revenue and subscription revenue together. It connects AdSense, AdMob, YouTube, RevenueCat, Shopify, and Patreon read-only, and shows combined revenue across every account in one mobile view, with drill-down by account and asset so you can see exactly which one moved. Read-only and OAuth-only, so it reads your numbers and never touches the accounts.&lt;br&gt;
It is free on iOS (&lt;a href="https://apps.apple.com/il/app/aperio-all-revenues-one-view/id6778547730" rel="noopener noreferrer"&gt;https://apps.apple.com/il/app/aperio-all-revenues-one-view/id6778547730&lt;/a&gt;) and Android (&lt;a href="https://play.google.com/store/apps/details?id=com.aperio.get" rel="noopener noreferrer"&gt;https://play.google.com/store/apps/details?id=com.aperio.get&lt;/a&gt;) if you want to skip the spreadsheet stage.&lt;br&gt;
However you solve it, the principle is the same: one combined number, tracked at the account level, that you can trust without opening ten tabs. If you manage more than one revenue source, I would genuinely like to hear how you handle it today.&lt;/p&gt;

</description>
      <category>mobile</category>
      <category>webmonetization</category>
      <category>indiehackers</category>
      <category>webdev</category>
    </item>
    <item>
      <title>AI Has Hands Now. You Should Decide What It Can Do.</title>
      <dc:creator>HaveAGoodOne</dc:creator>
      <pubDate>Mon, 04 May 2026 14:05:24 +0000</pubDate>
      <link>https://dev.to/movevaluefast/ai-has-hands-now-you-should-decide-what-it-can-do-1aem</link>
      <guid>https://dev.to/movevaluefast/ai-has-hands-now-you-should-decide-what-it-can-do-1aem</guid>
      <description>&lt;h2&gt;
  
  
  ⚠️ Example
&lt;/h2&gt;

&lt;p&gt;An AI agent with access to your tools can already:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;delete your production users table&lt;/li&gt;
&lt;li&gt;send emails to real customers&lt;/li&gt;
&lt;li&gt;trigger payments or workflows&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;In most systems today — these actions just execute.&lt;/p&gt;

&lt;p&gt;No checkpoint. No approval.&lt;/p&gt;




&lt;p&gt;We’ve crossed a line.&lt;/p&gt;

&lt;p&gt;AI is no longer just generating text.&lt;/p&gt;

&lt;p&gt;It’s starting to &lt;strong&gt;take actions&lt;/strong&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;sendEmail&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;customer&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;transferFunds&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;amount&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;If the agent decides to do it — it just runs.&lt;/p&gt;

&lt;p&gt;That’s fine in a demo.&lt;/p&gt;

&lt;p&gt;It’s &lt;strong&gt;not fine in production&lt;/strong&gt;.&lt;/p&gt;




&lt;h2&gt;
  
  
  Where things break
&lt;/h2&gt;

&lt;p&gt;Once AI touches real systems, you’re exposed to:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;accidental destructive actions&lt;/li&gt;
&lt;li&gt;prompt injection leading to unintended behavior&lt;/li&gt;
&lt;li&gt;over-permissioned tools&lt;/li&gt;
&lt;li&gt;zero auditability of decisions&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You don’t need a malicious AI.&lt;/p&gt;

&lt;p&gt;You just need:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;a slightly wrong decision, at the wrong time&lt;/p&gt;
&lt;/blockquote&gt;




&lt;h2&gt;
  
  
  The missing layer
&lt;/h2&gt;

&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Every action should be checked before it runs.&lt;/strong&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Not after.&lt;br&gt;
Not in logs.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Before execution.&lt;/strong&gt;&lt;/p&gt;


&lt;h2&gt;
  
  
  What Runplane does
&lt;/h2&gt;

&lt;p&gt;Runplane sits between your AI and real-world execution.&lt;/p&gt;

&lt;p&gt;Every action becomes:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;✅ ALLOW&lt;/li&gt;
&lt;li&gt;❌ BLOCK&lt;/li&gt;
&lt;li&gt;⏸ REQUIRE APPROVAL&lt;/li&gt;
&lt;/ul&gt;


&lt;h2&gt;
  
  
  Example
&lt;/h2&gt;

&lt;p&gt;Without control:&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="k"&gt;await&lt;/span&gt; &lt;span class="nf"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;/div&gt;



&lt;p&gt;With Runplane:&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="k"&gt;await&lt;/span&gt; &lt;span class="nx"&gt;runplane&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nf"&gt;guard&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;delete_user&lt;/span&gt;&lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="dl"&gt;"&lt;/span&gt;&lt;span class="s2"&gt;production-db&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="nx"&gt;userId&lt;/span&gt; &lt;span class="p"&gt;},&lt;/span&gt;
  &lt;span class="k"&gt;async &lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="nf"&gt;deleteUser&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;userId&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;p&gt;Now:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;destructive actions can be blocked&lt;/li&gt;
&lt;li&gt;risky actions can require approval&lt;/li&gt;
&lt;li&gt;everything is logged and auditable&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Where this fits
&lt;/h2&gt;

&lt;p&gt;If you're building:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;AI agents&lt;/li&gt;
&lt;li&gt;MCP tools&lt;/li&gt;
&lt;li&gt;automation workflows&lt;/li&gt;
&lt;li&gt;internal copilots&lt;/li&gt;
&lt;li&gt;API-driven systems&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You already have this risk.&lt;/p&gt;

&lt;p&gt;You just haven’t hit it yet.&lt;/p&gt;




&lt;h2&gt;
  
  
  Try it
&lt;/h2&gt;

&lt;p&gt;There’s a free developer tier:&lt;/p&gt;

&lt;p&gt;&lt;a href="https://runplane.ai/auth/sign-up?mode=developer" rel="noopener noreferrer"&gt;https://runplane.ai/auth/sign-up?mode=developer&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;You can plug it into a real flow and immediately see:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;actions being blocked&lt;/li&gt;
&lt;li&gt;approvals being triggered&lt;/li&gt;
&lt;/ul&gt;




&lt;h2&gt;
  
  
  Final thought
&lt;/h2&gt;

&lt;p&gt;We’re moving from:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI suggests actions”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;to:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;“AI executes actions”&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;Execution without control is risk.&lt;/p&gt;

&lt;p&gt;AI has hands now.&lt;/p&gt;

&lt;p&gt;You should decide what it’s allowed to touch.&lt;/p&gt;

</description>
    </item>
  </channel>
</rss>
