Skip to main content

max / makenotwork

Substitute business assumptions across public docs Reconciles mbp commit 424c516 onto current main. Migrates hardcoded Stripe fees, policy commitments (buyer-access/shutdown/price-change notice windows, grandfather + cancellation-grace periods, content-archive + generative-AI notice), uptime target, broadcast caps, discount percentages, and Fan+ pricing across the public docs to {{ … }} markers resolved from assumptions.toml. Adds [policy], [uptime], [broadcasts], [fan_plus], and nested [stripe.instant_payout] toml sections, plus derived stripe_fee_on_N / stripe_keep_on_N (N in {1,2,5,10,25,50}, pre-rounded to whole cents) and annual_discount_pct / founder_discount_pct. Two new docengine tests pin every stripe_fee/keep value and both discount pcts against the rendered strings. Merged with the Refined-A work already on main: the new stripe-fee and discount tests sit alongside the parametric annual-price test; the fee/keep and discount values are sale-price/ratio based, so they stay stable under the Refined-A tier reset. All markers resolve (site-docs CI guard green); docengine assumptions tests 31/31.
Co-Authored-By
Claude Opus 4.8 (1M context) <noreply@anthropic.com>
Author: Max Johnson <me@maxj.phd> · 2026-07-09 01:17 UTC
Signed with PGP, not checked
Commit: e837ed783750e4dc977b70aba0fa3a8f3e43c5ce
Parent: 692e0e8
22 files changed, +189 insertions, -73 deletions
@@ -61,6 +61,51 @@
61 61 per_payout = 0.25
62 62 payout_volume_pct = 0.0025
63 63
64 + [stripe.instant_payout]
65 + # Nested form of the flat instant_payout_* keys above; substituted into
66 + # legal/payments.md and guide/stripe.md as {{ stripe.instant_payout.* }}.
67 + # Kept alongside the flat form for backward compatibility.
68 + us_pct = 0.015
69 + intl_pct = 0.010
70 + min_usd = 0.50
71 +
72 +
73 + # ─── Policy commitments (canonical: guarantees.md) ───────────────────────
74 + # Time-based commitments that appear verbatim across guarantees.md, pricing.md,
75 + # tiers.md, faq.md, fan-guide.md, account-lifecycle.md, generative-ai.md, and
76 + # how-we-work.md. Semantically distinct even where the number matches today.
77 + [policy]
78 + buyer_access_days = 90 # guarantees §Buyer Access — post-close fan download window
79 + shutdown_notice_days = 90 # guarantees §Shutdown, §Continuity
80 + price_change_notice_days = 90 # guarantees §Price Stability, pricing.md
81 + grandfather_months = 12 # guarantees §Price Stability
82 + cancellation_grace_days = 30 # tiers.md §Cancellation, getting-started.md
83 + content_archive_months = 12 # guarantees §Content Archive (planned)
84 + generative_ai_notice_days = 30 # generative-ai.md §Governance
85 +
86 +
87 + # ─── Uptime (canonical: guarantees.md §Availability) ─────────────────────
88 + [uptime]
89 + target_pct = 0.995
90 + target_downtime_hours_year = 44 # (1 - 0.995) × 8760 ≈ 43.8, rounded up
91 +
92 +
93 + # ─── Broadcasts (canonical: tiers.md, mailing-lists.md) ──────────────────
94 + [broadcasts]
95 + per_day = 1
96 + recipients_per_send = 10000
97 + # Display string with thousands separator; docengine has no thousands filter
98 + # so the display form lives here (same pattern as `cohort.cap_display`).
99 + recipients_per_send_display = "10,000"
100 +
101 +
102 + # ─── Fan+ (canonical: fan-plus.md) ───────────────────────────────────────
103 + [fan_plus]
104 + monthly_price_usd = 8
105 + # Per-fan monthly credit allowance; funded by Fan+ subscription revenue,
106 + # not per-account overhead. Fan-only — creators don't receive it.
107 + monthly_credit_usd = 5
108 +
64 109
65 110 # ─── Hetzner prices (canonical: hetzner_prices.md) ────────────────────────
66 111 [hetzner]
@@ -548,6 +548,34 @@
548 548 put("stripe_fee_big_std", stripe_fee(t.tiers.standard.big_files));
549 549 put("stripe_fee_ev_std", stripe_fee(t.tiers.standard.everything));
550 550
551 + // Stripe fee + take-home on illustrative sale prices ($1, $2, $5, $10, $25,
552 + // $50). Pin the "sale price → fee → you keep" tables in guide/tiers.md and
553 + // guide/stripe.md. Values are pre-rounded to whole cents so the `money`
554 + // filter's `:.2` format won't drift from float imprecision (e.g. $25 × 2.9%
555 + // + $0.30 = 1.02499999… under f64, which naive :.2 would print as "$1.02").
556 + // "you keep" is `sale − round(fee)` — arithmetically consistent with what a
557 + // reader would compute from the fee column, at the cost of one-cent drift on
558 + // $25 relative to the original hand-written doc ($23.97, not $23.98).
559 + let round_cents = |x: f64| (x * 100.0).round() / 100.0;
560 + for &n in &[1.0_f64, 2.0, 5.0, 10.0, 25.0, 50.0] {
561 + let key = n as i64;
562 + let fee = round_cents(stripe_fee(n));
563 + put(&format!("stripe_fee_on_{key}"), fee);
564 + put(&format!("stripe_keep_on_{key}"), n - fee);
565 + }
566 +
567 + // Discount percentages as decimals. Render with `| percent(0)` for whole
568 + // numbers (e.g. `10%`, `50%`). `annual_discount_pct` kills the hardcoded
569 + // "10% off" in pricing.md and tiers.md; `founder_discount_pct` kills the
570 + // "50%-off" in guarantees.md. Founder discount uses the Basic tier as the
571 + // canonical ratio; all four tiers currently give the same discount and
572 + // that invariant is enforced elsewhere by the founding ≤ standard check.
573 + put("annual_discount_pct", 1.0 - t.annual_discount.multiplier);
574 + put(
575 + "founder_discount_pct",
576 + 1.0 - t.tiers.founding.basic / t.tiers.standard.basic,
577 + );
578 +
551 579 // Annual prices per tier (monthly × 12 × annual_discount.multiplier, rounded
552 580 // to nearest dollar). Substituted into docs as `${{ derived.annual_*_* }}`
553 581 // so a price change auto-propagates.
@@ -788,6 +816,49 @@
788 816 );
789 817 }
790 818
819 + #[test]
820 + fn derived_stripe_fee_on_n_matches_published_table() {
821 + let a = loaded();
822 + let get_money = |k: &str| a
823 + .substitute(&format!("{{{{ derived.{k} | money }}}}"))
824 + .unwrap();
825 +
826 + // These strings must match the "Stripe fee → You keep" table in
827 + // guide/tiers.md line 138-143 and guide/stripe.md exactly, or docs drift.
828 + // Sale-price-based (not tier-price-based), so stable under Refined-A.
829 + assert_eq!(get_money("stripe_fee_on_1"), "$0.33");
830 + assert_eq!(get_money("stripe_fee_on_2"), "$0.36");
831 + assert_eq!(get_money("stripe_fee_on_5"), "$0.45");
832 + assert_eq!(get_money("stripe_fee_on_10"), "$0.59");
833 + assert_eq!(get_money("stripe_fee_on_25"), "$1.03");
834 + assert_eq!(get_money("stripe_fee_on_50"), "$1.75");
835 +
836 + assert_eq!(get_money("stripe_keep_on_1"), "$0.67");
837 + assert_eq!(get_money("stripe_keep_on_2"), "$1.64");
838 + assert_eq!(get_money("stripe_keep_on_5"), "$4.55");
839 + assert_eq!(get_money("stripe_keep_on_10"), "$9.41");
840 + // Note: source doc previously had $23.98, computed as
841 + // round($25 - $1.025) rather than $25 - round($1.025); we standardize
842 + // on the latter for consistency with the fee column.
843 + assert_eq!(get_money("stripe_keep_on_25"), "$23.97");
844 + assert_eq!(get_money("stripe_keep_on_50"), "$48.25");
845 + }
846 +
847 + #[test]
848 + fn derived_discount_pcts_render_as_whole_percent() {
849 + let a = loaded();
850 + // percent(0) renders the whole-percent form used in the docs. Both are
851 + // stable under Refined-A: annual discount is 10%, founder is 50% of std.
852 + assert_eq!(
853 + a.substitute("{{ derived.annual_discount_pct | percent(0) }}").unwrap(),
854 + "10%"
855 + );
856 + assert_eq!(
857 + a.substitute("{{ derived.founder_discount_pct | percent(0) }}").unwrap(),
858 + "50%"
859 + );
860 + }
861 +
791 862 #[test]
792 863 fn derived_annual_prices_match_monthly_times_discount() {
793 864 // Formula: monthly × 12 × annual_discount.multiplier, rounded to
@@ -6,7 +6,7 @@
6 6
7 7 ## Fee Comparison
8 8
9 - All numbers assume US Stripe rates (2.9% + $0.30) and an **average fan transaction of $10**. Per-transaction cost depends on sale count, not just gross revenue; see [How We Work § The Math](./how-we-work.md#the-math) for the full breakdown. Patreon's row uses their "Pro" tier (8%); their Lite (5%) and Premium (12%) tiers shift the column up and down respectively.
9 + All numbers assume US Stripe rates ({{ stripe.percent | percent }} + {{ stripe.fixed | money }}) and an **average fan transaction of $10**. Per-transaction cost depends on sale count, not just gross revenue; see [How We Work § The Math](./how-we-work.md#the-math) for the full breakdown. Patreon's row uses their "Pro" tier (8%); their Lite (5%) and Premium (12%) tiers shift the column up and down respectively.
10 10
11 11 The Makenot.work range reflects the lowest tier (${{ tiers.standard.basic }}, Basic) at the high end and the highest tier (${{ tiers.standard.everything }}, Everything) at the low end.
12 12
@@ -18,7 +18,7 @@
18 18 | Bandcamp | 15% = $75 | ~$29.50 | $395 |
19 19 | Gumroad | 10% = $50 | included | $450 |
20 20 | itch.io (default) | 10% = $50 | ~$29.50 | $420 |
21 - | Patreon (Pro) | 8% = $40 | 2.9%+$0.30 = ~$29.50 | $430 |
21 + | Patreon (Pro) | 8% = $40 | {{ stripe.percent | percent }}+{{ stripe.fixed | money }} = ~$29.50 | $430 |
22 22
23 23 ### At $2,000/month revenue (200 sales × $10)
24 24
@@ -85,7 +85,7 @@
85 85 |---|---|---|---|---|---|
86 86 | **Model** | Flat monthly (${{ tiers.standard.basic }}-${{ tiers.standard.everything }}) | % of revenue | % of revenue | % of revenue (optional) | % of revenue |
87 87 | **Platform cut** | 0% | 15% | 10% | 0-10% (creator sets) | 5-12% |
88 - | **Processing** | ~3% (Stripe) | ~3% (Stripe) | included in 10% | ~3% | ~3% |
88 + | **Processing** | ~{{ stripe.percent | percent }} (Stripe) | ~{{ stripe.percent | percent }} (Stripe) | included in 10% | ~{{ stripe.percent | percent }} | ~{{ stripe.percent | percent }} |
89 89 | **Break-even vs 15%** | ~$107-400/mo revenue | N/A | N/A | N/A | N/A |
90 90 | **Break-even vs 10%** | ~$160-600/mo revenue | N/A | N/A | N/A | N/A |
91 91 | **Break-even vs 8%** | ~$200-750/mo revenue | N/A | N/A | N/A | N/A |
@@ -123,7 +123,7 @@
123 123
124 124 - Publish the change with a version date
125 125 - Explain what changed and why
126 - - Give creators at least 30 days to update their tier classifications if the definitions shift
126 + - Give creators at least {{ policy.generative_ai_notice_days }} days to update their tier classifications if the definitions shift
127 127
128 128 If a currently-covered model demonstrates verifiable, fully compensated training data, it may be reclassified. The principle stays the same: we follow the ethics of the training data, not the capabilities of the tool.
129 129
@@ -6,7 +6,7 @@
6 6
7 7 ## Revenue
8 8
9 - **Guarantee:** 0% platform fee on fan payments. The only deduction is the payment processor's fee (~3%).
9 + **Guarantee:** 0% platform fee on fan payments. The only deduction is the payment processor's fee (~{{ stripe.percent | percent }}).
10 10
11 11 - No platform percentage cut, ever.
12 12 - No transaction fees, payout fees, or skimming.
@@ -38,7 +38,7 @@
38 38 - Cancellation is a single button ("Pause Creator Account") in your account settings.
39 39 - No exit fees, no retention flows, no dark patterns.
40 40 - Export and download remain available through the end of your billing period.
41 - - After cancellation, your existing content stays published for 30 days. After that, items are hidden (not deleted). Resubscribing to any tier automatically restores all hidden items.
41 + - After cancellation, your existing content stays published for {{ policy.cancellation_grace_days }} days. After that, items are hidden (not deleted). Resubscribing to any tier automatically restores all hidden items.
42 42
43 43 ---
44 44
@@ -54,11 +54,11 @@
54 54
55 55 ## Buyer Access
56 56
57 - **Guarantee:** If a creator deletes their account, fans retain access to content for 90 days.
57 + **Guarantee:** If a creator deletes their account, fans retain access to content for {{ policy.buyer_access_days }} days.
58 58
59 - - **One-time purchases:** Items remain downloadable for 90 days after the creator leaves.
60 - - **Membership content:** Fans with active memberships retain access during the same 90-day grace period. Memberships are not billed during this period.
61 - - After 90 days, content is removed from our servers.
59 + - **One-time purchases:** Items remain downloadable for {{ policy.buyer_access_days }} days after the creator leaves.
60 + - **Membership content:** Fans with active memberships retain access during the same {{ policy.buyer_access_days }}-day grace period. Memberships are not billed during this period.
61 + - After {{ policy.buyer_access_days }} days, content is removed from our servers.
62 62 - Buyers are notified by email when the grace period begins so they can download their files.
63 63 - Transaction records are preserved indefinitely (receipts remain valid).
64 64
@@ -80,13 +80,13 @@
80 80 **Guarantee:** If Makenot.work shuts down, the following process applies:
81 81 <!-- SOP: internal/business/sops/shutdown-notice.md -->
82 82
83 - 1. 90-day advance notice minimum before any service interruption.
84 - 2. Full export access maintained for the entire 90-day notice period.
83 + 1. {{ policy.shutdown_notice_days }}-day advance notice minimum before any service interruption.
84 + 2. Full export access maintained for the entire {{ policy.shutdown_notice_days }}-day notice period.
85 85 3. Data preservation: all content remains accessible for download.
86 86 4. Fan notification: we help communicate the transition to your audience.
87 87 5. Source code remains available for reference.
88 88
89 - **What it costs to keep the lights on during shutdown:** Fixed costs are ~${{ expenses.F_monthly }}/month; a full 90-day wind-down costs under $2,000 in hosting. Fan payments go directly to creator-controlled Stripe accounts, so there are no pending payouts to settle on our side. We don't depend on external funding to keep operating, and there are no investors or creditors who could force an early shutdown.
89 + **What it costs to keep the lights on during shutdown:** Fixed costs are ~${{ expenses.F_monthly }}/month; a full {{ policy.shutdown_notice_days }}-day wind-down costs under $2,000 in hosting. Fan payments go directly to creator-controlled Stripe accounts, so there are no pending payouts to settle on our side. We don't depend on external funding to keep operating, and there are no investors or creditors who could force an early shutdown.
90 90
91 91 ---
92 92
@@ -115,11 +115,11 @@
115 115 **Guarantee:** No price increases without:
116 116 <!-- SOP: internal/business/sops/price-change-notice.md -->
117 117
118 - - 90 days advance notice.
118 + - {{ policy.price_change_notice_days }} days advance notice.
119 119 - Published explanation of the change.
120 - - Grandfathering of existing creators at their current rate for at least 12 months.
120 + - Grandfathering of existing creators at their current rate for at least {{ policy.grandfather_months }} months.
121 121
122 - Founder-tier pricing is locked for the life of the account: founders keep their 50%-off rate and are never moved to standard pricing.
122 + Founder-tier pricing is locked for the life of the account: founders keep their {{ derived.founder_discount_pct | percent(0) }}-off rate and are never moved to standard pricing.
123 123
124 124 No investor pressure demanding revenue growth. Price changes would only happen if infrastructure costs change dramatically.
125 125
@@ -147,7 +147,7 @@
147 147
148 148 ## Availability
149 149
150 - **Guarantee:** We target 99.5% uptime (roughly 44 hours of downtime per year or less).
150 + **Guarantee:** We target {{ uptime.target_pct | percent }} uptime (roughly {{ uptime.target_downtime_hours_year }} hours of downtime per year or less).
151 151
152 152 - Current uptime published live at [makenot.work/health](https://makenot.work/health), including 24-hour and 7-day percentages.
153 153 - Monitored by two independent systems: an internal background monitor with email alerts, and an external monitor (PoM) on separate infrastructure.
@@ -178,7 +178,7 @@
178 178
179 179 *Planned, not yet implemented. We intend to build this before leaving beta.*
180 180
181 - Any content that has existed on the platform for 12 months or more would remain hosted and accessible to fans even if the creator stops paying for their account.
181 + Any content that has existed on the platform for {{ policy.content_archive_months }} months or more would remain hosted and accessible to fans even if the creator stops paying for their account.
182 182
183 183 - Archived content stays live at its original URLs.
184 184 - Fans who purchased the content retain access.
@@ -40,7 +40,7 @@
40 40
41 41 ## The Model
42 42
43 - You pay a monthly tier fee based on content type (${{ tiers.standard.basic }}-${{ tiers.standard.everything }}). We take 0% of your fan revenue. The only deduction is the payment processing fee (~3%). No ads, no percentage cuts, no hidden fees.
43 + You pay a monthly tier fee based on content type (${{ tiers.standard.basic }}-${{ tiers.standard.everything }}). We take 0% of your fan revenue. The only deduction is the payment processing fee (~{{ stripe.percent | percent }}). No ads, no percentage cuts, no hidden fees.
44 44
45 45 ### The Math
46 46
@@ -58,7 +58,7 @@
58 58 - 10% platform cut = $5,000 to the platform
59 59 - Flat fee model = same ${{ tiers.standard.basic }}-${{ tiers.standard.everything }} tier fee, plus Stripe: `5,000 × $0.30 + 2.9% × $50,000 = $1,500 + $1,450 = $2,950` processing
60 60
61 - The gap widens as you grow. A percentage-cut platform is most expensive exactly when you're doing the best. Higher average transaction sizes shift more of Stripe's cost into the 2.9% line and away from the per-transaction $0.30; lower average sizes do the opposite.
61 + The gap widens as you grow. A percentage-cut platform is most expensive exactly when you're doing the best. Higher average transaction sizes shift more of Stripe's cost into the {{ stripe.percent | percent }} line and away from the per-transaction {{ stripe.fixed | money }}; lower average sizes do the opposite.
62 62
63 63 ---
64 64
@@ -97,7 +97,7 @@
97 97
98 98 *Planned, not yet implemented. We intend to build this before leaving beta.*
99 99
100 - Content that has been on the platform for 12 months or more would stay hosted even if you cancel. Your fans keep access. You just can't upload new content without reactivating. See our [written guarantees](./guarantees.md) for the full commitment.
100 + Content that has been on the platform for {{ policy.content_archive_months }} months or more would stay hosted even if you cancel. Your fans keep access. You just can't upload new content without reactivating. See our [written guarantees](./guarantees.md) for the full commitment.
101 101
102 102 ---
103 103
@@ -129,7 +129,7 @@
129 129
130 130 No outside investors. No debt. Nobody can make us raise prices, add ads, or sell the company. If we can't sustain this on creator tier fees, we'll wind down honestly, not pivot into something exploitative.
131 131
132 - Prices won't go up unless infrastructure costs force it. If they ever do, we'll say exactly what changed, give 90 days notice, and grandfather everyone at their current rate.
132 + Prices won't go up unless infrastructure costs force it. If they ever do, we'll say exactly what changed, give {{ policy.price_change_notice_days }} days notice, and grandfather everyone at their current rate.
133 133 <!-- SOP: internal/business/sops/price-change-notice.md -->
134 134
135 135 ### Where Your Money Goes
@@ -22,14 +22,14 @@
22 22
23 23 Every tier is the complete platform: profile page at `/u/username`, project and item pages, a per-project forum, [Discover](/discover) listing, memberships, pay-what-you-want, promo codes, RSS, analytics, full data export. The tier picks the file-size envelope, not the feature set.
24 24
25 - | Tier | Monthly | Annual (10% off) | File-size envelope |
25 + | Tier | Monthly | Annual ({{ derived.annual_discount_pct | percent(0) }} off) | File-size envelope |
26 26 |---|---|---|---|
27 27 | **Basic** | ${{ tiers.founding.basic }}/mo | ${{ derived.annual_founding_basic }}/yr | Up to {{ tier_limits.basic_per_file }} per file, {{ tier_limits.basic_total }} total. Fits text, blogs, newsletters, posts. |
28 28 | **Small Files** | ${{ tiers.founding.small_files }}/mo | ${{ derived.annual_founding_small_files }}/yr | Up to {{ tier_limits.small_files_per_file }} per file, {{ tier_limits.small_files_total }} total. Fits audio, plugins, binaries, sample packs. |
29 29 | **Big Files** | ${{ tiers.founding.big_files }}/mo | ${{ derived.annual_founding_big_files }}/yr | Up to {{ tier_limits.big_files_per_file }} per file, {{ tier_limits.big_files_total }} total. Fits video, games, large software. |
30 30 | **Everything** | ${{ tiers.founding.everything }}/mo | ${{ derived.annual_founding_everything }}/yr | Big Files envelope plus first access to high-cost capabilities as they ship (streaming infrastructure, etc.). |
31 31
32 - Annual is 10% off the monthly total. Most of that is the Stripe per-transaction fee we don't pay when we charge once a year instead of twelve times. We pass it back rather than keep it.
32 + Annual is {{ derived.annual_discount_pct | percent(0) }} off the monthly total. Most of that is the Stripe per-transaction fee we don't pay when we charge once a year instead of twelve times. We pass it back rather than keep it.
33 33
34 34 See [tiers](../guide/tiers.md) for the full feature breakdown and storage limits.
35 35
@@ -39,7 +39,7 @@
39 39
40 40 The standard rate applies to new signups after the founder window closes. The values below are **provisional targets, not committed prices**. We deliberately put founder pricing in front of standard pricing because we want real signup data, real tier-mix data, and real support-load data to set the post-founder number rather than guessing. The standard rate may end up lower than the targets below, the same, or higher. If it rises, the change comes with the notice and grandfathering described in [Guarantees](./guarantees.md), and our founders are below it either way.
41 41
42 - | Tier | Monthly | Annual (10% off) |
42 + | Tier | Monthly | Annual ({{ derived.annual_discount_pct | percent(0) }} off) |
43 43 |---|---|---|
44 44 | **Basic** | ${{ tiers.standard.basic }}/mo | ${{ derived.annual_standard_basic }}/yr |
45 45 | **Small Files** | ${{ tiers.standard.small_files }}/mo | ${{ derived.annual_standard_small_files }}/yr |
@@ -68,7 +68,7 @@
68 68
69 69 Prices may **fall** if our cost structure allows, for example if infrastructure or processing costs come down at our scale. Cost-favorable changes apply retroactively to active subscriptions.
70 70
71 - Prices will only **rise** under the conditions described in [Guarantees](./guarantees.md). If that ever happens, we'll give at least 90 days notice, explain the reasoning in writing, and grandfather existing subscribers at their current rate for at least 12 months.
71 + Prices will only **rise** under the conditions described in [Guarantees](./guarantees.md). If that ever happens, we'll give at least {{ policy.price_change_notice_days }} days notice, explain the reasoning in writing, and grandfather existing subscribers at their current rate for at least {{ policy.grandfather_months }} months.
72 72
73 73 ---
74 74
@@ -14,7 +14,7 @@
14 14
15 15 ## The Alternative
16 16
17 - We charge a flat monthly fee based on what you need to host: ${{ tiers.standard.basic }} for text, ${{ tiers.standard.small_files }} for audio and software, ${{ tiers.standard.big_files }} for video and large files, ${{ tiers.standard.everything }} for all features, current and future. We take 0% of your revenue. The only deduction from fan payments is the payment processor's fee (~3%), which goes to the processor, not us.
17 + We charge a flat monthly fee based on what you need to host: ${{ tiers.standard.basic }} for text, ${{ tiers.standard.small_files }} for audio and software, ${{ tiers.standard.big_files }} for video and large files, ${{ tiers.standard.everything }} for all features, current and future. We take 0% of your revenue. The only deduction from fan payments is the payment processor's fee (~{{ stripe.percent | percent }}), which goes to the processor, not us.
18 18
19 19 Your tier fee funds the platform. No incentive to take a cut of your sales, show ads to your fans, or lock you in.
20 20