<?xml version="1.0" encoding="UTF-8"?><rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Self-Publishing Archives - Be on the Right Side of Change</title>
	<atom:link href="https://blog.finxter.com/tag/self-publishing/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.finxter.com/tag/self-publishing/</link>
	<description></description>
	<lastBuildDate>Fri, 09 Oct 2026 11:47:36 +0000</lastBuildDate>
	<language>en-US</language>
	<sy:updatePeriod>
	hourly	</sy:updatePeriod>
	<sy:updateFrequency>
	1	</sy:updateFrequency>
	<generator>https://wordpress.org/?v=7.1.3</generator>

<image>
	<url>https://blog.finxter.com/wp-content/uploads/2020/08/cropped-cropped-finxter_nobackground-32x32.png</url>
	<title>Self-Publishing Archives - Be on the Right Side of Change</title>
	<link>https://blog.finxter.com/tag/self-publishing/</link>
	<width>32</width>
	<height>32</height>
</image> 
	<item>
		<title>Build a KDP Royalty Calculator in Python: One Cent Past $12.99 Costs You 49%</title>
		<link>https://blog.finxter.com/kdp-royalty-calculator-python/</link>
		
		<dc:creator><![CDATA[Michael]]></dc:creator>
		<pubDate>Fri, 09 Oct 2026 11:47:36 +0000</pubDate>
				<category><![CDATA[Books]]></category>
		<category><![CDATA[AI Writing]]></category>
		<category><![CDATA[Amazon KDP]]></category>
		<category><![CDATA[Passive Income]]></category>
		<category><![CDATA[Python Projects]]></category>
		<category><![CDATA[Self-Publishing]]></category>
		<guid isPermaLink="false">https://blog.finxter.com/kdp-royalty-calculator-python/</guid>

					<description><![CDATA[<p>KDP's royalty rules fit in about 30 lines of Python. Run them and three pricing cliffs appear: $12.99 vs $13.00 on ebooks, $9.98 vs $9.99 on paperbacks, and file size at $2.99.</p>
<p>The post <a href="https://blog.finxter.com/kdp-royalty-calculator-python/">Build a KDP Royalty Calculator in Python: One Cent Past $12.99 Costs You 49%</a> appeared first on <a href="https://blog.finxter.com">Be on the Right Side of Change</a>.</p>
]]></description>
										<content:encoded><![CDATA[<p>A Kindle ebook priced at $12.99 pays you $8.99 per sale. The same book at $13.00 pays $4.55.</p>
<p>One cent more for the reader. 49% less for you.</p>
<p>That is not a bug. It is how Amazon&#8217;s royalty rules work, and they are simple enough to code. Since a lot of people reading this blog write Python and are thinking about self-publishing (or already do it), I turned the rules into a small calculator. Every rate in it comes from KDP&#8217;s own help pages, linked below.</p>
<p>Here is what the code found.</p>
<h2>The rules, straight from KDP</h2>
<p>KDP pays ebooks under one of two options. The <a href="https://kdp.amazon.com/en_US/help/topic/G200644210" target="_blank" rel="noopener">eBook Royalties page</a> gives both formulas:</p>
<ul>
<li><strong>35% option:</strong> 35% × list price (minus VAT where it applies).</li>
<li><strong>70% option:</strong> 70% × (list price minus VAT minus delivery costs).</li>
</ul>
<p>Three details decide the math:</p>
<ul>
<li><strong>The 70% band is $2.99 to $12.99 on Amazon.com.</strong> This changed on July 7, 2026. The old ceiling was $9.99 and had been in place since 2007, according to KDP&#8217;s <a href="https://kdp.amazon.com/en_US/help/topic/G200634560" target="_blank" rel="noopener">eBook List Price Requirements</a> FAQ. Outside the band, you get 35%.</li>
<li><strong>Delivery costs are $0.15 per MB on Amazon.com.</strong> They only apply to the 70% option, are rounded to two decimals and are at least $0.01 (<a href="https://kdp.amazon.com/en_US/help/topic/G200634500" target="_blank" rel="noopener">Digital Book Pricing Page</a>).</li>
<li><strong>The ebook must be at least 20% cheaper than any physical edition</strong> to stay on the 70% option (same pricing page, section 4).</li>
</ul>
<p>Paperbacks have their own rules on the <a href="https://kdp.amazon.com/en_US/help/topic/G201834330" target="_blank" rel="noopener">Paperback Royalty page</a>: 60% of list price at $9.99 or more on Amazon.com, 50% at $9.98 or less, minus printing costs. <a href="https://kdp.amazon.com/en_US/help/topic/G201834340" target="_blank" rel="noopener">Printing costs</a> for a black-ink book with more than 110 pages are $1.00 plus $0.012 per page at regular trim sizes, or $1.00 plus $0.017 per page at large trim sizes. Large means wider than 6.12 inches or taller than 9 inches.</p>
<h2>The calculator</h2>
<p>Here it is. No dependencies, Amazon.com only, US dollars.</p>
<pre class="wp-block-code"><code class="language-python"># kdp_royalty.py - Amazon.com (USD) rules from KDP's help pages, October 2026
BAND_70 = (2.99, 12.99)   # 70% ebook band since July 7, 2026
DELIVERY_PER_MB = 0.15    # charged on the 70% option only


def ebook_royalty(price, mb, option=&quot;best&quot;):
    &quot;&quot;&quot;Royalty per US ebook sale at list price (no VAT, no price-match).&quot;&quot;&quot;
    delivery = max(0.01, round(mb * DELIVERY_PER_MB, 2))
    r70 = round(0.70 * (price - delivery), 2)
    r35 = round(0.35 * price, 2)
    if option == &quot;35&quot; or not BAND_70[0] &lt;= price &lt;= BAND_70[1]:
        return r35
    return r70 if option == &quot;70&quot; else max(r35, r70)


def print_cost(pages, large_trim=False):
    &quot;&quot;&quot;Black ink on white or cream paper, sold on Amazon.com.&quot;&quot;&quot;
    if pages &lt;= 110:
        return 2.84 if large_trim else 2.30
    return round(1.00 + pages * (0.017 if large_trim else 0.012), 2)


def paperback_royalty(price, pages, large_trim=False):
    rate = 0.60 if price &gt;= 9.99 else 0.50
    return round(rate * price - print_cost(pages, large_trim), 2)


def max_ebook_price_for_70(physical_list_price):
    &quot;&quot;&quot;70% option: ebook must be at least 20% below the physical edition.&quot;&quot;&quot;
    return min(BAND_70[1], int(physical_list_price * 0.80 * 100) / 100)


if __name__ == &quot;__main__&quot;:
    print(&quot;Ebook, 1 MB file&quot;)
    for price in (2.99, 4.99, 9.99, 12.99, 13.00, 14.99, 19.99):
        print(f&quot;  ${price:&gt;5.2f} -&gt; ${ebook_royalty(price, 1):.2f}&quot;)

    print(&quot;Paperback, 300 pages, regular trim&quot;)
    for price in (9.20, 9.98, 9.99, 12.99, 14.99):
        print(f&quot;  ${price:&gt;5.2f} -&gt; ${paperback_royalty(price, 300):.2f}&quot;)
</code></pre>
<p>Run it with <code>python kdp_royalty.py</code>:</p>
<pre class="wp-block-code"><code class="language-text">Ebook, 1 MB file
  $ 2.99 -&gt; $1.99
  $ 4.99 -&gt; $3.39
  $ 9.99 -&gt; $6.89
  $12.99 -&gt; $8.99
  $13.00 -&gt; $4.55
  $14.99 -&gt; $5.25
  $19.99 -&gt; $7.00
Paperback, 300 pages, regular trim
  $ 9.20 -&gt; $0.00
  $ 9.98 -&gt; $0.39
  $ 9.99 -&gt; $1.39
  $12.99 -&gt; $3.19
  $14.99 -&gt; $4.39
</code></pre>
<p>Two of the three cliffs are already in that output.</p>
<h2>Cliff 1: one cent past $12.99</h2>
<p>At $12.99 with a 1 MB file, the 70% option pays 0.70 × ($12.99 − $0.15) = <strong>$8.99</strong>.</p>
<p>At $13.00 you leave the band, so you get 35%: 0.35 × $13.00 = <strong>$4.55</strong>. That is 49% less per sale.</p>
<p>How high do you have to go on the 35% option to earn $8.99 again? A five-line loop answers it:</p>
<pre class="wp-block-code"><code class="language-python">price = 13.00
while ebook_royalty(price, 1) &lt; ebook_royalty(12.99, 1):
    price = round(price + 0.01, 2)
print(price)  # 25.68
</code></pre>
<p><strong>$25.68.</strong> So between $13.00 and $25.67, every price pays less than $12.99 does, and the reader pays more for it. If you price above the band, you need a reason that is worth nearly double the list price.</p>
<p>The change also works in your favor if you have older books priced between $10.00 and $12.99 on the 35% option. KDP&#8217;s FAQ says an ebook priced from $2.99 to $12.99 that meets the other requirements can switch to 70%. Nothing switches automatically, though: your current price and royalty option stay the same until you change them. At $11.99 with a 1 MB file, that switch takes you from $4.20 to $8.29 per sale.</p>
<h2>Cliff 2: one cent below $9.99 on a paperback</h2>
<p>The paperback cliff runs the other way. A 300-page, regular-trim, black-ink paperback costs $1.00 + 300 × $0.012 = <strong>$4.60</strong> to print. That matches KDP&#8217;s own worked example.</p>
<ul>
<li>At <strong>$9.98</strong> the rate is 50%: 0.50 × $9.98 − $4.60 = <strong>$0.39</strong>.</li>
<li>At <strong>$9.99</strong> the rate is 60%: 0.60 × $9.99 − $4.60 = <strong>$1.39</strong>.</li>
</ul>
<p>One cent more on the price, $1.00 more per copy for you. That is about 3.6 times the royalty.</p>
<p>The first line of the output shows the floor too. KDP sets the minimum list price at printing cost divided by the royalty rate, as explained on the printing cost page. In the 50% band that is $4.60 / 0.50 = <strong>$9.20</strong>, where your royalty is exactly $0.00. So for this book, every price from $9.20 to $9.98 pays less than $0.40 a copy.</p>
<h3>Trim size is a hidden price change</h3>
<p>Flip one argument and the same 300-page book moves to a large trim size, for example 6.14 x 9.21 inches, which is just over the 6.12-inch width limit:</p>
<pre class="wp-block-code"><code class="language-python">print_cost(300, large_trim=True)          # 6.1
paperback_royalty(14.99, 300)             # 4.39
paperback_royalty(14.99, 300, True)       # 2.89
</code></pre>
<p>Same price, same page count: <strong>$2.89 instead of $4.39</strong>, about 34% less per copy. Readers will barely notice the size difference. Your royalty report will.</p>
<h2>Cliff 3: file size at $2.99</h2>
<p>Delivery costs barely matter at 1 MB. They matter a lot at the bottom of the band:</p>
<pre class="wp-block-code"><code class="language-python">for mb in (1, 5, 10):
    print(mb, ebook_royalty(2.99, mb, &quot;70&quot;), ebook_royalty(2.99, mb, &quot;35&quot;))
# 1 1.99 1.05
# 5 1.57 1.05
# 10 1.04 1.05
</code></pre>
<p>At 10 MB, a $2.99 ebook pays <strong>$1.04 on the 70% option and $1.05 on 35%</strong>. The &#8220;70%&#8221; option is now worth less than the 35% one. Image-heavy books (cookbooks, comics, illustrated guides) hit this first. Compress your images before you upload, or price higher.</p>
<h2>Bonus rule: the 20% gap to your paperback</h2>
<p>The 20% rule links your two formats. If your paperback is $14.99, the highest 70%-eligible ebook price is:</p>
<pre class="wp-block-code"><code class="language-python">max_ebook_price_for_70(14.99)   # 11.99
max_ebook_price_for_70(16.24)   # 12.99
</code></pre>
<p>So the new $12.99 ceiling only works for you if your paperback (or hardcover) lists at <strong>$16.24 or more</strong>. Otherwise you are capped lower, whatever the band says.</p>
<h2>What the calculator leaves out</h2>
<p>This is a planning tool, not your royalty statement. It does not handle:</p>
<ul>
<li><strong>VAT.</strong> Royalties are calculated on the price without VAT, so EU and UK sales pay less than the same list price in the US.</li>
<li><strong>35% territories.</strong> The 70% option only applies to buyers in the countries listed on the <a href="https://kdp.amazon.com/en_US/help/topic/G200634500" target="_blank" rel="noopener">pricing page</a>. Sales to buyers elsewhere pay 35%, even on Amazon.com.</li>
<li><strong>Price matching.</strong> If Amazon matches a lower price elsewhere, you earn on the matched price.</li>
<li><strong>Kindle Unlimited page reads, Expanded Distribution (40% minus printing) and other marketplaces.</strong> Each has its own numbers.</li>
</ul>
<p>Each of those is a good next function if you want to extend it. A <code>marketplace</code> argument with a dictionary of rates per store is the obvious first step, since KDP publishes all of them in tables.</p>
<h2>The bottleneck is not the math</h2>
<p>Once you run your own catalogue through this script, one thing stands out. The per-book numbers are small. A $4.99 ebook pays $3.39. A $14.99 paperback pays $4.39. Real money comes from many books selling a few copies each, not from one perfect price on one book.</p>
<p>Put a number on it. At $3.39 per sale, $1,000 a month takes about 295 ebook sales. At $4.39 per paperback, it takes about 228 copies. Spread over one book, that is roughly ten ebook sales a day, every day. Spread over fifteen books, it is less than one sale per book per day.</p>
<p>That means the slowest step is usually the next manuscript, not the pricing. If you want to test whether a book idea holds up before you put months into it, <a href="https://www.imagineyourbook.com/" target="_blank" rel="noopener">ImagineYourBook</a> writes your first 10,000-word book free before you enter a card, and exports Word and EPUB files you can edit. Treat a draft like that as raw material to revise, not as the finished book.</p>
<p>One rule to know if you go that route: KDP&#8217;s <a href="https://kdp.amazon.com/en_US/help/topic/G200672390" target="_blank" rel="noopener">content guidelines</a> require you to tell Amazon about AI-generated text, images or translations when you publish. This applies &#8220;even if you applied substantial edits afterwards.&#8221; Using AI only to edit, error-check or brainstorm your own writing counts as AI-assisted and does not need to be disclosed.</p>
<h2>Try it on your own books</h2>
<ol>
<li>Save the script as <code>kdp_royalty.py</code>.</li>
<li>Plug in your real list prices, page counts, trim sizes and file sizes.</li>
<li>Look for any book sitting between $13.00 and $25.67, between $9.20 and $9.98 in paperback, or on a large trim it doesn&#8217;t need.</li>
<li>Fix those first. It is the cheapest raise you will get this year.</li>
</ol>
<p><strong>$12.99 pays $8.99. $13.00 pays $4.55. Thirty lines of Python will tell you which side of that line your books are on.</strong></p>
<p>The post <a href="https://blog.finxter.com/kdp-royalty-calculator-python/">Build a KDP Royalty Calculator in Python: One Cent Past $12.99 Costs You 49%</a> appeared first on <a href="https://blog.finxter.com">Be on the Right Side of Change</a>.</p>
]]></content:encoded>
					
		
		
			</item>
	</channel>
</rss>

<!--
Performance optimized by W3 Total Cache. Learn more: https://www.boldgrid.com/w3-total-cache/?utm_source=w3tc&utm_medium=footer_comment&utm_campaign=free_plugin

Page Caching using Disk: Enhanced 
Minified using Disk

Served from: blog.finxter.com @ 2026-10-09 12:40:29 by W3 Total Cache
-->