<?xml version="1.0" encoding="UTF-8"?><rss xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:atom="http://www.w3.org/2005/Atom" version="2.0"><channel><title><![CDATA[Kendeepp]]></title><description><![CDATA[Kendeepp]]></description><link>https://kendeepp.hashnode.dev</link><image><url>https://cdn.hashnode.com/res/hashnode/image/upload/v1593680282896/kNC7E8IR4.png</url><title>Kendeepp</title><link>https://kendeepp.hashnode.dev</link></image><generator>RSS for Node</generator><lastBuildDate>Sat, 17 Oct 2026 15:56:17 GMT</lastBuildDate><atom:link href="https://kendeepp.hashnode.dev/rss.xml" rel="self" type="application/rss+xml"/><language><![CDATA[en]]></language><ttl>60</ttl><item><title><![CDATA[Four small tools for people who ship alone: Obsidian, Blender and Livewire]]></title><description><![CDATA[I'm the author of everything below. It's all sold in my Gumroad shop: https://kendeepp.gumroad.com
Indie Weekly — a weekly review & ship-log vault for Obsidian ($39)
41 Markdown notes and 8 templates ]]></description><link>https://kendeepp.hashnode.dev/four-small-tools-for-people-who-ship-alone-obsidian-blender-and-livewire</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/four-small-tools-for-people-who-ship-alone-obsidian-blender-and-livewire</guid><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Fri, 16 Oct 2026 07:41:37 GMT</pubDate><content:encoded><![CDATA[<p>I'm the author of everything below. It's all sold in my Gumroad shop: <a href="https://kendeepp.gumroad.com">https://kendeepp.gumroad.com</a></p>
<h2>Indie Weekly — a weekly review &amp; ship-log vault for Obsidian ($39)</h2>
<p>41 Markdown notes and 8 templates (weekly plan, ship log, weekly review, project, decision, experiment…). Core Obsidian settings only, no community plugins required. Made for Obsidian desktop; mobile hasn't been tested yet. → <a href="https://kendeepp.gumroad.com/l/huwkwx">https://kendeepp.gumroad.com/l/huwkwx</a></p>
<h2>ReliaBake — crash-safe PBR baking for Blender ($19, code LAUNCH = $14 until Oct 30)</h2>
<p>Each map bakes in its own background Blender process from a copy of your .blend, so the UI stays responsive and hung jobs are timed out instead of freezing your session. Presets for glTF, Godot, Unreal and Unity. Tested on Blender 4.2.23 and 5.2.2 (extension and legacy install). The Unreal DirectX normal convention isn't officially verified yet. → <a href="https://kendeepp.gumroad.com/l/srttm">https://kendeepp.gumroad.com/l/srttm</a></p>
<h2>Billstack — invoice &amp; billing UI components for Livewire ($29)</h2>
<p>Invoice line editor, tax summary, payment status badge, customer invoice table and recurring schedule fields, plus a standalone demo and 21 PHPUnit tests. PHP 8.2+, Laravel 10+, Livewire 3. UI only: no payment processing, PDFs or jurisdiction-specific tax. → <a href="https://kendeepp.gumroad.com/l/qrzrsa">https://kendeepp.gumroad.com/l/qrzrsa</a></p>
<h2>Texture Relink Pro — relink missing textures &amp; UDIMs in Blender ($12)</h2>
<p>Point it at a folder; it matches missing images by name (case- and extension-tolerant), handles UDIM sets, and reports every change and every ambiguous candidate. Tested on Blender 4.2.23 and 5.2.2. → <a href="https://kendeepp.gumroad.com/l/tszcyh">https://kendeepp.gumroad.com/l/tszcyh</a></p>
<p>Also in the shop: two $5 spreadsheets (budget, reading &amp; habits), Solo OS for online sellers, an n8n support-agent pack, and the Rindstack Next.js starter.</p>
]]></content:encoded></item><item><title><![CDATA[How I made a habit tracker that doesn't lie in February]]></title><description><![CDATA[Most habit grids I tried got one thing wrong: they divide by 30 forever, or they let you tick days that don't exist (Feb 30, Apr 31). Your completion rate quietly drifts.
Here's the approach I settled]]></description><link>https://kendeepp.hashnode.dev/how-i-made-a-habit-tracker-that-doesn-t-lie-in-february</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/how-i-made-a-habit-tracker-that-doesn-t-lie-in-february</guid><category><![CDATA[spreadsheets]]></category><category><![CDATA[google sheets]]></category><category><![CDATA[Productivity]]></category><category><![CDATA[libreoffice]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Fri, 16 Oct 2026 05:44:12 GMT</pubDate><content:encoded><![CDATA[<p>Most habit grids I tried got one thing wrong: they divide by 30 forever, or they let you tick days that don't exist (Feb 30, Apr 31). Your completion rate quietly drifts.</p>
<p>Here's the approach I settled on.</p>
<p><strong>1. Compute the real month length.</strong> With the month's first date in B1: <code>=DAY(EOMONTH(B1,0))</code> → 28/29/30/31.</p>
<p><strong>2. Grey out and lock days past month-end.</strong> Conditional format each day column with <code>=COLUMN()-COLUMN($C$1)+1&gt;DAY(EOMONTH($B$1,0))</code>, and protect those cells so they can't be ticked.</p>
<p><strong>3. Count only real days.</strong> Completion per habit = <code>COUNTIF(row,TRUE)/DAY(EOMONTH($B$1,0))</code>. Because nonexistent days can't be ticked, it can never exceed 100%.</p>
<p><strong>4. Test the edges.</strong> I checked Feb in leap and non-leap years, 30- and 31-day months, and empty rows — 74/74 cases passing in LibreOffice and Google Sheets. I have <strong>not</strong> tested in Microsoft Excel yet.</p>
<p>That's all you need to build your own.</p>
<p><em>Disclosure: I built this with AI assistance and sell a ready-made version (habit grid + books log + yearly dashboard, $5): <a href="https://kendeepp.gumroad.com/l/mouelm">https://kendeepp.gumroad.com/l/mouelm</a>. Everything else I make: <a href="https://kendeepp.gumroad.com">https://kendeepp.gumroad.com</a></em></p>
]]></content:encoded></item><item><title><![CDATA[PayPal withdrawal costs for indie API sellers: the $35 wire, the HK$1,000 line, and thin RapidAPI margins]]></title><description><![CDATA[Not financial, tax, or legal advice. PayPal facts below come from PayPal's public fee and help pages fetched 2026-10-15 (Asia/Shanghai). Fees differ by country of residence and account type and can ch]]></description><link>https://kendeepp.hashnode.dev/paypal-withdrawal-cost-api-micro-margins</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/paypal-withdrawal-cost-api-micro-margins</guid><category><![CDATA[PayPal]]></category><category><![CDATA[#RapidAPI]]></category><category><![CDATA[api]]></category><category><![CDATA[pricing]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 15:45:19 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/edb7b56b-3d17-4ae2-b043-3b2620c48105.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not financial, tax, or legal advice. PayPal facts below come from PayPal's public fee and help pages fetched 2026-10-15 (Asia/Shanghai). Fees differ by country of residence and account type and can change; read the page for your own account before you price anything. This article does not explain how to open accounts in other jurisdictions or move money around rules. Use only the withdrawal options PayPal offers your account.</em></p>
<p>If you sell a small API on RapidAPI, the marketplace cut is only the first deduction. RapidAPI pays providers through PayPal only (<a href="https://kendeepp.hashnode.dev/rapidapi-provider-payouts-paypal-25-percent">this guide</a>), so PayPal's withdrawal fee decides what a cheap plan is actually worth to you.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Mainland China resident, business account:</strong> withdrawing to a bank in Mainland China by wire costs <strong>USD 35.00 per withdrawal</strong> (<a href="https://www.paypal.com/c2/business/paypal-business-fees?locale.x=en_C2">PayPal C2 business fees</a>).</li>
<li><strong>Minimum for that wire: USD 150</strong>, arriving in 3 to 7 business days (<a href="https://www.paypal.com/c2/cshelp/article/how-do-i-withdraw-funds-from-my-paypal-account-help394?locale.x=en_C2">PayPal help: How do I withdraw funds</a>).</li>
<li><strong>Same C2 table, Hong Kong bank account:</strong> <strong>no fee at HKD 1,000 or more</strong>, <strong>HKD 3.50</strong> below that, both "when no currency conversion is involved". The help page gives an HKD 80 minimum and 3 to 6 business days (same sources).</li>
<li><strong>Currency conversion costs extra.</strong> Withdrawing in a currency other than the balance currency adds PayPal's conversion fee (C2 fee page). The exact cost to turn a USD balance into HKD for your account is <strong>Not verified</strong> here.</li>
<li><strong>For micro plans the wire fee dominates.</strong> After RapidAPI's 25%, a $25 plan nets $18.75, so one $35 wire costs almost two months of that subscriber. Withdrawing at the $150 minimum still loses <strong>23.33%</strong> to the wire fee alone.</li>
</ol>
<h2>2) The fee rows, quoted</h2>
<p>From the C2 business fee table, "Withdrawing a balance from a business PayPal account":</p>
<table>
<thead>
<tr>
<th>Withdraw to</th>
<th>Type</th>
<th>Rate (as published)</th>
</tr>
</thead>
<tbody><tr>
<td>Bank account</td>
<td>Wire withdrawal/transfer in Mainland China</td>
<td>35.00 USD (per withdrawal)</td>
</tr>
<tr>
<td>HK bank account</td>
<td>1000.00 HKD or higher</td>
<td>No fee (when no currency conversion is involved)</td>
</tr>
<tr>
<td>HK bank account</td>
<td>1000.00 HKD or lower</td>
<td>3.50 HKD (when no currency conversion is involved)</td>
</tr>
<tr>
<td>US bank account</td>
<td></td>
<td>35.00 USD (per withdrawal)</td>
</tr>
<tr>
<td>Check</td>
<td>Request a check</td>
<td>5.00 USD (per withdrawal)</td>
</tr>
</tbody></table>
<p>Source: <a href="https://www.paypal.com/c2/business/paypal-business-fees?locale.x=en_C2">PayPal C2 business fees</a>. The page says rates apply to accounts of residents of Mainland China. Note that the published table says "or higher" and "or lower" on both HKD rows, so a withdrawal of exactly HKD 1,000 is ambiguous on the page itself. Treat it as <strong>Not verified</strong> and go above it if it matters.</p>
<p>For comparison, PayPal's Hong Kong business fee page (for HK residents) shows the same HKD 1,000 / HKD 3.50 split for local withdrawals and lists Instant Transfer at 1% (min HKD 10, max HKD 100) (<a href="https://www.paypal.com/hk/business/paypal-business-fees">PayPal HK business fees</a>). That page applies to HK residents, not to Mainland accounts.</p>
<p>Eligibility to link a Hong Kong bank account to a Mainland PayPal account depends on PayPal's and the bank's own requirements. Who qualifies is <strong>Not verified</strong> and is outside the scope of this article.</p>
<h2>3) Stack it on a RapidAPI plan</h2>
<p>RapidAPI's own docs: a 25% fee, and PayPal fees on top (<a href="https://docs.rapidapi.com/docs/payouts-and-finance">RapidAPI Payouts and Finance</a>). Arithmetic below uses Python Decimal.</p>
<table>
<thead>
<tr>
<th>Plan list price</th>
<th>After 25%</th>
<th>Minus one USD 35 wire if withdrawn every month</th>
</tr>
</thead>
<tbody><tr>
<td>$5</td>
<td>$3.75</td>
<td>-$31.25</td>
</tr>
<tr>
<td>$10</td>
<td>$7.50</td>
<td>-$27.50</td>
</tr>
<tr>
<td>$25</td>
<td>$18.75</td>
<td>-$16.25</td>
</tr>
<tr>
<td>$75</td>
<td>$56.25</td>
<td>+$21.25</td>
</tr>
</tbody></table>
<p>Monthly withdrawals by Mainland wire only make sense once a month's payout is well above $35. Below that, the fee is larger than the revenue.</p>
<p><strong>Batching math (Mainland wire):</strong></p>
<ul>
<li>The wire minimum is $150. $35 / $150 = <strong>23.33%</strong> of that withdrawal.</li>
<li>One $25 subscriber nets $18.75/month, so reaching $150 takes <strong>8 months</strong> of settled payouts.</li>
<li>At $300 the fee falls to 11.67%; at $1,000 it is 3.5%. The wire fee is fixed, so larger, less frequent withdrawals cost a smaller share.</li>
</ul>
<p><strong>HK bank line (only if your account is eligible and no conversion applies):</strong> the fee is zero at HKD 1,000 or more. As an illustration only, at an assumed USD/HKD 7.80 that is about $128.21. That FX rate is <strong>Not verified</strong> and is not from PayPal's page. Any USD→HKD conversion fee is extra and its amount is <strong>Not verified</strong> here.</p>
<h2>4) Fees that this article does not cover</h2>
<ul>
<li><strong>Receiving fee on RapidAPI's PayPal payout.</strong> The C2 page lists a 4.40% + fixed fee for <em>receiving international commercial transactions</em>, and separate PayPal Payouts fees charged to the <em>sender</em>. Which one, if any, hits a provider receiving RapidAPI's payout is <strong>Not verified</strong>. Check one real payout record.</li>
<li><strong>Bank-side charges</strong> (intermediary or receiving bank wire fees) are not on PayPal's page: <strong>Not verified</strong>.</li>
<li><strong>Tax</strong> on API income in your jurisdiction: out of scope.</li>
</ul>
<h2>5) What this means for pricing a micro API</h2>
<ul>
<li><strong>Do not price a public plan near $5 and expect to cash it out monthly</strong> from a Mainland account by wire. The $35 fixed fee can be several months of that plan's net.</li>
<li><strong>Raise the floor or reduce payout frequency.</strong> A higher first paid tier, or letting the balance build before one larger withdrawal, are the two levers the public fee page leaves you.</li>
<li><strong>Model three deductions, not one:</strong> RapidAPI 25%, any PayPal receiving or conversion fee (Not verified for your account), and the withdrawal fee.</li>
<li><strong>Account for the delay.</strong> RapidAPI pays roughly two months after the sale month (<a href="https://kendeepp.hashnode.dev/rapidapi-provider-payouts-paypal-25-percent">this guide</a>), and batching to reach $150 adds more months on top.</li>
<li><strong>Market reality matters more than fees.</strong> If a comparable PDF API already sells at $0.10 per 1,000 requests (<a href="https://kendeepp.hashnode.dev/pdf-api-marketplace-reality-check">this guide</a>), a thin plan has little room for a fixed $35 cost.</li>
</ul>
<h2>6) Self-check</h2>
<ul>
<li> I read the PayPal fee page for <strong>my</strong> country of residence and <strong>my</strong> account type.</li>
<li> My spreadsheet uses 25% (RapidAPI) plus withdrawal fee plus "Not verified" lines for receiving and conversion fees.</li>
<li> My smallest paid plan still makes sense after one fixed withdrawal fee.</li>
<li> I only use withdrawal methods PayPal offers my account, under its terms.</li>
</ul>
<h2>7) Sources</h2>
<ul>
<li>PayPal C2 business fees (English): <a href="https://www.paypal.com/c2/business/paypal-business-fees?locale.x=en_C2">https://www.paypal.com/c2/business/paypal-business-fees?locale.x=en_C2</a></li>
<li>PayPal C2 help, How do I withdraw funds: <a href="https://www.paypal.com/c2/cshelp/article/how-do-i-withdraw-funds-from-my-paypal-account-help394?locale.x=en_C2">https://www.paypal.com/c2/cshelp/article/how-do-i-withdraw-funds-from-my-paypal-account-help394?locale.x=en_C2</a></li>
<li>PayPal HK business fees: <a href="https://www.paypal.com/hk/business/paypal-business-fees">https://www.paypal.com/hk/business/paypal-business-fees</a></li>
<li>RapidAPI Payouts and Finance: <a href="https://docs.rapidapi.com/docs/payouts-and-finance">https://docs.rapidapi.com/docs/payouts-and-finance</a></li>
</ul>
<p>Product links: None (no product links).</p>
]]></content:encoded></item><item><title><![CDATA[RapidAPI Hub listing self-check: docs fields, plans, privacy, and the proxy secret]]></title><description><![CDATA[Not legal advice. Every Hub field and security fact below comes from RapidAPI docs on docs.rapidapi.com, fetched 2026-10-15 (Asia/Shanghai). RapidAPI can change Studio and these pages at any time; re-]]></description><link>https://kendeepp.hashnode.dev/rapidapi-hub-listing-self-check</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/rapidapi-hub-listing-self-check</guid><category><![CDATA[#RapidAPI]]></category><category><![CDATA[api]]></category><category><![CDATA[listing]]></category><category><![CDATA[documentation]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 15:39:53 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/f8c67a2f-9412-4659-b11a-f6cbe6a9a324.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not legal advice. Every Hub field and security fact below comes from RapidAPI docs on docs.rapidapi.com, fetched 2026-10-15 (Asia/Shanghai). RapidAPI can change Studio and these pages at any time; re-read them before you make an API public.</em></p>
<p>You can price an API carefully and still ship a listing that confuses buyers or leaves your origin open. This is a pre-publish self-check against what RapidAPI's own Hub Listing docs actually describe.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>General tab</strong> is where buyers first judge you: logo, category, short and long description, website, terms of use, visibility, tags, and base URLs (<a href="https://docs.rapidapi.com/docs/hub-listing-general-tab">Hub Listing - General Tab</a>).</li>
<li><strong>Docs tab README</strong> lands on the listing's About tab; the long description lands under the short description on Endpoints. Both accept markdown (<a href="https://docs.rapidapi.com/docs/hub-listing-docs-tab">Hub Listing - Docs Tab</a>).</li>
<li><strong>Definitions</strong> hold endpoints, security schemes, and OpenAPI/Postman imports (<a href="https://docs.rapidapi.com/docs/hub-listing-definitions-tab">Hub Listing - Definitions Tab</a>; <a href="https://docs.rapidapi.com/docs/configuring-api-security">Configuring API Security</a>).</li>
<li><strong>Monetize</strong> supports up to four public plans (BASIC, PRO, ULTRA, MEGA). On rapidapi.com the default free BASIC plan allows one million requests per month unless you change it (<a href="https://docs.rapidapi.com/docs/hub-listing-monetize-tab">Hub Listing - Monetize Tab</a>).</li>
<li><strong>Gateway</strong>: every Rapid Runtime request carries a unique <code>X-RapidAPI-Proxy-Secret</code>. Missing or wrong means the call did not come from Rapid. Copy it from Firewall Settings and enforce it on your origin (<a href="https://docs.rapidapi.com/docs/hub-listing-gateway-tab">Hub Listing - Gateway Tab</a>).</li>
<li><strong>Privacy / retention as a Hub field:</strong> the General tab has optional Terms of use text; Rapid documents request/response logs "up to 7 days" on the Gateway. A separate mandatory "privacy policy URL" or "data retention days" field for providers is <strong>Not verified</strong> in the pages reviewed.</li>
</ol>
<h2>2) General tab checklist</h2>
<p>From <a href="https://docs.rapidapi.com/docs/hub-listing-general-tab">Hub Listing - General Tab</a>:</p>
<ul>
<li> <strong>Logo.</strong> Default is a random image. Upload JPEG/PNG, max 500x500. Hosted on Rapid's infrastructure.</li>
<li> <strong>Category.</strong> Exactly one. Buyers browse by category (examples in the docs: SMS, Education, Commerce, Video and Images, News).</li>
<li> <strong>Short description.</strong> Shown on Hub tiles and search; truncated if too long. Also shown first on the Endpoints tab.</li>
<li> <strong>Long description.</strong> Markdown under the short description on Endpoints.</li>
<li> <strong>Website (optional).</strong> Shown on About as "Product Website".</li>
<li> <strong>Terms of use (optional).</strong> Markup or a link; opens in a popup from About → Resources. You can paste full text or a URL such as a terms page.</li>
<li> <strong>Visibility.</strong> New APIs start <strong>private</strong>. Making one public on rapidapi.com requires checking the Terms of Service box; team-owned APIs need an org admin approval.</li>
<li> <strong>Tags.</strong> Name-value pairs configured by the environment; shown on tiles and used in search filters.</li>
<li> <strong>Base URLs.</strong> Set where the Runtime forwards traffic; confirm they point at your production origin.</li>
<li> <strong>Health check.</strong> Present on the General tab; whether it is required before going public is <strong>Not verified</strong>.</li>
</ul>
<h2>3) Docs tab vs long description</h2>
<p>From <a href="https://docs.rapidapi.com/docs/hub-listing-docs-tab">Hub Listing - Docs Tab</a>:</p>
<ul>
<li><strong>Docs / README</strong> → markdown on the listing <strong>About</strong> tab (visual editor available).</li>
<li><strong>Long description</strong> (General) → markdown under the short description on <strong>Endpoints</strong>.</li>
</ul>
<p>Use either or both. A practical split: About README for auth overview, limits, and failure modes; Endpoints long description for what each resource returns. Images in README use the toolbar or markdown image syntax.</p>
<h2>4) Definitions and security</h2>
<p>From <a href="https://docs.rapidapi.com/docs/hub-listing-definitions-tab">Hub Listing - Definitions Tab</a> and <a href="https://docs.rapidapi.com/docs/configuring-api-security">Configuring API Security</a>:</p>
<ul>
<li>Prefer updating endpoints by <strong>re-uploading OpenAPI or Postman</strong> so you keep one source of truth.</li>
<li>Path parameters, query params, headers, and body types are defined per endpoint.</li>
<li><strong>RapidAPI Auth</strong> headers are always in play on rapidapi.com because every public Hub API uses the Rapid Runtime. Extra schemes (header, query, basic, bearer, OAuth2, etc.) are optional and stack on top.</li>
<li>If you add your own auth scheme, document what the consumer must send; the scheme description appears next to Authorization in the listing.</li>
</ul>
<p>Self-check: call each public endpoint from the playground with only the documented headers. If your origin accepts the same call without Rapid headers, you have a Gateway problem (next section).</p>
<h2>5) Monetize tab (plans only — not payout math)</h2>
<p>Payout percentages and settlement lag are covered in <a href="https://kendeepp.hashnode.dev/rapidapi-provider-payouts-paypal-25-percent">this guide</a>. For listing readiness, the Monetize docs say:</p>
<ul>
<li>Up to <strong>four public plans</strong>: BASIC, PRO, ULTRA, MEGA, plus private plans (<a href="https://docs.rapidapi.com/docs/hub-listing-monetize-tab">Hub Listing - Monetize Tab</a>).</li>
<li>Default <strong>BASIC</strong> is free; on rapidapi.com it allows <strong>one million</strong> requests/month unless changed. Consumers get emails at 85% and 100% of quota.</li>
<li>Plan knobs: visibility, type, subscription price, objects/quotas, features (endpoint access), optional approval, optional contract, "Recommended" label.</li>
<li>Changing a plan after subscribers exist leaves them on the old plan labeled "Deprecated Plan".</li>
<li>From <a href="https://docs.rapidapi.com/docs/monetizing-your-api-on-rapidapicom">Monetizing Your API on rapidapi.com</a>: Free / Pay Per Use / Freemium / Paid; Free APIs cannot collect payments through Rapid; freemium and paid require a credit card even for a free tier; above 500K requests/month the minimum is <strong>$0.00003 per call</strong> (example: 2M/month → at least $45/month).</li>
</ul>
<p><strong>Conflict to remember:</strong> Monetizing page cites a 500K free-plan cap; Monetize Tab cites 1M for default BASIC on rapidapi.com. Which cap a brand-new listing gets is <strong>Not verified</strong> until you read your own Studio plan.</p>
<p>Suggested list prices in the monetizing docs (BASIC free / PRO \(25 / ULTRA \)75 / MEGA $150) are recommendations, not requirements.</p>
<h2>6) Gateway: Proxy-Secret, secrets, and logs</h2>
<p>From <a href="https://docs.rapidapi.com/docs/hub-listing-gateway-tab">Hub Listing - Gateway Tab</a>:</p>
<ul>
<li>On rapidapi.com, APIs <strong>must</strong> use the Rapid Runtime.</li>
<li>Rapid adds <strong><code>X-RapidAPI-Proxy-Secret</code></strong> to every request. Unique per API. If missing or different, treat the call as not from Rapid.</li>
<li>Copy the value from <strong>Firewall Settings</strong> and validate it in your API gateway or app.</li>
<li>Optional: allowlist the published Rapid Runtime IP list (same page).</li>
<li><strong>Secret headers &amp; parameters:</strong> name/value pairs Rapid injects and hides from consumers (useful for a single upstream API key). Transformations are the more flexible alternative when values differ by plan or endpoint (<a href="https://docs.rapidapi.com/docs/hub-listing-request-and-response-transformations">Request and Response Transformations</a>).</li>
<li>Runtime benefits listed include timeout/rate/size/quota enforcement, monetization, analytics, mocking, transformations, <strong>detailed request and response logs (up to 7 days)</strong>, and automatic CORS for playground tests.</li>
</ul>
<p>Self-check: from a non-Rapid client, call your origin URL directly. The request must fail your Proxy-Secret (and/or IP) check. Then call via the Hub playground and confirm success.</p>
<h2>7) Privacy and data retention — what the Hub docs say vs what they do not</h2>
<p><strong>Documented:</strong></p>
<ul>
<li>Optional <strong>Terms of use</strong> field on General (can hold privacy text or a link) (<a href="https://docs.rapidapi.com/docs/hub-listing-general-tab">General Tab</a>).</li>
<li>Rapid Runtime keeps <strong>detailed request/response logs up to 7 days</strong> (<a href="https://docs.rapidapi.com/docs/hub-listing-gateway-tab">Gateway Tab</a>).</li>
</ul>
<p><strong>Not verified</strong> from the Hub Listing pages reviewed:</p>
<ul>
<li>A dedicated mandatory privacy-policy URL field.</li>
<li>A Hub-enforced retention period for <strong>your</strong> storage of uploaded files (for example PDF bodies you write to disk).</li>
<li>Whether Rapid's 7-day logs include full payloads for all content types, who can access them, and how deletion requests work.</li>
</ul>
<p>If your API accepts uploads or personal data, say in Terms of use / README what you store, for how long, and what you delete — and make the implementation match. Do not invent a RapidAPI retention SLA that the docs do not state.</p>
<h2>8) One-page pre-publish checklist</h2>
<ul>
<li> Logo, category, short description, long description, README filled.</li>
<li> Terms of use states refunds, abuse, and (if relevant) data handling.</li>
<li> Visibility set to public only after playground tests pass.</li>
<li> OpenAPI matches live endpoints; security schemes match what buyers must send.</li>
<li> Plans: free BASIC limits honest; paid floors respect $0.00003 above 500K if applicable.</li>
<li> <code>X-RapidAPI-Proxy-Secret</code> enforced on origin; direct hits rejected.</li>
<li> Secret upstream keys live in Gateway secrets or transformations, not in consumer-visible docs.</li>
<li> PayPal linked and fee model understood via <a href="https://kendeepp.hashnode.dev/rapidapi-provider-payouts-paypal-25-percent">this guide</a> before turning paid plans on.</li>
</ul>
<h2>9) Sources</h2>
<ul>
<li>Hub Listing - General Tab: <a href="https://docs.rapidapi.com/docs/hub-listing-general-tab">https://docs.rapidapi.com/docs/hub-listing-general-tab</a></li>
<li>Hub Listing - Docs Tab: <a href="https://docs.rapidapi.com/docs/hub-listing-docs-tab">https://docs.rapidapi.com/docs/hub-listing-docs-tab</a></li>
<li>Hub Listing - Definitions Tab: <a href="https://docs.rapidapi.com/docs/hub-listing-definitions-tab">https://docs.rapidapi.com/docs/hub-listing-definitions-tab</a></li>
<li>Configuring API Security: <a href="https://docs.rapidapi.com/docs/configuring-api-security">https://docs.rapidapi.com/docs/configuring-api-security</a></li>
<li>Hub Listing - Monetize Tab: <a href="https://docs.rapidapi.com/docs/hub-listing-monetize-tab">https://docs.rapidapi.com/docs/hub-listing-monetize-tab</a></li>
<li>Monetizing Your API on rapidapi.com: <a href="https://docs.rapidapi.com/docs/monetizing-your-api-on-rapidapicom">https://docs.rapidapi.com/docs/monetizing-your-api-on-rapidapicom</a></li>
<li>Hub Listing - Gateway Tab: <a href="https://docs.rapidapi.com/docs/hub-listing-gateway-tab">https://docs.rapidapi.com/docs/hub-listing-gateway-tab</a></li>
<li>Hub Listing - Request and Response Transformations: <a href="https://docs.rapidapi.com/docs/hub-listing-request-and-response-transformations">https://docs.rapidapi.com/docs/hub-listing-request-and-response-transformations</a></li>
</ul>
<p>Product links: None (no product links).</p>
]]></content:encoded></item><item><title><![CDATA[Selling a PDF-to-text API on RapidAPI: competitors, price ranges, and the usage signals you can actually check]]></title><description><![CDATA[Prices are list prices captured 2026-10-15 (Asia/Shanghai) and change often. Each figure links to its source. Where a figure could not be confirmed on a live page, it is marked Not verified.
PDF-to-te]]></description><link>https://kendeepp.hashnode.dev/pdf-api-marketplace-reality-check</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/pdf-api-marketplace-reality-check</guid><category><![CDATA[#RapidAPI]]></category><category><![CDATA[pdf]]></category><category><![CDATA[OCR ]]></category><category><![CDATA[api]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 15:13:39 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/f299c815-c091-44e6-bcd8-5ed86fde90fe.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Prices are list prices captured 2026-10-15 (Asia/Shanghai) and change often. Each figure links to its source. Where a figure could not be confirmed on a live page, it is marked Not verified.</em></p>
<p>PDF-to-text looks like an easy API to sell: everyone has PDFs. That is exactly why the shelf is crowded. Before listing one, check three things: who is already there, what they charge, and whether anyone can prove demand.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Competitors exist at every price point</strong>, from free tiers to big cloud vendors. A total count of PDF APIs on RapidAPI is <strong>Not verified</strong>: RapidAPI search results load with JavaScript and could not be captured.</li>
<li><strong>Price per 1,000 requests ranges about 200x</strong>: from $0.10 (OCR.space PRO) to about $20 (pdfRest Pro), with small RapidAPI listings in between.</li>
<li><strong>Hard usage numbers are mostly hidden.</strong> RapidAPI shows a "Popularity" score, service level and latency, but not paying-subscriber counts. Revenue for any listing is <strong>Not verified</strong>.</li>
<li><strong>After RapidAPI's 25% fee</strong>, a $5 plan nets $3.75 before PayPal fees (<a href="https://docs.rapidapi.com/docs/payouts-and-finance">RapidAPI Payouts and Finance</a>).</li>
</ol>
<h2>2) Who is already selling</h2>
<p><strong>On RapidAPI</strong> (figures from a search-engine snapshot of the listing pages; the live pages render with JavaScript, so every number here is <strong>Not verified</strong> live):</p>
<table>
<thead>
<tr>
<th>Listing</th>
<th>Plans seen</th>
<th>Signals seen</th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://rapidapi.com/rgtimothy/api/pdf-to-text-converter">PDF To Text Converter</a></td>
<td>BASIC \(0 (1/day), PRO \)2 (100/mo), ULTRA \(5 (500/mo), MEGA \)7 (1,000/mo) (<a href="https://rapidapi.com/rgtimothy/api/pdf-to-text-converter/pricing">pricing</a>)</td>
<td>Popularity 9.5, 100% service level, 829 ms latency</td>
</tr>
<tr>
<td><a href="https://rapidapi.com/ai-engine-ai-engine-default/api/ocr-wizard">OCR Wizard</a></td>
<td>Free 30 pages/mo; $12.99 (5,000), $22.99 (10,000), $92.99 (50,000) (<a href="https://rapidapi.com/ai-engine-ai-engine-default/api/ocr-wizard/pricing">pricing</a>)</td>
<td>100% service level, 862 ms latency</td>
</tr>
<tr>
<td><a href="https://rapidapi.com/nanonetsocr-nanonetsocr-default/api/ocr-nanonets/pricing">OCR Nanonets</a></td>
<td>Free 50 requests/mo, paid tiers up to 10,000/mo, $0.05 overage</td>
<td>Paid tier prices not captured: Not verified</td>
</tr>
</tbody></table>
<p><strong>Direct vendors</strong> (live pages fetched with curl, figures confirmed):</p>
<table>
<thead>
<tr>
<th>Vendor</th>
<th>Plan</th>
<th>Price</th>
<th>Included</th>
</tr>
</thead>
<tbody><tr>
<td><a href="https://ocr.space/ocrapi">OCR.space</a></td>
<td>Free / PRO / PRO PDF</td>
<td>\(0 / \)30 / $60 per month</td>
<td>25,000 / 300,000 / 300,000 requests; free and PRO capped at 3 PDF pages</td>
</tr>
<tr>
<td><a href="https://pdfrest.com/pricing/">pdfRest</a></td>
<td>Premium / Pro (monthly)</td>
<td>\(9.99 / \)99.99</td>
<td>600 / 5,000 API calls; overage \(0.115 / \)0.06 per call</td>
</tr>
<tr>
<td><a href="https://pdf.co/pricing">PDF.co</a></td>
<td>Basic / Personal / Business 1 (annual)</td>
<td>\(8.99 / \)22.49 / $44.99 per month</td>
<td>16,500 / 37,000 / 80,500 credits; credits per page Not verified</td>
</tr>
<tr>
<td><a href="https://docs.cloud.google.com/document-ai/pricing">Google Document AI</a></td>
<td>Enterprise Document OCR</td>
<td>first 1,000 free, then $1.50 per unit up to 5M</td>
<td>unit size (per 1,000 pages) Not verified from the captured text</td>
</tr>
</tbody></table>
<h2>3) Price per 1,000 requests</h2>
<table>
<thead>
<tr>
<th>Offer</th>
<th>Per 1,000 requests</th>
</tr>
</thead>
<tbody><tr>
<td>OCR.space PRO</td>
<td>$0.10</td>
</tr>
<tr>
<td>OCR.space PRO PDF</td>
<td>$0.20</td>
</tr>
<tr>
<td>OCR Wizard PRO (Not verified live)</td>
<td>$2.60</td>
</tr>
<tr>
<td>PDF To Text Converter MEGA (Not verified live)</td>
<td>$7.00</td>
</tr>
<tr>
<td>PDF To Text Converter ULTRA (Not verified live)</td>
<td>$10.00</td>
</tr>
<tr>
<td>pdfRest Premium</td>
<td>$16.65</td>
</tr>
<tr>
<td>pdfRest Pro</td>
<td>$20.00</td>
</tr>
</tbody></table>
<p>Requests are not the same unit everywhere: OCR.space limits pages per PDF, pdfRest counts calls, PDF.co counts credits. Compare by your own typical document, not by headline numbers.</p>
<p><strong>What this means for a new listing:</strong> a bare "PDF in, text out" endpoint competes with OCR.space at $0.10 per 1,000. You need a reason to cost more: better tables, more languages, larger files, or simpler auth.</p>
<h2>4) Usage and demand signals you can verify</h2>
<ul>
<li><strong>RapidAPI Popularity, service level, latency:</strong> public on the listing, but the formula behind Popularity is not documented in the pages reviewed (Not verified).</li>
<li><strong>Paying subscribers or revenue:</strong> not public on RapidAPI. Not verified for every listing above.</li>
<li><strong>Providers themselves</strong> can see consumer usage in the "Requests in last 60 days" column in Studio (<a href="https://docs.rapidapi.com/docs/hub-listing-monetize-tab">Monetize Tab docs</a>), but only for their own API.</li>
<li><strong>"Most popular" badges</strong> on direct vendor pages (PDF.co Business 1, pdfRest Pro) are marketing labels, not usage data.</li>
</ul>
<p>Bottom line: there is no verified public number showing how much any small PDF API earns on RapidAPI. Treat any claim otherwise as Not verified.</p>
<h2>5) What not to overpromise on your own listing</h2>
<ul>
<li><strong>Scanned PDFs.</strong> Text extraction and OCR are different. If OCR is optional or limited, say so.</li>
<li><strong>Languages.</strong> List the OCR language packs you actually ship.</li>
<li><strong>Page and size limits.</strong> State them; competitors do (OCR.space's 3-page cap is right on its pricing table).</li>
<li><strong>Failed requests.</strong> Google says it does not bill failed requests (4xx/5xx) (<a href="https://docs.cloud.google.com/document-ai/pricing">Document AI pricing</a>). On RapidAPI, quota counting for your errors depends on your setup; whether errored calls count toward a subscriber's quota is Not verified, so test it before promising "no charge on failure".</li>
<li><strong>File retention.</strong> If you do not store uploaded PDFs, say that plainly, and make sure it is true.</li>
<li><strong>Popularity.</strong> Do not quote another listing's score as proof of market size.</li>
</ul>
<h2>6) Sources</h2>
<ul>
<li>RapidAPI listing: PDF To Text Converter: <a href="https://rapidapi.com/rgtimothy/api/pdf-to-text-converter">https://rapidapi.com/rgtimothy/api/pdf-to-text-converter</a> (and /pricing)</li>
<li>RapidAPI listing: OCR Wizard: <a href="https://rapidapi.com/ai-engine-ai-engine-default/api/ocr-wizard">https://rapidapi.com/ai-engine-ai-engine-default/api/ocr-wizard</a> (and /pricing)</li>
<li>RapidAPI listing: OCR Nanonets: <a href="https://rapidapi.com/nanonetsocr-nanonetsocr-default/api/ocr-nanonets/pricing">https://rapidapi.com/nanonetsocr-nanonetsocr-default/api/ocr-nanonets/pricing</a></li>
<li>OCR.space API: <a href="https://ocr.space/ocrapi">https://ocr.space/ocrapi</a></li>
<li>pdfRest pricing: <a href="https://pdfrest.com/pricing/">https://pdfrest.com/pricing/</a></li>
<li>PDF.co pricing: <a href="https://pdf.co/pricing">https://pdf.co/pricing</a></li>
<li>Google Document AI pricing: <a href="https://docs.cloud.google.com/document-ai/pricing">https://docs.cloud.google.com/document-ai/pricing</a></li>
<li>RapidAPI Docs, Payouts and Finance: <a href="https://docs.rapidapi.com/docs/payouts-and-finance">https://docs.rapidapi.com/docs/payouts-and-finance</a></li>
<li>RapidAPI Docs, Hub Listing - Monetize Tab: <a href="https://docs.rapidapi.com/docs/hub-listing-monetize-tab">https://docs.rapidapi.com/docs/hub-listing-monetize-tab</a></li>
</ul>
<p>Product links: None (no product links).</p>
]]></content:encoded></item><item><title><![CDATA[RapidAPI provider payouts: the 25% fee, PayPal-only, and the two-month lag]]></title><description><![CDATA[Not financial or tax advice. Every fact below comes from RapidAPI's own documentation on docs.rapidapi.com, fetched 2026-10-15 (Asia/Shanghai). RapidAPI can change these pages at any time; re-read the]]></description><link>https://kendeepp.hashnode.dev/rapidapi-provider-payouts-paypal-25-percent</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/rapidapi-provider-payouts-paypal-25-percent</guid><category><![CDATA[#RapidAPI]]></category><category><![CDATA[api]]></category><category><![CDATA[Monetization]]></category><category><![CDATA[PayPal]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 14:44:57 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/f69f8de4-a91b-4791-b65e-38a6aacacba0.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not financial or tax advice. Every fact below comes from RapidAPI's own documentation on docs.rapidapi.com, fetched 2026-10-15 (Asia/Shanghai). RapidAPI can change these pages at any time; re-read them before you price anything.</em></p>
<p>If you are about to list a paid API on rapidapi.com, the money side is short to describe but easy to misread. Here is what the official docs actually say, what they contradict, and what they do not say at all.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Fee: a flat 25%</strong> on all payments made through the API Hub, effective November 15, 2025. A $100 plan pays you $75 (<a href="https://docs.rapidapi.com/docs/payouts-and-finance">Payouts and Finance</a>).</li>
<li><strong>PayPal fees are on top.</strong> The 25% "does not cover the fees associated with payouts processed through PayPal" (same page).</li>
<li><strong>PayPal is the only payout method.</strong> "Rapid currently only pays out API providers via PayPal... we cannot accommodate other payout methods" (same page).</li>
<li><strong>Timing: about two months.</strong> Charges in a month are consolidated and processed "at the end of the following month"; the docs' January example arrives "in the first week of March" (same page).</li>
<li><strong>You are paid only on settled money.</strong> Payouts happen only after the card company or bank has fully settled the developer's payment; refunds and chargebacks are offset against what you are owed (same page).</li>
<li><strong>Minimum payout threshold: Not verified.</strong> The docs pages reviewed do not state one.</li>
</ol>
<h2>2) The fee, with real numbers</h2>
<table>
<thead>
<tr>
<th>Plan list price</th>
<th>Your share at 25% (before PayPal fees)</th>
</tr>
</thead>
<tbody><tr>
<td>$25 (RapidAPI's suggested PRO)</td>
<td>$18.75</td>
</tr>
<tr>
<td>$75 (suggested ULTRA)</td>
<td>$56.25</td>
</tr>
<tr>
<td>$150 (suggested MEGA)</td>
<td>$112.50</td>
</tr>
</tbody></table>
<p>The suggested BASIC free / PRO \(25 / ULTRA \)75 / MEGA $150 ladder is RapidAPI's own recommendation (<a href="https://docs.rapidapi.com/docs/monetizing-your-api-on-rapidapicom">Monetizing Your API on rapidapi.com</a>).</p>
<p><strong>A contradiction to know about.</strong> The same payouts page still carries a worked example: three $10 PRO subscriptions should pay "$24 less any applicable PayPal fees". $24 out of $30 is a 20% fee, not 25%. At 25% the answer would be $22.50. The example most likely predates the November 2025 change, but which number RapidAPI applies to your account today is <strong>Not verified</strong> until you see a real statement. Budget with 25%.</p>
<p>PayPal's own fee on the incoming payout is not documented by RapidAPI; the amount for your country and account type is <strong>Not verified</strong> here. Check PayPal's fee page for your region.</p>
<h2>3) The timeline, month by month</h2>
<p>Using the docs' own example:</p>
<ul>
<li><strong>January:</strong> developers subscribe on Jan 1, 5 and 20.</li>
<li><strong>End of February:</strong> January's charges are processed ("end of the following month").</li>
<li><strong>First week of March:</strong> the money lands in PayPal.</li>
</ul>
<p>So your first sale on day one of a month reaches you roughly 60+ days later. Plan cash flow and any hosting bills accordingly.</p>
<p>What triggers a charge at all: a first subscription to a paid plan, a monthly renewal, or an overage (<a href="https://docs.rapidapi.com/docs/payouts-and-finance">Payouts and Finance</a>).</p>
<h2>4) Things that shrink or delay a payout</h2>
<ul>
<li><strong>Forgiveness requests.</strong> When a developer runs up accidental overages, RapidAPI will not refund them "without your explicit permission". The call is yours.</li>
<li><strong>Disputes and chargebacks.</strong> RapidAPI investigates; if a refund or chargeback happens, it offsets your payout by that amount.</li>
<li><strong>Failed payments.</strong> RapidAPI retries, then cancels the subscription. You only get paid once a payment is final.</li>
<li><strong>No PayPal linked.</strong> If you never link PayPal, "there is unfortunately no way for us to send you money". RapidAPI says it will email you at least three times.</li>
</ul>
<p>All from <a href="https://docs.rapidapi.com/docs/payouts-and-finance">Payouts and Finance</a>.</p>
<h2>5) Pricing rules that affect revenue</h2>
<p>From <a href="https://docs.rapidapi.com/docs/monetizing-your-api-on-rapidapicom">Monetizing Your API on rapidapi.com</a>:</p>
<ul>
<li>Four API types: Free, Pay Per Use, Freemium, Paid. <strong>Free APIs cannot collect payments through Rapid.</strong></li>
<li><strong>Freemium and paid plans require a credit card</strong>, even for the free tier of a freemium API. Expect some drop-off at that step.</li>
<li><strong>Price floor above 500K requests/month:</strong> at least \(0.00003 per call over 500K. A 2M-request plan must cost at least \)45/month (1.5M x $0.00003). The floor applies to overage prices too.</li>
<li>Overage advice: usually no more than $1 per call unless your own cost is higher.</li>
<li>You can have up to four public plans (BASIC, PRO, ULTRA, MEGA) per API (<a href="https://docs.rapidapi.com/docs/hub-listing-monetize-tab">Hub Listing - Monetize Tab</a>).</li>
</ul>
<p><strong>Another inconsistency:</strong> the Monetizing page says free plans are capped at 500K requests/month, while the Monetize Tab page says the default free BASIC plan on rapidapi.com allows one million. Which cap applies to a new listing is <strong>Not verified</strong>.</p>
<h2>6) Tax forms</h2>
<p>The only tax document the payouts page mentions: "W9 forms are also available upon request" from RapidAPI support, plus custom invoices on request (<a href="https://docs.rapidapi.com/docs/payouts-and-finance">Payouts and Finance</a>). That is RapidAPI's own W-9 for your records.</p>
<p>What the docs reviewed do <strong>not</strong> say: whether non-US providers must submit a W-8BEN, whether RapidAPI withholds US tax, or whether it issues 1099 or 1042-S forms. All of that is <strong>Not verified</strong>. Ask support in writing before your first payout and keep the reply.</p>
<h2>7) Honest self-check before you turn on paid plans</h2>
<ul>
<li> PayPal account linked, in a country where it can receive business payments.</li>
<li> Spreadsheet uses 25% plus a PayPal fee, not 20%.</li>
<li> Cash-flow plan assumes about two months from sale to cash.</li>
<li> Hosting cost per call is below your net price per call after fees.</li>
<li> Overage policy decided in advance, including how you answer forgiveness requests.</li>
<li> Tax question sent to support and answer saved.</li>
<li> Listing does not count "subscribers" as paying customers: free and freemium subscribers are not revenue.</li>
</ul>
<h2>8) Sources</h2>
<ul>
<li>RapidAPI Docs, Payouts and Finance: <a href="https://docs.rapidapi.com/docs/payouts-and-finance">https://docs.rapidapi.com/docs/payouts-and-finance</a></li>
<li>RapidAPI Docs, Monetizing Your API on rapidapi.com: <a href="https://docs.rapidapi.com/docs/monetizing-your-api-on-rapidapicom">https://docs.rapidapi.com/docs/monetizing-your-api-on-rapidapicom</a></li>
<li>RapidAPI Docs, Hub Listing - Monetize Tab: <a href="https://docs.rapidapi.com/docs/hub-listing-monetize-tab">https://docs.rapidapi.com/docs/hub-listing-monetize-tab</a></li>
</ul>
<p>Product links: None (no product links).</p>
]]></content:encoded></item><item><title><![CDATA[Odoo Apps refund claims: the two-month window, your 15 days, and when Odoo refunds the buyer]]></title><description><![CDATA[Not legal advice. Facts come from the Odoo Apps Sales Conditions / Refund Policy, the Apps FAQ, and the Vendor Guidelines on apps.odoo.com, fetched 2026-10-15 (Asia/Shanghai). Odoo can change these pa]]></description><link>https://kendeepp.hashnode.dev/odoo-apps-refund-claims-15-day-window</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/odoo-apps-refund-claims-15-day-window</guid><category><![CDATA[Odoo]]></category><category><![CDATA[ERP]]></category><category><![CDATA[#Refunds]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[marketplace]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:48:33 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/31e675a4-5104-4d47-a5c9-3d5082bb2742.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not legal advice. Facts come from the Odoo Apps Sales Conditions / Refund Policy, the Apps FAQ, and the Vendor Guidelines on apps.odoo.com, fetched 2026-10-15 (Asia/Shanghai). Odoo can change these pages; re-read before relying on them.</em></p>
<p>Selling a module on Odoo Apps means you also inherit a refund process you do not control end to end. Here is how it runs and what a vendor can do about it.</p>
<h2>1) Lead answer</h2>
<ol>
<li>Buyers can file claims <strong>within two months</strong> of purchase (<a href="https://apps.odoo.com/apps/refund-policy">Refund Policy</a>).</li>
<li>A claim starts when the buyer clicks the support button on their order. From that date the vendor has <strong>15 days</strong> to fix the issue or reach an agreement (<a href="https://apps.odoo.com/apps/refund-policy">Refund Policy</a>).</li>
<li>After 15 days without agreement, <strong>either party</strong> can ask Odoo to intervene, and Odoo decides on the refund (<a href="https://apps.odoo.com/apps/refund-policy">Refund Policy</a>).</li>
<li>A refunded buyer must agree to stop using the app and delete all copies (<a href="https://apps.odoo.com/apps/refund-policy">Refund Policy</a>).</li>
<li>The order-page channel matters: the FAQ tells buyers not to contact the publisher elsewhere because it is the only channel where the refund timing applies (<a href="https://apps.odoo.com/apps/faq">Apps FAQ</a>). Note the FAQ calls it "the two weeks time" while the Refund Policy says 15 days; which one Odoo applies in practice is <strong>Not verified</strong>, so plan for the shorter.</li>
</ol>
<h2>2) When the buyer gets a refund</h2>
<p>Per the Refund Policy, any one of these is enough:</p>
<ul>
<li>A bug not fixed within the allotted time.</li>
<li>A feature <strong>advertised on the description page</strong> is missing.</li>
<li>The module does not install properly on the <strong>advertised version</strong>.</li>
<li>The module breaks the Vendor Guidelines.</li>
<li>The module's license is wrong.</li>
<li>Fraud or a stolen card.</li>
</ul>
<h2>3) When the buyer does not</h2>
<ul>
<li>The request is a new feature not advertised in the description or in your messages.</li>
<li>You fixed the bug after the claim.</li>
<li>The module works but does not fit the buyer's specific needs.</li>
<li>The buyer's database is on Odoo Online (third-party apps cannot be installed there).</li>
<li>The buyer bought the wrong version.</li>
</ul>
<p>Since 13.0, each version is a separate product, so "wrong version" is a real outcome (<a href="https://apps.odoo.com/apps/refund-policy">Refund Policy</a>).</p>
<h2>4) What the vendor owes</h2>
<p>The FAQ draws the line: you are expected to fix bugs that stop the app working as advertised, and to give configuration advice (email or docs) when the buyer's server is misconfigured. You are not expected to build custom features or configure their server for free (<a href="https://apps.odoo.com/apps/faq">Apps FAQ</a>). Not supporting buyers is also on the FAQ's list of reasons a module can be removed.</p>
<p>The manifest <code>support</code> email is shown only to buyers (<a href="https://apps.odoo.com/apps/vendor-guidelines">Vendor Guidelines</a>). Monitor it.</p>
<h2>5) Dates and money, worked</h2>
<p>Worked example:</p>
<ul>
<li>Purchase 2026-10-15 → claims allowed until about 2026-12-15 (read as two calendar months; how Odoo counts the edge day is <strong>Not verified</strong>).</li>
<li>Claim opened 2026-11-03 → your 15 days end 2026-11-18. How Odoo counts day one is <strong>Not verified</strong>; treat the claim date as day 0 and answer within days, not on day 14.</li>
<li>Your share is 70% of revenue (<a href="https://apps.odoo.com/apps/faq">Apps FAQ</a>): EUR 9.00 (the minimum price) → EUR 6.30; EUR 49.99 → EUR 34.99; EUR 100.00 → EUR 70.00. Whether a refund after payout is clawed back from your next balance is <strong>Not verified</strong>.</li>
</ul>
<p>There is also a note to vendors: once Odoo issues a refund, "you have 30 days to validate it/accept it." What happens if you do not is <strong>Not verified</strong>.</p>
<h2>6) Write the listing to win claims</h2>
<p>Most refund triggers come down to what your description page promised:</p>
<ul>
<li> List only features that ship today; put roadmap items in a separate, clearly labeled section or leave them out.</li>
<li> State supported versions exactly, and that it does <strong>not</strong> run on Odoo Online.</li>
<li> Name every dependency, especially Enterprise ones.</li>
<li> Make sure the manifest license matches the LICENSE file (a wrong license is a refund trigger).</li>
<li> Put setup steps in docs, so "configuration advice" can be a link.</li>
<li> Answer every claim on the order thread, with dates, so the record is there if Odoo steps in.</li>
</ul>
<h2>7) What this article does not do</h2>
<ul>
<li>No manifest or image checklist (that is a separate guide; multi-series is a separate guide), payout banking (<a href="https://kendeepp.hashnode.dev/odoo-apps-payout-swift-self-check">this guide</a>), or license choice (<a href="https://kendeepp.hashnode.dev/odoo-apps-license-opl-lgpl-honesty">this guide</a>).</li>
<li>No data on how often Odoo sides with buyers (<strong>Not verified</strong>).</li>
</ul>
<h2>Sources</h2>
<ul>
<li>Odoo Apps Sales Conditions / Refund Policy — <a href="https://apps.odoo.com/apps/refund-policy">https://apps.odoo.com/apps/refund-policy</a> (fetched 2026-10-15)</li>
<li>Odoo Apps FAQ — <a href="https://apps.odoo.com/apps/faq">https://apps.odoo.com/apps/faq</a> (fetched 2026-10-15)</li>
<li>Odoo Apps Vendor Guidelines — <a href="https://apps.odoo.com/apps/vendor-guidelines">https://apps.odoo.com/apps/vendor-guidelines</a> (fetched 2026-10-15)</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Your Chrome Web Store email says "Yellow Magnesium": how to triage a rejection, warning, or takedown.]]></title><description><![CDATA[Not legal advice. Facts come from Chrome for Developers docs ("Troubleshooting Chrome Web Store violations" and "Chrome Web Store review process"), fetched 2026-10-15 (Asia/Shanghai). Google states it]]></description><link>https://kendeepp.hashnode.dev/chrome-web-store-violation-ids-triage</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/chrome-web-store-violation-ids-triage</guid><category><![CDATA[chrome extension]]></category><category><![CDATA[chrome web store]]></category><category><![CDATA[manifest-v3]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:43:01 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/318c2eff-e9ee-41c2-81dc-c3adb914950a.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not legal advice. Facts come from Chrome for Developers docs ("Troubleshooting Chrome Web Store violations" and "Chrome Web Store review process"), fetched 2026-10-15 (Asia/Shanghai). Google states its enforcement practices can change without notice; re-read both pages before acting.</em></p>
<p>Most extension guides stop at "click Submit". This one starts when the review email lands and you need to know how bad it is and what to do next.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>The two-word code is a lookup key.</strong> Every violation gets a human-readable ID made of a color and an element (for example, Yellow Magnesium = the extension does not behave as expected). The troubleshooting page lists 23 of them with common causes and fixes (<a href="https://developer.chrome.com/docs/webstore/troubleshooting">Troubleshooting</a>).</li>
<li><strong>Rejection</strong> happens to a submission. Your live listing, description, images, privacy disclosures and published CRX stay unchanged, and users are not notified (<a href="https://developer.chrome.com/docs/webstore/review-process">Review process</a>).</li>
<li><strong>Warning</strong> happens to a published item with a minor violation: typically <strong>7 to 30 days</strong> to ship a fixed version, otherwise takedown. The item stays installable during the warning (<a href="https://developer.chrome.com/docs/webstore/review-process">Review process</a>).</li>
<li><strong>Takedown</strong> removes the item from the store, but in most cases it is not permanent: submit a version that fixes the violation and pass review (<a href="https://developer.chrome.com/docs/webstore/review-process">Review process</a>).</li>
<li><strong>Malware / extreme violations</strong>: immediate takedown, no notice email, disabled on user devices and cannot be re-enabled (<a href="https://developer.chrome.com/docs/webstore/review-process">Review process</a>).</li>
<li><strong>Appeal</strong> takedowns and warnings from the item detail page in the Developer Dashboard (Appeal button); account suspensions from the account page. Other issues go through the One Stop Support form (<a href="https://developer.chrome.com/docs/webstore/review-process">Review process</a>).</li>
</ol>
<h2>2) Decode the color</h2>
<p>From the 23 IDs on the troubleshooting page, the colors cluster like this (our grouping, read from the list; Google does not publish a color legend — <strong>Not verified</strong> as an official taxonomy):</p>
<table>
<thead>
<tr>
<th>Color</th>
<th>IDs seen</th>
<th>Theme</th>
</tr>
</thead>
<tbody><tr>
<td>Blue</td>
<td>Argon, Titanium</td>
<td>MV3 remotely hosted code; enforcement circumvention</td>
</tr>
<tr>
<td>Yellow</td>
<td>Magnesium, Zinc, Argon, Lithium, Nickel, Potassium</td>
<td>Quality / spam: not working, missing metadata, keyword stuffing, redirection, spam, minimum functionality</td>
</tr>
<tr>
<td>Purple</td>
<td>Potassium, Lithium, Nickel, Copper, Magnesium</td>
<td>Permissions and user data: excessive permissions, disclosure, prominent disclosure, secure transmission, other user-data rules</td>
</tr>
<tr>
<td>Red</td>
<td>Zinc, Titanium</td>
<td>Deceptive installation; obfuscation</td>
</tr>
<tr>
<td>Grey</td>
<td>Zinc, Copper, Lithium, Magnesium, Nickel, Potassium, Silicon, Titanium</td>
<td>Content: illegal, gambling, adult, hate, not family safe, violence, crypto mining, affiliate ads</td>
</tr>
</tbody></table>
<p>Practical read: Yellow and Purple are usually fixable in a resubmission. Red and Blue Titanium are about intent signals; treat them seriously before appealing.</p>
<h2>3) The most common fixable one: Yellow Magnesium</h2>
<p>The page's own checklist (<a href="https://developer.chrome.com/docs/webstore/troubleshooting">Troubleshooting</a>):</p>
<ul>
<li>Test the <strong>exact files you uploaded</strong>, not your dev folder. Pack the extension yourself and drag the <code>.crx</code> onto <code>chrome://extensions</code>; packed and unpacked can behave differently.</li>
<li>Every file named in <code>manifest.json</code> must exist at that path. Watch <strong>case sensitivity</strong> (<code>Background.js</code> vs <code>background.js</code>).</li>
<li>A server-side outage during review counts as "not working". Make error states visible to the user.</li>
<li>If the extension needs an account or special network, say so in the listing and in the UI (and give reviewers test instructions).</li>
<li>Test on a flaky connection: timeouts, HTTP 400/500, certificate errors.</li>
<li>If you cannot reproduce the reviewer's problem, ask developer support which flow failed.</li>
</ul>
<h2>4) Blue Argon in one paragraph</h2>
<p>MV3 extensions must not run remotely hosted code: no external <code>&lt;script&gt;</code> sources, no <code>eval()</code> of fetched strings, no interpreter for remote commands even if fetched "as data". Logic must be self-contained; external resources may supply data only (<a href="https://developer.chrome.com/docs/webstore/troubleshooting">Troubleshooting</a>).</p>
<h2>5) Timeline math for a warning</h2>
<p>Worked example: warning email on 2026-10-15 → takedown no earlier than 2026-10-22 (+7 days) and no later than 2026-11-14 (+30 days), depending on the violation. The email states your actual window; do not plan on 30.</p>
<p>Review itself: "within a few days" for most, up to a few weeks; if pending more than <strong>three weeks</strong>, contact support. Expect longer reviews for new developers, new items, dangerous permissions, big code changes, broad host permissions, and after a rejection or warning (<a href="https://developer.chrome.com/docs/webstore/review-process">Review process</a>). Support requests get an email with a unique ID within minutes; the page says responses may take up to three days depending on queue and violation.</p>
<h2>6) Fix or appeal?</h2>
<table>
<thead>
<tr>
<th>Situation</th>
<th>Move</th>
</tr>
</thead>
<tbody><tr>
<td>Reviewer is right (missing file, broken flow, extra permission)</td>
<td>Fix and resubmit. Appealing a real bug wastes a review cycle.</td>
</tr>
<tr>
<td>Reviewer could not reach a feature (login, region, server)</td>
<td>Resubmit with clear test instructions; if still rejected, ask support which flow failed.</td>
</tr>
<tr>
<td>You believe the policy reading is wrong</td>
<td>Appeal from the item detail page with specific evidence (file, line, user flow).</td>
</tr>
<tr>
<td>Warning on a live item</td>
<td>Ship the fix inside the window first; appeal in parallel if you disagree.</td>
</tr>
<tr>
<td>Account suspended</td>
<td>Appeal from the account page.</td>
</tr>
</tbody></table>
<p>Whether an appeal pauses a warning countdown is <strong>Not verified</strong> — the docs do not say. Assume it does not.</p>
<h2>7) What this article does not do</h2>
<ul>
<li>No pre-submit checklist (that is a separate guide), privacy-policy walkthrough (<a href="https://kendeepp.hashnode.dev/chrome-web-store-privacy-single-purpose-self-check">this guide</a>), or permission design (<a href="https://kendeepp.hashnode.dev/chrome-mv3-permission-honesty">this guide</a>).</li>
<li>No claim about appeal success rates or turnaround beyond what the docs state (<strong>Not verified</strong>).</li>
</ul>
<h2>Sources</h2>
<ul>
<li>Troubleshooting Chrome Web Store violations — <a href="https://developer.chrome.com/docs/webstore/troubleshooting">https://developer.chrome.com/docs/webstore/troubleshooting</a> (fetched 2026-10-15)</li>
<li>Chrome Web Store review process — <a href="https://developer.chrome.com/docs/webstore/review-process">https://developer.chrome.com/docs/webstore/review-process</a> (fetched 2026-10-15)</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Apify Pay-per-event: designing events buyers can predict]]></title><description><![CDATA[Apify Pay-per-event: designing events buyers can predict
Not legal or investment advice. Mechanics come from docs.apify.com (PPE, Monetize, Actors in Store, JS/Python SDK pay-per-event), archived 2026]]></description><link>https://kendeepp.hashnode.dev/apify-ppe-event-design-honesty</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/apify-ppe-event-design-honesty</guid><category><![CDATA[apify]]></category><category><![CDATA[web scraping]]></category><category><![CDATA[pay-per-event]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:36:59 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/0e01c5c8-c652-4990-becb-98da35be6a62.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Apify Pay-per-event: designing events buyers can predict</h1>
<p><em>Not legal or investment advice. Mechanics come from docs.apify.com (PPE, Monetize, Actors in Store, JS/Python SDK pay-per-event), archived 2026-10-15 (Asia/Shanghai). Console labels and scoring evolve — re-open the pages before you ship pricing. This article links none of our Actors.</em></p>
<p>This article is not a full monetization overview. Related reading: <a href="https://kendeepp.hashnode.dev/apify-actor-monetization-honesty">this guide</a> (PPE vs rental vs usage), <a href="https://kendeepp.hashnode.dev/apify-store-publish-vs-monetization-boundary">this guide</a> (publish / price-change seam), and <a href="https://kendeepp.hashnode.dev/apify-quality-score-daily-tests">this guide</a> (quality score and daily Store test). Here the only job is: how to <strong>define and charge events</strong> so a Store visitor can predict the bill.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>An event</strong> is a specific, measurable action your Actor triggers in code and charges for — commonly creating a result, processing an item, or calling an external API (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>).</li>
<li>You must pick a <strong>primary event</strong> — the one that best represents main value. It is <strong>highlighted on the Actor detail page</strong> so users see what they pay for (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>).</li>
<li><strong>Two synthetic events</strong> can charge automatically: <code>apify-actor-start</code> (startup; Apify covers first <strong>5 seconds</strong> of compute when enabled) and <code>apify-default-dataset-item</code> (each item written to the <strong>default</strong> dataset). Don’t also <code>Actor.charge()</code> the synthetic start yourself — it <strong>fails</strong>. Default start price in docs: <strong>$0.00005</strong> (= <strong>$0.05 per 1,000 starts</strong>); count scales with RAM (≤1 GB → 1×; then +1× per extra GB) (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>).</li>
<li><strong>Custom events</strong> are named, described, priced, and charged from your code (<code>Actor.charge</code> / <code>pushData</code> with an event name). Prefer <strong>one charge per unit of work</strong>, not a big <code>count</code> batch at the end (<a href="https://docs.apify.com/sdk/js/docs/concepts/pay-per-event">SDK JS</a>, <a href="https://docs.apify.com/sdk/python/docs/concepts/pay-per-event">SDK Python</a>).</li>
<li><strong>Double-counting risks:</strong> charging both a custom “result” event <strong>and</strong> leaving <code>apify-default-dataset-item</code> on for the same push; charging start twice (custom + synthetic); batching with <code>count</code> without checking <code>chargedCount</code> / <code>charged_count</code>; retries without an <strong>idempotency key</strong> (Python SDK: same key not re-charged for <strong>three minutes</strong>) (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>, <a href="https://docs.apify.com/sdk/python/docs/concepts/pay-per-event">SDK Python</a>).</li>
<li><strong>Disclose in the Store description / README:</strong> event names and prices, which event is primary, whether <strong>platform usage is included</strong> or <strong>PPE + usage</strong> is on, and that users can set a <strong>max charge per run</strong> (<a href="https://docs.apify.com/platform/actors/running/actors-in-store">Actors in Store</a>, <a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>).</li>
</ol>
<h2>2) Contrast only as needed (not a full monetization guide)</h2>
<table>
<thead>
<tr>
<th>Model</th>
<th>User pays for</th>
<th>PPE design takeaway</th>
</tr>
</thead>
<tbody><tr>
<td><strong>PPE</strong></td>
<td>Named events you define (+ optional platform usage if toggled)</td>
<td>Event map must match what appears in the dataset / status</td>
</tr>
<tr>
<td><strong>Pay per usage</strong></td>
<td>Platform resources only; no developer event fees (<a href="https://docs.apify.com/platform/actors/publishing/monetize">Monetize</a>)</td>
<td>Don’t call that “PPE with $0 events” in marketing</td>
</tr>
<tr>
<td><strong>Rental</strong> (sunset Apr/Oct 2026)</td>
<td>Monthly rent <strong>plus</strong> platform usage (<a href="https://docs.apify.com/platform/actors/running/actors-in-store">Actors in Store</a>)</td>
<td>Migrate with a dual-model code path during transition (<a href="https://docs.apify.com/sdk/js/docs/concepts/pay-per-event">SDK</a>); don’t invent “PPR” as a separate Store category — per-result billing is PPE, often via <code>apify-default-dataset-item</code> (<a href="https://kendeepp.hashnode.dev/apify-actor-monetization-honesty">this guide</a>)</td>
</tr>
</tbody></table>
<p>Creator profit reminder (context only; details in <a href="https://kendeepp.hashnode.dev/apify-actor-monetization-honesty">this guide</a>): <code>profit = (0.8 * revenue) - platform costs</code> for paid-plan users (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>, <a href="https://docs.apify.com/platform/actors/publishing/monetize/pricing-and-costs">pricing &amp; costs</a>).</p>
<h2>3) Naming and mapping events to visible results</h2>
<p>Docs best practices (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>):</p>
<ul>
<li><strong>Limit the number of events.</strong> Fewer events → easier cost prediction.</li>
<li><strong>Avoid stacking many events for one user-visible result</strong> (makes the Actor look expensive and opaque).</li>
<li><strong>Map charges to something the user can see</strong> — a dataset row, a stored file, a status message. Examples in docs: <code>post</code>, <code>profile</code>, <code>processed-image</code>, <code>ai-analysis</code>.</li>
<li>If the work is invisible (external API, AI step), <strong>push a record or status</strong> so the invoice line has a twin in the run output.</li>
<li>Charge <strong>after</strong> results are saved and available; don’t bill for work the user cannot access if the run aborts mid-batch.</li>
<li>Charge <strong>as work completes</strong>, not in one end-of-run batch — early stop otherwise leaves unbilled (for you) or confusing (for them) gaps.</li>
</ul>
<p><strong>Invalid input:</strong> Docs allow charging for work that discovers a 404-style failure, and recommend returning an <strong>error item</strong> with a clear code instead of failing the whole run. If you charge for errors, say so in the README — otherwise buyers read “per result” as “per useful result.”</p>
<h2>4) Synthetic vs custom — honesty table</h2>
<table>
<thead>
<tr>
<th>Setup</th>
<th>What happens</th>
<th>Honest Store line</th>
<th>Dishonest line</th>
</tr>
</thead>
<tbody><tr>
<td><code>apify-default-dataset-item</code> on</td>
<td>Every default-dataset push auto-charges</td>
<td>“$X per dataset item (default dataset)”</td>
<td>“Free results” while the synthetic event is priced</td>
</tr>
<tr>
<td>Synthetic start on</td>
<td>Auto start charge; free first 5 s compute; RAM multiplies count</td>
<td>“$0.00005 per start unit (see RAM table)” or your raised price</td>
<td>Manually <code>charge('apify-actor-start')</code> (docs: fails) <strong>or</strong> also billing a custom “init” for the same start</td>
</tr>
<tr>
<td>Custom only</td>
<td>You control every <code>charge</code> / named <code>pushData</code></td>
<td>List each event title, description, price</td>
<td>Vague “smart usage-based pricing” with no event list</td>
</tr>
<tr>
<td>PPE + usage on</td>
<td>Events <strong>and</strong> platform usage billed to user; docs warn less transparent / hurts quality score; <strong>14 days</strong> to turn on, off immediately (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>)</td>
<td>“Event fees + platform usage (see pricing)”</td>
<td>“All-inclusive per event” while the toggle is on</td>
</tr>
<tr>
<td>Soft <code>max</code> total charge</td>
<td>User cap enforced; <code>eventChargeLimitReached</code> / <code>chargedCount</code> matter; finish the run when hit (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>, SDKs)</td>
<td>“Set a max cost per run; we stop when it hits”</td>
<td>Continuing heavy work after the limit “because cleanup” without disclosing residual platform burn</td>
</tr>
</tbody></table>
<p><strong>Start event RAM examples from docs</strong> (at default $0.00005): 128 MB or 1 GB → <strong>1</strong> event; <strong>4 GB → 4</strong> events ($0.0002). Raising the price does <strong>not</strong> buy more free compute. Deleting the synthetic start removes the free 5 seconds.</p>
<h2>5) Double-counting and idempotency self-check</h2>
<table>
<thead>
<tr>
<th>Risk</th>
<th>Mitigation from docs</th>
</tr>
</thead>
<tbody><tr>
<td>Synthetic dataset item + custom result on same push</td>
<td>Remove synthetic <strong>or</strong> stop custom-charging that push</td>
</tr>
<tr>
<td>Custom start + <code>apify-actor-start</code></td>
<td>Use one; docs say don’t use both</td>
</tr>
<tr>
<td><code>charge({ count: N })</code> then processing all N when budget partial</td>
<td>Always read <code>chargedCount</code> / <code>charged_count</code>; only process that many</td>
</tr>
<tr>
<td>Retries after network errors</td>
<td>Pass <code>idempotency_key</code> (Python SDK documents <strong>3-minute</strong> memory; same key not recharged; different event name under same key → skipped with warning)</td>
</tr>
<tr>
<td>Abort mid-run</td>
<td>Charge completed work promptly; SDK graceful <code>aborting</code> window is <strong>30 seconds</strong> — don’t rely on non-graceful abort</td>
</tr>
<tr>
<td>Many parallel runs</td>
<td>Max charge is <strong>per run</strong>, not per user total — memory limits still protect your platform cost</td>
</tr>
</tbody></table>
<p><strong>Not verified:</strong> exact platform-side idempotency behavior if you call the Charge API <strong>without</strong> the SDK; docs say you must implement idempotency yourself in that case.</p>
<h2>6) What to put on the Store page / README</h2>
<ol>
<li>Primary event name + price (matches Console).</li>
<li>Full event list with one-line descriptions a non-expert can map to output.</li>
<li>Whether platform usage is included or separate (PPE + usage).</li>
<li>Example cost: “~N primary events for a typical input of …”.</li>
<li>Free-plan limits, if any — stated up front, graceful exit, not a fake crash (<a href="https://docs.apify.com/platform/actors/publishing/monetize">Monetize</a>).</li>
<li>“Set max total charge per run” reminder.</li>
<li>If you charge for error/404 items, say so next to the event description.</li>
</ol>
<h2>7) Self-check</h2>
<ul>
<li> Primary event is the one users would guess from the title.</li>
<li> No synthetic + custom pair bills the same user-visible unit twice.</li>
<li> Event titles in Console = names in README = names in status/dataset fields where practical.</li>
<li> Local test with <code>ACTOR_TEST_PAY_PER_EVENT</code> and the <code>charging-log</code> dataset before go-live (<a href="https://docs.apify.com/sdk/js/docs/concepts/pay-per-event">SDKs</a>).</li>
<li> PPE + usage only as a temporary pricing probe; docs say it hurts transparency / quality score.</li>
<li> Memory <code>min</code>/<code>max</code> set so users can’t inflate platform cost past your event math.</li>
<li> No claim of a separate “pay-per-result” Store product — say PPE / dataset-item event instead.</li>
</ul>
<h2>8) Not verified</h2>
<ul>
<li>Quality-score <strong>weights</strong> for pricing transparency (<a href="https://kendeepp.hashnode.dev/apify-quality-score-daily-tests">this guide</a>: algorithm unpublished).</li>
<li>Internal Apify charge ledger beyond documented <code>ChargeResult</code> fields and the SDK idempotency window.</li>
<li>That every Console screenshot label matches docs on a future date.</li>
<li>Exact residual platform-cost duration after the spend limit aborts a run (“short time” in docs — no seconds published except the <strong>30 s</strong> graceful abort window).</li>
</ul>
<h2>9) Bottom line</h2>
<p>PPE honesty is an <strong>event map</strong>, not a slogan. Name one primary event, keep the list short, make every charge leave a footprint the user can see, and strip synthetic events that would double-bill the same unit. If the Store page cannot predict the invoice from the README, the design is not done.</p>
]]></content:encoded></item><item><title><![CDATA[Gumroad after checkout: Library, downloads, and delivery promises that match Help]]></title><description><![CDATA[Gumroad after checkout: Library, downloads, and delivery promises that match Help
Not legal or marketplace advice. Mechanics come from Gumroad Help articles archived 2026-10-15 (Asia/Shanghai). Re-ope]]></description><link>https://kendeepp.hashnode.dev/gumroad-library-delivery-download-ux</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/gumroad-library-delivery-download-ux</guid><category><![CDATA[downloads]]></category><category><![CDATA[gumroad]]></category><category><![CDATA[digital products]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[ecommerce]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 12:31:02 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/30953c1d-3489-4889-a4bc-8fb49d955f86.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Gumroad after checkout: Library, downloads, and delivery promises that match Help</h1>
<p><em>Not legal or marketplace advice. Mechanics come from Gumroad Help articles archived 2026-10-15 (Asia/Shanghai). Re-open them before you change a live product. This article links none of our products.</em></p>
<p>This article is not a past-buyer updates checklist or a refunds guide — see <a href="https://kendeepp.hashnode.dev/gumroad-updates-past-buyers-versioning">this guide</a> and <a href="https://kendeepp.hashnode.dev/gumroad-refunds-vs-chargebacks-honest-policy-boundaries">this guide</a>. Here the job is narrower: what buyers <strong>actually open</strong> after they pay, which seller toggles change that experience, and which file-size / streaming numbers you may quote without inventing limits.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Three access paths</strong> to the same Content: email receipt <strong>"View content"</strong>, the product page <strong>"already own"</strong> card (when Gumroad recognizes the buyer), and <strong>Library</strong> after they create an account with the <strong>same email</strong> used at checkout (<a href="https://gumroad.com/help/article/199-how-do-i-access-my-purchase">Help 199</a>, <a href="https://gumroad.com/help/article/198-your-gumroad-library">Help 198</a>, <a href="https://gumroad.com/help/article/247-what-your-customers-see">Help 247</a>).</li>
<li><strong>Content tab is the delivery pipe.</strong> Files, pages, folders, stamped PDFs, code blocks, embed videos (download or stream-only), and embedded emails live there (<a href="https://gumroad.com/help/article/149-adding-a-product">Help 149</a>). Buyers who open the product from Library see that Content.</li>
<li><strong>Documented size limits</strong> (<a href="https://gumroad.com/help/article/289-file-size-limits-on-gumroad">Help 289</a>): free / $0 PWYW floor → max <strong>product</strong> size <strong>250 MB</strong>; price <strong>greater than $0.99</strong> → largest <strong>single file</strong> <strong>20 GB</strong> (Help also says “priced higher than $1” in the intro — same article); <strong>"Download all"</strong> only if total content <strong>&lt; 500 MB</strong> (else upload a ZIP yourself).</li>
<li><strong>Read vs download:</strong> PDF/EPUB up to <strong>32 MB</strong> can show an in-browser <strong>Read</strong> button; EPUB <strong>over 32 MB</strong> is download-only; you can turn Read/Kindle off per file (<a href="https://gumroad.com/help/article/247-what-your-customers-see">Help 247</a>, <a href="https://gumroad.com/help/article/198-your-gumroad-library">Help 198</a>, <a href="https://gumroad.com/help/article/112-mobile-friendly-files">Help 112</a>).</li>
<li><strong>Stream vs download for video:</strong> you can leave downloads on, or set <strong>Disable file downloads</strong> (stream only). Streaming SD is <strong>480p</strong>, HD <strong>1080p</strong>; <strong>4K is reduced to 1080p for streaming</strong>. Transcoding starts after the <strong>first successful sale</strong> and may take minutes to hours (<a href="https://gumroad.com/help/article/43-streaming-videos">Help 43</a>).</li>
<li><strong>App ≠ desktop.</strong> ZIP / Mobi-style packages often do not show usefully in the mobile app; app-friendly types are listed in Help 112. Don’t promise “works in the Gumroad app” for a ZIP-only product (<a href="https://gumroad.com/help/article/247-what-your-customers-see">Help 247</a> FAQ, <a href="https://gumroad.com/help/article/112-mobile-friendly-files">Help 112</a>).</li>
</ol>
<h2>2) What the buyer sees (mental model)</h2>
<table>
<thead>
<tr>
<th>Path</th>
<th>What Help describes</th>
<th>Seller implication</th>
</tr>
</thead>
<tbody><tr>
<td>Receipt email</td>
<td>“View content” → download page; may ask for checkout email (<a href="https://gumroad.com/help/article/199-how-do-i-access-my-purchase">Help 199</a>)</td>
<td>Receipt deliverability is part of delivery. Spam-folder copy in your FAQ is honest.</td>
</tr>
<tr>
<td>Product page</td>
<td>“Already own” card + view content when recognized; license key if signed in / identified email link (<a href="https://gumroad.com/help/article/199-how-do-i-access-my-purchase">Help 199</a>)</td>
<td>Don’t tell returning buyers “buy again to re-download.”</td>
</tr>
<tr>
<td>Library</td>
<td>Side-nav Library → product tile → Content window; exclusive posts listed (<a href="https://gumroad.com/help/article/247-what-your-customers-see">Help 247</a>, <a href="https://gumroad.com/help/article/198-your-gumroad-library">Help 198</a>)</td>
<td>Account + same email = one shelf. No account still works via receipt.</td>
</tr>
<tr>
<td>Archive / remove</td>
<td>Archive hides; remove keeps original download link; support can restore the card (<a href="https://gumroad.com/help/article/198-your-gumroad-library">Help 198</a>)</td>
<td>“Deleted from Library” ≠ “lost access forever” for remove.</td>
</tr>
</tbody></table>
<p>Folders on the download page start <strong>collapsed</strong> unless you enable <strong>Start expanded</strong>, or there is only one top-level folder (<a href="https://gumroad.com/help/article/149-adding-a-product">Help 149</a>). A buyer who “can’t find the zip” may simply not have opened the folder.</p>
<h2>3) Seller toggles that change the experience</h2>
<table>
<thead>
<tr>
<th>Toggle / choice</th>
<th>Documented effect</th>
<th>Honesty risk if you hide it</th>
</tr>
</thead>
<tbody><tr>
<td>Free / $0 PWYW</td>
<td>Cumulative product size ≤ <strong>250 MB</strong> (<a href="https://gumroad.com/help/article/289-file-size-limits-on-gumroad">Help 289</a>)</td>
<td>Listing a multi-GB free pack</td>
</tr>
<tr>
<td>Paid &gt; $0.99</td>
<td>Single file up to <strong>20 GB</strong>; many files allowed (<a href="https://gumroad.com/help/article/289-file-size-limits-on-gumroad">Help 289</a>)</td>
<td>Claiming unlimited multi-file “Download all” when total ≥ 500 MB</td>
</tr>
<tr>
<td>Total content ≥ 500 MB</td>
<td>No “Download all” button; ZIP workaround (<a href="https://gumroad.com/help/article/289-file-size-limits-on-gumroad">Help 289</a>)</td>
<td>“One-click download everything” in the sales page</td>
</tr>
<tr>
<td>Hide Read / Kindle</td>
<td>Download-only for that PDF/EPUB (<a href="https://gumroad.com/help/article/247-what-your-customers-see">Help 247</a>)</td>
<td>Marketing “read in browser” while the toggle is off</td>
</tr>
<tr>
<td>Stream only</td>
<td>No download; watch on Gumroad; signed/expiring stream links (<a href="https://gumroad.com/help/article/43-streaming-videos">Help 43</a>)</td>
<td>Saying “downloadable video course” for stream-only files</td>
</tr>
<tr>
<td>Versions</td>
<td>Separate Content per version (<a href="https://gumroad.com/help/article/126-setting-up-versions-on-a-digital-product">Help 126</a>; deep dive <a href="https://kendeepp.hashnode.dev/gumroad-updates-past-buyers-versioning">this guide</a>)</td>
<td>Buyer bought Lite but listing screenshots show Pro files</td>
</tr>
<tr>
<td>Pages / embed emails</td>
<td>Structure + put critical notes next to files (<a href="https://gumroad.com/help/article/149-adding-a-product">Help 149</a>)</td>
<td>Important install steps only in a one-time email</td>
</tr>
</tbody></table>
<p><strong>Browsers:</strong> Gumroad supports the last four major updates of Edge, Safari, Chrome, and Firefox; outdated browsers can cause <strong>upload and purchase</strong> errors (<a href="https://gumroad.com/help/article/53-what-browsers-does-gumroad-support">Help 53</a>). Useful for support macros; not a sales boast.</p>
<h2>4) Claims you may make vs invent</h2>
<table>
<thead>
<tr>
<th>Claim</th>
<th>Honest?</th>
</tr>
</thead>
<tbody><tr>
<td>“After purchase, open Library (or your receipt) and download from Content”</td>
<td>Yes — matches 199/247/198</td>
</tr>
<tr>
<td>“Free product total files ≤ 250 MB”</td>
<td>Yes — Help 289</td>
</tr>
<tr>
<td>“Paid product: individual files up to 20 GB”</td>
<td>Yes — Help 289 (&gt; $0.99)</td>
</tr>
<tr>
<td>“Download all appears only under 500 MB total; otherwise use our ZIP”</td>
<td>Yes — Help 289</td>
</tr>
<tr>
<td>“EPUB over 32 MB won’t open in the browser reader”</td>
<td>Yes — 198/247/112</td>
</tr>
<tr>
<td>“Stream-only: watch on Gumroad, no file download”</td>
<td>Yes — Help 43</td>
</tr>
<tr>
<td>“4K streams at full 4K on Gumroad”</td>
<td>No — Help 43: reduced to <strong>1080p</strong> for streaming</td>
</tr>
<tr>
<td>“Works in the Gumroad iOS/Android app” for a ZIP-only pack</td>
<td>No — 247 FAQ / 112 type list</td>
</tr>
<tr>
<td>“Instant Library sync within N seconds of Content save”</td>
<td><strong>Not verified</strong> — no SLA in archived Help</td>
</tr>
<tr>
<td>“DRM that stops all screen recording / sharing”</td>
<td><strong>Not verified</strong> this run; Help 43 only documents signed/expiring stream links for stream-only video</td>
</tr>
</tbody></table>
<h2>5) Seller self-check (delivery honesty)</h2>
<ul>
<li> Sales page language matches <strong>stream only</strong> vs <strong>downloadable</strong> for every video.</li>
<li> Free / $0 products stay under <strong>250 MB</strong> total, or the price is raised above $0.99 before shipping large archives.</li>
<li> If total Content ≥ <strong>500 MB</strong>, the page tells buyers to use the <strong>ZIP</strong> (or named parts), not “Download all.”</li>
<li> PDF/EPUB: either offer <strong>Read</strong> honestly, or disclose that Read/Kindle is off.</li>
<li> App claim only if files are in Help 112’s audio/video/PDF/EPUB lists — not ZIP-only.</li>
<li> Folders: critical files either top-level or in a folder set to <strong>Start expanded</strong>.</li>
<li> Test purchase: receipt → View content; second check with Library account on the same email.</li>
<li> Don’t borrow the update story from <a href="https://kendeepp.hashnode.dev/gumroad-updates-past-buyers-versioning">this guide</a> here: if you promise “lifetime updates,” you still need Content + email (Help 169) — that is a separate article.</li>
</ul>
<h2>6) Not verified</h2>
<ul>
<li>Library visibility latency after you save Content.</li>
<li>Whether every mid-life Content replace triggers a “file ready” style mail (do not rely on it; see <a href="https://kendeepp.hashnode.dev/gumroad-updates-past-buyers-versioning">this guide</a>).</li>
<li>A published hard cap on <strong>number</strong> of files per product (Help 289 says you can add as many as you want).</li>
<li>Full “Content protection on Gumroad” article mechanics (related link noted in Help 43; not archived this run).</li>
<li>Help article <strong>80</strong> (streaming video rentals URL returned the Help index on fetch day — do not cite).</li>
</ul>
<h2>7) Bottom line</h2>
<p>Buyers don’t live on your product editor. They live on <strong>receipt → download page</strong> and <strong>Library → tile → Content</strong>. Quote only the file-size and streaming numbers Help prints (250 MB / 20 GB / 500 MB Download-all / 32 MB Read / 480p·1080p stream). If your listing promises an app, a browser reader, a one-click Download-all, or a downloadable 4K file, check the matching toggle and limit first — or rewrite the listing.</p>
]]></content:encoded></item><item><title><![CDATA[Apify Store after launch: the quality score, the daily test, and the 31-day path to "deprecated"]]></title><description><![CDATA[Apify Store after launch: the quality score, the daily test, and the 31-day path to "deprecated"
Not legal or investment advice. Mechanics come from docs.apify.com (Actor quality score, Actor testing ]]></description><link>https://kendeepp.hashnode.dev/apify-quality-score-daily-tests</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/apify-quality-score-daily-tests</guid><category><![CDATA[web scraping]]></category><category><![CDATA[SaaS]]></category><category><![CDATA[apify]]></category><category><![CDATA[quality-score]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 11:43:26 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/3674df79-abf5-4f55-af90-43c63ab3fbae.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Apify Store after launch: the quality score, the daily test, and the 31-day path to "deprecated"</h1>
<p><em>Not legal or investment advice. Mechanics come from docs.apify.com (Actor quality score, Actor testing in Apify Store, Automated tests for Actors), archived 2026-10-15 (Asia/Shanghai). Apify says the scoring algorithm keeps evolving, so re-open the pages before you rely on any detail. This article links none of our Actors.</em></p>
<p>Publishing an Actor is the start, not the finish. Two systems keep judging it afterwards: a <strong>quality score</strong> that feeds search ranking, and a <strong>daily automated test</strong> that can label it <code>under maintenance</code> and eventually <code>deprecated</code>. Neither needs you to do anything wrong. A target site changing its HTML is enough.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Quality score: 0–100</strong>, shown in Console &gt; Insights &gt; Actor quality. It correlates strongly with ranking in Apify Store search <strong>and</strong> in the Apify MCP server's <code>search-actors</code> tool used by AI agents. No position is guaranteed. Console search is personalized per user.</li>
<li><strong>It moves without you.</strong> It is recalculated several times a day, it is relative to other Actors, and the algorithm changes. Recommendations may linger after you've fixed the issue.</li>
<li><strong>Daily Store test:</strong> Apify runs your Actor with its <strong>prefill</strong> input. The run must end <strong>Succeeded</strong>, with a <strong>non-empty default dataset</strong>, <strong>within 5 minutes</strong>.</li>
<li><strong>Failure calendar:</strong> 3 consecutive failing days → you're notified and the Actor is marked <code>under maintenance</code>. 14 more days → a second notice. 14 more → <code>deprecated</code>.</li>
<li><strong>Recovery:</strong> fix and rebuild, and the test picks it up within 24 hours. Or, if the target site was at fault, pass the <strong>majority</strong> of test runs over the next 7 days and it is marked healthy automatically.</li>
<li><strong>Actors that need auth, or that legitimately run more than 5 minutes, always fail.</strong> Contact support to ask for an exclusion. Don't game the prefill instead.</li>
</ol>
<h2>2) The eight categories and what you actually control</h2>
<table>
<thead>
<tr>
<th>Category</th>
<th>Docs say it reflects</th>
<th>Your lever</th>
</tr>
</thead>
<tbody><tr>
<td>Reliability</td>
<td>Run success rate + passing automated QA tests ("poor reliability significantly impacts")</td>
<td>Input schema validation; pass the daily test</td>
</tr>
<tr>
<td>Popularity</td>
<td>Users running, saves, return usage</td>
<td>A clear use case. You can't honestly buy this</td>
</tr>
<tr>
<td>Feedback and community</td>
<td>Reviews/ratings from repeat runners; negative reviews hurt</td>
<td>First-run experience; reply to issues</td>
</tr>
<tr>
<td>Ease of use</td>
<td>Title, description, input field descriptions, README</td>
<td>Self-explanatory inputs</td>
</tr>
<tr>
<td>Pricing transparency</td>
<td>How predictable cost is; PPE named as the predictable model; Bronze/Silver/Gold discounts suggested</td>
<td>Explicit events, honest per-result wording</td>
</tr>
<tr>
<td>Trustworthiness</td>
<td><strong>Limited permissions</strong>. Their absence "will negatively impact"</td>
<td>Use limited permissions unless support approves more</td>
</tr>
<tr>
<td>History of success</td>
<td>Your track record across Actors</td>
<td>Slow, cumulative</td>
</tr>
<tr>
<td>Congruency</td>
<td>Title, description, README, input/dataset/KVS schemas use consistent terms</td>
<td>One vocabulary everywhere</td>
</tr>
</tbody></table>
<p><strong>Weights: Not verified.</strong> Apify doesn't publish them, so don't write "pricing is 20% of the score" or anything like it.</p>
<h2>3) The daily test, step by step</h2>
<ul>
<li><strong>Prefill is the test input.</strong> It's the <code>prefill</code> in your input schema, not <code>default</code>. A prefill that scrapes 10,000 pages or needs a cookie will fail every day.</li>
<li><strong>Keep the default run under 5 minutes, with at least one dataset item.</strong> A run that succeeds but pushes nothing still fails.</li>
<li>Treat the prefill as the demo, the test, and the first-run experience all at once. The same run that decides <code>under maintenance</code> is what a new user sees first.</li>
</ul>
<p><strong>Hypothetical calendar</strong> (first failing test on 2026-10-15):</p>
<table>
<thead>
<tr>
<th>Date</th>
<th>Event</th>
</tr>
</thead>
<tbody><tr>
<td>2026-10-15</td>
<td>Day 1 failing</td>
</tr>
<tr>
<td>2026-10-17</td>
<td>3 consecutive days → notified, <code>under maintenance</code></td>
</tr>
<tr>
<td>2026-10-31</td>
<td>+14 days still failing → second notice</td>
</tr>
<tr>
<td>2026-11-14</td>
<td>+14 more → <code>deprecated</code></td>
</tr>
</tbody></table>
<p>So you have about a month from first failure to deprecation, but the public <code>under maintenance</code> label arrives on <strong>day 3</strong>. The intro of the same page says "broken for more than a month." Whether that and the 3+14+14 count run on the same clock: <strong>Not verified</strong>.</p>
<p><strong>Majority over 7 days:</strong> 4 of 7 passing (0.571) qualifies and 3 of 7 (0.429) doesn't, assuming one test per day. Whether the count is "7 runs" or "all runs in the window": <strong>Not verified</strong>.</p>
<h2>4) Your own tests (so you hear first)</h2>
<p>Apify's guide recommends the public Actor Testing Actor:</p>
<ol>
<li>Create <strong>1–5 test tasks</strong>, including one with the default configuration.</li>
<li>Set a low <code>maxItems</code> to save credits; run heavy-data tests less often.</li>
<li>Assert status <code>SUCCEEDED</code>, no <code>ReferenceError</code>/<code>TypeError</code> in the log, retries below a threshold, runtime within a range, a non-empty dataset, and the fields in the expected shape.</li>
<li>Schedule it, then review the results <strong>weekly</strong>.</li>
</ol>
<p>A scheduled test that mirrors the Store test (prefill, 5-minute budget, non-empty dataset) is the cheapest early warning you can get.</p>
<h2>5) Honest language while the score or status is bad</h2>
<p>Say:</p>
<ul>
<li>"Temporarily under maintenance: the target site changed; fix in progress" (if that's true).</li>
<li>"Requires your own login; excluded from automated tests by arrangement with Apify" (only after support confirms).</li>
</ul>
<p>Don't say:</p>
<ul>
<li>"Top-ranked" or "#1 in Store." Ranking is personalized in Console and not guaranteed anywhere.</li>
<li>"Quality score 90+" as a lasting badge. It moves daily, relative to other Actors.</li>
<li>"Always works." The daily test is public evidence against you the moment it fails.</li>
</ul>
<h2>6) Self-check</h2>
<ul>
<li> Prefill run finishes Succeeded, with ≥1 dataset item, in &lt; 5 min.</li>
<li> The input schema validates (Reliability).</li>
<li> Limited permissions are on (Trustworthiness).</li>
<li> Title, README, and schemas use the same terms (Congruency).</li>
<li> Your own scheduled test runs and is reviewed weekly.</li>
<li> Auth/long-run Actors: exclusion requested from support, not hacked around.</li>
<li> Listing copy makes no ranking or score promises.</li>
</ul>
<h2>Not verified</h2>
<ul>
<li>Category weights inside the quality score.</li>
<li>How "majority of test runs in the next 7 days" is counted.</li>
<li>Whether "broken for more than a month" and the 3+14+14 schedule are the same clock.</li>
<li>Whether a <code>deprecated</code> Actor returns to healthy after a fix, or must be republished.</li>
<li>Whether Actors excluded from the daily test lose Reliability points.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Chrome MV3 permissions, honestly: activeTab, optional permissions, and the update that disables your extension]]></title><description><![CDATA[Chrome MV3 permissions, honestly: activeTab, optional permissions, and the update that disables your extension
Not legal advice. Mechanics come from developer.chrome.com (Declare permissions, Permissi]]></description><link>https://kendeepp.hashnode.dev/chrome-mv3-permission-honesty</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/chrome-mv3-permission-honesty</guid><category><![CDATA[chrome extension]]></category><category><![CDATA[manifest-v3]]></category><category><![CDATA[privacy]]></category><category><![CDATA[chrome web store]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 11:38:00 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/9c466e9e-0a4b-4152-abec-5ad8d5638292.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Chrome MV3 permissions, honestly: activeTab, optional permissions, and the update that disables your extension</h1>
<p><em>Not legal advice. Mechanics come from developer.chrome.com (Declare permissions, Permission warning guidelines, activeTab, permissions API) and the Chrome Web Store "Use of Permissions" policy, archived 2026-10-15 (Asia/Shanghai). Chrome changes; re-read the pages before you ship. This article links none of our products.</em></p>
<p>A privacy policy and the Privacy practices tab describe what you do with data. The manifest decides what you <strong>can</strong> reach. If the two disagree, users find out at install time, and reviewers find out sooner. This piece is about getting the manifest right and describing it truthfully.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Ask for the narrowest permission that works.</strong> The policy says that if more than one permission could implement a feature, you must request the one with the least access, and you must not "future proof" by requesting permissions for features you haven't built.</li>
<li><strong><code>activeTab</code> shows no install warning.</strong> It grants temporary access to the current tab only after a user gesture (action click, context-menu item, keyboard command, omnibox suggestion). Access lasts while the user stays on that origin and ends when they navigate away or close the tab. It never covers <code>chrome://</code> pages.</li>
<li><strong>Optional permissions are granted at runtime</strong>, via <code>permissions.request()</code> called <strong>inside a user gesture</strong>. That lets you explain why at the moment the user turns the feature on.</li>
<li><strong>Adding a required permission that has a warning disables your extension for existing users</strong> until they accept it. Adding an <em>optional</em> permission does not.</li>
<li><strong>Some permissions cannot be optional:</strong> <code>debugger</code>, <code>declarativeNetRequest</code>, <code>devtools</code>, <code>geolocation</code>, <code>mdns</code>, <code>proxy</code>, <code>tts</code>, <code>ttsEngine</code>, <code>wallpaper</code> (ChromeOS). If you need one, it has to be in <code>permissions</code> from day one, or added later at the cost of an update prompt.</li>
</ol>
<h2>2) The five manifest keys</h2>
<table>
<thead>
<tr>
<th>Key</th>
<th>Granted</th>
<th>Warning?</th>
</tr>
</thead>
<tbody><tr>
<td><code>permissions</code></td>
<td>At install</td>
<td>Changes may trigger a warning</td>
</tr>
<tr>
<td><code>optional_permissions</code></td>
<td>At runtime, by the user</td>
<td>Prompt when requested</td>
</tr>
<tr>
<td><code>host_permissions</code></td>
<td>At install</td>
<td>Changes may trigger a warning</td>
</tr>
<tr>
<td><code>optional_host_permissions</code></td>
<td>At runtime</td>
<td>Prompt when requested</td>
</tr>
<tr>
<td><code>content_scripts.matches</code></td>
<td>At install</td>
<td>Changes may trigger a warning</td>
</tr>
</tbody></table>
<p>Host permissions cover more than injection: <code>fetch()</code> from the service worker, reading tab <code>url</code>/<code>title</code>/<code>favIconUrl</code>, <code>webRequest</code>, <code>cookies</code>, and <code>declarativeNetRequest</code> header changes. Make sure your listing does not say "we only touch the page you click" when <code>host_permissions</code> says <code>https://*/*</code>.</p>
<p>Warnings can hide each other. The <code>tabs</code> warning does not show if you also request <code>&lt;all_urls&gt;</code>. A short warning list is not evidence of narrow access, so don't write listing copy based on what the dialog happened to show.</p>
<h2>3) Pick the mechanism per feature</h2>
<table>
<thead>
<tr>
<th>Feature runs…</th>
<th>Use</th>
<th>What you can honestly say</th>
</tr>
</thead>
<tbody><tr>
<td>Only when the user clicks / uses a shortcut on the current page</td>
<td><code>activeTab</code> (+ <code>scripting</code> if injecting)</td>
<td>"Reads the current page only when you click the button."</td>
</tr>
<tr>
<td>On specific sites the user opts into later</td>
<td><code>optional_host_permissions</code> + <code>permissions.request()</code></td>
<td>"Asks for access to a site when you enable it for that site."</td>
</tr>
<tr>
<td>Hosts discovered at runtime</td>
<td><code>"https://*/*"</code> in <code>optional_host_permissions</code>, request specific origins</td>
<td>Same as above. Don't claim "all sites" if you only request on demand</td>
</tr>
<tr>
<td>Always, on fixed sites, in the background</td>
<td><code>host_permissions</code> with exact patterns</td>
<td>List those domains by name</td>
</tr>
<tr>
<td>One of the non-optional APIs</td>
<td><code>permissions</code></td>
<td>Say it plainly and explain why</td>
</tr>
</tbody></table>
<p>Docs-confirmed trade-off: required permissions mean fewer prompts and guaranteed presence; optional permissions mean less standing access, a just-in-time explanation, and upgrades that don't disable the extension.</p>
<h2>4) The update trap</h2>
<p>The Permission warning guidelines say this directly: when an update adds a permission that triggers a warning, Chrome <strong>disables the extension until the user accepts</strong> the new permission. For a paid or licensed extension, that means active users may suddenly find the tool off, and every one of them has to say yes again.</p>
<p>Before shipping an update that touches permissions:</p>
<ul>
<li> Diff <code>permissions</code>, <code>host_permissions</code>, and <code>content_scripts.matches</code> against the live version. All three can trigger the warning.</li>
<li> Ask whether the new capability can be <strong>optional</strong> instead. An upgrade that only adds optional permissions does not disable the extension.</li>
<li> Test the upgrade path with Google's Extension Update Testing Tool, or pack it manually with the <strong>same .pem</strong> and update over the old install. You'll see the exact prompt users will see.</li>
<li> Write the changelog line <em>before</em> release: what new access, and why.</li>
<li> Remove permissions you no longer use (<code>permissions.remove()</code>). Note: re-requesting a removed permission "usually" re-adds it <strong>without</strong> a prompt, so don't tell users that removal forces a fresh consent.</li>
</ul>
<p>How long a disabled extension stays disabled, and whether Chrome re-prompts users who ignore the banner: <strong>Not verified</strong>.</p>
<h2>5) Listing and onboarding language</h2>
<p>Say:</p>
<ul>
<li>"Works on the tab you're viewing, only when you click the icon" (true for <code>activeTab</code>).</li>
<li>"Optional: grant access to example.com to enable auto-fill there" (true for optional host permissions).</li>
<li>"Needs <code>proxy</code> permission at install because it routes traffic. Chrome won't let this be optional."</li>
</ul>
<p>Don't say:</p>
<ul>
<li>"No permissions required" when the install dialog shows any warning.</li>
<li>"Only reads the current page" alongside <code>&lt;all_urls&gt;</code> in <code>host_permissions</code>.</li>
<li>"We'll never ask for more access" (you can't promise future manifests).</li>
<li>"Works in incognito / on local files" without telling users to turn it on themselves on the extension's details page. Both need a user toggle, and you can check them with <code>extension.isAllowedIncognitoAccess()</code> / <code>isAllowedFileSchemeAccess()</code>.</li>
</ul>
<h2>6) Self-check before you submit</h2>
<ul>
<li> Every entry in <code>permissions</code>/<code>host_permissions</code> maps to a shipped feature (no future-proofing).</li>
<li> Every click-triggered page feature tried <code>activeTab</code> first.</li>
<li> Every non-core feature uses optional permissions, requested inside a click handler.</li>
<li> Non-optional APIs are listed and justified in plain words.</li>
<li> Listing copy matches the broadest access in the manifest, not the shortest warning list.</li>
<li> The upgrade prompt was tested with the same signing key.</li>
<li> The exact current warning text for each permission was checked against the Permissions reference. <strong>Not verified</strong> here.</li>
</ul>
<h2>Not verified</h2>
<ul>
<li>Exact current warning strings per permission in Chrome stable.</li>
<li>Whether adding only optional permissions changes Chrome Web Store review time.</li>
<li>Whether users who ignore the "new permissions" prompt are re-prompted automatically.</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Charging for an Obsidian plugin: the README disclosures that keep you in the Community directory]]></title><description><![CDATA[Charging for an Obsidian plugin: the README disclosures that keep you in the Community directory
Not legal advice. Rules come from Obsidian's "Developer policies" page (docs.obsidian.md/community-dire]]></description><link>https://kendeepp.hashnode.dev/obsidian-plugin-developer-policies-disclosures</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/obsidian-plugin-developer-policies-disclosures</guid><category><![CDATA[obsidian]]></category><category><![CDATA[plugins]]></category><category><![CDATA[Developer]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[Monetization]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 11:33:13 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/048d0a43-531b-40df-b2de-e457905a36ce.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Charging for an Obsidian plugin: the README disclosures that keep you in the Community directory</h1>
<p><em>Not legal advice. Rules come from Obsidian's "Developer policies" page (docs.obsidian.md/community-directory/developer-policies, source text archived 2026-10-15, Asia/Shanghai). Re-read it before you submit. This article links no plugin.</em></p>
<p>You can put a paywall, a login, or a banner in an Obsidian plugin and still stay listed. The condition: say so in the README. A few things are banned outright, and no README wording fixes those.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Banned outright:</strong> obfuscated code, dynamic ads loaded over the internet, static ads outside your own UI, <strong>client-side telemetry</strong>, self-installing or self-updating code/dependencies, and themes loading network assets.</li>
<li><strong>Allowed only if "clearly indicated in your README":</strong> payment for full access, account for full access, network use (which services, and why), file access outside vaults (why), static ads inside your own UI, server-side telemetry (with a privacy-policy link), closed source (case by case).</li>
<li><strong>Licensing:</strong> a LICENSE file, compliance with upstream licenses (README attribution if required), and no use of "Obsidian" that suggests a first-party product.</li>
<li><strong>Forks:</strong> only with the original author's public written approval, or after 6+ months of inactivity plus a 30-day notice. The original author must be credited.</li>
<li><strong>Enforcement:</strong> users open an issue first and escalate after 7 days. Obsidian may give you "a reasonable timeframe" or remove you immediately (malicious, uncooperative, repeat).</li>
</ol>
<h2>2) Map your monetization to the policy</h2>
<table>
<thead>
<tr>
<th>What your plugin does</th>
<th>Status</th>
<th>README must say</th>
</tr>
</thead>
<tbody><tr>
<td>Pro features behind a license key</td>
<td>Disclosure</td>
<td>"Payment is required for full access", and that the key check calls </td>
</tr>
<tr>
<td>Sync via your server, sign-in required</td>
<td>Disclosure</td>
<td>Account required; network use: which host, what is sent, why</td>
</tr>
<tr>
<td>"Upgrade" banner in your settings tab</td>
<td>Disclosure</td>
<td>Static ads in plugin's own interface</td>
</tr>
<tr>
<td>Banner injected into the editor or status bar of other views</td>
<td><strong>Not allowed</strong>: outside your own interface</td>
<td>n/a, remove it</td>
</tr>
<tr>
<td>Ads fetched from an ad network</td>
<td><strong>Not allowed</strong>: dynamic ads</td>
<td>n/a</td>
</tr>
<tr>
<td>Usage analytics sent from the app</td>
<td><strong>Not allowed</strong>: client-side telemetry</td>
<td>n/a</td>
</tr>
<tr>
<td>Server logs of your own API calls, analysed</td>
<td>Disclosure</td>
<td>Server-side telemetry + privacy policy link</td>
</tr>
<tr>
<td>Minified bundle with readable source in repo</td>
<td>Fine</td>
<td>n/a</td>
</tr>
<tr>
<td>Obfuscated license check</td>
<td><strong>Not allowed</strong></td>
<td>n/a</td>
</tr>
<tr>
<td>Auto-downloading a newer binary</td>
<td><strong>Not allowed</strong>: self-update</td>
<td>n/a</td>
</tr>
</tbody></table>
<p><strong>Not verified:</strong> where the line between a license-key check and "telemetry" falls. The page does not define it. Disclose the call as network use either way.</p>
<h2>3) A README block you can adapt</h2>
<pre><code>## Disclosures
- Payment: core features are free; &lt;features&gt; need a paid license.
- Account: not required / required for &lt;feature&gt;.
- Network: contacts &lt;host&gt; to &lt;purpose&gt;. Sends &lt;data&gt;. Nothing else.
- Files outside the vault: none / &lt;path&gt;, because &lt;reason&gt;.
- Ads: an upgrade notice appears only in this plugin's settings tab.
- Telemetry: no client-side telemetry. Server logs: &lt;what&gt;, see &lt;privacy policy URL&gt;.
- License: &lt;SPDX id&gt;. Third-party code: &lt;list + attribution&gt;.
</code></pre>
<h2>4) Forks and "Pro" clones</h2>
<p>Re-publishing a popular free plugin with a paywall is a fork. It needs public written approval, or proof of 6 months of silence followed by a 30-day public notice. If you only borrowed the idea, the policy says to start a fresh repo that inherits no code without permission.</p>
<h2>5) Not verified</h2>
<ul>
<li>The length of the "reasonable timeframe" before removal.</li>
<li>Whether disclosures are checked at submission or only after a report.</li>
<li>Whether a plugin removed from the directory keeps working for existing installs.</li>
</ul>
<h2>6) Bottom line</h2>
<p>Payment, accounts, and in-plugin upsells are allowed if you disclose them. Hidden behaviour is what gets plugins removed: ads outside your view, client analytics, obfuscation. Write the disclosure block before the paywall code.</p>
]]></content:encoded></item><item><title><![CDATA[Selling an Odoo module: what OPL-1 and LGPL-3 actually promise your buyer]]></title><description><![CDATA[Selling an Odoo module: what OPL-1 and LGPL-3 actually promise your buyer
Not legal advice. Quotes come from Odoo's official Licenses page (odoo.com/documentation/17.0/legal/licenses), archived 2026-1]]></description><link>https://kendeepp.hashnode.dev/odoo-apps-license-opl-lgpl-honesty</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/odoo-apps-license-opl-lgpl-honesty</guid><category><![CDATA[Odoo]]></category><category><![CDATA[ERP]]></category><category><![CDATA[licensing]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[open source]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 11:28:08 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/1bf4f2c5-95b4-45c5-80d1-7845d97b73ff.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Selling an Odoo module: what OPL-1 and LGPL-3 actually promise your buyer</h1>
<p><em>Not legal advice. Quotes come from Odoo's official Licenses page (odoo.com/documentation/17.0/legal/licenses), archived 2026-10-15 (Asia/Shanghai). Re-open it before you rely on any line. This article links no app listing.</em></p>
<p>The <code>license</code> key in <code>__manifest__.py</code> looks like a dropdown. It is really a promise to every buyer about what they may do with your code after they pay. Most listing mistakes come from treating it as a price tag rather than a contract.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Community Edition (17, and per the page every version since 9) is LGPLv3.</strong> Your module may depend on it under any compatible license.</li>
<li><strong>Odoo's own paid apps use the Odoo Proprietary License v1.0 (OPL-1)</strong> "unless otherwise stated". OPL-1 allows use and modification only for people who bought a license or got written agreement, and forbids redistributing or selling copies.</li>
<li><strong>If your module uses an Enterprise or OPL-1 module as a library</strong>, you may still distribute yours under "the license of your choice" if it is compatible. Odoo's own examples: LGPL, MIT, or proprietary licenses similar to OPL. You may <strong>not</strong> copy source code or material from the OPL module.</li>
<li><strong>Picking LGPL-3 for a paid module is allowed, but it is an honest giveaway:</strong> a buyer may lawfully share the code. Don't sell it as "protected".</li>
<li><strong>Odoo 8 is AGPLv3.</strong> Selling a v8 backport under OPL-1 means knowing what you are building on.</li>
</ol>
<h2>2) The two licenses side by side</h2>
<table>
<thead>
<tr>
<th>Question a buyer asks</th>
<th>LGPL-3 module</th>
<th>OPL-1 module</th>
</tr>
</thead>
<tbody><tr>
<td>Can I run it without paying the author?</td>
<td>Yes, if I obtained a copy</td>
<td>Only with a purchased license or written agreement</td>
</tr>
<tr>
<td>Can I modify it?</td>
<td>Yes</td>
<td>Yes ("executed after modifications"), with a license</td>
</tr>
<tr>
<td>Can I resell or share the files?</td>
<td>Yes, under LGPL terms</td>
<td>No: "forbidden to publish, distribute, sublicense, or sell copies"</td>
</tr>
<tr>
<td>Can I build my own module on top?</td>
<td>Yes</td>
<td>Yes, as a library (depend, import), <strong>without copying code</strong></td>
</tr>
<tr>
<td>Must the copyright notice stay?</td>
<td>LGPL terms</td>
<td>Yes, in all copies or substantial portions</td>
</tr>
</tbody></table>
<h2>3) The Enterprise-dependency trap</h2>
<p>The Enterprise Edition License says the Software "can only be used ... with a valid Odoo Enterprise Subscription for the correct number of users". If your module depends on an Enterprise module, your buyer needs that subscription too, whatever license <em>your</em> file says.</p>
<p>Honest listing line: <em>"Requires Odoo Enterprise (e.g. ). Does not work on Community."</em> Leave it out and your refund requests are self-inflicted.</p>
<p>Partners get the same rights only "limited to a testing or development environment". Being a partner does not mean your customers can run Enterprise for free.</p>
<h2>4) What you may claim, and what you may not</h2>
<table>
<thead>
<tr>
<th>Claim on the listing</th>
<th>Honest?</th>
</tr>
</thead>
<tbody><tr>
<td>"OPL-1: one purchase per buyer, no redistribution"</td>
<td>Yes, it matches the license text</td>
</tr>
<tr>
<td>"Copy-protected / cannot be shared"</td>
<td>No. The license forbids it; nothing on the page says it is technically prevented. <strong>Not verified:</strong> any enforcement mechanism</td>
</tr>
<tr>
<td>"LGPL-3, free to modify and share" on a paid app</td>
<td>Yes, and say it plainly</td>
</tr>
<tr>
<td>"Includes code from Odoo's "</td>
<td>Breach of OPL-1 if you copied it. Depend on it, don't copy it</td>
</tr>
<tr>
<td>"Works on Community" while importing an Enterprise module</td>
<td>No</td>
</tr>
<tr>
<td>"Same license for v15–v17"</td>
<td>OK for 9–17 per the page. <strong>Not verified</strong> for 18/19; re-check the doc for that version</td>
</tr>
</tbody></table>
<h2>5) Pre-submit self-check</h2>
<ul>
<li> <code>license</code> key matches the LICENSE file in the repo and the listing text.</li>
<li> Every dependency listed; Enterprise ones called out in the first screen of the description.</li>
<li> No copied files or snippets from OPL-1 modules (search your diff for their copyright headers).</li>
<li> If LGPL-3: the listing does not imply exclusivity.</li>
<li> If OPL-1: the original copyright notice ships in every copy.</li>
<li> v8 branches checked separately (AGPLv3).</li>
</ul>
<h2>6) Not verified</h2>
<ul>
<li>How the Apps Store enforces OPL-1 after purchase.</li>
<li>Whether Store policy adds anything to LGPL resale rights for paid modules.</li>
<li>That the 18.0/19.0 doc pages carry identical text (only 17.0 was archived).</li>
<li>The legal effect in your jurisdiction. Ask a lawyer for that.</li>
</ul>
<h2>7) Bottom line</h2>
<p>Choose the license for what you want buyers to be able to do, and write the listing from it. OPL-1 is a contract, not DRM. LGPL-3 on a paid app is generous, and you should say so. Enterprise dependencies are your buyer's cost, so print them up front.</p>
]]></content:encoded></item><item><title><![CDATA[Apify Store: where publishing ends and monetization begins (and the 14-day rule in between)]]></title><description><![CDATA[Apify Store: where publishing ends and monetization begins (and the 14-day rule in between)
Not legal, tax, or investment advice. Mechanics below come from docs.apify.com (Publish, Set up monetization]]></description><link>https://kendeepp.hashnode.dev/apify-store-publish-vs-monetization-boundary</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/apify-store-publish-vs-monetization-boundary</guid><category><![CDATA[apify]]></category><category><![CDATA[web scraping]]></category><category><![CDATA[Monetization]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 10:32:32 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/1e8f9169-fa77-423a-a36e-0e79efe09c67.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Apify Store: where publishing ends and monetization begins (and the 14-day rule in between)</h1>
<p><em>Not legal, tax, or investment advice. Mechanics below come from docs.apify.com (Publish, Set up monetization, Monetize, Pay per event, Actors in Store) and the Store Publishing Terms, archived 2026-10-15 (Asia/Shanghai). Console behaviour changes, so re-open the pages before you change price. This article links none of our products or Actors.</em></p>
<p>This article is not a Store publishing checklist. Related reading on pricing claims: <a href="https://kendeepp.hashnode.dev/apify-actor-monetization-honesty">this guide</a>. Here the only job is: the seam between publishing and monetization — the timing rules that decide <strong>when</strong> a price takes effect, and how they change how you should launch.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Monetization sits inside the Publishing tab.</strong> You complete Display information, <strong>Monetization</strong>, Sample output, Output schema, and Actor permissions, then press <strong>Publish on Store</strong> (<a href="https://docs.apify.com/platform/actors/publishing/publish">Publish</a>).</li>
<li><strong>Billing and payment details come first.</strong> Set up monetization: “first complete your billing and payment details. Then, you can define the pricing” (<a href="https://docs.apify.com/actors/monetize/set-up-monetization">Set up monetization</a>). <strong>KYC is what payouts need</strong>; it is not a step for publishing (Terms §10.1.2–10.1.3).</li>
<li><strong>Significant changes</strong> (pricing-model change, price increase, new paid event) notify users and <strong>take effect after 14 days</strong>. During that window the old pricing applies. You <strong>can’t cancel or modify</strong> a submitted change (support only), you get <strong>one per month per Actor</strong>, and a <strong>pending change blocks</strong> new ones (<a href="https://docs.apify.com/actors/monetize/set-up-monetization">Set up monetization</a>; Terms §9.4).</li>
<li><strong>Exemption:</strong> “if your Actor has <strong>no paying users</strong>, the waiting period doesn’t apply and the change takes effect immediately.”</li>
<li><strong>Non-significant changes are immediate:</strong> price decreases, removing events, description edits, non-pricing settings.</li>
<li><strong>The “Pay per event + usage” toggle is asymmetric:</strong> turning it <strong>on</strong> takes <strong>14 days</strong>; turning it <strong>off</strong> is immediate because it is “a positive change for users” (<a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">PPE</a>).</li>
</ol>
<h2>2) Order of operations at the seam</h2>
<table>
<thead>
<tr>
<th>Step</th>
<th>Where</th>
<th>Why it matters at the boundary</th>
</tr>
</thead>
<tbody><tr>
<td>Billing + payment details</td>
<td>Account</td>
<td>Required <strong>before</strong> defining pricing (set-up-monetization)</td>
</tr>
<tr>
<td>Actor pricing: synthetic <code>apify-actor-start</code> / <code>apify-default-dataset-item</code>, custom events, +usage, min max-cost-per-run</td>
<td>Publishing → Monetization</td>
<td>Defines what a user pays on the first run</td>
</tr>
<tr>
<td>Primary event</td>
<td>same</td>
<td>Defaults to dataset event / only event</td>
</tr>
<tr>
<td>Review → confirm</td>
<td>same</td>
<td>Pricing locked in as <strong>current</strong> pricing</td>
</tr>
<tr>
<td>Other Publishing sections → <strong>Publish on Store</strong></td>
<td>Publishing</td>
<td>Actor becomes a public Store product (Publish)</td>
</tr>
<tr>
<td>KYC / Verified Creator</td>
<td>Account</td>
<td>Needed for <strong>payouts</strong> (§10.1.2); unpaid accruals withheld 12 months are forfeited (§10.1.6)</td>
</tr>
<tr>
<td>Agentic-payment eligibility</td>
<td>automatic</td>
<td>PPE only, no +usage, limited permissions, no Standby, <strong>and KYC</strong> (Monetize)</td>
</tr>
</tbody></table>
<p>Whether Console lets you publish with <strong>no</strong> monetization section completed (as opposed to choosing pay-per-usage) is <strong>Not verified</strong>.</p>
<h2>3) Significant vs non-significant: the timing table</h2>
<table>
<thead>
<tr>
<th>Change</th>
<th>Class</th>
<th>When it applies</th>
</tr>
</thead>
<tbody><tr>
<td>Pricing model switch (e.g. pay-per-usage → PPE)</td>
<td>Significant</td>
<td>+14 days, users notified</td>
</tr>
<tr>
<td>Raise an event price</td>
<td>Significant</td>
<td>+14 days</td>
</tr>
<tr>
<td>Add a new paid event</td>
<td>Significant</td>
<td>+14 days</td>
</tr>
<tr>
<td>Turn <strong>on</strong> PPE + usage</td>
<td>(PPE page)</td>
<td>+14 days</td>
</tr>
<tr>
<td>Any of the above with <strong>zero paying users</strong></td>
<td>Exempt</td>
<td>Immediate</td>
</tr>
<tr>
<td>Lower a price</td>
<td>Non-significant</td>
<td>Immediate</td>
</tr>
<tr>
<td>Remove an event</td>
<td>Non-significant</td>
<td>Immediate</td>
</tr>
<tr>
<td>Turn <strong>off</strong> PPE + usage</td>
<td>Positive</td>
<td>Immediate</td>
</tr>
<tr>
<td>Edit event descriptions / non-pricing settings</td>
<td>Non-significant</td>
<td>Immediate</td>
</tr>
</tbody></table>
<p><strong>Worked calendar</strong> (hypothetical): submit a price increase on <strong>2026-10-15</strong>, and it takes effect <strong>2026-10-29</strong>. You can’t submit another significant change while that one is pending. With “once per month per Actor,” plan the next one around mid-November. Whether “month” means a calendar month or a rolling 30 days is <strong>Not verified</strong>.</p>
<p><strong>Worked profit</strong> (hypothetical PPE, 1,000 results, $0.50 platform cost; 80% − costs per Terms §10.2.1): $2/1k gives $1.10 profit and $3/1k gives $1.90. Until day 14 you earn at the old rate, so don’t book the higher number early.</p>
<h2>4) Free → paid on an already-published Actor</h2>
<p>The docs don’t say “free → paid” in those words. They do define it through the rules above:</p>
<ul>
<li>Moving from <strong>pay-per-usage</strong> (users pay only platform usage) to <strong>PPE</strong> is a <strong>pricing-model change</strong>, which makes it significant: users are notified and it takes effect after 14 days.</li>
<li><strong>Adding a paid event</strong> on top of existing PPE is also significant.</li>
<li>If nobody pays yet, the change is <strong>immediate</strong>, so the cheapest moment to settle pricing is <strong>before</strong> paying users show up.</li>
<li><strong>Free-plan users:</strong> if you limit them, say so up front in the README and input schema, exit gracefully with a clear message, and never dress a policy limit up as a bug (<a href="https://docs.apify.com/platform/actors/publishing/monetize">Monetize</a>).</li>
<li>Set-up-monetization warns against “high prices exclusively for users on a free plan.”</li>
<li><strong>Announcement duty:</strong> Apify notifies users of significant changes. The docs don’t say whether creators must post their own notice. Updating the README to match the <strong>current</strong> price (not the pending one) is the honest default. The exact notification channel is <strong>Not verified</strong>.</li>
<li><strong>Rental:</strong> since <strong>2026-04-01</strong> you can’t publish new rental Actors or change rental pricing; since <strong>2026-10-01</strong> rental is retired and remaining Actors moved to pay-per-usage (<a href="https://docs.apify.com/platform/actors/running/actors-in-store">Actors in Store</a>). Don’t plan a “rental → paid” path now.</li>
</ul>
<h2>5) Publish-side rules that bite monetized Actors</h2>
<p>From the Store Publishing Terms:</p>
<ul>
<li><strong>§2.2.4.2:</strong> no promoting off-platform products in the README or description, and no review incentives or self-reviews. You can’t route paid users to an external checkout from the Store page.</li>
<li><strong>§3.2:</strong> Apify may run promotional pricing, coupons, and discounts on your Actor. Don’t promise “price never changes.”</li>
<li><strong>§7.1 / §10.2.2:</strong> a Faulty Actor can be marked under maintenance and deprecated after <strong>30 days</strong>. <strong>No payout accrues while it is Faulty.</strong></li>
<li><strong>§8.1:</strong> user Issues must be addressed within <strong>14 days</strong>, or the Actor can be declared Faulty.</li>
<li><strong>§9.2:</strong> profit and payout figures in the UI are <strong>estimates</strong>.</li>
</ul>
<h2>6) Seam self-check</h2>
<ol>
<li>Billing details done before opening Monetization?</li>
<li>Is the first public price the one you can live with? (Before paying users, changes are immediate; after, it’s 14 days and once a month.)</li>
<li>No pending significant change you might want to undo? (It can’t be cancelled.)</li>
<li>README/input schema state free-plan limits and the <strong>current</strong> price?</li>
<li>Not counting on PPE + usage as a temporary bump? (On takes 14 days, off is instant.)</li>
<li>KYC planned so earnings aren’t stuck (12-month forfeit)?</li>
<li>No off-platform checkout links on the Store page?</li>
</ol>
<h2>7) Not verified</h2>
<ul>
<li>Calendar month vs rolling 30 days for “once per month.”</li>
<li>The channel and wording of Apify’s user notification for significant changes.</li>
<li>Publishing with no monetization section completed.</li>
<li>Whether unpublish → republish resets the timing rules.</li>
<li>Whether a price change made during an Apify-run promotion (§3.2) counts as significant.</li>
</ul>
<h2>Sources (archived)</h2>
<ul>
<li><a href="https://docs.apify.com/platform/actors/publishing/publish">Publish your Actor</a></li>
<li><a href="https://docs.apify.com/actors/monetize/set-up-monetization">Set up Actor monetization</a></li>
<li><a href="https://docs.apify.com/platform/actors/publishing/monetize">Monetize Actors</a></li>
<li><a href="https://docs.apify.com/platform/actors/publishing/monetize/pay-per-event">Pay per event</a></li>
<li><a href="https://docs.apify.com/platform/actors/running/actors-in-store">Actors in Store</a></li>
<li><a href="https://docs.apify.com/legal/store-publishing-terms-and-conditions">Apify Store Publishing Terms</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Gumroad Discover eligibility, deep-dive: every switch that puts a product on (or off) the marketplace]]></title><description><![CDATA[Gumroad Discover eligibility, deep-dive: every switch that puts a product on (or off) the marketplace
Not legal or tax advice. Rules below come from Gumroad Help articles 79, 66, 222, 333 and the Pric]]></description><link>https://kendeepp.hashnode.dev/gumroad-discover-eligibility-ranking-deep-dive</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/gumroad-discover-eligibility-ranking-deep-dive</guid><category><![CDATA[gumroad]]></category><category><![CDATA[discover]]></category><category><![CDATA[digital products]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[ecommerce]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 10:22:12 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/8640c6b3-1918-4d11-8971-d08e9419aaad.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<h1>Gumroad Discover eligibility, deep-dive: every switch that puts a product on (or off) the marketplace</h1>
<p><em>Not legal or tax advice. Rules below come from Gumroad Help articles 79, 66, 222, 333 and the Pricing page, archived 2026-10-15 (Asia/Shanghai). Gumroad edits Help often — re-open them before you plan around Discover. This article links none of our products.</em></p>
<p>This article is not a shallow Discover overview. Here the only job is: the exact switches that put a product on (or off) Discover, what flips them, and where the documentation simply stops.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Two gates, in order.</strong> Account gate: payout settings filled in, <strong>≥ $100 USD balance from genuine sales</strong>, then <strong>risk-team review (~3 weeks on average after crossing $100)</strong>. Product gate: <strong>≥1 successful non-refunded sale</strong>, <strong>a category selected</strong>, <strong>ratings enabled</strong> (<a href="https://gumroad.com/help/article/79-gumroad-discover">79</a>).</li>
<li><strong>Discover is on by default</strong> once both gates pass. The documented off-switch is <strong>deleting the product’s category</strong> (<a href="https://gumroad.com/help/article/79-gumroad-discover">79</a>).</li>
<li><strong>Hiding ratings also removes you</strong> — Help 222: if you toggle ratings off display, “your product will <strong>not show up</strong> in the Discover search anymore” (<a href="https://gumroad.com/help/article/222-product-ratings-on-gumroad">222</a>).</li>
<li><strong>Discover = flat 30%, processing included</strong>; direct = 10% + \(0.50 plus card 2.9% + \)0.30. The $20k/month high-volume discount applies to <strong>direct only</strong>; “Discover marketplace sales stay at 30%” (<a href="https://gumroad.com/help/article/66-gumroads-fees">66</a>).</li>
<li><strong>Discover products are auto-enrolled in Gumroad Affiliates</strong> (fixed <strong>10%</strong>, 7-day cookie). Opting out is <strong>account-wide</strong>, not per product (<a href="https://gumroad.com/help/article/79-gumroad-discover">79</a>, <a href="https://gumroad.com/help/article/333-affiliates-on-gumroad">333</a>).</li>
<li><strong>Ranking is not public.</strong> The only documented lever is “descriptive and specific” tags inside a category. Anything more is <strong>Not verified</strong>.</li>
</ol>
<h2>2) The switch board</h2>
<table>
<thead>
<tr>
<th>Switch (Share tab unless noted)</th>
<th>Effect on Discover</th>
<th>Source</th>
</tr>
</thead>
<tbody><tr>
<td>Payout settings incomplete</td>
<td>Account not eligible</td>
<td>79</td>
</tr>
<tr>
<td>Balance &lt; $100 from genuine sales</td>
<td>Account not eligible; self-buys / partner / housemate purchases excluded</td>
<td>79</td>
</tr>
<tr>
<td>Risk review pending</td>
<td>Not eligible yet; <strong>~3 weeks average</strong> after $100</td>
<td>79</td>
</tr>
<tr>
<td>Zero successful sales on this product</td>
<td>Product not listed</td>
<td>79</td>
</tr>
<tr>
<td>Only sale was refunded</td>
<td>Still not listed — “refunded sales don’t count”</td>
<td>79</td>
</tr>
<tr>
<td>No category</td>
<td>Not listed (this is the documented opt-out)</td>
<td>79</td>
</tr>
<tr>
<td>Ratings disabled / hidden</td>
<td>Not listed; ratings become private</td>
<td>79, 222</td>
</tr>
<tr>
<td>NSFW toggle on</td>
<td>Shown only to buyers who enabled Adult content</td>
<td>79</td>
</tr>
<tr>
<td>Opt out of Gumroad Affiliates (Affiliates dashboard)</td>
<td>Stops 10% Gumroad Affiliates on <strong>all</strong> products; Discover listing itself not stated to change (<strong>Not verified</strong>)</td>
<td>333</td>
</tr>
</tbody></table>
<p><strong>Practical implication:</strong> “I hid the two bad reviews” and “I’m on Discover” cannot both be true. If you want Discover, ratings stay visible.</p>
<h2>3) Refunds hit Discover twice</h2>
<p>From Help 79 + 222:</p>
<ul>
<li><strong>Product gate:</strong> a refunded sale does not count as the “one successful sale.” If your first and only sale is refunded, the product drops back to ineligible.</li>
<li><strong>Ratings:</strong> a <strong>full</strong> refund removes that buyer’s rating and excludes it from the average; a <strong>partial</strong> refund does <strong>not</strong> (bundles excepted). So refunding to erase a bad rating also erases a qualifying sale.</li>
<li><strong>Fees:</strong> Gumroad returns its own fee on the refunded portion but keeps the processing portion (<a href="https://gumroad.com/help/article/66-gumroads-fees">66</a>).</li>
<li>Whether refunds that pull the account <strong>below $100</strong> re-trigger risk review or remove account eligibility is <strong>not documented → Not verified</strong>.</li>
</ul>
<p>Honest reading: don’t use refunds as a ratings-management tool. Use the documented “Respond” to reviews instead (222).</p>
<h2>4) What 30% actually costs at small prices (Decimal, tax ignored)</h2>
<p>From Help 66 rates; PayPal fees not modelled (Decimal).</p>
<table>
<thead>
<tr>
<th>Price</th>
<th>Direct fees</th>
<th>Direct net</th>
<th>Discover fee</th>
<th>Discover net</th>
<th>Discover net as % of direct net</th>
</tr>
</thead>
<tbody><tr>
<td>$9</td>
<td>$1.96</td>
<td>$7.04</td>
<td>$2.70</td>
<td>$6.30</td>
<td>≈89.5%</td>
</tr>
<tr>
<td>$19</td>
<td>$3.25</td>
<td>$15.75</td>
<td>$5.70</td>
<td>$13.30</td>
<td>84.44%</td>
</tr>
<tr>
<td>$29</td>
<td>$4.54</td>
<td>$24.46</td>
<td>$8.70</td>
<td>$20.30</td>
<td>82.99%</td>
</tr>
</tbody></table>
<p>The $0.50 fixed fee makes direct relatively expensive at low prices, so Discover’s premium shrinks as price falls. At $9 the premium is $0.74 per sale; at $29 it is $4.16. This is a business call, not an honesty one. But don’t tell yourself Discover is “free traffic.”</p>
<p><strong>Affiliates on top (illustrative only):</strong> with fees split pro-rata to commission (<a href="https://gumroad.com/help/article/66-gumroads-fees">66</a>), a $29 sale with a 10% Gumroad Affiliate nets the creator <strong>$22.01</strong> at direct rates or <strong>$18.27</strong> if the 30% rate applied. Which rate applies when an affiliate link lands on a Discover-listed product is <strong>Not verified</strong>, so both are shown.</p>
<h2>5) Ranking and recommendations: documented vs not</h2>
<table>
<thead>
<tr>
<th>Claim you may hear</th>
<th>Status</th>
</tr>
</thead>
<tbody><tr>
<td>“Descriptive, specific tags improve Discover sales”</td>
<td><strong>Documented</strong> (79)</td>
</tr>
<tr>
<td>Tags show within each category on Discover</td>
<td><strong>Documented</strong> (79)</td>
</tr>
<tr>
<td>Ratings are a prerequisite</td>
<td><strong>Documented</strong> (79, 222)</td>
</tr>
<tr>
<td>“Highest rated” profile sort exists</td>
<td><strong>Documented</strong> for <strong>your profile</strong> only (222), not Discover ranking</td>
</tr>
<tr>
<td>Discover ranks by sales velocity / conversion / rating average</td>
<td><strong>Not verified</strong>: no public formula</td>
</tr>
<tr>
<td>More reviews = higher placement</td>
<td><strong>Not verified</strong></td>
</tr>
<tr>
<td>Price affects placement</td>
<td><strong>Not verified</strong></td>
</tr>
<tr>
<td>Paid boost / featured slot for sale</td>
<td>No such product documented in these pages (<strong>Not verified</strong> beyond them)</td>
</tr>
</tbody></table>
<p>Don’t sell (or buy) “Discover ranking hacks.” The public surface is category + tags + ratings + real sales.</p>
<h2>6) Gate-by-gate self-check</h2>
<ol>
<li>Payout settings complete? (79)</li>
<li>Balance ≥ $100 from <strong>real</strong> buyers, with no self-buys or household purchases? (79)</li>
<li>Clock started for ~3-week risk review; nothing promised publicly until it clears? (79)</li>
<li>This product: ≥1 non-refunded sale? (79)</li>
<li>Category set, and is it the right one? Tags specific, not stuffed? (79)</li>
<li>Ratings visible? (79, 222)</li>
<li>OK with automatic Gumroad Affiliates at 10%, or opting out account-wide? (333)</li>
<li>Priced with the 30% vs direct gap in mind (section 4)? (66)</li>
<li>Warm audience still sent to <strong>direct</strong> links? (66 fee logic)</li>
</ol>
<h2>7) Not verified</h2>
<ul>
<li>Discover ranking/recommendation signals beyond tags/category/ratings.</li>
<li>Numeric meaning of “enough genuine sales” beyond the $100 balance.</li>
<li>The attribution rule that marks a sale “Discover” versus direct.</li>
<li>Fee basis for Gumroad-Affiliate-referred sales of Discover products.</li>
<li>Effect of later refunds/chargebacks on account-level eligibility.</li>
<li>Help article “Indirect taxes on sales via Gumroad Discover” (not fetched).</li>
</ul>
<h2>Sources (archived)</h2>
<ul>
<li><a href="https://gumroad.com/help/article/79-gumroad-discover">Gumroad Discover (79)</a></li>
<li><a href="https://gumroad.com/help/article/66-gumroads-fees">Gumroad’s fees (66)</a></li>
<li><a href="https://gumroad.com/help/article/222-product-ratings-on-gumroad">Product ratings and reviews (222)</a></li>
<li><a href="https://gumroad.com/help/article/333-affiliates-on-gumroad">Affiliates on Gumroad (333)</a></li>
<li><a href="https://gumroad.com/pricing">Pricing</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[n8n Creator Hub free→paid honesty: when you can claim a paid template]]></title><description><![CDATA[Not legal or marketplace advice. Figures and rules below come from n8n Help Center, n8n Docs, and official Creator Hub / Notion guideline pages archived with this draft (2026-10-15 Asia/Shanghai). n8n]]></description><link>https://kendeepp.hashnode.dev/n8n-creator-hub-free-to-paid-honesty</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/n8n-creator-hub-free-to-paid-honesty</guid><category><![CDATA[n8n]]></category><category><![CDATA[automation]]></category><category><![CDATA[workflow]]></category><category><![CDATA[creator economy]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 09:27:20 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/6a4b107a-d300-4254-b877-b887b28d4cd9.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not legal or marketplace advice. Figures and rules below come from n8n Help Center, n8n Docs, and official Creator Hub / Notion guideline pages archived with this draft (2026-10-15 Asia/Shanghai). n8n docs say the creator program / template marketplace is an</em> <em><strong>ongoing project</strong></em> <em>and details are</em> <em><strong>likely to change</strong></em> <em>— re-open the Creator Hub before you publish pricing claims. This article does not claim any local workflow is listed on n8n.io and does not endorse third-party “n8n markets.”</em></p>
<p>This article is not a walkthrough of the free-template ladder. Here the only job is: <strong>what you can honestly say about paid</strong> before vs after verification — and what official pages do <strong>not</strong> yet promise.</p>
<h2>1) Lead answer</h2>
<ol>
<li><p><strong>Anyone can become a creator and share templates</strong> on n8n.io (<a href="https://support.n8n.io/article/becoming-an-n8n-template-creator-and-getting-help">Becoming an n8n template creator…</a>). That is <strong>not</strong> the same as “I sell paid templates on Creator Hub.”</p>
</li>
<li><p><strong>New (unverified) creators:</strong> submit <strong>one template at a time</strong>; next only after the previous is <strong>approved</strong>. Review usually takes <strong>within a week</strong>, often sooner (same Help Center FAQ).</p>
</li>
<li><p><strong>Verified unlock:</strong> after <strong>3 approved</strong> templates you become a verified creator. Perks documented by Help Center + <a href="https://n8n.notion.site/n8n-Creator-hub-7bd2cbe0fce0449198ecb23ff4a2f76f">Creator Hub</a>: submit up to <strong>4</strong> at a time; creators Discord; verified badge; <strong>the option / ability to publish paid templates</strong>.</p>
</li>
<li><p><strong>Honesty gate:</strong> until those <strong>3 approvals</strong> (and the paid option is actually available on your Creator Dashboard), do <strong>not</strong> market “my n8n.io paid template” or “Creator Hub paid listing live.” Say “building free templates toward verification” if you must talk publicly.</p>
</li>
<li><p><strong>Program is evolving</strong> (<a href="https://docs.n8n.io/contribute/">Contribute</a>, <a href="https://docs.n8n.io/workflows/templates/">Use templates</a>): public docs do <strong>not</strong> publish a paid-template commission %, minimum price, refund policy, or payout calendar. Those numbers are <strong>Not verified</strong> — do not invent them in listings or tweets.</p>
</li>
<li><p><strong>Submission honesty</strong> (<a href="https://n8n.notion.site/Template-submission-guidelines-9959894476734da3b402c90b124b1f77">Template submission guidelines</a>): sticky notes mandatory; no hardcoded API keys; <strong>do not plagiarize or resell someone else’s template</strong> (ban risk). “Paid” does not license stealing a free community workflow and flipping it.</p>
</li>
</ol>
<h2>2) Free → paid — claim ladder</h2>
<table>
<thead>
<tr>
<th>Stage</th>
<th>What official pages say you have</th>
<th>What you may claim</th>
<th>What you must not claim</th>
</tr>
</thead>
<tbody><tr>
<td>Signed up, <strong>0</strong> approvals</td>
<td>Can submit templates (1 at a time)</td>
<td>“Submitted / awaiting review”</td>
<td>“Verified creator”; “selling paid on n8n”</td>
</tr>
<tr>
<td><strong>1–2</strong> approvals</td>
<td>Still unverified; still 1-at-a-time</td>
<td>“N of 3 free templates approved”</td>
<td>“Paid templates unlocked”; fake verified badge screenshots</td>
</tr>
<tr>
<td><strong>3</strong> approvals → <strong>verified</strong></td>
<td>Badge, Discord, batch of 4, <strong>option to publish paid</strong></td>
<td>“Verified creator; eligible to publish paid templates”</td>
<td>Guaranteed ranking, featured placement, or revenue figures not on docs</td>
</tr>
<tr>
<td>Paid listing actually live on n8n.io</td>
<td>(Dashboard / live URL — confirm in UI)</td>
<td>“Paid template on n8n.io” + price you set in the official flow</td>
<td>Pretending a <strong>third-party</strong> marketplace listing is “official Creator Hub paid”</td>
</tr>
<tr>
<td>Program changes</td>
<td>Docs warn details likely to change</td>
<td>“Per Creator Hub as of ”</td>
<td>Evergreen “n8n always pays X%”</td>
</tr>
</tbody></table>
<h2>3) Honesty table — paid language self-check</h2>
<table>
<thead>
<tr>
<th>Claim</th>
<th>Pass if…</th>
<th>Fail if…</th>
</tr>
</thead>
<tbody><tr>
<td>“Free template on n8n”</td>
<td>Actually approved and listed on n8n’s library</td>
<td>Calling a private Gist / Discord JSON an “n8n template” as if Hub-listed</td>
</tr>
<tr>
<td>“Paid template on Creator Hub / n8n.io”</td>
<td>Verified <strong>and</strong> paid publish path completed per current Hub UI</td>
<td>Pre-selling while still unverified; linking only an external checkout with no Hub paid listing</td>
</tr>
<tr>
<td>“Verified creator”</td>
<td>Third approval landed; badge/Discord perks arrived (email creators@ if stuck)</td>
<td>Self-awarding a badge after one submission</td>
</tr>
<tr>
<td>“Review in 24 hours”</td>
<td>You only say “usually within a week, often sooner”</td>
<td>Guaranteeing same-day approval</td>
</tr>
<tr>
<td>“Original paid workflow”</td>
<td>You built it; not a thinly renamed community template</td>
<td>Reselling / reposting others’ workflows (<a href="https://n8n.notion.site/Template-submission-guidelines-9959894476734da3b402c90b124b1f77">submission guidelines</a>)</td>
</tr>
<tr>
<td>“Includes API keys ready to run”</td>
<td>Never — strip secrets; document credential types users must create</td>
<td>Shipping live tokens in JSON (guidelines forbid hardcoded keys)</td>
</tr>
<tr>
<td>“n8n pays creators 30%”</td>
<td><strong>Do not</strong> — Help Center paid-template <strong>% is Not verified</strong>. Affiliate <strong>30%</strong> on Starter/Pro (partners page) is a <strong>different</strong> program — don’t mix into template pricing claims</td>
<td></td>
</tr>
<tr>
<td>“Same as FlowMarket / n8nplace / etc.”</td>
<td>Disclose those as <strong>independent</strong> third parties if you use them</td>
<td>Branding them as official n8n Creator Hub</td>
</tr>
</tbody></table>
<h2>4) What public docs verify vs leave blank</h2>
<h3>Verified (cite these)</h3>
<table>
<thead>
<tr>
<th>Topic</th>
<th>Source</th>
</tr>
</thead>
<tbody><tr>
<td>Creator Hub = program for templates on n8n.io; <a href="mailto:creators@n8n.io">creators@n8n.io</a></td>
<td><a href="https://support.n8n.io/article/becoming-an-n8n-template-creator-and-getting-help">Help Center — becoming a creator</a></td>
</tr>
<tr>
<td>1-at-a-time until verified; ~1 week review</td>
<td>Same</td>
</tr>
<tr>
<td>3 approvals → verified; 4 concurrent; badge; Discord; <strong>paid option</strong></td>
<td>Same + <a href="https://n8n.notion.site/n8n-Creator-hub-7bd2cbe0fce0449198ecb23ff4a2f76f">Creator Hub</a></td>
</tr>
<tr>
<td>Export JSON → description → submit via Creator Dashboard</td>
<td>Creator Hub</td>
</tr>
<tr>
<td>Sticky notes mandatory; no plagiarize/resell; no hardcoded keys</td>
<td><a href="https://n8n.notion.site/Template-submission-guidelines-9959894476734da3b402c90b124b1f77">Submission guidelines</a></td>
</tr>
<tr>
<td>Marketplace / creator program ongoing; details likely to change</td>
<td><a href="https://docs.n8n.io/contribute/">Contribute</a>, <a href="https://docs.n8n.io/workflows/templates/">Use templates</a></td>
</tr>
</tbody></table>
<h3>Not verified on public official pages (do not invent)</h3>
<ol>
<li><p>Paid-template <strong>commission / revenue share</strong> percentage.</p>
</li>
<li><p>Paid-template <strong>minimum price</strong>, currency rules, tax handling.</p>
</li>
<li><p>Paid-template <strong>refund / chargeback</strong> policy and who handles support.</p>
</li>
<li><p><strong>Payout</strong> method, minimum threshold, and calendar for template sales.</p>
</li>
<li><p>Whether unpaid free templates can later be <strong>converted</strong> to paid (or must be new listings).</p>
</li>
<li><p>Ranking / Discover-style traffic rules for paid vs free templates inside n8n’s library.</p>
</li>
</ol>
<p>If the Creator Dashboard shows numbers after you verify, treat the <strong>UI + any in-app terms</strong> as the source of truth and re-archive them before you publish marketing copy — they were not extractable as stable public Help articles on archive day.</p>
<h2>5) Free-period marketing that stays honest</h2>
<p>While you are still clearing the three free approvals:</p>
<ol>
<li><p>Talk about <strong>problem → workflow outcome</strong>, not imagined paid ARR.</p>
</li>
<li><p>State clearly: “Free template submitted to n8n Creator Hub; paid listings require verification (3 approved templates).”</p>
</li>
<li><p>Do not gate the Hub-submitted free JSON behind your own checkout while calling it an “n8n free template.”</p>
</li>
<li><p>Do not use “n8n Verified” wording until the badge path completes (Help Center even lists “badge hasn’t arrived after third approval” as a reason to email creators@).</p>
</li>
<li><p>Keep credentials/PII out of shared JSON — honesty includes <strong>operational</strong> honesty to importers, not only price honesty.</p>
</li>
</ol>
<h2>6) What this article deliberately skips</h2>
<ul>
<li><p>Full free-template <strong>publish checklist</strong>, sticky-note patterns, description template → a separate guide.</p>
</li>
<li><p>LLM JSON reliability patterns → a separate guide.</p>
</li>
<li><p>Gumroad Discover thresholds / fees → a separate guide (not substituted here; n8n official gate was sufficient for an honesty piece).</p>
</li>
<li><p>Third-party marketplace seller terms (FlowMarket, n8nplace, etc.) — not official n8n; out of scope except as “don’t mislabel them.”</p>
</li>
</ul>
<h2>7) Not verified (summary)</h2>
<ol>
<li><p>All paid-template <strong>economics</strong> (fee %, min price, payout, refunds) — not on Help Center / Docs / Hub public pages fetched 2026-10-15.</p>
</li>
<li><p>Exact Dashboard UI labels for the paid publish toggle (Notion/Help only say “option / ability to publish paid templates”).</p>
</li>
<li><p>Whether verification can be revoked and whether paid listings survive revocation.</p>
</li>
<li><p>Interaction between <strong>affiliate</strong> 30% (partners) and <strong>template</strong> paid sales — treat as separate unless n8n publishes a combined policy.</p>
</li>
</ol>
<h2>Sources (archived)</h2>
<ul>
<li><p><a href="https://support.n8n.io/article/becoming-an-n8n-template-creator-and-getting-help">https://support.n8n.io/article/becoming-an-n8n-template-creator-and-getting-help</a></p>
</li>
<li><p><a href="https://support.n8n.io/article/how-can-i-become-a-verified-template-creator">https://support.n8n.io/article/how-can-i-become-a-verified-template-creator</a></p>
</li>
<li><p><a href="https://n8n.notion.site/n8n-Creator-hub-7bd2cbe0fce0449198ecb23ff4a2f76f">https://n8n.notion.site/n8n-Creator-hub-7bd2cbe0fce0449198ecb23ff4a2f76f</a></p>
</li>
<li><p><a href="https://n8n.notion.site/Template-submission-guidelines-9959894476734da3b402c90b124b1f77">https://n8n.notion.site/Template-submission-guidelines-9959894476734da3b402c90b124b1f77</a></p>
</li>
<li><p><a href="https://docs.n8n.io/contribute/">https://docs.n8n.io/contribute/</a></p>
</li>
<li><p><a href="https://docs.n8n.io/workflows/templates/">https://docs.n8n.io/workflows/templates/</a></p>
</li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Figma Community free vs paid plugin honesty: what you can claim in the listing]]></title><description><![CDATA[Not legal, tax, or marketplace advice. Quotes and rules below come from Figma Help Center, Community license pages, and Developer Docs archived with this draft (2026-10-15 Asia/Shanghai). Eligibility,]]></description><link>https://kendeepp.hashnode.dev/figma-community-vs-paid-plugin-honesty</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/figma-community-vs-paid-plugin-honesty</guid><category><![CDATA[figma]]></category><category><![CDATA[Figma Plugins]]></category><category><![CDATA[Design]]></category><category><![CDATA[creator economy]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 09:23:10 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/a521c2db-1ef0-4375-9919-532abc483546.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not legal, tax, or marketplace advice. Quotes and rules below come from Figma Help Center, Community license pages, and Developer Docs archived with this draft (2026-10-15 Asia/Shanghai). Eligibility, Stripe, and review practice evolve — re-open the linked pages before you change price or copy. This article does not link or endorse any of our products or any specific plugin.</em></p>
<p>This article is not about where money is collected or a pre-submit checklist. Here the only job is: <strong>honest free / paid / freemium language</strong> that matches Community licenses, selling policies, and review guidelines.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>“Free” on Community is a license statement, not “public domain.”</strong> By default, free plugins ship under the <a href="https://www.figma.com/legal/community-free-resource-license/">Community Free Resource License</a> (<a href="https://help.figma.com/hc/en-us/articles/360042296374-Figma-Community-copyright-and-licensing">copyright &amp; licensing</a>): users may run the plugin in files for any purpose; they may <strong>not</strong> resell or redistribute the plugin. Creators may <strong>supplement or replace</strong> that default with their own terms — if you do, say so in the listing.</li>
<li><strong>“Paid” on Community uses the <a href="https://www.figma.com/legal/community-paid-resource-license/">Community Paid Resource License</a></strong> (creators may <strong>supplement</strong>, not wholesale replace, for plugins). Users may run the plugin for any purpose; they may <strong>not</strong> resell, redistribute, or copy it. Do not invent a custom commercial license that contradicts the Paid Resource License for Community checkout.</li>
<li><strong>You cannot sell a file that was already published free.</strong> For <strong>plugins/widgets</strong>, Help Center allows moving <em>some</em> functionality behind a paywall via the Payments API, <strong>but the plugin/widget must still contain free features in addition to paid</strong> (<a href="https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources">About selling Community resources</a>).</li>
<li><strong>Once a plugin is published paid, it cannot later be converted to free</strong> (<a href="https://help.figma.com/hc/en-us/articles/360042293394-Publish-classic-plugins-to-the-Figma-Community">Publish classic plugins</a>). Do not promise “we’ll make it free after launch” if you already shipped paid.</li>
<li><strong>Listing must match reality</strong> (<a href="https://help.figma.com/hc/en-us/articles/360039958914-Plugin-and-widget-review-guidelines">Plugin and widget review guidelines</a>): accurate description / screenshots; no hidden functionality; if third-party accounts or <strong>additional payments</strong> are required, that must be <strong>clear in the description</strong>. Monetizing via a third party is allowed; monetizing in “poor taste” can be rejected.</li>
<li><strong>Custom trials need explicit listing copy</strong> (<a href="https://developers.figma.com/docs/plugins/requiring-payment/">Requiring payment</a>): if you customize free-trial experience (time- or usage-based), the description must clearly explain <strong>what’s included</strong> and <strong>how long</strong> (if time-based). Default subscription trial is <strong>seven days</strong> (<a href="https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources">About selling</a>); one-time paid plugins have <strong>no</strong> free trial by default.</li>
</ol>
<h2>2) Free vs paid — honesty table (creator claims)</h2>
<table>
<thead>
<tr>
<th>Claim in listing / social</th>
<th>Pass if…</th>
<th>Fail if…</th>
</tr>
</thead>
<tbody><tr>
<td>“Free plugin”</td>
<td>Listed free; default Free Resource License (or your stated replacement) matches what users get</td>
<td>Calling it free while checkout / Payments API blocks core value with no free features left</td>
</tr>
<tr>
<td>“Free forever”</td>
<td>You truly keep a free Community listing with usable free features</td>
<td>Soft-launch free then flip entire plugin paid (files: cannot sell after free publish; plugins: paid publish is one-way)</td>
</tr>
<tr>
<td>“Paid plugin — $X one-time”</td>
<td>Approved seller + Stripe; min <strong>$2</strong> USD whole number; price model fixed at publish (<a href="https://help.figma.com/hc/en-us/articles/360042293394-Publish-classic-plugins-to-the-Figma-Community">Publish</a>)</td>
<td>Advertising Community-native pay before you are an approved seller / Stripe active</td>
</tr>
<tr>
<td>“$X/mo subscription”</td>
<td>Same eligibility; sub model chosen at publish (<strong>cannot change</strong> one-time ↔ sub later); default <strong>7-day</strong> trial disclosed</td>
<td>Hiding that price can rise (max <strong>once / 30 days</strong>, max <strong>+50%</strong> per bump; users notified <strong>16 days</strong> ahead) (<a href="https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources">About selling</a>)</td>
</tr>
<tr>
<td>“Freemium — free + paid unlocks”</td>
<td>Free features remain after paywall; description names free vs paid</td>
<td>Paywalling everything after users remixed a “free” listing expectation; empty free shell</td>
</tr>
<tr>
<td>“Buy on Gumroad / our site”</td>
<td>Third-party payment path disclosed in description; review allows 3P monetization</td>
<td>Undisclosed extra payments; “Community free” while secretly requiring off-platform pay for basic use</td>
</tr>
<tr>
<td>“Commercial use OK”</td>
<td>Matches Free/Paid Resource License (run in files for any purpose)</td>
<td>Implying buyers may <strong>resell/redistribute</strong> the plugin itself (both licenses forbid that)</td>
</tr>
<tr>
<td>“Team license / seat sharing”</td>
<td>You only claim what Figma documents: paid resources are tied to the <strong>purchasing account</strong>; org-wide admin purchase <strong>not</strong> supported (<a href="https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources">About selling</a>)</td>
<td>“One purchase unlocks the whole org”</td>
</tr>
</tbody></table>
<h2>3) Commercialization limits Community actually documents</h2>
<p>From <a href="https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources">About selling Community resources</a> + <a href="https://help.figma.com/hc/en-us/articles/360042293394-Publish-classic-plugins-to-the-Figma-Community">Publish classic plugins</a>:</p>
<table>
<thead>
<tr>
<th>Rule</th>
<th>Honest implication</th>
</tr>
</thead>
<tbody><tr>
<td>Min price <strong>$2</strong> USD, whole numbers</td>
<td>No “$1.99” Community-native price</td>
</tr>
<tr>
<td>Paid <strong>files</strong>: Figma notes it is <strong>not approving new creators</strong> to sell paid files “at this time”</td>
<td>Do not market “I’ll sell this file on Community next week” as if approval is guaranteed</td>
</tr>
<tr>
<td>Paid only from <strong>individual</strong> approved accounts (not team/org Community profiles)</td>
<td>Don’t promise org-profile paid listings</td>
</tr>
<tr>
<td>Designated payee = first publisher; <strong>no split payouts</strong></td>
<td>Don’t advertise “co-founder 50/50 via Figma”</td>
</tr>
<tr>
<td>Cash-out <strong>30 US business days</strong> after sale; max <strong>one cash-out per week</strong></td>
<td>Don’t promise same-week payout</td>
</tr>
<tr>
<td>One-time purchases: auto refund window <strong>24h</strong> (charged back to seller); <strong>subscriptions not refundable</strong></td>
<td>Listing must not contradict Figma’s refund policy</td>
</tr>
<tr>
<td>Description must not contradict refund policy or licensing terms</td>
<td>Overpromising “lifetime money-back anytime” vs official 24h / sub rules is a fail</td>
</tr>
</tbody></table>
<h2>4) Review-guideline language traps (honesty-focused)</h2>
<p>From <a href="https://help.figma.com/hc/en-us/articles/360039958914-Plugin-and-widget-review-guidelines">Plugin and widget review guidelines</a>:</p>
<ol>
<li><strong>Accurate descriptions</strong> — operate as described; no surprise hidden functionality.</li>
<li><strong>External connections clear</strong> — third-party account <strong>or additional payments / licensing</strong> must be clear in the description.</li>
<li><strong>Business / monetization</strong> — directing users to a third party to monetize is allowed; “poor taste” monetization may be rejected (<strong>poor taste</strong> boundary is judgmental — exact examples beyond ads / recreating Figma paid AI are <strong>Not verified</strong>).</li>
<li><strong>No ads</strong> in plugin UI / files.</li>
<li><strong>Do not recreate</strong> core Figma / paid Figma capabilities (including certain AI / MCP overlaps listed in the guidelines).</li>
<li>Support contact is your responsibility — claim a real channel you will answer (selling terms also expect customer email response within <strong>three business days</strong>).</li>
</ol>
<h2>5) Payments API / trial honesty checklist</h2>
<table>
<thead>
<tr>
<th>Check</th>
<th>Pass if…</th>
<th>Fail if…</th>
</tr>
</thead>
<tbody><tr>
<td>Default sub trial</td>
<td>Listing says <strong>7-day</strong> free trial (unless you customized)</td>
<td>“No trial” on a subscription plugin without documenting a custom path</td>
</tr>
<tr>
<td>Custom time / usage trial</td>
<td>Description states inclusions + duration / quota (<a href="https://developers.figma.com/docs/plugins/requiring-payment/">Requiring payment</a>)</td>
<td>Trial length only in Discord, not on the Community page</td>
</tr>
<tr>
<td>Freemium after free publish</td>
<td>Free features remain (<a href="https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources">About selling</a>)</td>
<td>“Still free” badge while every useful action opens checkout</td>
</tr>
<tr>
<td><code>payments</code> permission</td>
<td>Manifest includes <code>"permissions": ["payments"]</code> when using the API</td>
<td>Marketing paid features that crash because permission missing (dev error to end users = review fail)</td>
</tr>
<tr>
<td>Interstitial honesty</td>
<td>Use <code>PAID_FEATURE</code> / <code>TRIAL_ENDED</code> appropriately</td>
<td>Skipping interstitial without your own clear upgrade CTA when users hit the wall</td>
</tr>
</tbody></table>
<h2>6) What this article deliberately skips</h2>
<ul>
<li>Figma-native vs Gumroad/third-party <strong>rail choice</strong> and fee comparison tables → a separate guide.</li>
<li>Manifest icons, cover sizes, networkAccess labels, desktop/2FA submit prep → a separate guide.</li>
<li>Country payout eligibility deep lists / W-8BEN fill → a separate guide / tax pieces (do not reopen a separate guide wording here).</li>
<li>Step-by-step Stripe onboarding screenshots → not here; not published.</li>
</ul>
<h2>7) Not verified</h2>
<ol>
<li>Exact internal definition of monetization “in poor taste” beyond the written ads / core-capability / AI overlap rules.</li>
<li>Whether any grandfathered exceptions exist for converting paid → free (docs say cannot).</li>
<li>Live length of “not approving new creators to sell paid <strong>files</strong>” freeze (stated on Help page at archive time; plugins/widgets still documented as sellable for eligible creators).</li>
<li>Exact intermediary bank fee when cashing out via Stripe (not specified as a fixed USD range on these pages).</li>
</ol>
<h2>Sources (archived)</h2>
<ul>
<li><a href="https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources">https://help.figma.com/hc/en-us/articles/12067637274519-About-selling-Community-resources</a>  </li>
<li><a href="https://help.figma.com/hc/en-us/articles/360039958914-Plugin-and-widget-review-guidelines">https://help.figma.com/hc/en-us/articles/360039958914-Plugin-and-widget-review-guidelines</a>  </li>
<li><a href="https://help.figma.com/hc/en-us/articles/360042296374-Figma-Community-copyright-and-licensing">https://help.figma.com/hc/en-us/articles/360042296374-Figma-Community-copyright-and-licensing</a>  </li>
<li><a href="https://help.figma.com/hc/en-us/articles/360042293394-Publish-classic-plugins-to-the-Figma-Community">https://help.figma.com/hc/en-us/articles/360042293394-Publish-classic-plugins-to-the-Figma-Community</a>  </li>
<li><a href="https://www.figma.com/legal/community-free-resource-license/">https://www.figma.com/legal/community-free-resource-license/</a>  </li>
<li><a href="https://www.figma.com/legal/community-paid-resource-license/">https://www.figma.com/legal/community-paid-resource-license/</a>  </li>
<li><a href="https://developers.figma.com/docs/plugins/requiring-payment/">https://developers.figma.com/docs/plugins/requiring-payment/</a></li>
</ul>
]]></content:encoded></item><item><title><![CDATA[Odoo Apps Store payout & SWIFT self-check (seller money path)]]></title><description><![CDATA[Not legal, tax, or banking advice. Numbers and rails below come from Odoo Apps FAQ, Vendor Guidelines, and Submit pages archived with this draft (2026-10-15 Asia/Shanghai). Re-open those pages and you]]></description><link>https://kendeepp.hashnode.dev/odoo-apps-payout-swift-self-check</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/odoo-apps-payout-swift-self-check</guid><category><![CDATA[Odoo]]></category><category><![CDATA[ERP]]></category><category><![CDATA[payments]]></category><category><![CDATA[Swift]]></category><category><![CDATA[indie hackers]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 08:38:28 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/76f5e69c-3e15-4cff-92fa-8f4ba4676040.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not legal, tax, or banking advice. Numbers and rails below come from Odoo Apps FAQ, Vendor Guidelines, and Submit pages archived with this draft (2026-10-15 Asia/Shanghai). Re-open those pages and your live Sales / Preferences dashboards before you invoice or enable auto-redeem. This article does not link or endorse any of our modules.</em></p>
<p>This article is not a vendor listing checklist or a multi-series maintenance guide. Here the only job is: <strong>when and how Odoo pays you</strong>, what “€400” actually gates, what SWIFT wording allows you to promise buyers/partners, and what you must still confirm with Odoo because public docs are silent.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Split:</strong> Odoo S.A. takes <strong>30%</strong> commission on Apps Store sales; you receive <strong>70%</strong> of module revenues (<a href="https://apps.odoo.com/apps/faq">FAQ</a>, <a href="https://apps.odoo.com/apps/vendor-guidelines">Vendor Guidelines</a>, <a href="https://apps.odoo.com/apps/upload">Submit</a>). <strong>IAP</strong> (In-App Purchase) is separate: <strong>25%</strong> commission on each IAP transaction (<a href="https://apps.odoo.com/apps/faq">FAQ</a>).</li>
<li><strong>Accrual:</strong> Sales land on a <strong>PO (purchase order)</strong> visible on your <strong>sales dashboard</strong>. That PO stays <strong>Open</strong> until Odoo closes it.</li>
<li><strong>Close gate:</strong> During each month, Odoo closes POs that have reached or exceeded <strong>400 euros</strong> of <strong>unredeemed sales</strong> (<a href="https://apps.odoo.com/apps/faq">FAQ</a>, <a href="https://apps.odoo.com/apps/vendor-guidelines">Vendor Guidelines</a>). Under €400 → expect the balance to <strong>carry</strong>, not a weekly wire.</li>
<li><strong>Redeem paths:</strong>  <ul>
<li><strong>Automatic:</strong> enable in <strong>Preferences</strong> → Odoo pays after close “in the following days” (FAQ) / sends accumulated prior-month amount (Guidelines). Legal check: some countries forbid receiving bank money <strong>without issuing an invoice</strong> — Guidelines tell you to confirm with local counsel before enabling.  </li>
<li><strong>Manual:</strong> wait for close + notification → send invoice that includes the <strong>PO / redeem reference</strong> and <strong>matching amounts</strong>. Do <strong>not</strong> invoice <strong>Open</strong> POs.</li>
</ul>
</li>
<li><strong>Rail:</strong> Payment is <strong>international SWIFT</strong>. Official wording: may take <strong>several days or weeks</strong>; delay is <strong>higher outside Europe</strong> (<a href="https://apps.odoo.com/apps/faq">FAQ</a>, <a href="https://apps.odoo.com/apps/vendor-guidelines">Vendor Guidelines</a>). No published day-count SLA, IBAN field list, or intermediary-fee schedule on these pages → treat specifics as <strong>Not verified</strong> until Odoo/your bank confirms.</li>
<li><strong>FX:</strong> Apps are sold in the <strong>end user’s currency</strong>, so dashboard amounts can <strong>deviate</strong> from your list currency due to exchange rates (<a href="https://apps.odoo.com/apps/vendor-guidelines">Vendor Guidelines</a>). List currency itself is only <strong>EUR or USD</strong> in the manifest (Guidelines) — that is pricing, not payout currency documentation (<strong>payout currency details → Not verified</strong> on public FAQ).</li>
</ol>
<h2>2) Money path diagram (seller self-check)</h2>
<pre><code>Buyer pays on Apps Store
        ↓
Sale line appears on your Sales dashboard PO (Open)
        ↓
Month rolls; unredeemed sales on PO ≥ €400?
   no  → keep accruing (no redeem yet)
   yes → Odoo closes PO
        ↓
Auto-redeem ON?  → Odoo processes payment “following days”
Auto-redeem OFF? → email: send invoice with redeem/PO ref + matching totals
        ↓
International SWIFT → your bank (days–weeks; slower outside Europe)
</code></pre>
<p><strong>Honesty rule:</strong> “I get paid every month” is only true if (a) you cross <strong>€400</strong> unredeemed, (b) the PO is <strong>closed</strong>, and (c) auto-redeem is legal/on <strong>or</strong> you invoice promptly. Slow months under €400 are <strong>carry</strong>, not a bug.</p>
<h2>3) Commission &amp; threshold — worked example (local Decimal)</h2>
<p>Assume a <strong>€32.00</strong> list price (EUR). Official split: Odoo <strong>30%</strong>, vendor <strong>70%</strong>.</p>
<table>
<thead>
<tr>
<th>Line</th>
<th>Amount</th>
</tr>
</thead>
<tbody><tr>
<td>List (buyer-side, EUR)</td>
<td>€32.00</td>
</tr>
<tr>
<td>Odoo 30%</td>
<td>€9.60</td>
</tr>
<tr>
<td>Vendor 70%</td>
<td>€22.40</td>
</tr>
</tbody></table>
<p><strong>€400 close threshold</strong> is worded as <strong>unredeemed sales</strong> on the PO (gross sales tracked), not “vendor net ≥ €400”.</p>
<p>Python <code>Decimal</code> (archived in the archived sources):</p>
<table>
<thead>
<tr>
<th>Check</th>
<th>Result</th>
</tr>
</thead>
<tbody><tr>
<td>Sales needed (ceil) for €400 gross at €32</td>
<td><strong>13</strong> sales</td>
</tr>
<tr>
<td>Gross at 13 × €32</td>
<td><strong>€416.00</strong></td>
</tr>
<tr>
<td>Vendor 70% of that gross</td>
<td><strong>€291.20</strong></td>
</tr>
<tr>
<td>Odoo 30% of that gross</td>
<td><strong>€124.80</strong></td>
</tr>
</tbody></table>
<p>So you can clear the <strong>close gate</strong> while your <strong>net</strong> is still well under €400. Do not tell partners “Odoo pays when I have earned €400 net.”</p>
<p>IAP: if you use IAP, commission is <strong>25%</strong> per FAQ — do <strong>not</strong> apply the 30% Apps formula to IAP lines without checking the dashboard (<strong>line-level IAP arithmetic in UI → Not verified</strong> beyond the stated %).</p>
<h2>4) Automatic vs manual redeem — honesty table</h2>
<table>
<thead>
<tr>
<th>Topic</th>
<th>Automatic</th>
<th>Manual</th>
</tr>
</thead>
<tbody><tr>
<td>Where to enable</td>
<td>Preferences dashboard (<a href="https://apps.odoo.com/apps/vendor-guidelines">Vendor Guidelines</a>)</td>
<td>Default path if auto off</td>
</tr>
<tr>
<td>Trigger</td>
<td>PO closed (≥ €400 unredeemed); FAQ: pay invoice in <strong>following days</strong></td>
<td>Email that Odoo awaits your invoice</td>
</tr>
<tr>
<td>Invoice duty</td>
<td>Still confirm local law allows receiving funds <strong>without</strong> your invoice</td>
<td>You <strong>must</strong> invoice with redeem/PO reference; amounts must match</td>
</tr>
<tr>
<td>Open PO</td>
<td>Never redeem</td>
<td>Never invoice Open POs — wait for close + notify</td>
</tr>
<tr>
<td>Fail claim</td>
<td>“Auto means instant cash same day”</td>
<td>“I can invoice whenever Sales shows a number”</td>
</tr>
</tbody></table>
<p><strong>Sanctions / commission hold:</strong> Vendor Guidelines — if apps are under temporary or long-term sanctions, <strong>no commissions</strong> are paid. Recurrent guideline breaches can unpublish apps and suppress the account. Payout honesty includes “my apps are in good standing.”</p>
<h2>5) SWIFT self-check (what public docs allow)</h2>
<table>
<thead>
<tr>
<th>Check</th>
<th>Pass if you say…</th>
<th>Fail if you say…</th>
<th>Source gap</th>
</tr>
</thead>
<tbody><tr>
<td>Method</td>
<td>“Odoo pays vendors by <strong>international SWIFT</strong>”</td>
<td>“PayPal / Wise / SEPA instant” as Odoo’s documented vendor rail</td>
<td>Public pages only name SWIFT</td>
</tr>
<tr>
<td>Timing</td>
<td>“<strong>Days or weeks</strong>; slower if outside Europe”</td>
<td>“T+2 guaranteed” / “always within 5 business days”</td>
<td>No numeric SLA</td>
</tr>
<tr>
<td>Geography</td>
<td>“Outside Europe often slower”</td>
<td>Country-by-country fee table</td>
<td>No country matrix</td>
</tr>
<tr>
<td>Who pays bank fees</td>
<td>—</td>
<td>Invent OUR/BEN/SHA</td>
<td><strong>Not verified</strong> (unlike Apify docs, Odoo FAQ is silent on SHA/OUR)</td>
</tr>
<tr>
<td>Bank fields</td>
<td>“I will use whatever IBAN/BIC Odoo’s payout form requests”</td>
<td>Publish a guessed mandatory field list</td>
<td>Field list <strong>Not verified</strong> on FAQ/Guidelines</td>
</tr>
<tr>
<td>Currency posted</td>
<td>“Expect FX noise vs list currency”</td>
<td>“Always EUR to my account at list rate”</td>
<td>Guidelines: end-user currency → deviations</td>
</tr>
</tbody></table>
<p><strong>Seller action when docs are thin:</strong> treat the checklist in §7 as questions for Odoo support / your accountant — do not fill gaps with forum folklore.</p>
<h2>6) What buyers / partners should hear (and not)</h2>
<p>Safe (aligned with official pages):</p>
<ul>
<li>Store price is subject to <strong>30%</strong> platform commission on Apps sales.</li>
<li>Vendor payout waits on <strong>PO close</strong> at <strong>≥ €400</strong> unredeemed sales, then SWIFT.</li>
<li>Support obligations for <strong>paid</strong> apps remain yours (Guidelines) — payout lag is not an excuse to ignore bugs.</li>
</ul>
<p>Unsafe:</p>
<ul>
<li>“Odoo wires me on the 1st of every month like a salary.”</li>
<li>“Minimum payout is €400 <strong>to me</strong>” (threshold is unredeemed <strong>sales</strong>, not net).</li>
<li>“SWIFT always clears in three days inside the EU” (docs only say days/weeks; EU not singled out as a fast SLA — only “outside Europe” as slower).</li>
<li>Quoting a <strong>Reddit</strong> thread as policy (a separate guide links demand chatter; bodies remain <strong>Not verified</strong> — do not promote them as payout rules).</li>
</ul>
<h2>7) Seller checklist — verify with Odoo / counsel (public docs stop here)</h2>
<p>Mark each row after you confirm live; until then keep the <strong>Not verified</strong> label in your own runbook:</p>
<ol>
<li>Exact <strong>bank detail fields</strong> required on the Apps payout / Preferences form (IBAN, BIC, account holder match rules).</li>
<li><strong>Payout currency</strong> and who bears FX when the PO closed in mixed end-user currencies.</li>
<li>Whether <strong>intermediary SWIFT fees</strong> are deducted from the vendor amount (OUR/SHA/BEN).</li>
<li>Whether auto-redeem is <strong>lawful</strong> in your country without issuing invoices (Guidelines explicitly push this to a lawyer).</li>
<li>How <strong>IAP 25%</strong> lines appear on the same PO vs Apps 30% lines.</li>
<li>Interaction between <strong>commission suspension</strong> (sanctions) and already-closed POs.</li>
<li>Tax docs Odoo issues (or does not issue) for your jurisdiction — <strong>not</strong> described on FAQ/Guidelines archive.</li>
</ol>
<h2>8) What this article deliberately skips</h2>
<ul>
<li>Manifest <code>price</code> / <code>currency</code> / min <strong>9 EUR</strong>, screenshots, scoring, GitHub <code>online-odoo</code> register → a separate guide.</li>
<li>Porting modules across Odoo series → a separate guide.</li>
<li>Creating or submitting an Apps listing, registering an account, or sending a real invoice → out of scope (not published; not executed).</li>
</ul>
<h2>9) Not verified</h2>
<ol>
<li>Live Sales dashboard PO field names and timezone of “during each month” close jobs.</li>
<li>IBAN/BIC / intermediary fee policy.</li>
<li>Payout currency and bank-side FX.</li>
<li>Exact “following days” count after auto-redeem.</li>
<li>IAP line presentation vs Apps lines on one PO.</li>
<li>Any non-SWIFT vendor payout option (not mentioned on archived FAQ/Guidelines/Submit).</li>
</ol>
<h2>Sources (archived)</h2>
<ul>
<li><a href="https://apps.odoo.com/apps/faq">https://apps.odoo.com/apps/faq</a>  </li>
<li><a href="https://apps.odoo.com/apps/vendor-guidelines">https://apps.odoo.com/apps/vendor-guidelines</a>  </li>
<li><a href="https://apps.odoo.com/apps/upload">https://apps.odoo.com/apps/upload</a></li>
</ul>
<p>Evidence: the archived sources (<code>sources.md</code>, <code>run.log</code>, html/txt).</p>
]]></content:encoded></item><item><title><![CDATA[Apify Actor monetization honesty: rental, PPE, and pricing claims that survive a README audit]]></title><description><![CDATA[Not legal, tax, or investment advice. Mechanics below come from docs.apify.com monetization / Store / payout pages and Store Publishing Terms archived with this draft (2026-10-15 Asia/Shanghai). Conso]]></description><link>https://kendeepp.hashnode.dev/apify-actor-monetization-honesty</link><guid isPermaLink="true">https://kendeepp.hashnode.dev/apify-actor-monetization-honesty</guid><category><![CDATA[apify]]></category><category><![CDATA[web scraping]]></category><category><![CDATA[Monetization]]></category><category><![CDATA[indie hackers]]></category><category><![CDATA[SaaS]]></category><dc:creator><![CDATA[Kendeepp]]></dc:creator><pubDate>Thu, 15 Oct 2026 08:30:44 GMT</pubDate><enclosure url="https://cdn.hashnode.com/uploads/covers/6acf927e98adb389088cf685/3bcd6023-9264-45e2-a9a1-5c0c7f0e5ce8.png" length="0" type="image/jpeg"/><content:encoded><![CDATA[<p><em>Not legal, tax, or investment advice. Mechanics below come from docs.apify.com monetization / Store / payout pages and Store Publishing Terms archived with this draft (2026-10-15 Asia/Shanghai). Console UI and fees evolve — re-open the linked pages before you change prices. This article does not link or endorse any of our products or any specific Actor.</em></p>
<p>This article is not a Store publishing checklist. Here the only job is: what you can <strong>honestly claim</strong> about how users pay you, how Apify splits revenue, what “rental” still means in 2026, and when money actually leaves Apify.</p>
<h2>1) Lead answer</h2>
<ol>
<li><strong>Current publishable models</strong> on the Monetize index (<a href="https://docs.apify.com/actors/publishing/monetize">Monetize Actors</a>): <strong>Pay per event (PPE)</strong> and <strong>Pay per usage</strong>. Rental is documented for users still on it, but is <strong>being sunset</strong> (see #2).</li>
<li><strong>PPE creator profit</strong> (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>, <a href="https://docs.apify.com/actors/publishing/monetize/pricing-and-costs">pricing &amp; costs</a>, Terms §10.2.1):<br /><code>profit = (0.8 × revenue) − platform costs</code><br />You keep <strong>80%</strong> of event fees charged to users; Apify keeps <strong>20%</strong>; then <strong>platform usage</strong> for those runs is subtracted from your side (unless you pass usage to users — with transparency / quality-score tradeoffs).</li>
<li><strong>Free-plan users do not fund your profit</strong> on PPE / rental: only <strong>paid-plan</strong> customers count toward revenue and cost in the formula (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>, <a href="https://docs.apify.com/actors/publishing/monetize/rental">rental</a>). Apify covers free users’ platform costs in that calc — you still owe them a <strong>transparent</strong> free-tier story in README / input schema (<a href="https://docs.apify.com/actors/publishing/monetize">Monetize</a>).</li>
<li><strong>“Pay per result” is not a separate docs page</strong> (URL 404 on archive day). Official path for per-result billing is PPE — especially the synthetic event <strong><code>apify-default-dataset-item</code></strong> (charges each <code>pushData</code> to the <strong>default</strong> dataset) (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>). Do not invent a third model name in marketing copy.</li>
<li><strong>Rental sunset (2026)</strong> (<a href="https://docs.apify.com/actors/publishing/monetize/rental">rental</a>, <a href="https://docs.apify.com/actors/running/actors-in-store">Actors in Store</a>): <strong>Apr 1</strong> — no new rental Actors / no rental price changes; <strong>Oct 1</strong> — rental fully retired; remaining Actors migrated to <strong>pay-per-usage</strong>. Rental profit was <code>0.8 × rental fees</code> (paid-plan renters only). Users still pay <strong>platform usage on top</strong> of the monthly rent — docs call that out as a common confusion source.</li>
<li><strong>Payout rails</strong> (<a href="https://docs.apify.com/actors/publishing/monetize/monthly-payouts">Manage payouts</a>): billing details + payment method + <strong>KYC</strong>; invoices issued <strong>day 11</strong> for prior month; review <strong>days 11–14</strong> (auto-approve <strong>14th</strong> if idle); payouts <strong>days 21–25</strong>. Minimums: <strong>$20</strong> PayPal/Wise, <strong>$100</strong> other methods; under-min rolls over. Wire is SWIFT from <strong>Czech Republic (CZ)</strong> with <strong>SHA</strong> shared fees; intermediary fees often <strong>$10–$50</strong> (<strong>not</strong> a promise — range from docs). UI profit figures are <strong>estimates</strong> (Terms §9.2).</li>
</ol>
<h2>2) Pricing models — honesty table (creator claims)</h2>
<table>
<thead>
<tr>
<th>Model</th>
<th>What users pay</th>
<th>What you can claim</th>
<th>Fail / overclaim</th>
</tr>
</thead>
<tbody><tr>
<td><strong>PPE</strong></td>
<td>Prices you define per event (+ optional platform usage if “PPE + usage” on)</td>
<td>“Users pay for named events; primary event is shown on the detail page”</td>
<td>“Flat unlimited runs for $X” when you charge per event; hiding that <strong>PPE + usage</strong> adds platform bills (<a href="https://docs.apify.com/actors/running/actors-in-store">Actors in Store</a>)</td>
</tr>
<tr>
<td><strong>Pay per usage</strong></td>
<td>Platform resources only; <strong>no</strong> developer surcharge (<a href="https://docs.apify.com/actors/running/actors-in-store">Actors in Store</a>)</td>
<td>“Free Actor / usage-only — you pay Apify compute &amp; proxies”</td>
<td>Calling it “monetized” as if you earn event fees</td>
</tr>
<tr>
<td><strong>Rental</strong> (sunset)</td>
<td>Trial → monthly rent <strong>plus</strong> platform usage; after trial needs Apify <strong>paid plan</strong> (<a href="https://docs.apify.com/actors/running/actors-in-store">Actors in Store</a>)</td>
<td>Historical: “$Y/month after N-day trial”; warn usage is <strong>extra</strong></td>
<td>New rental launches after <strong>2026-04-01</strong>; “all-in monthly price” that ignores CU/proxy; promising rental after <strong>2026-10-01</strong> retirement</td>
</tr>
</tbody></table>
<p><strong>Per-result honesty:</strong> Say you charge <strong>per default-dataset item</strong> (or your custom event), not “Apify pay-per-result product” as a separate Store category. Synthetic <strong><code>apify-default-dataset-item</code></strong> is default-on and auto-charges <code>pushData</code> to the default dataset only (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>).</p>
<h2>3) PPE profit — worked example (official numbers)</h2>
<p>Docs example (<a href="https://docs.apify.com/actors/publishing/monetize/pricing-and-costs">pricing &amp; costs</a>): two <strong>paid</strong> users generate <strong>$31</strong> event revenue and <strong>$4</strong> platform cost; free user ignored.</p>
<p>Python <code>Decimal</code> (archived in the archived sources):</p>
<table>
<thead>
<tr>
<th>Line</th>
<th>Amount</th>
</tr>
</thead>
<tbody><tr>
<td>Revenue (paid users)</td>
<td>$31.00</td>
</tr>
<tr>
<td>Your 80% share of revenue</td>
<td>$24.80</td>
</tr>
<tr>
<td>Platform costs (paid users)</td>
<td>$4.00</td>
</tr>
<tr>
<td><strong>Profit</strong></td>
<td><strong>$20.80</strong></td>
</tr>
</tbody></table>
<p>Same month, a third <strong>free-plan</strong> user might show activity in analytics — that slice is <strong>not</strong> in the profit formula.</p>
<p><strong>Negative profit isolation:</strong> if one Actor’s net is negative, Apify treats that Actor as <strong>$0</strong> for the month so it does <strong>not</strong> drag down other Actors’ positive profit (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>, <a href="https://docs.apify.com/actors/publishing/monetize/monthly-payouts">Manage payouts</a>).</p>
<p><strong>Pass usage to users:</strong> “Pay per event + usage” exists to avoid eating platform costs while you tune prices — docs warn it hurts <strong>pricing transparency</strong> and <strong>Actor quality score</strong>, and enabling the toggle takes <strong>14 days</strong> to take effect (turning it <strong>off</strong> is immediate) (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>). Standby runs: users <strong>always</strong> pay platform usage on top of events.</p>
<h2>4) Rental — what not to promise in 2026</h2>
<p>From <a href="https://docs.apify.com/actors/publishing/monetize/rental">rental</a> / <a href="https://docs.apify.com/actors/running/actors-in-store">Actors in Store</a>:</p>
<table>
<thead>
<tr>
<th>Claim</th>
<th>Pass if…</th>
<th>Fail if…</th>
</tr>
</thead>
<tbody><tr>
<td>Sunset calendar</td>
<td>You cite Apr 1 / Oct 1 <strong>2026</strong> milestones</td>
<td>You market “new rental Actor” after Apr 1</td>
</tr>
<tr>
<td>Profit share</td>
<td>“80% of rental fees from paid-plan renters”</td>
<td>“80% of everything the user spends on Apify”</td>
</tr>
<tr>
<td>Total user cost</td>
<td>README shows rent <strong>+</strong> expected platform usage</td>
<td>“\(30/mo all-in” when usage often adds more (docs cite confusion examples like \)20 rent → $35–50 total)</td>
</tr>
<tr>
<td>AI / MCP discovery</td>
<td>You know rental Actors are <strong>excluded</strong> from Apify MCP search results</td>
<td>You promise “same agent discoverability as PPE” for rental</td>
</tr>
<tr>
<td>Migration</td>
<td>You plan PPE (or usage-only) before Oct 1 retirement</td>
<td>You assume rental continues indefinitely</td>
</tr>
</tbody></table>
<p>Illustrative rental month from docs: one paid renter at <strong>$30</strong> → your profit <strong>$24</strong> (<code>0.8 × 30</code>). Free-plan trialist who never upgrades contributes <strong>$0</strong>.</p>
<h2>5) Listing / README honesty self-check</h2>
<table>
<thead>
<tr>
<th>Check</th>
<th>Pass if…</th>
<th>Fail if…</th>
</tr>
</thead>
<tbody><tr>
<td>Primary event</td>
<td>One event clearly represents main value; highlighted on detail page (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>)</td>
<td>Vague “usage-based” with no named events</td>
</tr>
<tr>
<td>Free users</td>
<td>Limits stated in README <strong>and</strong> input schema; graceful exit message (<a href="https://docs.apify.com/actors/publishing/monetize">Monetize</a>)</td>
<td>Free users hit a crash that looks like a platform bug</td>
</tr>
<tr>
<td>Spending limits</td>
<td>You respect <code>ACTOR_MAX_TOTAL_CHARGE_USD</code>; charge as work completes; stop when <code>eventChargeLimitReached</code> (<a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">PPE</a>)</td>
<td>Batch-charge at end so aborted runs bill for inaccessible data</td>
</tr>
<tr>
<td>Start event</td>
<td>Prefer synthetic <code>apify-actor-start</code> (default <strong>$0.00005</strong>; Apify covers first <strong>5s</strong> compute) — don’t also keep a custom start event</td>
<td>Manually charging <code>apify-actor-start</code> in code (docs: it <strong>fails</strong>)</td>
</tr>
<tr>
<td>Discount tiers</td>
<td>Higher tiers ≤ lower-tier prices; tiers follow <strong>platform-wide</strong> spend, not per-Actor (<a href="https://docs.apify.com/legal/store-publishing-terms-and-conditions">Terms §9.3</a>)</td>
<td>Advertising “GOLD price” as if every user gets it</td>
</tr>
<tr>
<td>UI estimates</td>
<td>You treat Console profit / payout previews as <strong>estimates</strong> (refunds, unpaid invoices) (<a href="https://docs.apify.com/legal/store-publishing-terms-and-conditions">Terms §9.2</a>)</td>
<td>Quoting a UI number as a guaranteed payout</td>
</tr>
<tr>
<td>Agentic / Skyfire eligibility</td>
<td>PPE, events-only (no PPE+usage), limited permissions, no Standby, KYC done (<a href="https://docs.apify.com/actors/publishing/monetize">Monetize</a>)</td>
<td>Claiming “all my Actors take agent pay” when rental/usage or full permissions block it</td>
</tr>
</tbody></table>
<h2>6) Payout timing &amp; minimums (creator side)</h2>
<p>From <a href="https://docs.apify.com/actors/publishing/monetize/monthly-payouts">Manage payouts</a> + Terms:</p>
<table>
<thead>
<tr>
<th>Topic</th>
<th>Official</th>
</tr>
</thead>
<tbody><tr>
<td>Eligibility</td>
<td>Billing details + payout method + <strong>KYC</strong>; incomplete KYC → earnings <strong>roll</strong> to next month; Terms also allow forfeit after <strong>12 months</strong> failed KYC</td>
</tr>
<tr>
<td>Invoice</td>
<td>Auto on <strong>11th</strong> for <strong>previous</strong> calendar month; only <strong>paid / legitimate</strong> user funds</td>
</tr>
<tr>
<td>Review window</td>
<td><strong>3 days</strong> (11–14); idle → auto-approve on <strong>14th</strong></td>
</tr>
<tr>
<td>Cash-out window</td>
<td>Roughly <strong>21–25</strong> of the month</td>
</tr>
<tr>
<td>Min threshold</td>
<td><strong>USD 20</strong> PayPal / Wise; <strong>USD 100</strong> other; under-min rolls; Terms: under-min for <strong>12 continuous months</strong> → abandoned / forfeited</td>
</tr>
<tr>
<td>Wire</td>
<td>From <strong>CZ</strong> via <strong>SWIFT</strong>, SHA shared costs; US <strong>ACH not</strong> available</td>
</tr>
<tr>
<td>Deductions</td>
<td>Possible if Apify credits a user for Actor malfunction — reviewable in the invoice window</td>
</tr>
</tbody></table>
<p>Do <strong>not</strong> promise “payday on the 1st” or “same-week wire everywhere.” Do not promise PayPal is fee-free — docs say PayPal may still charge as the intermediary.</p>
<h2>7) What this article deliberately skips</h2>
<ul>
<li>Store <strong>publish</strong> sections, README structure, automated tests, quality score deep dive → a separate guide.</li>
<li>Step-by-step Console screenshots / submitting an Actor → not here; not published.</li>
<li>Partner Creator special commission contracts → Terms mention them; details <strong>Not verified</strong> beyond “adjusted structure.”</li>
<li>Exact intermediary bank fee for your country beyond the documented <strong>$10–$50</strong> typical range.</li>
</ul>
<h2>8) Not verified</h2>
<ol>
<li>Whether any Console UI still offers a labeled “Pay per result” radio separate from PPE on archive day (standalone docs URL <strong>404</strong>; PPE synthetic covers the use case).</li>
<li>Partner Creator % schedules (contract-only).</li>
<li>Exact calendar day your bank posts a SHA SWIFT (docs: “few additional business days”).</li>
<li>Live quality-score weight of “PPE + usage” beyond the qualitative warning.</li>
</ol>
<h2>Sources (archived)</h2>
<ul>
<li><a href="https://docs.apify.com/actors/publishing/monetize">https://docs.apify.com/actors/publishing/monetize</a>  </li>
<li><a href="https://docs.apify.com/actors/publishing/monetize/pay-per-event">https://docs.apify.com/actors/publishing/monetize/pay-per-event</a>  </li>
<li><a href="https://docs.apify.com/actors/publishing/monetize/rental">https://docs.apify.com/actors/publishing/monetize/rental</a>  </li>
<li><a href="https://docs.apify.com/actors/publishing/monetize/pricing-and-costs">https://docs.apify.com/actors/publishing/monetize/pricing-and-costs</a>  </li>
<li><a href="https://docs.apify.com/actors/publishing/monetize/monthly-payouts">https://docs.apify.com/actors/publishing/monetize/monthly-payouts</a>  </li>
<li><a href="https://docs.apify.com/actors/running/actors-in-store">https://docs.apify.com/actors/running/actors-in-store</a>  </li>
<li><a href="https://docs.apify.com/legal/store-publishing-terms-and-conditions">https://docs.apify.com/legal/store-publishing-terms-and-conditions</a></li>
</ul>
<p>Evidence: the archived sources (<code>sources.md</code>, <code>run.log</code>, html/txt).</p>
]]></content:encoded></item></channel></rss>