fix(pricing): remove the phantom "XLSX exports" claim from API Business (#4974)#4975
Conversation
…ss (#4974) Elie's catch: the tier advertises XLSX exports, but no XLSX exporter, endpoint, or library exists anywhere in the product — the only xlsx mentions are the marketing string itself and the unconsumed exportFormats metadata. The bullet shipped with the original hidden catalog entry (#4563) and #4946 propagated it to every public surface. Removed from: catalog marketingFeatures, both live-catalog mirrors (api/product-catalog.js + ais-relay.cjs), apiSection.businessWebhooks copy (25 locales -> "Priority support"), pricing.md prose + JSON summary, pricing.mdx table + bullets, /pro JSON-LD offer description; tiers.json + en/fa placeholders via generator regen. exportFormats metadata left untouched (entitlement-row shape, no consumer). The tier's true differentiators stand: 300 req/min, 10,000 req/day, priority support. public/pro rebuilt; 54/54 across freshness/parity + drift + locale-registry + billing-mode + funnel-policy suites. Closes #4974 Claude-Session: https://claude.ai/code/session_0161Cso3K8pbtf276Q9WPM3s
|
The latest updates on your projects. Learn more about Vercel for GitHub.
|
Greptile SummaryThis PR removes the phantom "XLSX exports" marketing claim from the API Business tier across every pricing surface — a false feature that never had any implementation behind it. All 25 locale files, the Convex catalog source of truth, the edge product-catalog endpoint, the Railway relay seeder, documentation, JSON-LD structured data, and the generated bundles are updated consistently.
Confidence Score: 4/5Safe to merge — the false XLSX marketing claim is removed consistently from every identified pricing surface, and no application logic is broken by the change. The XLSX string is gone from all live-facing surfaces. The one wrinkle is that API_BUSINESS_FEATURES.exportFormats in the Convex catalog still lists "xlsx" as an entitlement-schema value for a feature that doesn't exist. No code currently reads that array to gate behaviour, so it's inert today — but it's stale data that will mislead the next developer who adds export-gating logic. The Railway relay script also maintains its own hard-coded copy of the tier config, which required a separate manual edit and will need to be kept in sync for future pricing changes. convex/config/productCatalog.ts (API_BUSINESS_FEATURES.exportFormats still contains "xlsx"); scripts/ais-relay.cjs (duplicated DODO_TIER_CONFIG). Important Files Changed
Flowchart%%{init: {'theme': 'neutral'}}%%
flowchart TD
A["convex/config/productCatalog.ts\n(source of truth)"] -->|"drives"| B["api/product-catalog.js\n(Vercel edge endpoint)"]
A -->|"mirrors"| C["public/pricing.md\n(prose + machine-readable JSON)"]
A -->|"mirrors"| D["docs/pricing.mdx\n(Mintlify docs table)"]
B -->|"seeded by"| E["scripts/ais-relay.cjs\n(Railway DODO_TIER_CONFIG — own copy)"]
B -->|"cached in Redis"| F["/api/product-catalog\n(live JSON endpoint — needs cache purge)"]
A -->|"regen"| G["pro-test/src/generated/tiers.json"]
G -->|"compiled into"| H["public/pro/assets/*.js bundles"]
A -->|"drives"| I["pro-test/src/locales/*.json\n(25 locale businessWebhooks strings)"]
I -->|"compiled into"| H
H -->|"referenced by"| J["public/pro/index.html\n(JSON-LD + module preload)"]
H -->|"referenced by"| K["public/pro/welcome.html"]
style F fill:#ff9,stroke:#cc0,color:#000
style E fill:#fdd,stroke:#c00,color:#000
%%{init: {'theme': 'base', 'themeVariables': {"darkMode": true, "background": "#0d1117", "primaryColor": "#21262d", "primaryTextColor": "#e6edf3", "primaryBorderColor": "#8b949e", "lineColor": "#8b949e", "textColor": "#e6edf3", "edgeLabelBackground": "#161b22", "actorBkg": "#21262d", "actorBorder": "#8b949e", "actorTextColor": "#e6edf3", "actorLineColor": "#8b949e", "signalColor": "#8b949e", "signalTextColor": "#e6edf3", "noteBkgColor": "#373320", "noteBorderColor": "#d4a72c", "noteTextColor": "#f0e6c0", "labelBoxBkgColor": "#21262d", "labelBoxBorderColor": "#8b949e", "labelTextColor": "#e6edf3", "loopTextColor": "#e6edf3", "activationBkgColor": "#30363d", "activationBorderColor": "#8b949e"}}}%%
flowchart TD
A["convex/config/productCatalog.ts\n(source of truth)"] -->|"drives"| B["api/product-catalog.js\n(Vercel edge endpoint)"]
A -->|"mirrors"| C["public/pricing.md\n(prose + machine-readable JSON)"]
A -->|"mirrors"| D["docs/pricing.mdx\n(Mintlify docs table)"]
B -->|"seeded by"| E["scripts/ais-relay.cjs\n(Railway DODO_TIER_CONFIG — own copy)"]
B -->|"cached in Redis"| F["/api/product-catalog\n(live JSON endpoint — needs cache purge)"]
A -->|"regen"| G["pro-test/src/generated/tiers.json"]
G -->|"compiled into"| H["public/pro/assets/*.js bundles"]
A -->|"drives"| I["pro-test/src/locales/*.json\n(25 locale businessWebhooks strings)"]
I -->|"compiled into"| H
H -->|"referenced by"| J["public/pro/index.html\n(JSON-LD + module preload)"]
H -->|"referenced by"| K["public/pro/welcome.html"]
style F fill:#ff9,stroke:#cc0,color:#000
style E fill:#fdd,stroke:#c00,color:#000
|
…-links + feature-array parity (PR #4975 review) Greptile's two findings on the removal PR, both addressed: - exportFormats metadata still listed "xlsx" for api_business — inert today (nothing consumes the array) but primed to mislead the next developer who adds export-gating. Removed, and the PlanFeatures field now carries an explicit do-not-gate-on-this warning citing #4974. Enterprise's array left as-is (sales-led; the field-level warning covers it). - The seeder's DODO_TIER_CONFIG is a hand-maintained copy of the edge's TIER_CONFIG with nothing linking them. Both now carry cross-reference comments naming all three copies and the parity test — and the parity test itself now compares the FEATURE ARRAYS (mirror-to-mirror, and against generated tiers.json), which is exactly the check whose absence let the XLSX string survive in copy. Mutation-verified: re-adding the phantom to either mirror fails 4 assertions. 619/619 convex suite, 14/14 freshness/parity, typecheck:api clean, generator regen no-op. Claude-Session: https://claude.ai/code/session_0161Cso3K8pbtf276Q9WPM3s
|
Preview deployment for your docs. Learn more about Mintlify Previews.
💡 Tip: Enable Workflows to automatically generate PRs for you. |
Elie's catch post-#4946: no XLSX export functionality exists anywhere in the product — the only
xlsxmentions are the marketing string itself (shipped with the original hidden catalog in #4563) and the unconsumedexportFormatsmetadata. Same defect class as the 50,000-req/day overpromise.Removed from every surface: catalog bullet, both live-catalog mirrors (edge endpoint + Railway seeder),
apiSection.businessWebhooksin all 25 locales (→ "Priority support"), pricing.md (prose + machine-readable JSON), pricing.mdx, /pro JSON-LD offer, and the generated tiers.json + en/fa placeholders via regen.exportFormatsmetadata left as-is (entitlement-row shape, nothing consumes it). Verified zero remaining XLSX references on pricing surfaces; the two remaining repo hits are unrelated data-pipeline docs (EU fuel-price XLSX source files).54/54 across freshness/parity + drift + locale-registry + billing-mode + funnel-policy;
public/prorebuilt.Post-merge: purge
DELETE /api/product-catalogagain — the currently-cached payload still carries the XLSX string until then.Closes #4974
https://claude.ai/code/session_0161Cso3K8pbtf276Q9WPM3s