{"schemaVersion":2,"referenceKind":"documentation-not-execution-api","aiHandoff":{"mode":"review-copy-open-paste","providers":["ChatGPT","Claude","Gemini"],"automaticSubmission":false,"accountConnection":false,"readerNotesDefault":false,"pageCodeDefault":false},"checkedOn":"2026-10-26","help":"https://plainreckoner.com/faq/#how-to-use-the-tools","workedChecks":"https://plainreckoner.com/tool-checks.json","workflow":["Choose the task and open its canonical HTML tool page.","For message tools, enter the visitor’s audience, offer, intended result and next action. Keep unsupported claims marked as assumptions.","Edit the draft and inspect the page outline. These tools do not predict sales or supply an AI-generated customer verdict.","For the page editor, edit HTML and CSS locally, inspect phone and desktop previews, then copy or download. Nothing is published or sent to an AI builder automatically.","Save a draft version before recording answers from real readers you recruit. Keep observations attached to that version.","In legacy numeric tools, use matched reporting dates and keep pageviews, sessions, users, impressions and requests distinct. Leave unknown figures blank.","Read the method and limitations, then export or plan a next test. Documentation is not proof that a tool has executed."],"usageQuestions":[{"question":"Can I continue my work in ChatGPT, Claude or Gemini?","answer":"Yes. Choose Ask AI in a tool. Review and edit the context, copy it, then open your preferred chat and paste it. Reader notes and page code are optional. Nothing is sent automatically, and your figures are not placed in the provider link. This is a handoff, not a connected account or an AI answer inside Plain Reckoner. The provider may require its own account or plan.","url":"https://plainreckoner.com/faq/#continue-with-ai"},{"question":"How do I turn my homepage plan into a page?","answer":"Open Build your page. Edit the HTML and CSS, then check the Phone and Desktop previews. Copy code for your website or AI builder, or download a complete HTML file. Nothing publishes automatically. Code stays in your browser; preview blocks scripts and external files. Download a JSON backup to keep your editable work.","url":"https://plainreckoner.com/faq/#page-editor"},{"question":"How do I use the order profit & roas tool?","answer":"Use one matched order cohort. Separate sales, returned product costs and advertising. Replace the example with your costs. Open Other costs and assumptions before using the result. Contribution is not net profit. Tax, overhead, owner pay and unentered costs are excluded. Enter actual fees, including fees on shipping. Match refunds and cost recoveries to the original orders. Ad-platform attribution does not establish that ads caused every sale.","url":"https://plainreckoner.com/faq/#break-even-roas"},{"question":"How do I use the free shipping threshold tool?","answer":"Choose a contribution target, then check the merchandise value needed to cover delivery. Replace the example with your costs. Open Other costs and assumptions before using the result. This is a cost threshold, not an optimized conversion or AOV prediction. Product margin, weight, carrier prices and fee bases can change with the basket. Tax and refunds are excluded. A non-positive marginal rate has no finite threshold in this model.","url":"https://plainreckoner.com/faq/#free-shipping-threshold"},{"question":"How do I use the return cost scenarios tool?","answer":"Compare kept and fully refunded orders. Set the costs your own fee schedule actually retains. Replace the example with your costs. Open Other costs and assumptions before using the result. This models full product refunds with no customer-paid shipping for one product/order pattern. It does not predict returns, model partial refunds or replace a cohort profit report. The same rate can hide very different recovery and handling costs. Tax, overhead and unentered costs remain excluded.","url":"https://plainreckoner.com/faq/#return-cost"},{"question":"How do I use the bundle pricing & stock tool?","answer":"Price two different components and check the stock that limits the offer. Replace the example with your costs. Open Other costs and assumptions before using the result. A price floor is not a recommended price. Customer-paid shipping, returns, tax, overhead and unentered costs are excluded. Bundle discounts may stack with other offers. Real inventory tracking and price updates remain in your store.","url":"https://plainreckoner.com/faq/#bundle-pricing"},{"question":"Can I explore recent online retail data without connecting a store?","answer":"Yes. The retail market explorer shows a reviewed official ONS snapshot for Great Britain. Compare one-month and three-month spending changes, then inspect the source dates and full monthly series. Market aggregates are context, not individual purchases or a prediction for your product.","url":"https://plainreckoner.com/faq/#retail-market"},{"question":"How can I check a discount on slow-moving stock?","answer":"Open the inventory markdown test. Enter one product’s current price, cost, stock, completed sales and in-stock days. Add the proposed discount, fees and campaign budget. Compare whole-unit recovery targets with available stock. These are conditional calculations, not a demand forecast. Nothing connects to your store or changes a price.","url":"https://plainreckoner.com/faq/#inventory-markdown"},{"question":"How do I start using the free tools?","answer":"Choose a collection on the free tools page. Message and homepage tools help you explain your offer, plan a page and ask readers what they understood. Website and store calculators help you check earnings and selling costs. Choose the task you need; no account is required.","url":"https://plainreckoner.com/faq/#how-to-use-the-tools"},{"question":"Which numbers should I enter?","answer":"Use the counts from your own report. Pageviews, sessions, users and ad impressions are different units. Use the same dates and currency for related figures. Leave an optional unknown field blank; enter zero only when the real value is zero.","url":"https://plainreckoner.com/faq/#which-numbers"},{"question":"Do the message tools send my draft to an AI service?","answer":"No. The message workspace organises your own entries with local templates. Your brief, draft versions and reader notes stay in this browser when storage is available. Exported files contain your entries; shared tool links do not.","url":"https://plainreckoner.com/faq/#message-workspace-privacy"},{"question":"Do the reader tools provide people to test my page?","answer":"No. You recruit relevant readers, save the exact draft they see and record their actual answers. A small self-recruited group can reveal confusion, but it does not establish a population conversion rate or guarantee sales.","url":"https://plainreckoner.com/faq/#message-reader-feedback"},{"question":"How should I read a tool result?","answer":"Check the unit, dates, formula and assumptions next to the result. A historical benchmark describes its sample; it does not predict your earnings. Meeting a numerical network threshold does not guarantee approval. A listing benchmark is not a confirmed sale price.","url":"https://plainreckoner.com/faq/#read-the-result"},{"question":"How do I import a daily revenue CSV?","answer":"Open the two-period comparison and choose a CSV under 100 KB with up to 366 complete days. Use the template, or map the date, traffic and USD revenue columns. Confirm the units, check the preview, then apply it. Files stay in your browser.","url":"https://plainreckoner.com/faq/#import-a-report"},{"question":"How do I share a tool without sharing my figures?","answer":"In the message workspace, Share tool copies a link without your entries. Legacy benchmark tools offer a separate choice to include figures. Included numbers can be read by anyone with the link and may enter browser history and hosting logs.","url":"https://plainreckoner.com/faq/#share-a-result"},{"question":"Can an AI assistant read the tool instructions?","answer":"Yes. The public tool reference lists inputs, units, formulas, limits and worked checks. It is documentation, not a calculator API or proof that a tool has run. An assistant should keep unknown values unknown, cite the relevant page and distinguish its own calculation from a result it actually obtained.","url":"https://plainreckoner.com/faq/#tool-help-for-assistants"}],"name":"Plain Reckoner free tools","description":"Connected business message tools and legacy publisher/store calculators. Check the method and limits before using a result.","html":"https://plainreckoner.com/app/","price":0,"accountRequired":false,"language":"en","tools":[{"name":"Explain your offer","url":"https://plainreckoner.com/app/offer/","description":"Turn your offer into a clear, editable message.","inputs":["your audience","your offer","intended result","next action"],"privacy":"Local browser storage. Shared tool links exclude entries. Exports contain your own information.","limits":"Draft organisation and recorded reader feedback, not a sales prediction. No generative AI or supplied participant panel.","execution":"Browser interface; this JSON documents usage and is not an execution API."},{"name":"Plan your homepage","url":"https://plainreckoner.com/app/homepage/","description":"Build a page outline around the same offer and next step.","inputs":["your audience","your offer","intended result","next action"],"privacy":"Local browser storage. Shared tool links exclude entries. Exports contain your own information.","limits":"Draft organisation and recorded reader feedback, not a sales prediction. No generative AI or supplied participant panel.","execution":"Browser interface; this JSON documents usage and is not an execution API."},{"name":"Build your page","url":"https://plainreckoner.com/app/editor/","description":"Edit HTML and CSS, check the layout, then copy or download your page.","inputs":["HTML up to 100 KB","CSS up to 80 KB","optional local editor JSON backup up to 200 KB"],"outputs":["sandboxed responsive preview","static HTML page","HTML and CSS embed","plain-text AI-builder handoff","local editor JSON backup"],"limits":"Static HTML and CSS. Preview blocks scripts, active links and external files. No publishing or AI submission. Review custom CSS before embedding.","privacy":"Local browser storage. Shared tool links exclude entries. Exports contain your own information.","execution":"Browser interface; this JSON documents usage and is not an execution API."},{"name":"Choose your next action","url":"https://plainreckoner.com/app/cta/","description":"Compare two actions and keep clicks separate from completed outcomes.","inputs":["your audience","your offer","intended result","next action"],"privacy":"Local browser storage. Shared tool links exclude entries. Exports contain your own information.","limits":"Draft organisation and recorded reader feedback, not a sales prediction. No generative AI or supplied participant panel.","execution":"Browser interface; this JSON documents usage and is not an execution API."},{"name":"Ask real readers","url":"https://plainreckoner.com/app/reader-check/","description":"Record real reader answers against the exact draft they saw.","inputs":["your audience","your offer","intended result","next action"],"privacy":"Local browser storage. Shared tool links exclude entries. Exports contain your own information.","limits":"Draft organisation and recorded reader feedback, not a sales prediction. No generative AI or supplied participant panel.","execution":"Browser interface; this JSON documents usage and is not an execution API."},{"name":"Plan a small test","url":"https://plainreckoner.com/app/test-plan/","description":"Write a practical test plan and keep track of what remains unknown.","inputs":["your audience","your offer","intended result","next action"],"privacy":"Local browser storage. Shared tool links exclude entries. Exports contain your own information.","limits":"Draft organisation and recorded reader feedback, not a sales prediction. No generative AI or supplied participant panel.","execution":"Browser interface; this JSON documents usage and is not an execution API."},{"name":"Guided analysis workspace","url":"https://plainreckoner.com/app/start/","inputs":["business type: store or publisher","optional public website URL","reporting month","optional numeric figures in USD"],"outputs":["local cost or RPM calculations","bounded public-page observations","missing inputs and next checks","compatible tool handoff"],"privacy":"Only the public website URL is sent to the inspection endpoint. Guided context and store scenarios stay in this browser tab for up to 24 hours; numeric figures are not uploaded. Manual review submits details only after the visitor checks and sends its form.","limits":"Public samples cannot establish private traffic or sales. Unknown costs prevent a complete store contribution result. No artificial scan delay or universal business score."},{"name":"Order profit & ROAS","url":"https://plainreckoner.com/app/break-even-roas/","inputSchema":[{"name":"sales","label":"Product sales after discounts","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"orders","label":"Orders in this cohort","unit":"whole units","type":"integer","minimum":1,"maximum":1000000,"required":true,"decimalPlaces":0},{"name":"cost","label":"Product cost of those orders","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"ads","label":"Advertising spend","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"shipping","label":"Shipping and packing cost","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"shippingRevenue","label":"Shipping revenue after matched refunds","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"fees","label":"Actual selling and payment fees","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"refunds","label":"Product revenue refunded","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"recovered","label":"Product cost recovered from returns","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"returnCost","label":"Extra return handling cost","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"target","label":"Contribution wanted after ads","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2}],"method":["Sales after refunds = entered product sales minus matched product refunds. Recovered cost means product cost returned to usable inventory, not a second cash sale.","Contribution before ads = sales after refunds + shipping revenue after matched refunds − product cost + recovered product cost − shipping and packing − actual fees − extra return handling.","Contribution after ads subtracts advertising spend. The target ad budget subtracts your chosen contribution target. A target already missed before ads is unavailable.","Break-even ROAS uses the same pre-refund sales numerator as the displayed gross ROAS, divided by positive contribution before ads. Its two-decimal floor requirement rounds up."],"outputs":[{"name":"afterAds","label":"Contribution after advertising","unit":"money"},{"name":"beforeAds","label":"Room for ads before the target","unit":"money"},{"name":"netSales","label":"Product sales after refunds","unit":"money"},{"name":"grossRoas","label":"ROAS on sales before refunds","unit":"ratio"},{"name":"netRoas","label":"ROAS on sales after refunds","unit":"ratio"},{"name":"breakEvenRoas","label":"Break-even ROAS on pre-refund sales","unit":"ratio"},{"name":"adBudget","label":"Ad budget at your contribution target","unit":"money"},{"name":"targetCpa","label":"Ad budget per order at that target","unit":"money"},{"name":"margin","label":"Contribution divided by net product sales","unit":"percent"},{"name":"productGrossProfit","label":"Product gross profit before selling costs","unit":"money"},{"name":"grossMargin","label":"Product gross margin on net sales","unit":"percent"},{"name":"markup","label":"Product markup on net product cost","unit":"percent"}],"limits":"Contribution is not net profit. Tax, overhead, owner pay and unentered costs are excluded. Enter actual fees, including fees on shipping. Match refunds and cost recoveries to the original orders. Ad-platform attribution does not establish that ads caused every sale.","sources":[{"label":"Google: conversion values","href":"https://support.google.com/google-ads/answer/13064207"},{"label":"Shopify: sales report definitions","href":"https://help.shopify.com/en/manual/reports-and-analytics/shopify-reports/report-types/default-reports/sales-report"}],"research":"https://plainreckoner.com/notes/break-even-roas-hidden-costs/","privacy":"Local calculations and local JSON export. No store connection, private sales access or URL values."},{"name":"Free shipping threshold","url":"https://plainreckoner.com/app/free-shipping-threshold/","inputSchema":[{"name":"cart","label":"Current product basket value","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"margin","label":"Product gross margin on sales","unit":"%","type":"number","minimum":0,"maximum":100,"required":true,"decimalPlaces":2},{"name":"carrier","label":"Carrier cost per shipment","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"target","label":"Contribution wanted per order","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"fee","label":"Payment and selling fee","unit":"%","type":"number","minimum":0,"maximum":99.99,"required":true,"decimalPlaces":2},{"name":"fixedFee","label":"Fixed fee per order","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"packing","label":"Packing cost per order","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"ads","label":"Ad cost per order","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"charged","label":"Shipping currently paid by customer","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2}],"method":["Product gross margin is (product sales − product cost) ÷ product sales. Enter margin after product discounts, before the selling fee. It is not markup.","Net marginal rate = product gross margin rate − percentage selling fee. Minimum free-shipping basket = (carrier + packing + ad cost + fixed fee + target contribution) ÷ positive net marginal rate. Round the basket up to the next cent.","The preservation scenario retains the current basket contribution, including the shipping charge currently collected and its percentage fee. It assumes the same product mix and shipping cost."],"outputs":[{"name":"threshold","label":"Minimum basket for your target","unit":"money"},{"name":"preserveThreshold","label":"Basket that preserves current contribution","unit":"money"},{"name":"current","label":"Current contribution with shipping charged","unit":"money"},{"name":"freeAtCart","label":"Contribution with free shipping at this basket","unit":"money"},{"name":"extraBasket","label":"Extra basket value to reach your target","unit":"money"},{"name":"shippingLoss","label":"Contribution lost if the basket stays the same","unit":"money"},{"name":"atThreshold","label":"Contribution at the calculated threshold","unit":"money"}],"limits":"This is a cost threshold, not an optimized conversion or AOV prediction. Product margin, weight, carrier prices and fee bases can change with the basket. Tax and refunds are excluded. A non-positive marginal rate has no finite threshold in this model.","sources":[{"label":"Shopify: free shipping minimums","href":"https://help.shopify.com/en/manual/discounts/discount-types/free-shipping"},{"label":"Shopify: profit reports","href":"https://help.shopify.com/en/manual/reports-and-analytics/shopify-reports/report-types/default-reports/profit-reports"}],"research":"https://plainreckoner.com/notes/free-shipping-threshold-profit/","privacy":"Local calculations and local JSON export. No store connection, private sales access or URL values."},{"name":"Return cost scenarios","url":"https://plainreckoner.com/app/return-cost/","inputSchema":[{"name":"price","label":"Product selling price","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"cost","label":"Product cost","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"outbound","label":"Outbound shipping and packing","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"rate","label":"Fully returned order rate","unit":"%","type":"number","minimum":0,"maximum":100,"required":true,"decimalPlaces":2},{"name":"ads","label":"Ad cost per original order","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"fee","label":"Original percentage selling fee","unit":"%","type":"number","minimum":0,"maximum":99.99,"required":true,"decimalPlaces":2},{"name":"fixedFee","label":"Original fixed selling fee","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"returnShip","label":"Return shipping paid by you","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"handling","label":"Extra return handling","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"recovery","label":"Product cost recovered into stock","unit":"%","type":"number","minimum":0,"maximum":100,"required":true,"decimalPlaces":2},{"name":"feeRecovery","label":"Original fees refunded to you","unit":"%","type":"number","minimum":0,"maximum":100,"required":true,"decimalPlaces":2}],"method":["Every original order incurs its entered outbound cost, original payment fee and ad cost. A full return refunds all product revenue.","Returned-order contribution subtracts unrecovered product cost, outbound cost, retained original fees, return shipping, extra handling and original ad cost. Recovered cost is stock value, not immediate cash.","Scenario contribution = kept-order contribution × kept-order share + returned-order contribution × full-return share. The cost break-even return rate rounds down to two decimals."],"outputs":[{"name":"expected","label":"Scenario contribution per original order","unit":"money"},{"name":"kept","label":"Contribution when the order is kept","unit":"money"},{"name":"returned","label":"Contribution on a fully returned order","unit":"money"},{"name":"lossPerReturn","label":"Contribution lost per full return","unit":"money"},{"name":"perHundred","label":"Scenario contribution per 100 original orders","unit":"money"},{"name":"breakEvenRate","label":"Cost break-even full-return rate","unit":"percent"},{"name":"retainedFee","label":"Original fee retained on a return","unit":"money"}],"limits":"This models full product refunds with no customer-paid shipping for one product/order pattern. It does not predict returns, model partial refunds or replace a cohort profit report. The same rate can hide very different recovery and handling costs. Tax, overhead and unentered costs remain excluded.","sources":[{"label":"Stripe: fees on refunded payments","href":"https://support.stripe.com/questions/understanding-fees-for-refunded-payments"},{"label":"Shopify: sales reversals and physical returns","href":"https://help.shopify.com/en/manual/reports-and-analytics/shopify-reports/report-types/default-reports/sales-report"}],"research":"https://plainreckoner.com/notes/ecommerce-returns-profit-cost/","privacy":"Local calculations and local JSON export. No store connection, private sales access or URL values."},{"name":"Bundle pricing & stock","url":"https://plainreckoner.com/app/bundle-pricing/","inputSchema":[{"name":"price","label":"Bundle product price","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"priceA","label":"Individual price: product A","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"costA","label":"Cost per unit: product A","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"unitsA","label":"Units of A per bundle","unit":"whole units","type":"integer","minimum":1,"maximum":100,"required":true,"decimalPlaces":0},{"name":"stockA","label":"Available stock: product A","unit":"whole units","type":"integer","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":0},{"name":"priceB","label":"Individual price: product B","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"costB","label":"Cost per unit: product B","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"unitsB","label":"Units of B per bundle","unit":"whole units","type":"integer","minimum":1,"maximum":100,"required":true,"decimalPlaces":0},{"name":"stockB","label":"Available stock: product B","unit":"whole units","type":"integer","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":0},{"name":"shipping","label":"Shipping and packing per bundle","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"fee","label":"Selling fee on the bundle price","unit":"%","type":"number","minimum":0,"maximum":99.99,"required":true,"decimalPlaces":2},{"name":"fixedFee","label":"Fixed fee per bundle","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2},{"name":"ads","label":"Ad cost per bundle","unit":"USD","type":"number","minimum":0,"maximum":1000000,"required":true,"decimalPlaces":2}],"method":["Product cost and reference price multiply each component by its quantity per bundle. The two components must be different stock items.","Complete bundles = the smaller of floor(stock A ÷ quantity A) and floor(stock B ÷ quantity B). Committed or unavailable stock should already be excluded.","Contribution subtracts component costs, entered shipping/packing, percentage and fixed fees, and ad cost. The break-even price rounds up to the next cent.","The reference is the same items in one undiscounted basket, with the same shipment and ad costs. Separate-order shipping savings or increased demand are not assumed."],"outputs":[{"name":"contribution","label":"Contribution after the entered costs","unit":"money"},{"name":"floor","label":"Minimum price to cover entered costs","unit":"money"},{"name":"maxBundles","label":"Complete bundles supported by this stock","unit":"integer"},{"name":"regular","label":"Same items at individual prices","unit":"money"},{"name":"cost","label":"Product cost per complete bundle","unit":"money"},{"name":"priceChange","label":"Price change versus individual prices","unit":"percent"},{"name":"baseline","label":"Contribution from an undiscounted combined basket","unit":"money"},{"name":"difference","label":"Contribution change versus that basket","unit":"money"}],"limits":"A price floor is not a recommended price. Customer-paid shipping, returns, tax, overhead and unentered costs are excluded. Bundle discounts may stack with other offers. Real inventory tracking and price updates remain in your store.","sources":[{"label":"Shopify: bundle pricing and discounts","href":"https://help.shopify.com/en/manual/products/bundles/shopify-bundles"},{"label":"Shopify: quantity-aware bundle inventory","href":"https://help.shopify.com/en/manual/products/bundles/eligibility-and-considerations"}],"research":"https://plainreckoner.com/notes/product-bundle-pricing-margin/","privacy":"Local calculations and local JSON export. No store connection, private sales access or URL values."},{"name":"Retail market explorer","url":"https://plainreckoner.com/app/retail-market/","inputs":["comparison horizon: one month, three months or both"],"outputs":["official online spending-value changes by retailer type"],"observationPeriod":"September 2026; three-month comparison July–September vs April–June 2026","sourcePublished":"2026-10-23","checkedOn":"2026-10-24","geography":"Great Britain","adjustment":"Seasonally adjusted, spending value at current prices","source":"https://www.ons.gov.uk/businessindustryandtrade/retailindustry/bulletins/retailsales/september2026","data":"https://plainreckoner.com/data/retail-market/","limits":"Dated aggregate survey snapshot; not individual orders, real-time product demand or a prediction. Categories have different weights and overlapping aggregates must not be summed."},{"name":"Inventory markdown test","url":"https://plainreckoner.com/app/inventory-markdown/","inputSchema":[{"name":"price","label":"Current price","unit":"USD / unit","minimum":0.01,"maximum":1000000,"type":"number","required":true},{"name":"cost","label":"Product cost per unit","unit":"USD / unit","minimum":0,"maximum":1000000,"type":"number","required":true},{"name":"stock","label":"Units in stock","unit":"units","minimum":0,"maximum":1000000,"type":"integer","required":true},{"name":"sold","label":"Completed units sold","unit":"units","minimum":0,"maximum":1000000000,"type":"integer","required":true},{"name":"sellingDays","label":"In-stock days in that report","unit":"days","minimum":1,"maximum":3650,"type":"integer","required":true},{"name":"discount","label":"Discount (%)","unit":"%","minimum":0,"maximum":100,"type":"number","required":true},{"name":"fee","label":"Selling fee (%)","unit":"%","minimum":0,"maximum":99.99,"type":"number","required":true},{"name":"otherCost","label":"Other selling cost per unit","unit":"USD / unit","minimum":0,"maximum":1000000,"type":"number","required":true},{"name":"campaignCost","label":"Campaign budget","unit":"USD","minimum":0,"maximum":1000000,"type":"number","required":true},{"name":"comparisonDays","label":"Compare over (days)","unit":"days","minimum":1,"maximum":3650,"type":"integer","required":true}],"formulas":{"contribution":"unit price * (1 - selling fee percent / 100) - product cost - other unit selling cost","baselineUnits":"min(stock, floor(observed completed units / in-stock days * comparison days))","recoveryUnits":"ceil((baseline contribution + campaign budget) / positive discounted unit contribution)"},"outputs":["contribution price floor","whole-unit recovery target","finite-stock feasibility","cash recovered if all stock sells"],"limits":"Conditional arithmetic in USD, not net profit, demand forecasting or a price recommendation. Discounts round to cents; fees retain sub-cent precision. Zero sales do not establish a sales pace.","privacy":"Local calculations and local JSON export. No upload, credentials, store connection or price change.","research":"https://plainreckoner.com/notes/slow-moving-inventory-discount-profit/"},{"name":"Per thousand views","url":"https://plainreckoner.com/app/rpm/","question":"Is what you earn per thousand views any good?","inputs":["pageviews","revenue"],"inputMeanings":{"pageviews":"Monthly pageviews; not sessions or users","revenue":"Monthly ad revenue in USD; not net profit"},"basis":"1.17 billion pageviews and $6.84m of verified ad revenue, from historical business records checked by a broker; full study scope is in the method","limits":"Read the linked page for the sample, dates and limits. Historical records are not predictions."},{"name":"What it is worth","url":"https://plainreckoner.com/app/value/","question":"What listing benchmark fits your figures?","inputs":["pageviews","revenue"],"inputMeanings":{"pageviews":"Monthly pageviews; not sessions or users","revenue":"Monthly ad revenue in USD; not net profit"},"basis":"listing multiples from 279 sold-status records first listed in 2025–26; final prices are not verified","limits":"Read the linked page for the sample, dates and limits. Historical records are not predictions."},{"name":"Ad networks","url":"https://plainreckoner.com/app/networks/","question":"Which ad networks are worth checking for your site?","inputs":["pageviews","niche"],"inputMeanings":{"pageviews":"Monthly pageviews; not sessions or users","niche":"Closest published niche benchmark"},"reportInputSchema":[{"name":"pageviews","label":"Monthly pageviews","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Actual pageviews from your traffic report; not sessions."},{"name":"premiumSessions","label":"Premium sessions in 30 days","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Use Journey’s premium-session figure from its GA4 evaluation, not all worldwide sessions or pageviews."},{"name":"annualRevenue","label":"Actual annual ad revenue (USD)","type":"number","minimum":0,"maximum":10000000000,"unknown":null,"description":"Ad revenue earned over the last 12 months. Do not multiply an estimated month by 12."},{"name":"activeUsers","label":"Monthly active users","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Your reported active users. We do not convert pageviews into users."},{"name":"geography","label":"Raptive country share (%)","type":"number","minimum":0,"maximum":100,"unknown":null,"description":"Traffic from the US, UK, Canada, New Zealand and Australia, using the provider’s reporting basis."},{"name":"domainMonths","label":"Domain age in completed months","type":"integer","minimum":0,"maximum":1200,"unknown":null,"description":"Use the age of the domain, not the age of your analytics account."}],"basis":"what each network asks for, read off its own page","limits":"Read the linked page for the sample, dates and limits. Historical records are not predictions."},{"name":"Kind of business","url":"https://plainreckoner.com/app/models/","question":"What listing benchmark fits your business model?","inputs":["revenue","model"],"inputMeanings":{"revenue":"Monthly net profit in USD; not gross revenue","model":"Published business-model cohort"},"basis":"$696m in listing prices on sold-status records, across 2,582 businesses and 9 kinds of business","limits":"Read the linked page for the sample, dates and limits. Historical records are not predictions."},{"name":"Month by month","url":"https://plainreckoner.com/app/seasons/","question":"Is this month bad, or is it just January?","inputs":["pageviews","niche"],"inputMeanings":{"pageviews":"Monthly pageviews; not sessions or users","niche":"Closest published niche benchmark"},"basis":"99 historical display-only businesses, each measured over 12 consecutive months against its own annual level; all 12 monthly indices are published","limits":"Read the linked page for the sample, dates and limits. Historical records are not predictions."},{"name":"Who reads your site","url":"https://plainreckoner.com/app/crawlers/","question":"Are you unusual in what you let the AI companies read?","limits":"Public files only. The page states what was checked and what is unknown."},{"name":"Who may sell your ads","url":"https://plainreckoner.com/app/sellers/","question":"Does your ad network’s own list agree with your site’s?","limits":"Public files only. The page states what was checked and what is unknown."},{"name":"AdSense report checker","url":"https://plainreckoner.com/app/ad-metrics/","question":"Why do page RPM and ad impression RPM differ?","inputs":["ad earnings","pageviews","ad impressions","optional ad clicks","optional ad requests","optional requests that returned ads"],"inputSchema":[{"name":"earnings","label":"Ad earnings","type":"number","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Use one reporting period and currency."},{"name":"pageviews","label":"Pageviews","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Pages counted by the same ad report."},{"name":"impressions","label":"Ad impressions","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Ads counted as shown. This is not a count of pages."},{"name":"clicks","label":"Ad clicks (optional)","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Leave blank if you do not know."},{"name":"requests","label":"Ad requests (optional)","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Times your site asked for an ad."},{"name":"matched","label":"Requests that returned ads (optional)","type":"integer","minimum":0,"maximum":1000000000000,"unknown":null,"description":"Use matched requests, not ad impressions."}],"formulas":{"pageRpm":"earnings / pageviews * 1000","impressionRpm":"earnings / impressions * 1000","pageCtr":"clicks / pageviews * 100","adCtr":"clicks / impressions * 100","coverage":"matched / requests * 100","adsPerPage":"impressions / pageviews"},"validation":["matched must not exceed requests","A missing numerator or missing/nonpositive denominator produces an unavailable rate, not a substitute benchmark."],"outputs":["page RPM","ad impression RPM","ad impressions per page","page CTR","ad CTR","request coverage"],"privacy":"Figures are calculated locally and are not uploaded or added to the URL.","limits":"Use one report, one date range and one currency. Unknown values stay unknown. Advertiser CPM and CPC cannot be inferred.","sources":["https://support.google.com/adsense/answer/190515","https://support.google.com/adsense/answer/6157296","https://support.google.com/adsense/answer/92360"]},{"name":"Revenue planning lab","url":"https://plainreckoner.com/app/planning/","inputs":["monthly pageviews","monthly ad revenue in USD","monthly cash costs in USD","candidate publisher-net page RPM","extra monthly fee in USD","one-time switching cost in USD","whole comparison months","sustained traffic loss percent"],"outputs":["traffic stress results","profit target","network-switching period gain","affordable traffic-loss limit","0/10/20/30 percent traffic-loss sensitivity"],"workedExample":"https://plainreckoner.com/notes/switching-ad-networks-break-even/","privacy":"Calculated in the browser; no upload or new URL parameters.","limits":"Conditional scenarios, not forecasts. Switching assumes constant page RPM and fixed fees; no-loss failure and zero candidate RPM do not produce a traffic-loss allowance. Revenue shares must already be included in the input RPM."},{"name":"Business calculators","url":"https://plainreckoner.com/app/decisions/","limits":"Cost and revenue scenarios, not market quotes or forecasts."}]}