{"id":55,"date":"2026-10-30T09:00:00","date_gmt":"2026-10-30T09:00:00","guid":{"rendered":"https:\/\/roasit.com\/blog\/?p=55"},"modified":"2026-10-28T09:03:28","modified_gmt":"2026-10-28T09:03:28","slug":"subscription-net-revenue","status":"publish","type":"post","link":"https:\/\/roasit.com\/blog\/subscription-net-revenue\/","title":{"rendered":"How to Calculate Subscription Net Revenue: A Worked Example"},"content":{"rendered":"<p>Subscription net revenue is the money a subscription cohort keeps after store deductions and refunds. It is the revenue figure that belongs in a cohort ROAS table, not the price shown to customers. This worked example turns store reports into a D30 revenue figure for a sample mobile app.<\/p>\n<p>A customer charge and developer proceeds are different measures. Apple defines proceeds as the customer price less applicable taxes and Apple&#8217;s commission. Google Play&#8217;s earnings report separates charges, Google fees, refunds, and fee refunds. That distinction matters when paid acquisition is judged against cash that actually reaches the developer.<\/p>\n<nav>\n<ul>\n<li><a href=\"#start-with-one-definition\">Start with one definition<\/a><\/li>\n<li><a href=\"#build-the-sample-cohort\">Build the sample cohort<\/a><\/li>\n<li><a href=\"#calculate-subscription-net-revenue\">Calculate subscription net revenue<\/a><\/li>\n<li><a href=\"#put-the-result-in-cohort-roas\">Put the result in cohort ROAS<\/a><\/li>\n<li><a href=\"#keep-the-cohort-clean\">Keep the cohort clean<\/a><\/li>\n<\/ul>\n<\/nav>\n<h2 id=\"start-with-one-definition\">Subscription net revenue starts with reported proceeds<\/h2>\n<p>For acquisition reporting, define subscription net revenue as proceeds attributable to a cohort during a chosen window. The window might be D7, D30, or D90. Pick one window and keep it fixed when comparing campaigns.<\/p>\n<p>Do not begin with a published list price and subtract a guessed percentage. Store economics vary by territory, program, subscription age, tax treatment, and refund timing. Apple says auto-renewable subscription proceeds can be 70% of the subscription price less applicable taxes during a subscriber&#8217;s first year, with 85% after one year of paid service. The <a href=\"https:\/\/developer.apple.com\/app-store\/subscriptions\/\" target=\"_blank\" rel=\"noopener\">Apple subscription proceeds guidance<\/a> explains the conditions. A cohort report should use the proceeds figure the financial data gives the team.<\/p>\n<p>Google Play provides a practical reconciliation route. Its <a href=\"https:\/\/support.google.com\/googleplay\/android-developer\/answer\/2482017?hl=en\" target=\"_blank\" rel=\"noopener\">earnings report guidance<\/a> says to sum Charge and Charge refund rows for transaction value, then sum Google fee and Google fee refund rows to calculate the aggregate fee percentage. That makes a D30 snapshot repeatable instead of estimated.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" width=\"2528\" height=\"1696\" class=\"wp-image-52\" src=\"https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-flow.jpeg\" alt=\"Subscription net revenue flow from phone purchases through store deductions to an earnings report\" srcset=\"https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-flow.jpeg 2528w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-flow-300x201.jpeg 300w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-flow-1024x687.jpeg 1024w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-flow-768x515.jpeg 768w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-flow-1536x1030.jpeg 1536w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-flow-2048x1374.jpeg 2048w\" sizes=\"auto, (max-width: 2528px) 100vw, 2528px\" \/><figcaption>A sample flow from customer charges to a cohort&#8217;s reported proceeds.<\/figcaption><\/figure>\n<h2 id=\"build-the-sample-cohort\">Build the sample cohort before adding revenue<\/h2>\n<p>This sample is made for the article. It follows a meditation app called Harbor Minutes that acquired users from paid campaigns during one calendar week. The team evaluates the cohort at D30. Revenue earned after D30 belongs to a later checkpoint, even if the customer installed during the week.<\/p>\n<p>There are two rules. First, the acquisition cost and subscription proceeds must use the same install cohort. Second, both stores need the same cutoff. If iOS data closes through D30 but Google Play data includes D33 refunds, subscription net revenue becomes hard to compare. Use transaction dates and a documented export time.<\/p>\n<div class=\"rb-table-scroll\"><table>\n<thead>\n<tr>\n<th>Input<\/th>\n<th class=\"num\">Sample value<\/th>\n<th>How it is used<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Paid installs<\/td>\n<td class=\"num\">2,750<\/td>\n<td>One acquired cohort<\/td>\n<\/tr>\n<tr>\n<td>Paid media cost<\/td>\n<td class=\"num\">$11,000<\/td>\n<td>Denominator for cohort ROAS<\/td>\n<\/tr>\n<tr>\n<td>iOS proceeds through D30<\/td>\n<td class=\"num\">$7,350<\/td>\n<td>Reported proceeds for the cohort<\/td>\n<\/tr>\n<tr>\n<td>Google Play charges through D30<\/td>\n<td class=\"num\">$8,000<\/td>\n<td>Starting point for the Play calculation<\/td>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n<p>The cohort has both monthly renewals and first paid conversions. That is normal. The report should include each transaction that occurred by D30, then apply the store&#8217;s matching refunds and deductions. It should not add forecast renewals. Forecasts can support an LTV model, but they are not D30 subscription net revenue.<\/p>\n<figure><img loading=\"lazy\" decoding=\"async\" width=\"2528\" height=\"1696\" class=\"wp-image-53\" src=\"https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-cohorts.jpeg\" alt=\"Subscription net revenue sample cohort grid with refunds shown as returning coins\" srcset=\"https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-cohorts.jpeg 2528w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-cohorts-300x201.jpeg 300w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-cohorts-1024x687.jpeg 1024w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-cohorts-768x515.jpeg 768w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-cohorts-1536x1030.jpeg 1536w, https:\/\/roasit.com\/blog\/wp-content\/uploads\/2026\/10\/subscription-net-revenue-cohorts-2048x1374.jpeg 2048w\" sizes=\"auto, (max-width: 2528px) 100vw, 2528px\" \/><figcaption>A sample cohort grid with charges and returned payments kept in the same reporting window.<\/figcaption><\/figure>\n<h2 id=\"calculate-subscription-net-revenue\">Calculate subscription net revenue from each store<\/h2>\n<p>Apple&#8217;s sample proceeds are already supplied by the financial reporting flow, so no assumed commission rate is needed. Record the reported amount as $7,350. Keep sales and proceeds in separate fields because Apple states that sales totals are not the same as proceeds.<\/p>\n<p>For Google Play, the report has $8,000 in Charge rows. Google fees total $1,200. The cohort also has $480 in Charge refund rows. Those refunds return $72 of previously collected Google fees. Google Play says a partial refund applies proportionally to payout and service fee, which is why the fee refund belongs in the calculation.<\/p>\n<div class=\"rb-table-scroll\"><table>\n<thead>\n<tr>\n<th>Google Play D30 calculation<\/th>\n<th class=\"num\">USD<\/th>\n<\/tr>\n<\/thead>\n<tbody>\n<tr>\n<td>Charge rows<\/td>\n<td class=\"num\">$8,000<\/td>\n<\/tr>\n<tr>\n<td>Less Google fee rows<\/td>\n<td class=\"num\">-$1,200<\/td>\n<\/tr>\n<tr>\n<td>Less Charge refund rows<\/td>\n<td class=\"num\">-$480<\/td>\n<\/tr>\n<tr>\n<td>Add Google fee refund rows<\/td>\n<td class=\"num\">$72<\/td>\n<\/tr>\n<tr>\n<th>Google Play proceeds<\/th>\n<th class=\"num\">$6,392<\/th>\n<\/tr>\n<\/tbody>\n<\/table><\/div>\n<p>The formula is simple:<\/p>\n<p><strong>Google Play proceeds equal charges, less Google fees and charge refunds, plus Google fee refunds.<\/strong><\/p>\n<p>So the sample&#8217;s subscription net revenue equals Apple proceeds plus Google Play proceeds. $7,350 + $6,392 = $13,742. That number is not profit. It excludes payroll, hosting, creative production, and other operating costs. It is the cohort&#8217;s store-adjusted subscription proceeds.<\/p>\n<h2 id=\"put-the-result-in-cohort-roas\">Put subscription net revenue into cohort ROAS<\/h2>\n<p>The sample has $11,000 in paid media cost. D30 cohort ROAS is subscription net revenue divided by paid media cost:<\/p>\n<p><strong>D30 cohort ROAS = $13,742 \/ $11,000 = 124.9%<\/strong><\/p>\n<p>That result says the cohort produced $1.25 in reported subscription proceeds for every $1.00 spent on acquisition by D30. A gross-sales calculation would report a higher result because it would start from the $18,000 in customer charges before Google fees, refunds, Apple commission, and applicable tax treatment.<\/p>\n<p>Place this value beside the install count, spend, D30 proceeds, and refund total. The same table can also show <a href=\"https:\/\/roasit.com\/blog\/cohort-roas-example\/\">how to calculate cohort ROAS<\/a> for campaigns with different acquisition costs. If the business reports payback, compare the same proceeds definition against media spend every time. Changing from gross sales to subscription net revenue halfway through a dashboard creates a false improvement or decline.<\/p>\n<h2 id=\"keep-the-cohort-clean\">Keep the cohort clean when refunds arrive<\/h2>\n<p>Refunds are the most common reason a revenue table drifts. Apple notes that refunds subtract from subscription units in Sales and Trends. Google Play&#8217;s daily estimated sales files add recently charged and refunded transactions, and it can take several days for transactions to appear. A D30 report should therefore have a refresh policy.<\/p>\n<ul>\n<li>Freeze the first D30 view on the same day each week.<\/li>\n<li>Refresh mature cohorts after the store files settle, then label the revision date.<\/li>\n<li>Keep refunds attached to the original install cohort when the transaction data allows it.<\/li>\n<li>Do not treat a canceled subscription as a refund. Google Play states that cancellation stops future charges while the user keeps access through the current billing period.<\/li>\n<\/ul>\n<p>Use the <a href=\"https:\/\/roasit.com\/blog\/net-app-revenue-roas\/\">net app revenue ROAS comparison<\/a> when deciding which deductions belong in the reporting definition. Then keep the field names visible in the table. A campaign manager should be able to see whether a number means billed sales, store proceeds, or subscription net revenue without opening a separate finance sheet.<\/p>\n<p>For Harbor Minutes, the next useful step is to repeat this calculation at D7, D30, and D90 for the same install cohort. The curve will show when acquisition spend pays back, while each checkpoint stays grounded in store-reported proceeds. The <a href=\"https:\/\/roasit.com\/blog\/category\/app-revenue\/\">App Revenue category<\/a> has related reporting guides.<\/p>\n","protected":false},"excerpt":{"rendered":"<p>Learn how to calculate subscription net revenue from store proceeds, fees, and refunds, then use it in a D30 cohort ROAS calculation.<\/p>\n","protected":false},"author":2,"featured_media":54,"comment_status":"closed","ping_status":"closed","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[6],"tags":[18,20,11,16,19],"class_list":["post-55","post","type-post","status-publish","format-standard","has-post-thumbnail","hentry","category-app-revenue","tag-app-revenue","tag-app-store","tag-google-play","tag-ios","tag-subscriptions"],"_links":{"self":[{"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/posts\/55","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/users\/2"}],"replies":[{"embeddable":true,"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/comments?post=55"}],"version-history":[{"count":1,"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/posts\/55\/revisions"}],"predecessor-version":[{"id":56,"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/posts\/55\/revisions\/56"}],"wp:featuredmedia":[{"embeddable":true,"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/media\/54"}],"wp:attachment":[{"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/media?parent=55"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/categories?post=55"},{"taxonomy":"post_tag","embeddable":true,"href":"https:\/\/roasit.com\/blog\/wp-json\/wp\/v2\/tags?post=55"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}