docs: fix outdated claims, dead links and broken examples (LIN-2565) - #196
Merged
Conversation
Full audit of the docs against hazelnut, ts-backend, the dashboard and the published SDKs. Events are no longer gated on attribution. Around 20 places across 14 files claimed "Events are only stored and displayed for attributed users" and told customers to call signup first or lose data. There is no attribution gate in the ingest path, and hazelnut.user_events_denormalized recorded 4,058,511 events in the last 3 days for users with no campaign and no ad network, across 179 projects. The only requirement is an identity (user_id or install_instance_id), so the copy now says that. Billing: - Growth entry tier is $0.012/install, not "starting at $0.01". It is a flat tier model, so a sub-10k customer pays $0.012 on the whole month. - Added Stripe to payment methods (shipped 2026-08-01, LIN-1638). - All four "pay your invoice" links pointed at /billing, which 404s. Dead links (17): - /dashboard/settings/events (13 refs) 404s. The page is /dashboard/events. - ?s=webhooks is not a recognized settings key and silently landed users on Project Details. - /api-reference/introduction and the unity-spm GitHub repo no longer exist. Broken code examples: - Android signup was missing a comma, so it did not compile. - iOS used mixpanelDistinctId; the real label is mixPanelDistinctId. - iOS wrapped 14 non-throwing calls in try/do/catch, giving unreachable-catch warnings. None of the public methods are declared throws in 4.1.0. - Flutter model classes are not re-exported by linkrunner.dart, which the docs never mentioned. - Removed PaymentType.SECOND_PAYMENT from the Flutter and React Native docs. It is gone from flutter 4.1.1 and rn-linkrunner 3.1.0, though iOS 4.1.0, Android 4.1.0 and the backend all still support it. See the ticket. - React Native removePayment requires userId; paymentId is the optional one. - Corrected the rn-linkrunner and linkrunner package names. Removed the Web SDK page. It was absent from docs.json navigation, its setup steps pointed at a settings section that does not exist, and its script tag 404d. Removed the page, its two redirects, and every reference to it. API reference: - Documented user_id, gaid, idfa, store_click_at and installed_at on the get-attribution-result response, and network_account and website on Campaign. - capture-event returns 200, not 201, and accepts user_id or install_instance_id. - Documented the MAIN_DOMAIN rename and delete guards from LIN-2124, and corrected the domain-not-found error text. - Campaign edit example used PUT; only PATCH is registered. Dashboard UI: - Settings > Subdomains is now Settings > Manage Domains. - Domain Verification is now the Deeplinks section with different field labels. - Integrations is a top-level sidebar item, not nested under Settings. - The MCP connector is added with a terminal command, not an "Add to Claude" button. - Project Token lives in the SDK Console. - Dropped the stale SDK Console beta notices; it shipped in April 2026. Deleted the four unused Mintlify starter templates under api-reference/endpoint. Co-Authored-By: Claude Opus 5 (1M context) <noreply@anthropic.com>
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
Full audit of the public docs against hazelnut, ts-backend, the dashboard and the currently published SDKs.
Ticket: https://linear.app/linkrunner/issue/LIN-2565
The big one: we do track events for unattributed users
Around 20 places across 14 files claimed "Events are only stored and displayed for attributed users" and told customers to call
signupfirst or lose data.That is false. There is no attribution gate anywhere in the ingest path (
gateway/handler/data_api.go,internal/service/data.go), andhazelnut.user_events_denormalizedrecorded 4,058,511 events in the last 3 days for users with no campaign and no ad network, across 179 projects, which is roughly half of all event volume. The only requirement is an identity (user_idorinstall_instance_id).This was actively telling customers to expect data loss that is not happening.
Billing
ts-backend/src/constant/billing.ts:35). It is a flat tier model, so a sub-10k customer pays $0.012 on the whole month./billing, which 404s. Correct route is/dashboard/billing.Dead links (17)
/dashboard/settings/events(13 references across 8 files) 404s. The page is/dashboard/events.?s=webhooksis not a recognized settings key, so it silently landed users on Project Details./api-reference/introductionand theunity-spmGitHub repo no longer exist.Broken code examples
mixpanelDistinctId; the real argument label ismixPanelDistinctId.try/do/catch. No public method is declaredthrowsin 4.1.0, so these produced unreachable-catch warnings.linkrunner.dart, which the docs never mentioned.removePaymentrequiresuserId;paymentIdis the optional one.rn-linkrunnerandlinkrunnerpackage names.Web SDK page removed
sdk/web.mdxwas absent fromdocs.jsonnavigation, its setup steps pointed at a "Web SDK" settings section that does not exist (the token lives under Whitelist SDKs), and its script tag 404d. Removed the page, its two redirects, and every reference to it.API reference
user_id,gaid,idfa,store_click_at,installed_aton theget-attribution-resultresponse, andnetwork_account+websiteonCampaign.capture-eventreturns 200, not 201, and acceptsuser_idorinstall_instance_id(the latter was undocumented).PUT; onlyPATCHis registered.Dashboard UI drift
Settings > Subdomainsis now Manage Domains.Domain Verificationis now the Deeplinks section with different field labels.Also deleted the four unused Mintlify starter templates under
api-reference/endpoint/(still literally "Create Plant" /POST /plants).SECOND_PAYMENT removal
Removed 4 lines total, all in the Flutter and React Native docs:
sdk/flutter.mdx- the commentedtype: PaymentType.SECOND_PAYMENTline in thecapturePaymentexample, and thePaymentType.SECOND_PAYMENTbullet in the payment-type list.sdk/react-native.mdx- the equivalent commentedtype: "SECOND_PAYMENT"line and list bullet.Why: these two SDKs no longer accept the value, so the docs were pointing at an enum member that does not exist. Verified against the published packages, not the local checkout:
SECOND_PAYMENTlinkrunner(Flutter)rn-linkrunnerlinkrunner-ios/ LinkrunnerKitcase secondPayment = "SECOND_PAYMENT")io.linkrunner:android-sdkSECOND_PAYMENT("SECOND_PAYMENT"))hazelnut/internal/domain/revenue.go:8, Prisma enum)Flutter 4.1.1
PaymentTypeisFIRST_PAYMENT, WALLET_TOPUP, FUNDS_WITHDRAWAL, SUBSCRIPTION_CREATED, SUBSCRIPTION_RENEWED, DEFAULT_PAYMENT, ONE_TIME, RECURRING. The rn-linkrunner 3.1.0 type union matches, withDEFAULTin place ofDEFAULT_PAYMENT.Deliberately left alone, because they are all still correct:
sdk/ios.mdx- including thePaymentTypeenum block, which matches published 4.1.0 exactly.sdk/android.mdx- the value and its table row.sdk/unity.mdx,sdk/capacitor.mdx,sdk/cordova.mdx- these wrap the native iOS/Android SDKs and pass the type as a string, so the value still works.api-reference/revenue-tracking.mdxandsdk-less/api-reference.mdx- these document the wire format, which still accepts it.Open question, not for this PR: the backend, iOS and Android all support
SECOND_PAYMENT, but Flutter and React Native dropped it. That reads as an SDK regression rather than an intentional deprecation. If it was intentional, the other three should drop it too and this section becomes a wider docs change. If it was not, Flutter and RN should re-add it and these 4 lines get reverted. Happy to revert the removal instead if you would rather keep the docs ahead of the SDK fix.Verification
mintlify broken-linkspasses (the 20 TikTok image hits are a pre-existing false positive; the checker does not decode%20, and the files serve 200 live).Note: the local
sdk/checkout is well behind published (Flutter 3.9.1 vs 4.1.1, RN 2.10.1 vs 3.1.0, Android 3.8.1 vs 4.1.0, iOS 3.11.0 vs 4.1.0), so registry tarballs were used as ground truth.