Skip to content

docs: fix outdated claims, dead links and broken examples (LIN-2565) - #196

Merged
RathodDarshil merged 1 commit into
mainfrom
darshil/lin-2565-docs-audit-fixes
Aug 25, 2026
Merged

docs: fix outdated claims, dead links and broken examples (LIN-2565)#196
RathodDarshil merged 1 commit into
mainfrom
darshil/lin-2565-docs-audit-fixes

Conversation

@RathodDarshil

@RathodDarshil RathodDarshil commented Aug 25, 2026

Copy link
Copy Markdown
Collaborator

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 signup first 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), 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, which is roughly half of all event volume. The only requirement is an identity (user_id or install_instance_id).

This was actively telling customers to expect data loss that is not happening.

Billing

  • Growth entry tier is $0.012/install, not "starting at $0.01" (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.
  • Added Stripe to payment methods (shipped 2026-08-01, LIN-1638).
  • All four "pay your invoice" links pointed at /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=webhooks is not a recognized settings key, so it 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 the snippet did not compile.
  • iOS used mixpanelDistinctId; the real argument label is mixPanelDistinctId.
  • iOS wrapped 14 non-throwing calls in try/do/catch. No public method is declared throws in 4.1.0, so these produced unreachable-catch warnings.
  • Flutter model classes are not re-exported by linkrunner.dart, which the docs never mentioned.
  • React Native removePayment requires userId; paymentId is the optional one.
  • Corrected the rn-linkrunner and linkrunner package names.

Web SDK page removed

sdk/web.mdx was absent from docs.json navigation, 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

  • Documented user_id, gaid, idfa, store_click_at, installed_at on the get-attribution-result response, and network_account + website on Campaign.
  • capture-event returns 200, not 201, and accepts user_id or install_instance_id (the latter was undocumented).
  • 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 drift

  • Settings > Subdomains is now 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 April 2026.

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 commented type: PaymentType.SECOND_PAYMENT line in the capturePayment example, and the PaymentType.SECOND_PAYMENT bullet in the payment-type list.
  • sdk/react-native.mdx - the equivalent commented type: "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:

SDK Version Has SECOND_PAYMENT
linkrunner (Flutter) 4.1.1 (pub.dev) No
rn-linkrunner 3.1.0 (npm) No
linkrunner-ios / LinkrunnerKit 4.1.0 (CocoaPods) Yes (case secondPayment = "SECOND_PAYMENT")
io.linkrunner:android-sdk 4.1.0 (Maven Central) Yes (SECOND_PAYMENT("SECOND_PAYMENT"))
Backend (wire value) live Yes (hazelnut/internal/domain/revenue.go:8, Prisma enum)

Flutter 4.1.1 PaymentType is FIRST_PAYMENT, WALLET_TOPUP, FUNDS_WITHDRAWAL, SUBSCRIPTION_CREATED, SUBSCRIPTION_RENEWED, DEFAULT_PAYMENT, ONE_TIME, RECURRING. The rn-linkrunner 3.1.0 type union matches, with DEFAULT in place of DEFAULT_PAYMENT.

Deliberately left alone, because they are all still correct:

  • sdk/ios.mdx - including the PaymentType enum 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.mdx and sdk-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-links passes (the 20 TikTok image hits are a pre-existing false positive; the checker does not decode %20, and the files serve 200 live).
  • Every URL added in this diff returns 200.
  • No orphaned pages, no navigation entries pointing at missing files, no dead redirects.
  • All MDX fences and components balanced.
  • Code examples checked against sources pulled from pub.dev, npm, CocoaPods and Maven Central.

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.

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>
@RathodDarshil
RathodDarshil merged commit 8624598 into main Aug 25, 2026
5 checks passed
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant