This guide covers how to monetize the Boring Math calculator network through advertising and affiliate partnerships.
| Revenue Stream | Effort | Timeline | Potential |
|---|---|---|---|
| Google AdSense | Low | 2-4 weeks | $100-500/mo* |
| Affiliate Links | Medium | Immediate | $200-1000/mo* |
| Sponsored Content | High | 6+ months | Variable |
*Estimates based on 10,000+ monthly visitors
Before applying, ensure you have:
- 5+ quality calculators live
- Original content (300+ words per page)
- Privacy Policy page published
- About page published
- Contact information available
- 2-4 weeks of traffic (shows site is active)
- No policy violations (no adult content, hate speech, etc.)
- Sign up at google.com/adsense
- Add your site and verify ownership
- Add the AdSense code to your site (temporary verification)
- Wait for review (typically 1-14 days)
- Get approved or address feedback
Create src/components/common/AdSense.astro:
---
export interface Props {
slot: string;
format?: 'auto' | 'rectangle' | 'horizontal' | 'vertical';
responsive?: boolean;
className?: string;
}
const {
slot,
format = 'auto',
responsive = true,
className = ''
} = Astro.props;
// Only show ads in production
const isProd = import.meta.env.PROD;
const publisherId = import.meta.env.PUBLIC_ADSENSE_ID;
---
{isProd && publisherId && (
<div class={`adsense-container ${className}`}>
<ins
class="adsbygoogle"
style="display:block"
data-ad-client={publisherId}
data-ad-slot={slot}
data-ad-format={format}
data-full-width-responsive={responsive}
/>
<script>
(adsbygoogle = window.adsbygoogle || []).push({});
</script>
</div>
)}Add the AdSense script to BaseLayout.astro:
<!-- In <head> section -->
{import.meta.env.PROD && import.meta.env.PUBLIC_ADSENSE_ID && (
<script
async
src={`https://pagead2.googlesyndication.com/pagead/js/adsbygoogle.js?client=${import.meta.env.PUBLIC_ADSENSE_ID}`}
crossorigin="anonymous"
/>
)}Recommended ad placements:
<!-- Above Calculator (horizontal) -->
<AdSense slot="1234567890" format="horizontal" className="mb-6" />
<!-- Calculator Component Here -->
<FreelanceDayRateCalculator client:load />
<!-- Below Results (rectangle) -->
<AdSense slot="0987654321" format="rectangle" className="mt-6" />
<!-- Sidebar (desktop only) -->
<div class="hidden lg:block">
<AdSense slot="1122334455" format="vertical" className="sticky top-4" />
</div>| Position | Ad Type | Notes |
|---|---|---|
| Above calculator | Horizontal banner | High visibility, non-intrusive |
| Below results | Medium rectangle | User engaged, good CTR |
| Sidebar (desktop) | Skyscraper | Use only on desktop |
| In-content | Native ads | Between content sections |
- Don't place ads that interfere with calculator use
- Don't exceed 3-4 ad units per page
- Don't click your own ads (instant ban)
- Don't encourage users to click ads
- Don't place ads near interactive elements
- Don't hide content behind ads
| Monthly Pageviews | Estimated Revenue |
|---|---|
| 1,000 | $1-5 |
| 5,000 | $10-25 |
| 10,000 | $25-75 |
| 50,000 | $100-300 |
| 100,000 | $250-750 |
*Based on typical CPMs for calculator/finance niches ($2-5 RPM)
- Join affiliate programs for relevant products
- Add contextual recommendations to calculator pages
- Earn commission when users purchase through your links
- FTC requires clear disclosure
| Program | Commission | Cookie | Best For |
|---|---|---|---|
| QuickBooks | $50-150/sale | 45 days | Freelance, invoicing |
| FreshBooks | $55/sale | 120 days | Freelance, invoicing |
| TurboTax | $15-25/sale | 30 days | Tax calculators |
| Wise | $15-30/referral | 30 days | International payments |
| Credit Karma | $2/signup | 30 days | Credit, finance |
| Program | Commission | Cookie | Best For |
|---|---|---|---|
| The Knot | $15-50/lead | 30 days | Wedding planning |
| Zola | 8%/sale | 30 days | Registry, wedding |
| Drizly | 5%/order | 7 days | Alcohol delivery |
| Total Wine | 5%/sale | 7 days | Alcohol purchase |
| Program | Commission | Cookie | Best For |
|---|---|---|---|
| Amazon Associates | 1-10% | 24 hours | Books, products |
| ShareASale | Varies | Varies | Multi-merchant |
| CJ Affiliate | Varies | Varies | Multi-merchant |
| Impact | Varies | Varies | Multi-merchant |
Create src/components/common/AffiliateBox.astro:
---
export interface AffiliateProduct {
name: string;
description: string;
url: string;
logo?: string;
cta?: string;
}
export interface Props {
title: string;
products: AffiliateProduct[];
}
const { title, products } = Astro.props;
---
<aside class="bg-gray-50 rounded-xl p-6 my-8 border border-gray-200">
<p class="text-xs text-gray-500 uppercase tracking-wide mb-3">
Recommended Tools
</p>
<h3 class="text-lg font-semibold text-gray-900 mb-4">{title}</h3>
<div class="space-y-4">
{products.map((product) => (
<a
href={product.url}
target="_blank"
rel="nofollow sponsored noopener"
class="block bg-white rounded-lg p-4 shadow-sm hover:shadow-md transition-shadow"
>
<div class="flex items-center justify-between">
<div>
<h4 class="font-medium text-gray-900">{product.name}</h4>
<p class="text-sm text-gray-600 mt-1">{product.description}</p>
</div>
<span class="text-blue-600 font-medium text-sm whitespace-nowrap ml-4">
{product.cta || 'Learn More'} →
</span>
</div>
</a>
))}
</div>
<p class="text-xs text-gray-400 mt-4">
* We may earn a commission if you sign up through these links.
<a href="/affiliate-disclosure" class="underline">Learn more</a>
</p>
</aside>---
import AffiliateBox from '../../components/common/AffiliateBox.astro';
const affiliateProducts = [
{
name: 'QuickBooks Self-Employed',
description: 'Track income, expenses, and mileage. Separate business and personal.',
url: 'https://quickbooks.com/?ref=yourcode',
cta: 'Start Free Trial'
},
{
name: 'FreshBooks',
description: 'Invoicing, time tracking, and expense management for freelancers.',
url: 'https://freshbooks.com/?ref=yourcode',
cta: 'Try Free'
}
];
---
<!-- After calculator results -->
<AffiliateBox
title="Tools for Freelancers"
products={affiliateProducts}
/>- Be transparent - Always disclose affiliate relationships
- Be relevant - Only recommend products related to the calculator
- Be genuine - Only recommend products you'd actually use
- Track performance - Use unique tracking codes per page
- Update regularly - Remove dead links, update commissions
- Don't hide disclosures - FTC requires clear visibility
- Don't overdo it - 1-3 affiliate recommendations per page
- Don't mislead - Don't imply endorsement that doesn't exist
- Don't ignore rules - Follow each program's terms
Create src/pages/affiliate-disclosure.astro:
---
import BaseLayout from '../layouts/BaseLayout.astro';
---
<BaseLayout title="Affiliate Disclosure | Boring Math Calculators">
<article class="prose prose-lg max-w-3xl mx-auto">
<h1>Affiliate Disclosure</h1>
<p>
Boring Math Calculators is a participant in affiliate advertising programs
designed to provide a means for sites to earn advertising fees by linking
to products and services we recommend.
</p>
<h2>How It Works</h2>
<p>
Some links on our website are affiliate links. This means if you click on
the link and purchase a product or service, we may receive a small commission
at no additional cost to you.
</p>
<h2>Our Commitment</h2>
<p>
We only recommend products and services that we believe will add value to
our readers. Our primary goal is to help you make informed decisions with
our calculators, not to sell you products.
</p>
<h2>Identification</h2>
<p>
Affiliate links are identified with an asterisk (*) or the text "affiliate
link" near the link. We also include a brief disclosure near any affiliate
recommendations.
</p>
<h2>Questions</h2>
<p>
If you have questions about our affiliate relationships, please contact us
at [your email].
</p>
</article>
</BaseLayout>// Track which calculator drove the conversion
const affiliateUrl = new URL('https://partner.com/signup');
affiliateUrl.searchParams.set('ref', 'boringmath');
affiliateUrl.searchParams.set('utm_source', 'boringmath');
affiliateUrl.searchParams.set('utm_medium', 'affiliate');
affiliateUrl.searchParams.set('utm_campaign', 'freelance-calculator');// In your AffiliateBox component
gtag('event', 'affiliate_click', {
'affiliate_partner': 'quickbooks',
'calculator_page': 'freelance-day-rate',
'link_position': 'below_results'
});Your privacy policy must include:
- What data you collect (analytics, cookies)
- How you use data (improve service, advertising)
- Third-party services (Google Analytics, AdSense)
- Cookie usage disclosure
- User rights (opt-out options)
- Contact information
Add to your privacy policy:
## Advertising
We use Google AdSense to display advertisements on our website. Google, as a
third-party vendor, uses cookies to serve ads based on your prior visits to
this and other websites. You may opt out of personalized advertising by
visiting [Google's Ads Settings](https://www.google.com/settings/ads).
## Analytics
We use Google Analytics to understand how visitors use our site. Google
Analytics collects information such as how often users visit the site,
what pages they visit, and what other sites they used prior to coming to
our site. We use this information solely to improve our website.Test different configurations:
- Above vs. below calculator - Which has higher CTR?
- Number of ads - 2 vs. 3 vs. 4 units
- Ad formats - Rectangle vs. horizontal
- Positions - Inline vs. sidebar
Track with Google Analytics events.
| Strategy | Impact |
|---|---|
| Increase traffic | More impressions |
| Improve page speed | Better viewability |
| Target high-CPM niches | Finance, insurance, software |
| Optimize ad placement | Higher viewability |
| Use responsive ads | Better fill rate |
| Strategy | Impact |
|---|---|
| Contextual placement | Higher relevance |
| Clear CTAs | Better click-through |
| Trust signals | Logos, ratings |
| Limited options | Reduce decision paralysis |
| Seasonal timing | Tax season, wedding season |
- Build 5+ quality calculators
- Create required pages (privacy, about, contact)
- Set up Google Analytics
- Generate initial traffic
- Apply for AdSense
- Implement ad placements
- Test and optimize positions
- Monitor for policy violations
- Join relevant affiliate programs
- Add contextual recommendations
- Create affiliate disclosure page
- Track affiliate performance
- A/B test ad placements
- Optimize affiliate CTAs
- Scale content creation
- Build backlinks for traffic
- Add more calculators (10-20)
- Diversify affiliate programs
- Consider premium ad networks
- Explore sponsorship opportunities
| Metric | Tool | Frequency |
|---|---|---|
| Page views | Google Analytics | Daily |
| Ad impressions | AdSense | Daily |
| Ad RPM | AdSense | Weekly |
| Affiliate clicks | GA Events | Weekly |
| Affiliate conversions | Network dashboards | Weekly |
| Total revenue | All sources | Monthly |
## Revenue Report - [Month Year]
### Traffic
- Page views: X
- Unique visitors: X
- Avg. session duration: Xm Xs
### AdSense
- Impressions: X
- Clicks: X
- RPM: $X.XX
- Revenue: $X.XX
### Affiliates
- [Partner 1]: X clicks, X conversions, $X.XX
- [Partner 2]: X clicks, X conversions, $X.XX
- Total affiliate revenue: $X.XX
### Total Revenue: $X.XX
### Notes
- [What worked]
- [What to improve]
- [Goals for next month]- FTC Affiliate Disclosure - Required for US audiences
- AdSense Disclosure - Required by Google
- Privacy Policy - Required for any data collection
- Cookie Consent - Required for EU audiences (GDPR)
- AdSense income is taxable
- Affiliate income is taxable
- Keep records of all payments
- Consider quarterly estimated taxes
- Consult a tax professional
Monetization Guide Version: 1.0.0 Last Updated: January 2026