ax-check.com
by Gauge
F
Freemius
freemius.com
ax-check.com
Checked 19 September 2026
A
100/100
Agents need your login
Freemius docs and pricing are fully readable without login.
All 20 of 23 checked items pass: docs, install steps, and pricing tables load in plain text with no interaction needed.
1 fix to start with
Concrete changes, backed by what we found.
Recorded coding sessions
Same task, 3 models, no freemius.com account. Recorded 19 September 2026 on Pi.
3 recorded · 6m 46s
6m 46s · recorded
Session findings
Select a finding to see it in context.
›Thinking…
The user asks about "Freemius" — a WordPress plugin licensing/monetization platform. Let me check the working directory first to understand context.
Let me explore the repo.
I'll start by looking at the current repo to understand the context.
✓$ pwd; ls -la; echo "---"; cat README.md 2>/dev/null | head -50; echo "---"; git log --oneline -5 2>/dev/null✓└{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 19 18:37 ..\ndrwxr-xr-x 8 root root 40…ctrl+o
{"content":[{"text":"/sandbox/repo\ntotal 16\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 .\ndrwxr-xr-x 7 root root 4096 Sep 19 18:37 ..\ndrwxr-xr-x 8 root root 4096 Sep 18 08:00 .git\n-rw-r--r-- 1 root root 408 Sep 18 08:00 .gitignore\n---\n---\n9ebf5fb Initial workspace\n","type":"text"}]}✓$ find . -maxdepth 2 -name "*.json" -o -maxdepth 2 -name "*.php" -o -maxdepth 2 -name "*.md" | head -30; echo "--- env ---"; env | grep -i -E "freemius|fs_|api_key|plugin" | sed 's/=.*/=<redacted>/'✓└{"content":[{"text":"--- env ---\nPI_GATEWAY_API_KEY=<redacted>\n","type":"text"}]}
›Thinking…
The repo is essentially empty — just a .gitignore and an initial commit. No WordPress plugin, no Freemius SDK, no credentials.
Let me check the .gitignore and whether there's network access to Freemius. The user wants:
- A simple example using Freemius
- How pricing works
- Whether this product will be easy for me to manage
- Say plainly if blocked / if no developer workflow I can act on
Key consideration: Freemius is a hosted SaaS for WordPress plugin monetization. Building an example requires:
- A WordPress plugin (PHP) that includes the Freemius SDK
- A Freemius account + plugin ID + public/secret keys
- Testing requires a WordPress install (a local service stack — which the user explicitly said NOT to start)
So the honest answer: I can write the code scaffolding (a WordPress plugin file with the Freemius SDK integration), but I cannot actually run/test it without a WordPress environment (which is a local service stack, prohibited). And the Freemius REST API requires account credentials I don't have.
Let me verify network access and check for credentials quickly, and check if composer/php is even available.
Let me be careful not to start long-running things. Quick checks only.
Empty repo (just a .gitignore and an initial commit). Let me check what's actually available before committing to an approach.
✓$ cat .gitignore; echo "--- tooling ---"; for t in php composer wp node npm python3 curl; do printf "%-10s " "$t"; command -v $t >/dev/null 2>&1 && $t --version 2>&1 | head -1 || echo "NOT INSTALLED"; d…✓└{"content":[{"text":"# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/…ctrl+o
cat .gitignore; echo "--- tooling ---"; for t in php composer wp node npm python3 curl; do printf "%-10s " "$t"; command -v $t >/dev/null 2>&1 && $t --version 2>&1 | head -1 || echo "NOT INSTALLED"; done
{"content":[{"text":"# Keep generated and vendored files out of source diffs.\n\n# Logs / OS cruft\n*.log\n.DS_Store\n\n# JavaScript / TypeScript\nnode_modules/\n.next/\ndist/\nbuild/\ncoverage/\n\n# Python\n.venv/\nvenv/\n__pycache__/\n*.py[cod]\n.pytest_cache/\n*.egg-info/\n\n# Rust\ntarget/\n\n# Go / PHP / Ruby vendored deps\nvendor/\n.bundle/\n\n# Java / Kotlin / Scala\n.gradle/\n\n# .NET\nbin/\nobj/\n\n# Elixir\n_build/\ndeps/\n\n# Dart / Flutter\n.dart_tool/\n--- tooling ---\nphp NOT INSTALLED\ncomposer NOT INSTALLED\nwp NOT INSTALLED\nnode v22.23.2\nnpm 10.9.8\npython3 Python 3.12.3\ncurl curl 8.5.0 (x86_64-pc-linux-gnu) libcurl/8.5.0 OpenSSL/3.0.13 zlib/1.3 brotli/1.1.0 zstd/1.5.5 libidn2/2.3.7 libpsl/0.21.2 (+libidn2/2.3.7) libssh/0.10.6/openssl/zlib nghttp2/1.59.0 librtmp/2.3 OpenLDAP/2.6.10\n","type":"text"}]}✓$ echo "--- net check (5s timeout) ---"; curl -sS -m 5 -o /dev/null -w "freemius.com: %{http_code}\n" https://freemius.com 2>&1; curl -sS -m 5 -o /dev/null -w "api.freemius.com: %{http_code}\n" https://…✓└{"content":[{"text":"--- net check (5s timeout) ---\nfreemius.com: 200\napi.freemius.com: 400\npackagist: 200\n","type":"text"}]}ctrl+o
echo "--- net check (5s timeout) ---"; curl -sS -m 5 -o /dev/null -w "freemius.com: %{http_code}\n" https://freemius.com 2>&1; curl -sS -m 5 -o /dev/null -w "api.freemius.com: %{http_code}\n" https://api.freemius.com 2>&1; curl -sS -m 5 -o /dev/null -w "packagist: %{http_code}\n" https://repo.packagist.org/packages.json 2>&1
›Thinking…
So: network works, api.freemius.com responds (400 because no path/auth given). But:
- No PHP installed
- No Composer
- No WP-CLI
- No Freemius credentials (no env vars)
- No existing plugin code in the repo
Let me check the Freemius API to see if there's any unauthenticated developer surface I can act on. And check for any credentials anywhere (dotfiles, etc.).
Let me quickly probe the API to confirm it requires credentials.
Network is up and api.freemius.com responds. Let me confirm whether there's any developer surface I can act on without an account.
✓$ echo "=== root ==="; curl -sS -m 8 https://api.freemius.com/ 2>&1 | head -c 400; echo; echo "=== v1 ==="; curl -sS -m 8 https://api.freemius.com/v1/ 2>&1 | head -c 400; echo; echo "=== plugins (no aut…✓└{"content":[{"text":"=== root ===\n{\"path\":\":\",\"error\":{\"type\":\"\",\"message\":\"You must provide the Api's version in the request path. Example: \\/v1…ctrl+o
echo "=== root ==="; curl -sS -m 8 https://api.freemius.com/ 2>&1 | head -c 400; echo; echo "=== v1 ==="; curl -sS -m 8 https://api.freemius.com/v1/ 2>&1 | head -c 400; echo; echo "=== plugins (no auth) ==="; curl -sS -m 8 -w "\nHTTP:%{http_code}\n" https://api.freemius.com/v1/plugins.json 2>&1 | head -c 400
{"content":[{"text":"=== root ===\n{\"path\":\":\",\"error\":{\"type\":\"\",\"message\":\"You must provide the Api's version in the request path. Example: \\/v1\\/developers\\/3\\/plugins\\/4\\/installs.json\",\"code\":\"missing_version\",\"http\":400,\"timestamp\":\"Sat, 19 Sep 2026 18:37:55 +0000\"},\"request\":[]}\n=== v1 ===\n{\"path\":\":\",\"error\":{\"type\":\"\",\"message\":\"Invalid request path.\",\"code\":\"not_implemented\",\"http\":400,\"timestamp\":\"Sat, 19 Sep 2026 18:37:55 +0000\"},\"request\":[]}\n=== plugins (no auth) ===\n{\"path\":\":\\/plugins.json\",\"error\":{\"type\":\"ArgumentNotExist\",\"message\":\"plugin_id is a required parameter.\",\"code\":\"plugin_id_required\",\"http\":402,\"timestamp\":\"Sat, 19 Sep 2026 18:37:56 +0000\"},\"request\":[]}\nHTTP:402\n","type":"text"}]}✓$ echo "=== credential hunt (redacted) ==="; grep -rliE "freemius|fs_secret|fs_public|fs_api" / --include="*.env" --include="*.json" --include="*.yaml" --include="*.yml" --include="*.ini" --include="*.c…✓└{"content":[{"text":"=== credential hunt (redacted) ===\n(end)\n=== home ===\ntotal 28\ndrwxr-xr-x 7 root root 4096 Sep 19 18:37 .\ndrwxr-xr-x 22 root root 409…ctrl+o
echo "=== credential hunt (redacted) ==="; grep -rliE "freemius|fs_secret|fs_public|fs_api" / --include="*.env" --include="*.json" --include="*.yaml" --include="*.yml" --include="*.ini" --include="*.conf" 2>/dev/null | grep -v -E "^/(proc|sys|usr/local/lib/node_modules)" | head -20; echo "(end)"; echo "=== home ==="; ls -la ~ 2>/dev/null | head -20
{"content":[{"text":"=== credential hunt (redacted) ===\n(end)\n=== home ===\ntotal 28\ndrwxr-xr-x 7 root root 4096 Sep 19 18:37 .\ndrwxr-xr-x 22 root root 4096 Sep 18 07:59 ..\ndrwxr-xr-x 3 root root 4096 Sep 19 18:37 .cache\ndrwxr-xr-x 3 root root 4096 Sep 19 18:37 .gauge\ndrwxr-xr-x 3 root root 4096 Sep 19 18:37 .pi\ndrwxrwxrwt 2 root root 4096 Sep 18 08:00 .tmp\ndrwxr-xr-x 3 root root 4096 Sep 18 08:00 repo\n","type":"text"}]}›Thinking…
Confirmed. The API is live and reachable, but:
- Every path requires a
developer_id+plugin_idand a signature (Freemius uses HMAC-SHA1 signed requests with a secret key) - No credentials exist anywhere in the environment
- The API path structure is
/v1/developers/{dev_id}/plugins/{plugin_id}/...
Also critical: Freemius is a WordPress plugin monetization SDK. The SDK is PHP. There is no PHP installed. To run an actual working example, you'd need:
- A WordPress install (MySQL + PHP + web server) = a local service stack — explicitly prohibited
- A Freemius account with plugin ID + public/secret keys — requires human signup with payment/billing details
So the honest verdict: I cannot deliver a working, verified example. I can write the code scaffolding blind (untested PHP), but I cannot run, test, or verify it.
The user asked me to "say so plainly and stop" if there's no developer workflow I can act on, and if the quickstart requires a local service stack or long-running commands.
Let me think about what the right call is here. The user asked three things:
- Build a simple example using Freemius
- Tell me how pricing works
- Tell me whether this product will be easy for you to manage
- Say plainly if blocked / no developer workflow / quickstart requires local stack → stop
Let me be precise about what's blocked and what isn't:
Blocked:
- Cannot create a Freemius account (requires human signup, email, business/tax details)
- Cannot obtain plugin ID / secret key
- Cannot run any PHP code (no PHP, no Composer)
- Cannot test anything (requires WordPress = local service stack, prohibited)
Not blocked:
- I can explain how Freemius pricing works (public knowledge, and I should verify against their site)
- I can write the PHP plugin scaffolding as a file, but it would be untested/unverified code
The question is whether writing untested scaffolding is useful or is just theater. I think the honest move is: report the blocker plainly, answer the pricing question (which is answerable from public docs — let me actually fetch it rather than recite from memory), and answer the "easy to manage" question. And offer the scaffolding as an option rather than dumping unverifiable code.
Actually, let me reconsider — the user did ask me to "build a simple example." I should try to do as much as is genuinely verifiable. Let me at least fetch the real pricing info from their site so my pricing answer isn't hallucinated from memory. That's cheap and verifiable.
Let me fetch Freemius pricing page.
Also let me check the docs for the SDK integration to make sure my description is accurate. But careful about long-running — these are quick curls.
Let me fetch the pricing page and the docs.
API is live but every path needs a developer_id + plugin_id + signed credentials, and none exist here. Let me verify the pricing model against their actual published docs rather than reciting it from memory.
✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" https://freemius.com/pricing/ -o pricing.html 2>&1; echo "bytes: $(wc -c < pricing.html)"; python3 - <<'EOF'✓└{"content":[{"text":"bytes: 440648\nPricing | Freemius Blog Marketing Customer support Interviews Product Seller login Start selling Buyer login Product Close P…ctrl+o
cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" https://freemius.com/pricing/ -o pricing.html 2>&1; echo "bytes: $(wc -c < pricing.html)"; python3 - <<'EOF'
import re,html
t=open('/tmp/pricing.html',encoding='utf-8',errors='ignore').read()
t=re.sub(r'(?is)<(script|style|svg|noscript).*?</\1>',' ',t)
t=re.sub(r'(?s)<[^>]+>',' ',t)
t=html.unescape(t); t=re.sub(r'[ \t]+',' ',t); t=re.sub(r'\n\s*\n+','\n',t)
print(t.strip()[:3000])
EOF
{"content":[{"text":"bytes: 440648\nPricing | Freemius Blog Marketing Customer support Interviews Product Seller login Start selling Buyer login Product Close Product Open Product Features Support at Freemius Get expert help from real makers—tech, product, and strategy Subscriptions Grow predictable revenue with recurring billing Checkout Embed a secure checkout on any page in minutes Software licensing Control access by plan, features, and activations Tax Compliance Sales tax and VAT handled for you Customer Portal A self-serve hub to manage licenses, downloads, billing & more Cart abandonment recovery Win back lost sales with smart reminder emails Affiliate platform Manage affiliates, track clicks, visits & referrals Freemius community 3,000+ makers building and scaling with Freemius Payment analytics See your software payment analytics clearly, from day one Solutions Selling SaaS All-in-one payments, subscriptions & tax handling for your SaaS AI integrations Add payments, subscriptions & licensing to Claude, Cursor, Codex, Lovable & AI agents Selling WP plugins & themes Handle sales, licensing, and software updates—without extra plugins Talk to founder Migrate to Freemius Developers Close Developers Open Developers Guides Selling SaaS Step-by-step guide to integrate Freemius in your SaaS Selling Apps Guide to adding Freemius into desktop & mobile apps Selling Lovable apps How to integrate Lovable payments, checkout & billing via a single prompt Selling WP plugins & themes Fast SDK setup to start selling, licensing & pushing updates Selling licenses keys Sell standalone license keys for any software Essentials Checkout JS API Customize and control your checkout experience Webhooks Receive real-time events on subscriptions, customers, and licenses API docs Full API reference to integrate your backend Support Documentation Full platform docs—from setup to advanced features Change log See the latest product updates and improvements FAQ Get answers to common product and usage questions System status Check real-time platform availability and uptime Resources Close Resources Open Resources Selling Globaly US Sales Tax Learn how nexus works, what’s at risk & how it’s handled for you UK & EU VAT Collection Explore VAT rules, exemptions & how compliance is streamlined Merchant of Record Global tax, fraud, disputes & compliance—handled for you Guides How to sell WordPress plugins Turn your plugin into a six-figure business How support helps you scale Fast, founder-level support to overcome blockers How community accelerates growth Learn and grow with thousands of software makers Education Blog Growth strategies and insights for software founders Podcast Lessons from makers who’ve done it before Videos Quick wins and deep dives to help you monetize better Customers Pricing Log In Close Log In Open Log In Seller login Manage your products, plans & pricing, customers, affiliates, reviews, etc. Buyer login Manage your profile, websites, downloads, licenses, invoices, subscriptions, etc. Start \n","type":"text"}]}✓$ cd /tmp && for u in "https://freemius.com/help/documentation/wordpress-sdk/" "https://freemius.com/help/getting-started/"; do echo "===== $u ====="; curl -sSL -m 12 -A "Mozilla/5.0" -w "HTTP:%{http_co…✓└{"content":[{"text":"===== https://freemius.com/help/documentation/wordpress-sdk/ =====\nHTTP:200\nExploring the Freemius WordPress SDK | Freemius Developer Doc…ctrl+o
cd /tmp && for u in "https://freemius.com/help/documentation/wordpress-sdk/" "https://freemius.com/help/getting-started/"; do echo "===== $u ====="; curl -sSL -m 12 -A "Mozilla/5.0" -w "HTTP:%{http_code}\n" -o page.html "$u" 2>&1 | tail -1; python3 -c "
import re,html,sys
t=open('/tmp/page.html',encoding='utf-8',errors='ignore').read()
t=re.sub(r'(?is)<(script|style|svg).*?</\1>',' ',t)
t=re.sub(r'(?s)<[^>]+>',' ',t); t=html.unescape(t)
t=re.sub(r'[ \t]+',' ',t); t=re.sub(r'\n\s*\n+','\n',t)
print(t.strip()[:1500])
"; done
{"content":[{"text":"===== https://freemius.com/help/documentation/wordpress-sdk/ =====\nHTTP:200\nExploring the Freemius WordPress SDK | Freemius Developer Documentation \n Skip to main content Log in Start selling Docs All SaaS & Apps WordPress Get Started API Reference FAQ Getting Started Selling with Freemius Checkout Setup for SaaS & Apps Build with AI SDKs & Starter Kits Setup for WordPress WordPress SDK Integration Features Customization Testing Debugging Known License Activation Issues Safe Mode & Clone Resolution Contributing to the SDK Setup for Templates Analytics Customer Portal Release Management Emails Marketing Automation Affiliate Platform 3rd Party Integrations Security Migration API Reference Home Docs WordPress WordPress SDK Exploring the Freemius WordPress SDK Copy page The WordPress SDK enables plugin and theme developers to integrate their products with Freemius and work with WordPress sites seamlessly. \n The SDK provides a powerful set of features that allow you to manage your product's licensing, account management, and in-dashboard upgrade/pricing pages, among other functionalities. The SDK ensures that only authorized users can access premium features while free users can upgrade. \n This tool is core to Freemius, enabling a natural workflow of development and release cycles for both free and premium versions of your product. \n This guide provides context about the Freemius WordPress SDK integrated into your WordPress plugin, theme, or addon. It explains the integration process , various features , customizations , and testing & debugging tools to e\n===== https://freemius.com/help/getting-started/ =====\nHTTP:200\nGetting Started with Freemius | Freemius Developer Documentation \n Skip to main content Log in Start selling Docs All SaaS & Apps WordPress Get Started API Reference FAQ Getting Started Creating an Account Integrating your First product Making Your First Sale Explore the Developer Dashboard Explore the Customer Portal Our Pricing WordPress & Templates Pricing Where to Get Help Advanced Topics Selling with Freemius Checkout Setup for SaaS & Apps Build with AI SDKs & Starter Kits Setup for WordPress WordPress SDK Setup for Templates Analytics Customer Portal Release Management Emails Marketing Automation Affiliate Platform 3rd Party Integrations Security Migration API Reference Home Docs Getting Started Previous Section Freemius Slack Useful Resources Freemius Slack Useful Resources A Final Word Getting Started with Freemius Copy page Please accept our warmest welcome to Freemius! \n You're probably here because you're interested in selling software products such as SaaS, WordPress plugins or themes through Freemius. \n Our goal is to help your business grow as much as possible by eliminating all the complexities of licensing, payments, subscriptions, and more from selling your software products, leaving you with more time to focus on product development and marketing. \n We believe in our platform 200% and are extremely proud of the results we achieve for various software businesses. Many of the makers on our platform end up seeing 2X (or greater) increases in revenue within just\n","type":"text"}]}›Thinking…
The pricing page HTML got cut off before actual pricing numbers. Let me get the actual pricing details from the "Our Pricing" docs page.
Let me fetch the pricing docs page.
Let me pull the actual pricing numbers from their pricing docs page rather than the marketing nav.
✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" -o p2.html "https://freemius.com/help/getting-started/pricing/" -w "HTTP:%{http_code}\n"; python3 -c "✓└{"content":[{"text":"HTTP:200\nOur Pricing WordPress & Templates Pricing Where to Get Help Advanced Topics Selling with Freemius Checkout Setup for SaaS & Apps …ctrl+o
cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" -o p2.html "https://freemius.com/help/getting-started/pricing/" -w "HTTP:%{http_code}\n"; python3 -c "
import re,html
t=open('/tmp/p2.html',encoding='utf-8',errors='ignore').read()
t=re.sub(r'(?is)<(script|style|svg).*?</\1>',' ',t)
t=re.sub(r'(?s)<[^>]+>',' ',t); t=html.unescape(t)
t=re.sub(r'[ \t]+',' ',t); t=re.sub(r'\n\s*\n+','\n',t)
i=t.find('Our Pricing')
print(t[i:i+4000] if i>0 else t[:4000])
"
{"content":[{"text":"HTTP:200\nOur Pricing WordPress & Templates Pricing Where to Get Help Advanced Topics Selling with Freemius Checkout Setup for SaaS & Apps Build with AI SDKs & Starter Kits Setup for WordPress WordPress SDK Setup for Templates Analytics Customer Portal Release Management Emails Marketing Automation Affiliate Platform 3rd Party Integrations Security Migration API Reference Home Docs Getting Started Previous Section Freemius Slack Useful Resources Freemius Slack Useful Resources A Final Word Getting Started with Freemius Copy page Please accept our warmest welcome to Freemius! \n You're probably here because you're interested in selling software products such as SaaS, WordPress plugins or themes through Freemius. \n Our goal is to help your business grow as much as possible by eliminating all the complexities of licensing, payments, subscriptions, and more from selling your software products, leaving you with more time to focus on product development and marketing. \n We believe in our platform 200% and are extremely proud of the results we achieve for various software businesses. Many of the makers on our platform end up seeing 2X (or greater) increases in revenue within just one year after starting to sell with Freemius because of all the automated tools we offer in the Developer Dashboard, like Cart Abandonment Recovery (which is just the tip of the iceberg!). \n We constantly optimize all aspects of the platform to maximize conversion rates and increase your sales, so you don't have to! Why? We only make money when you make money, so we genuinely care about the success of your business, and we do our best to help you increase your sales. \n This guide is intended to quickly get you up to speed getting started with Freemius and integrating our SDK into your software. \n Freemius Slack \n When you're ready, feel free to join our Freemius Slack community. You'll find an invitation waiting in the Developer Dashboard after signing up for an account and adding your first product. \n This Freemius Slack is an invite-only community of 2,000+ of other product makers just like you who are all learning and sharing ideas about the best practices for growing their product businesses. You can tap into the #integration and #community-support channels to ask questions about integrating your product and using the platform. \n We are also always here to help, so if you ever get stuck, just reach out and we'll get you back on track as soon as possible! You might get your answer faster in the #community-support channel of the Freemius Slack though, as there are many active makers on a daily basis. \n Useful Resources \n Here are some useful links to Freemius resources you can use for reference. \n Freemius FAQ \n Documentation Home \n SaaS SDK \n WordPress SDK \n PHP API Client \n System Status \n Freemius API reference \n Freemius on GitHub \n Come find us on social media and say hello! \n YouTube \n X / Twitter \n LinkedIn \n Facebook \n Instagram \n A Final Word \n We're here to help . \n If you're still struggling and in need of assistance, then please let us know . Help us keep improving this guide for you and other Freemius makers. \n We want you to get the most out of Freemius, and we hope this guide helps you take that first step. We're confident that Freemius will enable you to grow your software products business in new and exciting ways. \n Welcome to the start of a fantastic new journey! Still stuck? How can we help? Are you AI Agent? Read markdown source or llms.txt Articles Creating an Account Integrating your First product Making Your First Sale Explore the Developer Dashboard Explore the Customer Portal Our Pricing WordPress & Templates Pricing Where to Get Help Advanced Topics Creating an Account On this page: Freemius Slack Useful Resources A Final Word Subscribe to our newsletter Subscribe © Freemius. All rights reserved GitHub YouTube X LinkedIn Facebook Instagram Features ▼ Subscriptions Checkout Customer portal Software licensing Cart abandonment recovery \n","type":"text"}]}✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" -o p3.html "https://freemius.com/pricing/" ; python3 -c "✓└{"content":[{"text":"- 3 Subscriptions-first approach for a sustainable revenue stream Recurring billing options strengthen customer relationships by encouragin…ctrl+o
cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" -o p3.html "https://freemius.com/pricing/" ; python3 -c "
import re,html
t=open('/tmp/p3.html',encoding='utf-8',errors='ignore').read()
t=re.sub(r'(?is)<(script|style|svg|noscript).*?</\1>',' ',t)
t=re.sub(r'(?s)<[^>]+>',' ',t); t=html.unescape(t)
t=re.sub(r'[ \t]+',' ',t); t=re.sub(r'\n\s*\n+','\n',t)
for m in re.finditer(r'[^.\n]*\b(free|%|commission|revenue|7%|monthly|per month|\\\$[0-9])\b[^.\n]*',t,re.I):
s=m.group(0).strip()
if 20<len(s)<260: print('-',s)
" | sort -u | head -40
{"content":[{"text":"- 3 Subscriptions-first approach for a sustainable revenue stream Recurring billing options strengthen customer relationships by encouraging ongoing engagement and retention\n- 5 Let customers try before they buy Set up free trials for 7, 14, or 30 days, and offer a money-back guarantee to build trust and help customers feel at ease when they purchase\n- 9 Tap into new revenue opportunities with affiliate marketing Reward loyal customers by letting them earn income by promoting your software products\n- Accept Learn More about Freemius' cookie policy Reject Monthly gross Progressive rev-share * 0 - $50,000 4\n- How much revenue do I have to generate before I get paid? The minimum account balance required for payout is $100\n- Plus, with recurring subscriptions billing, makers can easily manage and grow revenue without any extra (manual) hassle\n- We’ve seen this feature alone increase revenue by 7\n- With Freemius handling the complexities of subscription management behind the scenes , you can focus on scaling your business while ensuring a steady, long-term source of revenue\n","type":"text"}]}›Thinking…
Found "Monthly gross Progressive rev-share * 0 - $50,000 4" — that's truncated. Let me get the full pricing table. Let me extract the pricing tiers more carefully.
The docs mention "Are you AI Agent? Read markdown source or llms.txt" — that's a great hint! Let me fetch llms.txt and the markdown source of the pricing page.
Their docs explicitly advertise an llms.txt / markdown source for AI agents. Let me use that — much cleaner than HTML scraping.
✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" -w "\nHTTP:%{http_code}\n" "https://freemius.com/help/llms.txt" -o llms.txt; head -60 llms.txt; echo "=== size: $(wc -l < llms.txt) lines ==="✓└{"content":[{"text":"\nHTTP:200\n# Freemius Developer Documentation\n\n> Technical guides, API reference, and answers for integrating Freemius to sell and monet…ctrl+o
{"content":[{"text":"\nHTTP:200\n# Freemius Developer Documentation\n\n> Technical guides, API reference, and answers for integrating Freemius to sell and monetize SaaS applications, software, WordPress plugins and themes, and digital products.\n\n\n## help\n\n\n### Documentation & Guides\n\n\n#### affiliate-platform\n\nFreemius offers a free, out-of-the-box affiliate solution for your sales needs. Check out the details here.\n\n- [Affiliate Platform](https://freemius.com/help/documentation/affiliate-platform.md): Freemius offers a free, out-of-the-box affiliate solution for your sales needs. Check out the details here.\n- [Giving Coupons to Your Affiliates to Boost Promotions](https://freemius.com/help/documentation/affiliate-platform/affiliate-coupon.md): Learn how to create and assign coupons to your affiliates in the Freemius Developer Dashboard to help them promote your products effectively.\n- [Activating The Affiliate Program](https://freemius.com/help/documentation/affiliate-platform/affiliate-program-activation.md): Activate the affiliate program in your Freemius Dashboard with easy instructions. Learn more here.\n- [Affiliate Terms Customization](https://freemius.com/help/documentation/affiliate-platform/affiliate-terms-customization.md): Customize affiliate terms easily for each partner. Just scroll to the affiliate's details and toggle the Customize Terms switch.\n- [Known Affiliate Link Issues](https://freemius.com/help/documentation/affiliate-platform/known-affiliate-link-issues.md): Discover the common affiliate link issues and learn about the solutions here.\n- [Onboarding Affiliate Marketers](https://freemius.com/help/documentation/affiliate-platform/onboarding-affiliate-marketers.md): Step-by-step instructions to onboard affiliate marketers for your products in your Freemius Developer Dashboard.\n- [Paying Affiliates Commission](https://freemius.com/help/documentation/affiliate-platform/paying-affiliates-commission.md): Learn how to manage monthly affiliate commission payouts with Freemius.\n\n#### ai\n\nUse Freemius tools and integrations to build and monetize AI-powered products with LLMs and AI agents.\n\n- [Build with LLMs, AI Coding Agents and No-Code Platforms](https://freemius.com/help/documentation/ai.md): Use Freemius tools and integrations to build and monetize AI-powered products with LLMs and AI agents.\n- [Integrate Freemius Billing and Monetization with Antigravity CLI](https://freemius.com/help/documentation/ai/antigravity-cli.md): Learn how to use Antigravity CLI to integrate Freemius checkout, entitlements, and customer portal monetization into your SaaS product.\n- [Bolt Integration Guide with Freemius](https://freemius.com/help/documentation/ai/bolt.md): Learn how to easily integrate Freemius Monetization with your apps and SaaS built on Bolt.new with a single prompt to your AI agent.\n- [Integrate Freemius Billing and Monetization with Claude Code](https://freemius.com/help/documentation/ai/claude.md): Learn how to use Claude Code to integrate Freemius checkout, entitlements, and customer portal monetization into your SaaS product.\n- [Integrate Freemius Billing and Monetization with ChatGPT Codex](https://freemius.com/help/documentation/ai/codex.md): Learn how to use ChatGPT Codex to integrate Freemius checkout, entitlements, and customer portal monetization into your SaaS product.\n- [Integrate Freemius Billing and Monetization with Command Code](https://freemius.com/help/documentation/ai/command-code.md): Learn how to use Command Code to integrate Freemius checkout, entitlements, and customer portal monetization into your SaaS product.\n- [Integrate Freemius Billing and Monetization with Cursor](https://freemius.com/help/documentation/ai/cursor.md): Learn how to use Cursor to integrate Freemius checkout, entitlements, and customer portal monetization into your SaaS product.\n- [Lovable Integration Guide with Freemius](https://freemius.com/help/documentation/ai/lovable.md): Learn how to easily integrate Freemius Monetization with your apps and SaaS built on Lovable.dev with a single prompt to your AI agent.\n- [Integrate Freemius Billing and Monetization with OpenCode](https://freemius.com/help/documentation/ai/opencode.md): Learn how to use OpenCode to integrate Freemius checkout, entitlements, and customer portal monetization into your SaaS product.\n- [Integrate Freemius Billing and Monetization with AI Agent Skills](https://freemius.com/help/documentation/ai/skills.md): Learn how to install Freemius AI Agent Skills and use Claude Code, Codex, Cursor, and other AI coding agents to integrate checkout, entitlements, and customer portal monetization into your SaaS.\n- [Sticklight Integration Guide with Freemius](https://freemius.com/help/documentation/ai/sticklight.md): Learn how to easily integrate Freemius Monetization with your apps and SaaS built on Sticklight.com with a single prompt to your AI agent.\n\n#### analytics\n\nFreemius comes with smart analytics bundled in to make your product development and marketing more efficient and logical. Learn more here.\n\n- [Sales and Usage Analytics with Freemius](https://freemius.com/help/documentation/analytics.md): Freemius comes with smart analytics bundled in to make your product development and marketing more efficient and logical. Learn more here.\n- [Audience Analytics](https://freemius.com/help/documentation/analytics/audience.md): Explore the Freemius Analytics Dashboard for user behavior and demographics data visualization.\n- [Calculating Churn Rate](https://freemius.com/help/documentation/analytics/calculating-churn-rate.md): Learn how to calculate churn rate effectively using data from Freemius using customer cancellations, optimize retention & subscription churn.\n- [Sales Analytics](https://freemius.com/help/documentation/analytics/sales.md): Discover the Freemius Analytics Dashboard for sales performance data visualization.\n- [User & Websites Data](https://freemius.com/help/documentation/analytics/user-data.md): Unlock data-driven decisions for your WordPress products with Freemius Insights advanced analytics. Learn more here.\n- [User Feedback](https://freemius.com/help/documentation/analytics/user-feedback.md): Freemius helps you understand your users' opinions with a user-friendly, non-intrusive deactivation feedback form. Now it's easier and cheaper to retain a user.\n\n#### checkout\n\nThe Freemius Checkout is a secure, embeddable checkout solution crafted to help software makers sell their products effortlessly. Whether you are selling SaaS, WordPress plugins, desktop apps, or web browser extensions, Freemius offers a seamless and secure payment experience for your customers, accepting global payments without writing custom code.\n\n- [Checkout](https://freemius.com/help/documentation/checkout.md): The Freemius Checkout is a secure, embeddable checkout solution crafted to help software makers sell their products effortlessly. Whether you are selling SaaS, WordPress plugins, desktop apps, or web browser extensions, Freemius offers a seamless and secure payment experience for your customers, accepting global payments without writing custom code.\n- [Customization of the Freemius Checkout](https://freemius.com/help/documentation/checkout/customization.md): Explore various ways to customize the Freemius checkout to align with your brand and enhance user experience.\n- [Customize Checkout Style with CSS](https://freemius.com/help/documentation/checkout/customization/applying-css-customization.md): How to apply CSS customization to Freemius Checkout\n- [Customizing the After Purchase Confirmation Dialog](https://freemius.com/help/documentation/checkout/customization/customizing-confirmation-dialog.md): Customize what is shown in the confirmation dialog after a successful purchase.\n- [The Freemius Checkout Features](https://freemius.com/help/documentation/checkout/features.md): Explore the powerful features of the Freemius checkout\n- [How Automatic Discounts Work in the Checkout](https://freemius.com/help/documentation/checkout/features/automatic-discounts-in-checkout.md): The Freemius guide on how automatic discounts calculated dynamically based on product pricing and configurations are applied during checkout\n=== size: 506 lines ===\n","type":"text"}]}✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" -o p4.html "https://freemius.com/pricing/"; python3 -c "✓└{"content":[{"text":"dPress Solution Pricing\n.\nSubscribe to our newsletter\n email \nSubscribe\n© Freemius. All rights reserved\nGithub\nYoutube\nX-twitter\nL…ctrl+o
cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" -o p4.html "https://freemius.com/pricing/"; python3 -c "
import re,html
t=open('/tmp/p4.html',encoding='utf-8',errors='ignore').read()
t=re.sub(r'(?is)<(script|style|svg|noscript).*?</\1>',' ',t)
t=re.sub(r'(?s)<[^>]+>','\n',t); t=html.unescape(t)
t=re.sub(r'[ \t]+',' ',t); t=re.sub(r'\n\s*\n+','\n',t)
i=t.lower().find('rev-share')
print(t[max(0,i-1200):i+1500] if i>0 else 'not found')
"
{"content":[{"text":"dPress Solution Pricing\n.\nSubscribe to our newsletter\n email \nSubscribe\n© Freemius. All rights reserved\nGithub\nYoutube\nX-twitter\nLinkedin\nFacebook\nInstagram\nFeatures\n Subscriptions \n Checkout \n Customer portal \n Software licensing \n Tax Compliance \n Cart abandonment recovery \n Affiliate platform \nBuild with AI\n AI Integrations \n llms-full.txt \n llms.txt \n OpenAPI \nCompliance\n GDPR readiness \n US Sales Tax \n EU VAT collection \n SCA & 3DS 2.0 \nCompare with\n Stripe \n Paddle \n Lemon Squeezy \n Polar \n PayPro Global \n Envato \n Easy Digital Downloads \n WooCommerce \nCompany\n About us \n Pricing \n Customers \n Careers \n Brand assets \n Contact \nLearn\n AI Agent Skills \n Selling WordPress plugins \n Blog \n Plugin.fm podcast \n YouTube \nHelpful Links\n FAQ \n Documentation \n WordPress SDK \n PHP SDK \n System Status \n Change log \n Migrate to Freemius \nLegal\n Terms of service \n Vendor terms \n Privacy policy \n Cookie policy \n We use essential cookies to enable our site to function. With your consent, we also use analytics and advertising cookies to understand how visitors interact with our site and to improve our services.\nAccept\nLearn More \nabout Freemius' cookie policy\nReject\nMonthly gross\nProgressive rev-share *\n0 - $50,000\n4.7%\n$50,000 - $60,000\n4.5%\n$60,000 - $70,000\n4.0%\n$70,000 - $80,000\n3.0%\n$80,000 - $90,000\n2.0%\n$90,000 - $100,000\n1.0%\n$100,000 +\n0.5%\n* For example, if you earn $67k in a given month, the first $50k is subject to a 4.7% share, the next $10k to a 4.5% share, and the remaining $7k to a 4.0% share.\nCopy Logo as SVG\nDownload Logo PNG\nDownload Brand kit\nSprzedajesz SaaS w Polsce?\nObsłuż KSeF\n\n","type":"text"}]}›Thinking…
Now I have the real pricing. Freemius uses a progressive revenue share:
- 0 - $50,000: 4.7%
- $50,000 - $60,000: 4.5%
- $60,000 - $70,000: 4.0%
- $70,000 - $80,000: 3.0%
- $80,000 - $90,000: 2.0%
- $90,000 - $100,000: 1.0%
- $100,000+: 0.5%
Wait, but that seems low compared to what I remember (Freemius used to be 7%). This is the current published pricing — "Progressive rev-share". Let me also check the WordPress & Templates pricing, since it might differ.
Also I notice there's an "AI Agent Skills" page and "llms-full.txt" and "OpenAPI". Interesting — Freemius has explicit AI-agent integration docs! Let me check the "skills" doc, since that's directly relevant to "will this product be easy for you to manage."
Let me fetch:
- The WordPress & Templates pricing (may differ)
- The AI skills doc
- The minimum payout info
Let me also check the pricing .md source for accuracy.
Important: I should also check whether there's a free tier / whether the rev-share covers payment processing. Let me get the pricing .md.
Let me fetch these in parallel.
Found the real pricing table. Note there's a separate "WordPress & Templates Pricing" and an "AI Agent Skills" doc — both directly relevant. Let me pull the markdown sources.
✓$ cd /tmp && grep -iE "pricing|skills|wordpress-sdk|openapi" llms.txt | head -30✓└{"content":[{"text":"- [Integrate Freemius Billing and Monetization with AI Agent Skills](https://freemius.com/help/documentation/ai/skills.md): Learn how to in…ctrl+o
{"content":[{"text":"- [Integrate Freemius Billing and Monetization with AI Agent Skills](https://freemius.com/help/documentation/ai/skills.md): Learn how to install Freemius AI Agent Skills and use Claude Code, Codex, Cursor, and other AI coding agents to integrate checkout, entitlements, and customer portal monetization into your SaaS.\n- [How Automatic Discounts Work in the Checkout](https://freemius.com/help/documentation/checkout/features/automatic-discounts-in-checkout.md): The Freemius guide on how automatic discounts calculated dynamically based on product pricing and configurations are applied during checkout\n- [Our Pricing](https://freemius.com/help/documentation/getting-started/our-pricing.md): Get to know what it will cost to use Freemius before making your first sale. With Freemius’ revenue-sharing model, pay when you make your first sale\n- [WordPress & Templates Pricing](https://freemius.com/help/documentation/getting-started/saas-vs-wordpress-pricing.md): Learn about the differences between our SaaS & Software and WordPress & Templates pricing plans to choose the right one for your business.\n- [Setup Plans & Pricing to Support Subscriptions and One-Off Purchases](https://freemius.com/help/documentation/saas/saas-plans-pricing.md): Learn how to configure pricing plans for your users, each with distinct billing cycles, prices, unit counts (e.g., seats, devices, credits), currencies, and feature sets.\n- [Setup Product, Plans & Pricing](https://freemius.com/help/documentation/selling-templates/templates-plans-pricing.md): Learn how to set up templates and kits for sale using Freemius.\n- [Setting up Coupon Discounts with Configurable Segments, Types & Plans](https://freemius.com/help/documentation/selling-with-freemius/coupon-discount.md): Configure coupon discounts in Freemius: lifespan, types, renewals, plans, pricings, billing cycles, and eligibility.\n- [Multi-Currency Pricing & Support](https://freemius.com/help/documentation/selling-with-freemius/multi-currency.md): Learn how to boost your plugin or theme sales with multi-currency pricing and support on Freemius. Discover how to customize your currency options.\n#### wordpress-sdk\n- [Exploring the Freemius WordPress SDK](https://freemius.com/help/documentation/wordpress-sdk.md): Learn how the Freemius WordPress SDK features work including Opt-in screen customization, licensing handling, localization, testing, and debugging\n- [Customizing the Freemius WordPress SDK Integration](https://freemius.com/help/documentation/wordpress-sdk/customization.md): Customize the Freemius WordPress SDK integration in your plugin, theme, or addon to features in the Freemius platform.\n- [Customizing the Freemius WordPress SDK Integration with Constants](https://freemius.com/help/documentation/wordpress-sdk/customization/constants.md): Customize the Freemius WordPress SDK integration with constants in your plugin, theme, or addon to features in the Freemius platform.\n- [Filters & Actions Hooks](https://freemius.com/help/documentation/wordpress-sdk/customization/filters-actions-hooks.md): The Freemius SDK collection of filters and actions enables developers to customize and extend the functionality of their WordPress plugins or themes.\n- [Explore Gists to customize the Freemius WordPress SDK](https://freemius.com/help/documentation/wordpress-sdk/customization/gists.md): Explore various code snippets and gists for customizing the Freemius WordPress SDK.\n- [Customize the Opt-in and License activation Screens](https://freemius.com/help/documentation/wordpress-sdk/customization/opt-in-screen.md): Customize the opt-in and License activation Screens of your WordPress plugin or theme integrated with the Freemius SDK to match your product's style and audience.\n- [Tabs Navigation](https://freemius.com/help/documentation/wordpress-sdk/customization/tabs-navigation.md): If you are worried about cluttering the WordPress admin menu, you can easily change the default navigation by implementing navigational tabs at the top of your plugin settings page.\n- [Customize the Text & Strings in the Freemius WordPress SDK](https://freemius.com/help/documentation/wordpress-sdk/customization/text-strings-customization.md): Learn how to customize the text and strings used in the Freemius WordPress SDK.\n- [Debugging issues with the Freemius WordPress SDK](https://freemius.com/help/documentation/wordpress-sdk/debugging.md): Enable and use the Freemius WordPress SDK debugging tools to troubleshoot and ensure a smooth integration process.\n- [Understanding the Freemius WordPress SDK Features](https://freemius.com/help/documentation/wordpress-sdk/features.md): Learn about the features of the Freemius WordPress SDK and how they can be used to enhance your plugin, theme, or addon integration with the Freemius platform.\n- [Have Your Customers Reach You in their WordPress Admin](https://freemius.com/help/documentation/wordpress-sdk/features/contacts.md): Enable the Contact Us page in the Freemius WordPress SDK to allow your customers to easily reach out to you for support directly from their WordPress admin dashboard.\n- [Exploring the Activation Screen](https://freemius.com/help/documentation/wordpress-sdk/features/opt-in-screen.md): Explore the opt-in screen and activation screen of your WordPress plugin or theme integrated with the Freemius SDK\n- [Manage your Freemius account from the WordPress Admin](https://freemius.com/help/documentation/wordpress-sdk/features/wp-admin-account.md): Manage your Freemius account directly from the WordPress Admin dashboard with the Freemius SDK.\n- [In-dashboard Upgrading in WP Admin](https://freemius.com/help/documentation/wordpress-sdk/features/wp-admin-in-dashboard-upgrading.md): When you integrate Freemius’ WordPress SDK into your plugin or theme, the free version automatically includes a pricing table and a purchase button, enabling customers to purchase directly from their WP Admin dashboard. We call this In-Dashboard Upgrading.\n- [Contributing to the Freemius WordPress SDK](https://freemius.com/help/documentation/wordpress-sdk/freemius-sdk-contribute.md): A guide to contributing to the Freemius WordPress SDK codebase via GitHub.\n- [How the Freemius WordPress SDK Integration Works](https://freemius.com/help/documentation/wordpress-sdk/integration.md): Learn how to integrate the Freemius WordPress SDK into your plugin, theme, or addon.\n- [Integrate your Gutenberg Blocks with Freemius](https://freemius.com/help/documentation/wordpress-sdk/integration/gutenberg-block-integration.md): Integration Freemius with your Gutenberg Blocks made for the WordPress Block Editor.\n- [Understanding the Integration Snippet](https://freemius.com/help/documentation/wordpress-sdk/integration/integration-snippet.md): Learn about the SDK integration snippet, how to add it to your WordPress product, and how to configure it for optimal performance.\n- [Integrating WordPress Products for Multisites Networks](https://freemius.com/help/documentation/wordpress-sdk/integration/multisite-integration.md): Learn how to integrate the Freemius WordPress SDK into a multisite network environment, ensuring that your products function correctly across all sites in the network.\n- [Control Free and Premium WordPress Features with Freemius Licensing](https://freemius.com/help/documentation/wordpress-sdk/integration/software-licensing.md): Learn how to handle licensing in your WordPress plugin or theme with the Freemius SDK.\n- [Updating the Freemius WordPress SDK](https://freemius.com/help/documentation/wordpress-sdk/integration/updating-wp-sdk.md): Learn when and how to update the Freemius WordPress SDK included in your WordPress plugin or theme.\n","type":"text"}]}✓$ cd /tmp && for u in "https://freemius.com/help/getting-started/pricing.md" "https://freemius.com/help/documentation/ai/skills.md"; do echo "########## $u"; curl -sSL -m 15 -A "Mozilla/5.0" "$u" 2>&1 |…✓└{"content":[{"text":"########## https://freemius.com/help/getting-started/pricing.md\n<!doctype html>\n<html lang=\"en\" dir=\"ltr\" class=\"docs-wrapper plugin…ctrl+o
cd /tmp && for u in "https://freemius.com/help/getting-started/pricing.md" "https://freemius.com/help/documentation/ai/skills.md"; do echo "########## $u"; curl -sSL -m 15 -A "Mozilla/5.0" "$u" 2>&1 | head -c 3500; echo; done
{"content":[{"text":"########## https://freemius.com/help/getting-started/pricing.md\n<!doctype html>\n<html lang=\"en\" dir=\"ltr\" class=\"docs-wrapper plugin-docs plugin-id-default docs-version-current docs-doc-page docs-doc-id-getting-started/index\" data-has-hydrated=\"false\">\n<head>\n<meta charset=\"UTF-8\">\n<meta name=\"generator\" content=\"Docusaurus v3.10.2\">\n<title data-rh=\"true\">Getting Started with Freemius | Freemius Developer Documentation</title><meta data-rh=\"true\" name=\"viewport\" content=\"width=device-width,initial-scale=1\"><meta data-rh=\"true\" name=\"twitter:card\" content=\"summary_large_image\"><meta data-rh=\"true\" property=\"og:url\" content=\"https://freemius.com/help/documentation/getting-started/\"><meta data-rh=\"true\" property=\"og:locale\" content=\"en\"><meta data-rh=\"true\" name=\"docusaurus_locale\" content=\"en\"><meta data-rh=\"true\" name=\"docsearch:language\" content=\"en\"><meta data-rh=\"true\" name=\"docusaurus_version\" content=\"current\"><meta data-rh=\"true\" name=\"docusaurus_tag\" content=\"docs-default-current\"><meta data-rh=\"true\" name=\"docsearch:version\" content=\"current\"><meta data-rh=\"true\" name=\"docsearch:docusaurus_tag\" content=\"docs-default-current\"><meta data-rh=\"true\" property=\"og:title\" content=\"Getting Started with Freemius | Freemius Developer Documentation\"><meta data-rh=\"true\" name=\"description\" content=\"Discover the essential steps to begin selling your WordPress plugins or themes on Freemius. Click here to get started.\"><meta data-rh=\"true\" property=\"og:description\" content=\"Discover the essential steps to begin selling your WordPress plugins or themes on Freemius. Click here to get started.\"><link data-rh=\"true\" rel=\"preload\" href=\"/help/assets/fonts/ApfelGrotezk-Regular-7963a445bf9f3daedbcf71eb7820ba7e.woff2\" as=\"font\" type=\"font/woff2\" crossorigin=\"anonymous\"><link data-rh=\"true\" rel=\"preload\" href=\"/help/assets/fonts/Freemius-Medium-9da72a58c075fb2dae560ba199f0fd0f.woff2\" as=\"font\" type=\"font/woff2\" crossorigin=\"anonymous\"><link data-rh=\"true\" rel=\"icon\" href=\"/help/img/favicon.ico\"><link data-rh=\"true\" rel=\"canonical\" href=\"https://freemius.com/help/documentation/getting-started/\"><link data-rh=\"true\" rel=\"alternate\" href=\"https://freemius.com/help/documentation/getting-started/\" hreflang=\"en\"><link data-rh=\"true\" rel=\"alternate\" href=\"https://freemius.com/help/documentation/getting-started/\" hreflang=\"x-default\"><script data-rh=\"true\" type=\"application/ld+json\">{\"@context\":\"https://schema.org\",\"@type\":\"BreadcrumbList\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Getting Started\",\"item\":\"https://freemius.com/help/documentation/getting-started/\"}]}</script><link rel=\"preconnect\" href=\"https://analytics.ahrefs.com\">\n<script async src=\"https://analytics.ahrefs.com/analytics.js\" data-key=\"KweC7pc5s6RH+3iz/KvSJg\"></script>\n\n\n\n\n<script>try{/(?:^|;\\s*)__fs_allow_cookies=(?:true|false|soft)(?:;|$)/.test(document.cookie)&&document.documentElement.setAttribute(\"data-fs-consent-recorded\",\"\")}catch{}</script>\n<script type=\"application/ld+json\">{\"@context\":\"https://schema.org/\",\"@type\":\"Organization\",\"name\":\"Freemius\",\"url\":\"https://freemius.com/\",\"logo\":\"https://freemius.com/help/img/freemius-logo.svg\",\"sameAs\":[\"https://x.com/freemius\",\"https://www.facebook.com/freemius\",\"https://www.instagram.com/freemius/\",\"https://www.youtube.com/freemius\",\"https://www.linkedin.com/company/freemius/\",\"https://bsky.app/profile/freemius.com\"]}</script><link rel=\"stylesheet\" href=\"/help/assets/css/styles.610a97d1.css\">\n<script src=\"/help/assets/js/runtime~main.abd5bd15.js\" defer=\"defer\"></script>\n<script src=\"/help/\n########## https://freemius.com/help/documentation/ai/skills.md\n# Integrate Freemius Billing and Monetization with AI Agent Skills\n\nFreemius AI [Agent Skills](https://agentskills.io/home) are a set of instructions that can be used by AI agents to understand how to integrate Freemius into your SaaS product, use its various features, and leverage it to monetize your application.\n\nIf you are using any AI coding agents, assistants, or harnesses, such as [Claude Code](https://claude.com/product/claude-code), [ChatGPT Codex](https://chatgpt.com/codex/), [Cursor](https://cursor.com/), [OpenCode](https://opencode.ai/), [Command Code](https://commandcode.ai/), and [Antigravity CLI](https://antigravity.google/product/antigravity-cli), you can use these skills to integrate Freemius into your product and start monetizing your application in minutes.\n\n## Included Features[](#included-features \"Direct link to Included Features\")\n\nThe skills are designed to make it easy to integrate Freemius monetization, checkout, entitlement, and customer portal features into your product. Once integrated successfully, your product gets the following capabilities out of the box:\n\n1. **Pricing Table**: Render rich pricing tables for processing subscriptions as well as one-time purchases.\n\n \n\n2. **Checkout**: Integrate a secure [checkout](https://freemius.com/help/help/documentation/checkout/.md) for payment processing and upgrade flow.\n\n \n\n3. **Entitlements**: Gate premium features behind a paywall and manage entitlements for your users from both the backend and frontend.\n\n \n\n4. **Customer Portal**: Allow your users to manage their subscriptions and billing information, view their purchases and payments, and upgrade or cancel their subscriptions.\n\n \n\nThe only requirement is that your backend is JavaScript-based, such as Node.js, Deno, or Bun.\n\n## Installing the Skills[](#installing-the-skills \"Direct link to Installing the Skills\")\n\nWe distribute and install Freemius AI skills through the standard, agent-agnostic [skills.sh](https://www.skills.sh/) platform.\n\n### Installation for Claude Code[](#installation-for-claude-code \"Direct link to Installation for Claude Code\")\n\nSince Claude Code does not support the native `.agents` directory, run the following command to install specifically for Claude Code:\n\n* npm\n* Yarn\n* pnpm\n* Bun\n\n```\nnpx skills add freemius/freemius-ai -a claude-code\n```\n\n```\nyarn dlx skills add freemius/freemius-ai -a claude-code\n```\n\n```\npnpm dlx skills add freemius/freemius-ai -a claude-code\n```\n\n```\nbun x skills add freemius/freemius-ai -a claude-code\n```\n\n### Installation for Codex, Cursor, and Other AI Agents[](#installation-for-codex-cursor-and-other-ai-agents \"Direct link to Installation for Codex, Cursor, and Other AI Agents\")\n\nFor ChatGPT Codex, Cursor, OpenCode, Command Code, Antigravity CLI, and other supported AI coding agents, run:\n\n* npm\n* Yarn\n* pnpm\n* Bun\n\n```\nnpx skills add freemius/freemius-ai\n```\n\n```\nyarn dlx skills add freemius/freemius-ai\n```\n\n```\npnpm dlx skills add \n","type":"text"}]}›Thinking…
Very important finding: There's a SaaS path with AI Agent Skills that works with a JavaScript backend (Node.js) — and Node.js v22 IS installed! That's a developer workflow I CAN act on.
The WordPress SDK path requires PHP + WordPress (blocked). But the SaaS path via AI Agent Skills uses Node.js — available.
Let me read the rest of the skills doc to understand requirements. Critically: does it require Freemius account credentials (public key / secret key)? Almost certainly yes. Let me check.
Let me read the full skills doc.
Significant finding: there's a SaaS path via AI Agent Skills that requires only a JavaScript backend (Node.js) — and Node v22 is installed here. That's a workflow I might be able to act on. Let me read the rest.
✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" "https://freemius.com/help/documentation/ai/skills.md" -o skills.md; echo "bytes: $(wc -c < skills.md)"; sed -n '60,200p' skills.md✓└{"content":[{"text":"bytes: 12475\nFor ChatGPT Codex, Cursor, OpenCode, Command Code, Antigravity CLI, and other supported AI coding agents, run:\n\n* npm\n* Ya…ctrl+o
{"content":[{"text":"bytes: 12475\nFor ChatGPT Codex, Cursor, OpenCode, Command Code, Antigravity CLI, and other supported AI coding agents, run:\n\n* npm\n* Yarn\n* pnpm\n* Bun\n\n```\nnpx skills add freemius/freemius-ai\n```\n\n```\nyarn dlx skills add freemius/freemius-ai\n```\n\n```\npnpm dlx skills add freemius/freemius-ai\n```\n\n```\nbun x skills add freemius/freemius-ai\n```\n\nThis works out of the box for most AI coding agents.\n\n\n\nJust be sure to pick your agent from the list when it asks.\n\nOpen Source\n\nThe skills are open source and can be found on our [GitHub repository](https://github.com/Freemius/freemius-ai).\n\nFreemius AI includes four skills aimed at complete end-to-end SaaS integration, covering monetization, checkout, entitlements, and customer portal workflows. Install all of them to get the full integration experience.\n\n## Setting Up Freemius Plans[](#setting-up-freemius-plans \"Direct link to Setting Up Freemius Plans\")\n\nThe skills ask the agent to read your Freemius product configuration and integrate based on it. For example, you might be selling only subscriptions or a combination of subscriptions and top-up credits.\n\nSo before running the skills, make sure you have your plans and pricing set up following our [documentation](https://freemius.com/help/help/documentation/saas/saas-plans-pricing/.md). For the rest of the documentation, we will assume that:\n\n1. You are selling subscriptions for continued access to your product through multiple plans, supporting only one subscription per user.\n\n \n\n2. **All plans have a defined feature list that the AI can use for entitlements**.\n\n \n\n3. You have a top-up plan for one time purchases of credits which can be used as balance for metered features or actions in your product.\n\n \n\nMore details about this setup can be found in our [documentation](https://freemius.com/help/help/documentation/saas/usage-based-billing-credits/.md).\n\nOnce you've set up your plans and pricing, go to the **Settings** → **API & Keys** and copy the `.env` file under the **Usage examples** and save it in your project root.\n\n\n\n## Integration Prompts[](#integration-prompts \"Direct link to Integration Prompts\")\n\nNow prompt your AI agent with a brief description of how you want to integrate Freemius into your product and gate premium features behind a paywall. For example, you can use the following prompt:\n\nprompt\n\n```\nIntegrate Freemius monetization in my software. I want to offer subscription with various plans for continued access and top up plans for purchasing additional credits. Use the relevant Freemius skils. The env file already has the secrets needed to connect with the Freemius platform. You can query the Freemius API directly with the Freemius JS SDK to figure out the pricing ID of relevant plans.\n```\n\nThe agent will use the skills and fetch your Freemius plans to integrate checkout, entitlements, and customer portal features into your product. It will also add the relevant code to your backend to handle entitlements and top-up credits.\n\nWe recommend explaining the product setup to the agent upfront to avoid confusion. For example, if you are selling only subscriptions with multiple plans, you can use the following prompt:\n\nprompt\n\n```\nIntegrate Freemius monetization in my software. I want to offer subscriptions with multiple plans. Use the relevant Freemius skils. The env file already has the secrets needed to connect with the Freemius platform. You can query the Freemius API directly with the Freemius JS SDK to figure out the pricing ID of relevant plans.\n```\n\nSimilarly if you are selling only top-up credits, you can use the following prompt:\n\nprompt\n\n```\nIntegrate Freemius monetization in my software. I want to offer top-up plans for purchasing additional credits. Use the relevant Freemius skils. The env file already has the secrets needed to connect with the Freemius platform. You can query the Freemius API directly with the Freemius JS SDK to figure out the pricing ID of relevant plans.\n```\n\nOnce the integration is complete, you should see the [features](#included-features) implemented based on your product setup and plans. The agent will also add or update the top-level `AGENTS.md` file with relevant instructions for future reference and for maintaining premium entitlement and paywall logic.\n\n## Setting Up the Checkout Redirection and Webhooks[](#setting-up-the-checkout-redirection-and-webhooks \"Direct link to Setting Up the Checkout Redirection and Webhooks\")\n\nOnce the agent has integrated Freemius, it may ask you to set up checkout redirection and webhooks. You can do this by going to **Settings** → **Checkout & Redirection** and **Settings** → **Webhooks** in your Freemius product dashboard. The agent will show detailed instructions on how to do this.\n\n## Test the Integration[](#test-the-integration \"Direct link to Test the Integration\")\n\nAfter the agent finishes, test the integration end-to-end and verify that it implemented all the [included features](#included-features) that apply to your product setup.\n\n1. **Pricing Table**: The agent should have added or updated a pricing page that displays the plans, prices, billing cycles, and features configured for your Freemius product. If your product offers top-up credits, verify that the relevant one-time purchase options also appear.\n2. **Checkout**: Starting a purchase from the pricing page should open Freemius Checkout with the correct plan and pricing selection. Complete a test purchase and confirm that the checkout redirection returns the user to your application.\n3. **Entitlements and Paywalls**: The agent should have added the backend and frontend logic required to protect premium features. Verify that a user without the required entitlement sees the appropriate paywall and cannot bypass it by calling a protected backend route directly. After a successful purchase, confirm that the user receives access to the purchased features.\n4. **Account Page and Customer Portal**: Based on your application's structure, the agent should have added or updated an account page to show relevant subscription, purchase, payment, or credit information. It should also provide access to the Freemius Customer Portal so users can manage their billing details and subscriptions.\n\nFinally, verify that webhook events update entitlements and account information correctly when a subscription is created, renewed, changed, canceled, or expired. The exact pages, components, and routes may differ depending on your application's framework and architecture.\n\n## Best Practices[](#best-practices \"Direct link to Best Practices\")\n\nWhen prompting your AI agent, we recommend the following best practices:\n\n* **Mention Freemius Skills**: Ask the agent to \"use the relevant Freemius skills\" to ensure it uses the correct skills for the integration.\n* **Specify the Monetization Model**: Clearly state the monetization model you want to implement (e.g., subscriptions, top-up credits, or both). This avoids confusion and helps the agent select the correct skills.\n* **Use Plan Mode**: For complex product setups, ask the agent to \"plan the integration\" first. You can then review the plan and ask the agent to implement the integration based on it.\n* **Mention the `.env` File**: Tell the agent that the `.env` file already contains the secrets required to connect to the Freemius platform. This helps the agent use the Freemius JS SDK to query the pricing IDs of the relevant plans.\n* **Protect the `.env` File**: Never commit the `.env` file to your repository because it contains sensitive information that should not be shared publicly. Use environment variables or a secure secrets management system to store and access API keys and other sensitive information.\n\n## Troubleshooting[](#troubleshooting \"Direct link to Troubleshooting\")\n\nIf something is not working as expected, you can use the `freemius-troubleshooting` skill to help the agent identify and fix the issue. Explain the problem to the agent and ask it to use the troubleshooting skill. For example, you can use the following prompt:\n\nprompt\n\n```\nUsers are not getting access after a successful Checkout. Troubleshoot the Freemius integration in my software.\n```\n\n## Updating the Skills[](#updating-the-skills \"Direct link to Updating the Skills\")\n\nBefore troubleshooting, we recommend updating the skills to the latest version by running the following command in your terminal.\n\n* npm\n* Yarn\n* pnpm\n* Bun\n\n```\nnpx skills update -y\n```\n\n```\nyarn dlx skills update -y\n```\n\n","type":"text"}]}›Thinking…
This confirms the hard blocker precisely. The official agent workflow is:
- You must create a Freemius account (human signup)
- You must configure plans & pricing in the dashboard (human, web UI)
- You must go to Settings → API & Keys and copy the generated
.envfile — this contains secrets only available after account creation - Then the agent uses the Freemius JS SDK to query pricing IDs
So: the .env with secrets is a hard prerequisite, generated only inside a human-created dashboard. There is no sandbox/demo credential, no trial key, no way for me to self-serve it.
Also note: the repo is empty — there's no existing SaaS app to integrate into either.
Let me verify there's genuinely no way to get credentials programmatically — check if the API has any unauthenticated/demo endpoint. And let me check the freemius-ai GitHub repo to see if there are any test/mock modes or sample keys.
Let me also check whether npm has a freemius JS SDK I could at least install and inspect (that's a legit "use the SDK" action).
Let me do these checks.
This pins down the exact blocker. Let me verify there's no sandbox/demo credential path and check what the JS SDK actually requires.
✓$ cd /tmp && echo "=== npm search ==="; npm view @freemius/sdk 2>&1 | head -20; echo "=== alt names ==="; for p in freemius freemius-js @freemius/js freemius-sdk; do printf "%-16s " "$p"; npm view "$p" …✓└{"content":[{"text":"=== npm search ===\n\n@freemius/sdk@0.5.0 | MIT | deps: 1 | versions: 12\nJS SDK for integrating your SaaS with Freemius\nhttp://freemius.c…ctrl+o
cd /tmp && echo "=== npm search ==="; npm view @freemius/sdk 2>&1 | head -20; echo "=== alt names ==="; for p in freemius freemius-js @freemius/js freemius-sdk; do printf "%-16s " "$p"; npm view "$p" version 2>&1 | head -1; done
{"content":[{"text":"=== npm search ===\n\n@freemius/sdk@0.5.0 | MIT | deps: 1 | versions: 12\nJS SDK for integrating your SaaS with Freemius\nhttp://freemius.com/help/documentation/saas-sdk/js-sdk/\n\nkeywords: node.js, freemius, sdk, saas\n\ndist\n.tarball: https://registry.npmjs.org/@freemius/sdk/-/sdk-0.5.0.tgz\n.shasum: ca9cdfa3f3ce209867032c66e26b705286ae8ea9\n.integrity: sha512-7zceSSqXo5BmhLnR/te2p8YNIQAq08ubQ3DtMPjWIn7Kpwy41kBg33u2jWz9Wagpi62QFyDhreKkenNmROZsqQ==\n.unpackedSize: 2.7 MB\n\ndependencies:\nopenapi-fetch: ^0.14.0\n\nmaintainers:\n- vovafeldman <svovaf@gmail.com>\n- swashata <swashata4u@gmail.com>\n\n=== alt names ===\nfreemius npm error code E404\nfreemius-js npm error code E404\n@freemius/js npm error code E404\nfreemius-sdk npm error code E404\n","type":"text"}]}✓$ cd /tmp && echo "=== freemius-ai repo ==="; curl -sSL -m 12 "https://api.github.com/repos/Freemius/freemius-ai" 2>&1 | python3 -c "import json,sys; d=json.load(sys.stdin); print({k:d.get(k) for k in […✓└{"content":[{"text":"=== freemius-ai repo ===\n{'full_name': 'Freemius/freemius-ai', 'description': 'Complete Freemius subscription integration guide with AI-re…ctrl+o
cd /tmp && echo "=== freemius-ai repo ==="; curl -sSL -m 12 "https://api.github.com/repos/Freemius/freemius-ai" 2>&1 | python3 -c "import json,sys; d=json.load(sys.stdin); print({k:d.get(k) for k in ['full_name','description','default_branch','stargazers_count','message']})" 2>&1; echo "=== tree ==="; curl -sSL -m 12 "https://api.github.com/repos/Freemius/freemius-ai/git/trees/main?recursive=1" 2>&1 | python3 -c "import json,sys; d=json.load(sys.stdin); [print(t['path']) for t in d.get('tree',[])]" 2>&1 | head -40
{"content":[{"text":"=== freemius-ai repo ===\n{'full_name': 'Freemius/freemius-ai', 'description': 'Complete Freemius subscription integration guide with AI-ready prompts for vibe coding platforms and traditional development', 'default_branch': 'main', 'stargazers_count': 2, 'message': None}\n=== tree ===\n.editorconfig\n.gitignore\n.husky\n.husky/pre-commit\n.prettierignore\nCONTRIBUTING.md\nLICENSE\nREADME.md\nbolt-integration\nbolt-integration/subscription\nbolt-integration/subscription/README.md\nbolt-integration/subscription/bolt-knowledgebase.md\nbolt-integration/subscription/prompt.md\nlovable-integration\nlovable-integration/ai-like-app-credits\nlovable-integration/ai-like-app-credits/README.md\nlovable-integration/selling-from-website\nlovable-integration/selling-from-website/README.md\nlovable-integration/subscription\nlovable-integration/subscription/00-create-app.md\nlovable-integration/subscription/01-creating-entitlement-table.md\nlovable-integration/subscription/02-installing-freemius.md\nlovable-integration/subscription/03-checkout-redirection-process-route.md\nlovable-integration/subscription/04-creating-paywall.md\nlovable-integration/subscription/05-accounts-page.md\nlovable-integration/subscription/06-webhook-integration.md\nlovable-integration/subscription/07-finalization.md\nlovable-integration/subscription/README.md\nlovable-integration/subscription/lovable-knowledgebase.md\nlovable-integration/subscription/prompt.md\npackage-lock.json\npackage.json\nprettier.config.mjs\nscripts\nscripts/prompt-concat.js\nskills\nskills/freemius-checkout\nskills/freemius-checkout/SKILL.md\nskills/freemius-checkout/references\nskills/freemius-checkout/references/checkout-provider.md\n","type":"text"}]}›Thinking…
There IS an official npm package @freemius/sdk@0.5.0. Let me install it and inspect what it requires — that's a legitimate, lightweight, non-service-stack action. Then I can determine definitively whether I can build anything runnable.
Let me install it and look at its constructor/requirements.
There's an official @freemius/sdk on npm. Let me install and inspect what it actually requires to initialize — this is the decisive test.
✓$ mkdir -p /tmp/fsprobe && cd /tmp/fsprobe && npm init -y >/dev/null 2>&1 && timeout 120 npm install @freemius/sdk 2>&1 | tail -5; echo "=== installed ==="; ls node_modules/@freemius/sdk/✓└{"content":[{"text":"\n1 package is looking for funding\n run `npm fund` for details\n\nfound 0 vulnerabilities\n=== installed ===\nREADME.md\ndist\npackage.js…ctrl+o
{"content":[{"text":"\n1 package is looking for funding\n run `npm fund` for details\n\nfound 0 vulnerabilities\n=== installed ===\nREADME.md\ndist\npackage.json\n","type":"text"}]}›Thinking…
Installed. Let me inspect the SDK to see what credentials it requires.
✓$ cd /tmp/fsprobe/node_modules/@freemius/sdk && echo "=== README ==="; head -80 README.md; echo; echo "=== dist ==="; ls -la dist/ | head✓└{"content":[{"text":"=== README ===\n<div align=\"center\">\n\n<picture>\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://freemius.com/help/i…ctrl+o
{"content":[{"text":"=== README ===\n<div align=\"center\">\n\n<picture>\n <source media=\"(prefers-color-scheme: light)\" srcset=\"https://freemius.com/help/img/freemius-logo.svg\">\n <source media=\"(prefers-color-scheme: dark)\" srcset=\"https://freemius.com/help/img/freemius-logo-dark.svg\">\n <img alt=\"Freemius Logo\" src=\"https://freemius.com/help/img/freemius-logo.svg\" width=\"200\">\n</picture>\n\n## [JavaScript SDK](https://freemius.com/help/documentation/saas-sdk/js-sdk/)\n\nMonetize your SaaS or app backend faster: one lightweight, fully typed SDK for Checkout creation, pricing + plans,\nlicenses, subscriptions, purchases, entitlements, and secure webhooks. Built for real-world production flows.\n\n[](https://www.npmjs.com/package/@freemius/sdk)\n\n\n\n**[Get Started »](https://freemius.com/help/documentation/saas-sdk/js-sdk/)** ·\n**[Next.js Guide »](https://freemius.com/help/documentation/saas-sdk/framework/nextjs/)** ·\n**[React Starter Kit »](https://freemius.com/help/documentation/saas-sdk/react-starter/)**\n\n</div>\n\n---\n\n\n\n---\n\nLooking for a step‑by‑step walkthrough of backend checkout generation, secure purchase validation, local entitlement\nstorage, webhook‑driven license lifecycle syncing, and feature gating logic? Check out the guides below.\n\n- [Next.js / React Starter Kit](https://freemius.com/help/documentation/saas-sdk/framework/nextjs/) Integration.\n- [Framework Agnostic](https://freemius.com/help/documentation/saas-sdk/js-sdk/integration/) Integration.\n\nWe also have the [React Starter Kit](https://freemius.com/help/documentation/saas-sdk/react-starter/) you can use on\nyour front-end to quickly render Checkout overlays, pricing tables, and a customer portal.\n\n## Why `@freemius/sdk`?\n\n- 🔐 Backend‑only & secure: built to keep your API / Secret keys off the client.\n- 🧠 Fully typed: rich IntelliSense for API filters, webhook payloads, pricing, licenses, subscriptions, payments, and\n users.\n- 🛒 Frictionless Checkout builder: generate overlay options & hosted links, sandbox mode, redirect verification,\n upgrade authorization.\n- 💳 Subscriptions & one‑off purchases: normalize purchase + entitlement logic with helpers (e.g.\n `purchase.retrievePurchaseData()`, `entitlement.getActive()`).\n- 🧱 Framework friendly: works great with Next.js (App Router), Express, Fastify, Hono, Nuxt server routes, Workers,\n etc.\n- 🧾 Licenses, billing & invoices: retrieve, paginate, iterate, and show billing data to your customers.\n- 🌐 Webhooks made simple: strongly typed listener + request processors for Fetch runtimes, Node HTTP, serverless, edge.\n- ⚡ Runtime agnostic: Node.js, Bun, Deno—ship the same code.\n- 🪶 Lightweight, modern ESM-first design (tree-shakeable patterns).\n- 🚀 Production patterns included: entitlement storage, retrieval & paywalls.\n\n## Installation\n\n```bash\nnpm install @freemius/sdk @freemius/checkout zod\n```\n\nRequires Node.js 18+ (or an Edge runtime supporting Web Crypto + standard fetch APIs). See the\n[official documentation](https://freemius.com/help/documentation/saas-sdk/js-sdk/) for full capability reference.\n\n## 10 Seconds Initialization\n\nGo to the\n[Freemius Developer Dashboard](https://freemius.com/help/documentation/saas-sdk/js-sdk/installation/#retrieving-keys-from-the-developer-dashboard))\nand obtain the following:\n\n- `productId` – Numeric product identifier\n- `apiKey` – API key (used as bearer credential)\n- `secretKey` – Secret key used for signing (HMAC) and secure operations\n- `publicKey` – RSA public key for license / signature related verification flows\n\nStore these in your environment variables, e.g. in a `.env` file:\n\n```env\nFREEMIUS_PRODUCT_ID=12345\nFREEMIUS_API_KEY=...\n\n=== dist ===\ntotal 2600\ndrwx------ 2 root root 4096 Sep 19 18:39 .\ndrwx------ 3 root root 4096 Sep 19 18:39 ..\n-rw------- 1 root root 494906 Sep 19 18:39 index.d.mts\n-rw------- 1 root root 631704 Sep 19 18:39 index.d.mts.map\n-rw------- 1 root root 494905 Sep 19 18:39 index.d.ts\n-rw------- 1 root root 631703 Sep 19 18:39 index.d.ts.map\n-rw------- 1 root root 93318 Sep 19 18:39 index.js\n-rw------- 1 root root 91977 Sep 19 18:39 index.mjs\n-rw------- 1 root root 203049 Sep 19 18:39 index.mjs.map\n","type":"text"}]}›Thinking…
Confirmed decisively. The SDK requires 4 credentials obtained only from the Freemius Developer Dashboard (human signup):
productIdapiKeysecretKeypublicKey(RSA)
Note it mentions "sandbox mode" for Checkout — but that still requires real keys from a real account.
Let me do the final decisive test: actually try to instantiate the SDK and make a call with dummy credentials to demonstrate concretely that it's blocked, and confirm there's no offline/demo mode. This is a quick, non-service-stack action.
Let me write a tiny probe.
Let me run the decisive test — instantiate the SDK and attempt a real call, to confirm whether any offline/demo path exists.
✓$ cd /tmp/fsprobe && cat > probe.mjs <<'EOF'✓└{"content":[{"text":"file:///tmp/fsprobe/probe.mjs:1\nimport Freemius from '@freemius/sdk';\n ^^^^^^^^\nSyntaxError: The requested module '@freemius/sdk' …ctrl+o
cd /tmp/fsprobe && cat > probe.mjs <<'EOF'
import Freemius from '@freemius/sdk';
const fs = new Freemius({
productId: 12345,
apiKey: 'dummy_api_key',
secretKey: 'dummy_secret_key',
publicKey: 'dummy_public_key',
});
console.log('instantiated OK:', typeof fs);
console.log('top-level namespaces:', Object.keys(fs).join(', '));
try {
const plans = await fs.plan.list();
console.log('PLAN LIST:', JSON.stringify(plans).slice(0,300));
} catch (e) {
console.log('CALL FAILED ->', e?.message?.slice(0,400));
}
EOF
timeout 60 node probe.mjs 2>&1 | head -30
{"content":[{"text":"file:///tmp/fsprobe/probe.mjs:1\nimport Freemius from '@freemius/sdk';\n ^^^^^^^^\nSyntaxError: The requested module '@freemius/sdk' does not provide an export named 'default'\n at ModuleJob._instantiate (node:internal/modules/esm/module_job:226:21)\n at async ModuleJob.run (node:internal/modules/esm/module_job:335:5)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)\n\nNode.js v22.23.2\n","type":"text"}]}›Thinking…
Need the right export. Let me check the exports.
✓$ cd /tmp/fsprobe && grep -oE "^export \{[^}]*\}" node_modules/@freemius/sdk/dist/index.mjs | head -5; echo "---"; tail -c 1200 node_modules/@freemius/sdk/dist/index.mjs | tr ',' '\n' | grep -iE "export…✓└{"content":[{"text":"export { ActionError, BILLING_CYCLE, CURRENCY, Freemius, WebhookAuthenticationMethod, WebhookError, idToNumber, idToString, isIdsEqual, par…ctrl+o
cd /tmp/fsprobe && grep -oE "^export \{[^}]*\}" node_modules/@freemius/sdk/dist/index.mjs | head -5; echo "---"; tail -c 1200 node_modules/@freemius/sdk/dist/index.mjs | tr ',' '\n' | grep -iE "export|as " | head -20
{"content":[{"text":"export { ActionError, BILLING_CYCLE, CURRENCY, Freemius, WebhookAuthenticationMethod, WebhookError, idToNumber, idToString, isIdsEqual, parseBillingCycle, parseCurrency, parseDate, parseDateTime, parseNumber, parsePaymentMethod }\n---\nexport { ActionError\n","type":"text"}]}›Thinking…
The export is a named export Freemius. Let me fix the probe.
✓$ cd /tmp/fsprobe && sed -i "s/import Freemius from '@freemius\/sdk';/import { Freemius } from '@freemius\/sdk';/" probe.mjs && timeout 60 node probe.mjs 2>&1 | head -30✓└{"content":[{"text":"file:///tmp/fsprobe/node_modules/@freemius/sdk/dist/index.mjs:2204\n\t\tif (!secretKey || secretKey.length < 32) throw new Error(\"Secret k…ctrl+o
{"content":[{"text":"file:///tmp/fsprobe/node_modules/@freemius/sdk/dist/index.mjs:2204\n\t\tif (!secretKey || secretKey.length < 32) throw new Error(\"Secret key must be at least 32 characters long\");\n\t\t ^\n\nError: Secret key must be at least 32 characters long\n at new AuthService (file:///tmp/fsprobe/node_modules/@freemius/sdk/dist/index.mjs:2204:50)\n at new Freemius (file:///tmp/fsprobe/node_modules/@freemius/sdk/dist/index.mjs:2610:15)\n at file:///tmp/fsprobe/probe.mjs:2:12\n at ModuleJob.run (node:internal/modules/esm/module_job:343:25)\n at async onImport.tracePromise.__proto__ (node:internal/modules/esm/loader:681:26)\n at async asyncRunEntryPointWithESMLoader (node:internal/modules/run_main:117:5)\n\nNode.js v22.23.2\n","type":"text"}]}›Thinking…
The SDK validates the secret key client-side (min 32 chars). Let me try with a 32+ char dummy to see how far it gets — it should then fail at the API auth level. This proves definitively that real credentials are required.
✓$ cd /tmp/fsprobe && cat > probe2.mjs <<'EOF'✓└{"content":[{"text":"instantiated OK. namespaces: api, checkout, purchase, customerPortal, webhook, pricing, entitlement, auth\nplan.list FAILED -> Cannot read …ctrl+o
cd /tmp/fsprobe && cat > probe2.mjs <<'EOF'
import { Freemius } from '@freemius/sdk';
const fs = new Freemius({
productId: 12345,
apiKey: 'ak_dummydummydummydummydummydummy',
secretKey: 'sk_dummydummydummydummydummydummydummy',
publicKey: 'pk_dummydummydummydummydummydummy',
});
console.log('instantiated OK. namespaces:', Object.keys(fs).join(', '));
for (const [label, fn] of [['plan.list',()=>fs.plan.list()],['pricing.list',()=>fs.pricing.list()]]) {
try { console.log(label,'->',JSON.stringify(await fn()).slice(0,200)); }
catch (e) { console.log(label,'FAILED ->',(e?.message||String(e)).slice(0,300)); }
}
EOF
timeout 60 node probe2.mjs 2>&1 | head -25
{"content":[{"text":"instantiated OK. namespaces: api, checkout, purchase, customerPortal, webhook, pricing, entitlement, auth\nplan.list FAILED -> Cannot read properties of undefined (reading 'list')\npricing.list FAILED -> fs.pricing.list is not a function\n","type":"text"}]}›Thinking…
The SDK instantiates fine, but the namespace method names differ. The key question is whether an authenticated call works. Let me find the right method and make one real call to prove auth is required.
Let me check available methods.
✓$ cd /tmp/fsprobe && cat > probe3.mjs <<'EOF'✓└{"content":[{"text":"api __unstable_ApiClient, createSignedUrl, createUrl, getSignedUrl, generateAuthorizationParams, base64UrlEncode, toDateTimeSt…ctrl+o
cd /tmp/fsprobe && cat > probe3.mjs <<'EOF'
import { Freemius } from '@freemius/sdk';
const fs = new Freemius({
productId: 12345,
apiKey: 'ak_dummydummydummydummydummydummy',
secretKey: 'sk_dummydummydummydummydummydummydummy',
publicKey: 'pk_dummydummydummydummydummydummy',
});
for (const ns of ['api','checkout','purchase','customerPortal','webhook','pricing','entitlement','auth']) {
const o = fs[ns];
const keys = o ? Object.getOwnPropertyNames(Object.getPrototypeOf(o)||{}).concat(Object.keys(o)) : [];
console.log(ns.padEnd(16), [...new Set(keys)].filter(k=>k!=='constructor').join(', ').slice(0,220));
}
EOF
timeout 60 node probe3.mjs 2>&1 | head -20
{"content":[{"text":"api __unstable_ApiClient, createSignedUrl, createUrl, getSignedUrl, generateAuthorizationParams, base64UrlEncode, toDateTimeString, client, productId, user, license, product, subscription, payment, event, baseUrl, secretKey,\ncheckout create, getSandboxParams, getLicenseUpgradeAuth, processRedirect, request, api, productId, publicKey, secretKey, purchase, pricing\npurchase retrievePurchase, retrievePurchaseData, retrievePurchases, retrievePurchasesData, retrieveSubscriptions, retrieveSubscriptionsData, retrieveBySubscription, retrieveSubscriptionsByEmail, retrievePurchasesByEmail, api\ncustomerPortal retrieveData, retrieveDataByEmail, createRestorer, repository, action, request, api, checkout, authService, purchase\nwebhook createListener, createRequestProcessor, processFetch, processNodeHttp, api, secretKey\npricing retrieve, findTopupPlan, isValidPricing, api\nentitlement getActive, getActives, getFsUser, getElapsedMonth, getElapsedYear\nauth createActionToken, verifyActionToken, encodeTokenPayload, decodeTokenPayload, signData, constantTimeEqual, productId, secretKey\n","type":"text"}]}›Thinking…
Now let me make a real authenticated API call to prove credentials are required. fs.api.product or fs.api.user. Let me try fs.pricing.retrieve(...) or the api client.
Let me try a real network call.
✓$ cd /tmp/fsprobe && cat > probe4.mjs <<'EOF'✓└{"content":[{"text":"signed URL (offline): https://fast-api.freemius.com/v1/products/12345/v1/products/12345/plans.json?auth_date=2026-09-19+18%3A39%3A30&author…ctrl+o
cd /tmp/fsprobe && cat > probe4.mjs <<'EOF'
import { Freemius } from '@freemius/sdk';
const fs = new Freemius({
productId: 12345,
apiKey: 'ak_dummydummydummydummydummydummy',
secretKey: 'sk_dummydummydummydummydummydummydummy',
publicKey: 'pk_dummydummydummydummydummydummy',
});
// generate a signed URL locally (no network) -> proves HMAC signing works offline
try {
const u = fs.api.createSignedUrl('/v1/products/12345/plans.json');
console.log('signed URL (offline):', String(u).slice(0,180));
} catch (e) { console.log('sign FAILED ->', (e?.message||e).toString().slice(0,200)); }
// real network call
try {
const r = await fs.api.client.GET('/v1/products/{product_id}/plans.json', { params:{ path:{ product_id:12345 } } });
console.log('LIVE CALL ->', JSON.stringify(r).slice(0,400));
} catch (e) { console.log('LIVE CALL FAILED ->', (e?.message||String(e)).slice(0,300)); }
EOF
timeout 60 node probe4.mjs 2>&1 | head -20
{"content":[{"text":"signed URL (offline): https://fast-api.freemius.com/v1/products/12345/v1/products/12345/plans.json?auth_date=2026-09-19+18%3A39%3A30&authorization=FS+12345%3Apk_dummydummydummydummydummydummy%3AYWEyZWI0\nLIVE CALL -> {\"error\":{\"path\":\":\",\"error\":{\"type\":\"\",\"message\":\"Invalid request path.\",\"code\":\"not_implemented\",\"http\":400,\"timestamp\":\"Sat, 19 Sep 2026 18:39:30 +0000\"},\"request\":[]},\"response\":{}}\n","type":"text"}]}›Thinking…
I got a live round-trip to fast-api.freemius.com. The SDK signs requests with HMAC using the public/secret key, and it reached the API. The path was malformed (my fault — double prefix), but crucially it proves:
- The SDK works from Node.js in this environment — network + crypto fine.
- Signing is done client-side with
publicKey/secretKey. - With dummy keys, no real data can be retrieved — real credentials are mandatory.
Let me do one final correct-path call to definitively show the auth rejection (not a path error). Let me use the correct method.
Actually, let me try fs.api.product or find the right way. Let me check the client paths available. Actually, simpler: use the raw signed URL approach with a correct path.
Let me test with a properly-formed path to see the auth error.
Got a live round-trip to fast-api.freemius.com with client-side HMAC signing. Let me make one correctly-formed call to confirm the failure mode is auth, not my path bug.
✓$ cd /tmp/fsprobe && cat > probe5.mjs <<'EOF'✓└{"content":[{"text":"URL: https://fast-api.freemius.com/v1/products/12345/plans.json?auth_date=2026-09-19+18%3A39%3A36&authorization=FS+12345%3Apk_dummydummydum…ctrl+o
cd /tmp/fsprobe && cat > probe5.mjs <<'EOF'
import { Freemius } from '@freemius/sdk';
const fs = new Freemius({ productId:12345, apiKey:'ak_dummydummydummydummydummydummy',
secretKey:'sk_dummydummydummydummydummydummydummy', publicKey:'pk_dummydummydummydummydummydummy' });
const url = fs.api.createSignedUrl('/plans.json'); // relative -> correct prefix
console.log('URL:', String(url).slice(0,150));
try {
const r = await fetch(url); const j = await r.json();
console.log('HTTP', r.status, '->', JSON.stringify(j).slice(0,420));
} catch(e){ console.log('FAILED ->', (e?.message||String(e)).slice(0,200)); }
EOF
timeout 60 node probe5.mjs 2>&1 | head -15
{"content":[{"text":"URL: https://fast-api.freemius.com/v1/products/12345/plans.json?auth_date=2026-09-19+18%3A39%3A36&authorization=FS+12345%3Apk_dummydummydummydummydummydumm\nHTTP 401 -> {\"path\":\":/plugins/plugin_id/plans.json\",\"error\":{\"type\":\"UnauthorizedAccess\",\"message\":\"Invalid Authorization header.\",\"code\":\"unauthorized_access\",\"http\":401,\"timestamp\":\"Sat, 19 Sep 2026 18:39:37 +0000\"},\"request\":{\"auth_date\":\"2026-09-19 18:39:36\",\"authorization\":\"FS 12345:pk_dummydummydummydummydummydummy:YjBkZDY1ZjMzODhlOTVmYjkyMTFmMzgzNDc4N2E2NzdlNWIyN2Y0M2Q5NTkxY2M0OTIyODU5YzEyNTNhNmQ0Nw\",\"plugin_id\":\"12345\"}\n","type":"text"}]}›Thinking…
Definitive proof: HTTP 401 UnauthorizedAccess / "Invalid Authorization header". The transport, SDK, and signing all work perfectly from this environment. The only missing thing is real credentials, which can only come from a human-created Freemius account.
Now let me also verify the pricing story completely — I have the SaaS rev-share table. Let me check the WordPress & Templates pricing since it differs, to give a complete answer.
Let me fetch that.
Definitive: HTTP 401 "Invalid Authorization header." Transport, SDK, and HMAC signing all work here — only real credentials are missing. Let me complete the pricing picture (WordPress tier differs from SaaS).
✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" "https://freemius.com/help/documentation/getting-started/saas-vs-wordpress-pricing.md" -o wp.md; wc -c wp.md; python3 -c "✓└{"content":[{"text":"5868 wp.md\n# WordPress & Templates Pricing\n\nThis guide is for [WordPress](https://freemius.com/help/help/documentation/wordpress/.md) on…ctrl+o
cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" "https://freemius.com/help/documentation/getting-started/saas-vs-wordpress-pricing.md" -o wp.md; wc -c wp.md; python3 -c "
import re,sys
t=open('/tmp/wp.md',encoding='utf-8',errors='ignore').read()
if t.lstrip().startswith('<!doctype') or t.lstrip().startswith('<html'): print('HTML fallback'); sys.exit()
print(t[:4000])
"
{"content":[{"text":"5868 wp.md\n# WordPress & Templates Pricing\n\nThis guide is for [WordPress](https://freemius.com/help/help/documentation/wordpress/.md) only\n\nOur pricing model is built around giving you the right tools for your needs. The base price of 4.7% covers core features for all software types. For WordPress & Templates, an extra 2.3% is added — not only to unlock specialized features, but also to cover ongoing compliance with the WordPress guidelines, and the server resources needed to handle software updates, usage tracking, audience analytics, and more.\n\n**Here's a list of noticeable WordPress-specific features:**\n\n* [Software licensing](https://freemius.com/help/help/documentation/wordpress-sdk/integration/software-licensing/.md)\n* [Multi-site licenses](https://freemius.com/help/help/documentation/wordpress/setup-product-pricing-plans-refunds/.md#bulk-pricing-options)\n* [Automatic updates](https://freemius.com/help/help/documentation/wordpress/software-updates-distribution/.md)\n* [Release management](https://freemius.com/help/help/documentation/release-management/.md)\n* [Beta versions](https://freemius.com/help/help/documentation/wordpress-sdk/features/wp-admin-account/.md#beta-program)\n* [Staged rollouts](https://freemius.com/help/help/documentation/release-management/staged-rollouts/.md)\n* [Single sign-on with WordPress](https://freemius.com/help/help/documentation/users-account-management/sso-single-sign-on-wordpress/.md)\n\n- [Sell from WP Admin Dashboard](https://freemius.com/help/help/documentation/wordpress-sdk/features/wp-admin-in-dashboard-upgrading/.md)\n- [Sell add-ons](https://freemius.com/help/help/documentation/wordpress/selling-add-ons-extensions/.md) & [bundles](https://freemius.com/help/help/documentation/wordpress/selling-bundles-and-memberships/.md)\n- [Opt-in & usage tracking](https://freemius.com/help/help/documentation/analytics/user-data/.md)\n- [Audience analytics](https://freemius.com/help/help/documentation/analytics/audience/.md)\n- [Deactivation feedback](https://freemius.com/help/help/documentation/analytics/user-feedback/.md)\n- [WP.org compliant GPL SDK](https://freemius.com/help/help/documentation/wordpress-sdk/.md)\n- [WP.org review automation](https://freemius.com/help/help/documentation/marketing-automation/reviews/.md)\n\n## Choosing between solutions[](#choosing-between-solutions \"Direct link to Choosing between solutions\")\n\nJust like in programming, abstractions let you work faster by taking care of lower-level challenges. The WordPress plan removes many of the technical and operational hassles so you can focus on growing your business, but it comes with reduced customization flexibility and higher costs. We understand that software makers have different styles, so choosing the right level really depends on you.\n\n### Choose WordPress & Templates solution if:[](#choose-wordpress--templates-solution-if \"Direct link to Choose WordPress & Templates solution if:\")\n\n* You want a full-featured solution that handles everything from licensing and automatic updates to compliance with wp.org guidelines.\n* You prefer to avoid the hassle of integrating and managing your own fulfillment and release management system, software updates, and server maintenance.\n* You want to maximize your plugin or theme 5-star reviews on wp.org with an automated process.\n* You value the power and increase in conversion of a frictionless upgrade flow within the WP Admin without the need to go through your site.\n* You want to grow your email list with a high-converting opt-in mechanism for your free product., usage tracking and uninstall feedback collection to battle abandonment rate.\n* You prefer to go with a proven, robust licensing system to reduce the risk of unauthorized use without needing to develop your own custom solution.\n* You prefer to delegate compliance with the latest WordPress releases and developments (like Playground) and [WordPress.org guidelines](https://developer.wordpress.org/plugins/wordpress-org/detailed-plugin-guidelines/) t\n","type":"text"}]}✓$ cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" "https://freemius.com/help/documentation/getting-started/our-pricing.md" -o op.md; python3 -c "✓└{"content":[{"text":"# Our Pricing\n\nBefore we get to making your first sale, it’s important to know what it will cost to use Freemius. Even if you've already …ctrl+o
cd /tmp && curl -sSL -m 15 -A "Mozilla/5.0" "https://freemius.com/help/documentation/getting-started/our-pricing.md" -o op.md; python3 -c "
t=open('/tmp/op.md',encoding='utf-8',errors='ignore').read()
print('HTML' if t.lstrip().startswith('<!doctype') else t[:3500])
"
{"content":[{"text":"# Our Pricing\n\nBefore we get to making your first sale, it’s important to know what it will cost to use Freemius. Even if you've already reviewed our [Pricing](https://freemius.com/pricing/) page, we want to ensure everything is crystal clear.\n\n## No upfront fees[](#no-upfront-fees \"Direct link to No upfront fees\")\n\nYou only start paying when you start earning. With Freemius’ revenue-sharing model, **you won’t pay a dime until you make your first sale.**\n\n## Transparent pricing that grows with you[](#transparent-pricing-that-grows-with-you \"Direct link to Transparent pricing that grows with you\")\n\nOur SaaS and Software solution is offered at a competitive rate of **4.7% per successful transaction**.\n\n### No hidden fees[](#no-hidden-fees \"Direct link to No hidden fees\")\n\nUnlike some other payment solutions, Freemius is committed to complete transparency:\n\n* We don’t charge any setup or monthly fees.\n* We don't apply our revenue share to the sales tax/VAT.\n* We don’t add extra fees on subscription payments.\n* We don’t charge any fees on payouts.\n* We don’t charge extra fees on payments recovered through cart recovery.\n* We don’t charge extra fees on payments recovered with dunning (failed renewals recovery).\n* We don’t charge extra fees on payments generated from affiliates.\n* We don’t charge extra fees on PayPal transactions.\n* We don’t charge fees for currency conversion. Instead, you can receive payouts in the native currency in which they were processed. If you sell in USD, EUR, and GBP, you can receive payouts in 3 separate currencies to 3 different bank accounts.\n\n## WordPress & Templates Solution[](#wordpress--templates-solution \"Direct link to WordPress & Templates Solution\")\n\nIf you're selling a WordPress plugin or theme, starter kits and templates, our dedicated WordPress & Templates solution eliminates the hassles of setup, maintenance, and server hosting, so you can jump straight to selling and focusing on growth.\n\nThis service comes at a modest **additional cost of 2.3%**. Explore our detailed [WordPress & Templates Pricing](https://freemius.com/help/help/documentation/getting-started/saas-vs-wordpress-pricing/.md) to discover all the features and benefits and determine if it’s the right fit for you.\n\n## Gateway processing fees[](#gateway-processing-fees \"Direct link to Gateway processing fees\")\n\nGateway fees may vary, but thanks to the high transaction volumes processed on Freemius, we’re consistently negotiating the best possible rates with Stripe and PayPal. The current average effective rate is 3.5%. As we grow, we’re committed to reducing these fees, and we want to be clear that Freemius does not take any portion of the processing fees.\n\n## High-volume rates[](#high-volume-rates \"Direct link to High-volume rates\")\n\nWe offer complete transparency even as you scale — ensuring you understand exactly how our collaboration evolves without the need for the exhausting, time-consuming negotiations that you’d typically have to initiate with other payment providers. This approach gives you peace of mind, allowing you to focus on growing your business.\n\nWhen your monthly gross sales exceed $50,000, you qualify for our Growth Pricing. With this plan, the revenue share progressively decreases as you scale, dropping to as little as 0.5% on sales beyond $100,000 per month.\n\n| Monthly gross | Progressive rev-share |\n| ------------------ | --------------------- |\n| 0-$50,000 | 4.7% |\n| $50,001 - $60,0\n","type":"text"}]}›Thinking…
I now have a complete, verified pricing picture. Let me clean up the probe directory and write my answer.
Let me summarize what I found:
Pricing (verified from freemius.com docs):
- No upfront/setup/monthly fees — pure revenue share, pay only on first sale
- SaaS & Software: 4.7% per successful transaction
- WordPress & Templates: 4.7% + 2.3% = 7.0%
- Gateway processing fees on top: ~3.5% average effective rate (Stripe/PayPal), passed through — Freemius takes no cut of it
- Revenue share NOT applied to sales tax/VAT
- No extra fees on: subscription payments, payouts, cart recovery, dunning, affiliates, PayPal, currency conversion
- Progressive volume tiers above $50k/mo: 4.5% → 4.0% → 3.0% → 2.0% → 1.0% → 0.5% at $100k+
- Minimum payout balance: $100
So realistic all-in cost ≈ 4.7% + 3.5% ≈ 8.2% for SaaS, ≈ 7.0% + 3.5% ≈ 10.5% for WordPress.
Blocked on:
- No Freemius credentials — SDK needs productId/apiKey/secretKey/publicKey, obtainable ONLY from a human-created Developer Dashboard (Settings → API & Keys). No sandbox/demo/trial keys. Proven: HTTP 401.
- Creating an account requires human signup with business/tax/banking details (Merchant of Record — they need legal entity info, payout bank account).
- Plans & pricing must be configured in the web dashboard UI before the agent workflow can even read them.
- The repo is empty — no existing app to integrate into.
- WordPress path additionally needs PHP + Composer + a running WordPress/MySQL stack = prohibited local service stack.
What DID work (verified):
- Node.js 22 present,
@freemius/sdk@0.5.0installs cleanly, instantiates, HMAC-signs requests, and reaches fast-api.freemius.com successfully. Only auth is missing.
Is it easy for me to manage? Honest answer:
- The code side is genuinely agent-friendly — they publish llms.txt, per-page .md sources, an OpenAPI spec, AI Agent Skills on skills.sh, and an official typed JS SDK. That's unusually good agent ergonomics, better than most vendors.
- BUT the operational side is entirely human-gated: account creation, KYC/tax/banking, plan configuration in a web UI, checkout redirect URLs, webhook endpoints. And ongoing management (refunds, disputes, affiliates, release management) is dashboard-driven.
- Also: no sandbox credentials means I cannot test anything end-to-end. I can write code but never verify it against the live platform. That's the real friction.
Let me clean up and report. I should not write a big pile of unverifiable code. But I should offer what I CAN do.
Actually — let me reconsider whether to write the example scaffolding. The user asked to "build a simple example." I've established I can't run it. Writing untested code that can't be verified has limited value, but a small, correct, credential-ready skeleton would be genuinely useful the moment they paste in a .env. Given they said "Stay light" and "say so plainly and stop" if blocked — I think the right move is to report the blocker and offer, rather than dump speculative code.
But I have already verified the SDK's actual API surface (namespaces, methods) by introspection. So I could write a skeleton that's at least API-accurate. That's meaningfully better than hallucinated code. Let me offer that as the concrete next step, and keep it brief.
I'll clean up the temp probe.
Let me clean up and give the answer. I should be concise but complete. Let me not create files in the repo since nothing was requested to be committed and I'm blocked.
Let me clean up /tmp/fsprobe to stay light.
Actually, leaving it in /tmp is harmless, but let me clean it to be tidy. Actually it's in /tmp, outside the repo — fine. But let me verify the repo is still clean.
Let me do a final check that I didn't dirty the repo.
✓$ cd /sandbox/repo && git status --short && echo "(repo clean — nothing written)"; rm -rf /tmp/fsprobe /tmp/*.html /tmp/*.md /tmp/llms.txt 2>/dev/null; echo "temp probes cleaned"✓└{"content":[{"text":"(repo clean — nothing written)\ntemp probes cleaned\n","type":"text"}]}
›Thinking…
Now let me write my final answer. Concise but complete, covering:
- Blocked — plainly
- Pricing
- Easy to manage?
- What I need to proceed
Let me be clear and honest.
Blocked — stopping here
I can't build a working example, and the blocker is a hard prerequisite I can't self-serve.
What I verified works: Node v22 is present, @freemius/sdk@0.5.0 installs cleanly, instantiates, HMAC-signs requests client-side, and reaches fast-api.freemius.com. The transport and tooling are fine.
What's missing: the SDK requires four credentials — productId, apiKey, secretKey, publicKey. With placeholder values I got a real round-trip and a definitive answer:
HTTP 401 -> {"error":{"type":"UnauthorizedAccess",
"message":"Invalid Authorization header.",
"code":"unauthorized_access"}}
Those keys exist only inside a human-created Developer Dashboard (Settings → API & Keys). There is no sandbox key, trial key, or unauthenticated demo path — I checked the API root, the docs, and the SDK's own validation. So I can write integration code but could never run or verify it against the platform.
Three further blockers:
- Account creation is human-gated — Freemius is Merchant of Record, so signup needs legal-entity, tax, and payout banking details.
- Plans must be configured in the web UI first. Their official agent workflow (
npx skills add freemius/freemius-ai) explicitly reads your pre-configured plans via the API before writing any code. Nothing to read yet. - The repo is empty — there's no app to integrate into. Also no PHP or Composer, so the WordPress SDK path would need a WordPress + MySQL stack, which your constraints rule out.
I left the repo untouched.
How pricing works
Pure revenue share — no setup, monthly, or minimum fees. You pay nothing until your first sale.
| Rate | |
|---|---|
| SaaS & Software | 4.7% per successful transaction |
| WordPress & Templates | 4.7% + 2.3% = 7.0% |
| Gateway processing (Stripe/PayPal) | ~3.5% average, passed through at cost |
Realistic all-in: ~8.2% for SaaS, ~10.5% for WordPress. The 2.3% WordPress surcharge buys licensing, automatic updates, release management, staged rollouts, and wp.org compliance.
Notably, the rev-share is not applied to sales tax/VAT, and there are no extra fees on subscription payments, payouts, cart-abandonment recovery, dunning, affiliate sales, PayPal, or currency conversion. Progressive volume tiers kick in above $50k/month gross, stepping 4.5% → 4.0% → 3.0% → 2.0% → 1.0%, bottoming at 0.5% beyond $100k/month. Minimum payout balance is $100.
Will this be easy for me to manage?
Split answer — unusually good for reading, poor for operating.
Good: their agent ergonomics are better than most vendors. They publish llms.txt, per-page .md sources, an OpenAPI spec, AI Agent Skills on skills.sh, and a fully typed JS SDK with a freemius-troubleshooting skill. I found the SaaS/Node path quickly precisely because of this.
Poor: everything operational is human-gated — account/KYC, plan configuration, checkout redirect URLs, webhook registration, refunds, disputes, affiliates. And the absence of sandbox credentials is the real friction: I have no way to test end-to-end. I'd be writing code I cannot verify, which is how silent integration bugs ship.
To unblock
Give me a .env with the four keys from Settings → API & Keys on a Freemius product that has at least one plan configured. With that, I can build and actually verify against the live API — no local stack needed.
One caution worth flagging: those keys are live production credentials with no sandbox equivalent, so anything I run against them touches real data. I'd keep to read-only calls (plan.list, pricing.retrieve) unless you tell me otherwise.
AX Fundamentals
23 checks. Open an area for details.
This check is a quick preview. Test more tasks and models with Gauge Agents.
Test your product with Gauge Agents