agentsclimarketplace

Linktree debug bundle

Skill jeremylongshore/claude-code-plugins-plus-skills/plugins/saas-packs/linktree-pack/skills/linktree-debug-bundle

425 plugins, 2,810 skills, 200 agents for Claude Code. Open-source marketplace at tonsofskills.com with the ccpi CLI package manager.

Install
npx -y skills add jeremylongshore/claude-code-plugins-plus-skills --skill linktree-debug-bundle

Assembled from the repository path, not quoted from the project. Check it against their README if it does not work.

What its author says it does

Copied from the file, not written here

'Debug Bundle for Linktree.

The file declares its own license as MIT. That is the author’s claim about this one file, and it is not the same thing as the license GitHub reports for the repository, which is listed with the other numbers below.

SKILL.md

5.4 KB, as published. Nobody here has run it

Linktree Debug Bundle

Overview

This debug bundle collects diagnostic evidence from Linktree link-in-bio API integrations for troubleshooting profile rendering, link analytics, and webhook delivery issues. It captures OAuth token validity, profile metadata retrieval, individual link status checks, click analytics availability, and webhook endpoint health. The resulting tarball gives support engineers the data needed to diagnose broken links, missing analytics events, profile sync failures, and API permission issues without requiring Linktree admin access.

Prerequisites

  • curl, jq, tar installed
  • LINKTREE_API_KEY set (OAuth bearer token from Linktree developer portal)

Debug Collection Script

#!/bin/bash
set -euo pipefail
BUNDLE="debug-linktree-$(date +%Y%m%d-%H%M%S)"
mkdir -p "$BUNDLE"

# Environment check
echo "=== Environment ===" > "$BUNDLE/environment.txt"
echo "API Key: ${LINKTREE_API_KEY:+SET (redacted)}" >> "$BUNDLE/environment.txt"
echo "Node: $(node -v 2>/dev/null || echo 'not installed')" >> "$BUNDLE/environment.txt"
echo "Timestamp: $(date -u)" >> "$BUNDLE/environment.txt"

# API connectivity — user profile
echo "=== API Health ===" > "$BUNDLE/api-health.txt"
curl -sf -o "$BUNDLE/api-health.txt" -w "HTTP %{http_code} in %{time_total}s\n" \
  -H "Authorization: Bearer ${LINKTREE_API_KEY}" \
  "https://api.linktree.com/v1/user" 2>&1 || echo "UNREACHABLE" > "$BUNDLE/api-health.txt"

# Profile links enumeration
echo "=== Links ===" > "$BUNDLE/links.json"
curl -sf -H "Authorization: Bearer ${LINKTREE_API_KEY}" \
  "https://api.linktree.com/v1/links" \
  >> "$BUNDLE/links.json" 2>&1 || echo '{"error":"FAILED"}' > "$BUNDLE/links.json"

# Link click analytics (last 7 days)
echo "=== Analytics ===" > "$BUNDLE/analytics.json"
curl -sf -H "Authorization: Bearer ${LINKTREE_API_KEY}" \
  "https://api.linktree.com/v1/analytics?period=7d" \
  >> "$BUNDLE/analytics.json" 2>&1 || echo '{"error":"ANALYTICS_FAILED"}' > "$BUNDLE/analytics.json"

# Recent logs
echo "=== Recent Logs ===" > "$BUNDLE/app-logs.txt"
tail -100 /var/log/linktree-sync/*.log >> "$BUNDLE/app-logs.txt" 2>/dev/null || echo "No sync logs found" >> "$BUNDLE/app-logs.txt"

# Rate limit status
echo "=== Rate Limits ===" > "$BUNDLE/rate-limits.txt"
curl -sI -H "Authorization: Bearer ${LINKTREE_API_KEY}" \
  "https://api.linktree.com/v1/user" 2>/dev/null | grep -i "x-rate\|retry-after\|x-ratelimit" >> "$BUNDLE/rate-limits.txt" || echo "No rate limit headers" >> "$BUNDLE/rate-limits.txt"

# Package versions
echo "=== Dependencies ===" > "$BUNDLE/deps.txt"
npm ls 2>/dev/null | grep -i linktree >> "$BUNDLE/deps.txt" || echo "No Linktree npm packages found" >> "$BUNDLE/deps.txt"

tar -czf "$BUNDLE.tar.gz" "$BUNDLE" && rm -rf "$BUNDLE"
echo "Bundle: $BUNDLE.tar.gz"

Analyzing the Bundle

tar -xzf debug-linktree-*.tar.gz
cat debug-linktree-*/environment.txt     # Verify API key is set
cat debug-linktree-*/api-health.txt      # Check HTTP status and latency
jq '.links | length' debug-linktree-*/links.json       # Count active links
jq '.totalClicks' debug-linktree-*/analytics.json      # Verify analytics data

Common Issues

SymptomCheck in BundleFix
401 Unauthorizedenvironment.txt shows key NOT SETGenerate new API key in Linktree Developer Settings
Profile returns but links emptylinks.json has empty arrayEnsure links are published (not draft); check link visibility settings
Analytics returns 403analytics.json shows permission errorAnalytics API requires Pro plan or higher; upgrade Linktree subscription
Click counts stuck at zeroanalytics.json shows totalClicks: 0Analytics lag up to 24h; verify links have tracking enabled
429 rate limitedrate-limits.txt shows retry-afterLinktree allows 100 req/min; implement request queuing with backoff
Webhook not firingApp logs show no delivery attemptsVerify webhook URL in Linktree admin; check SSL cert validity on receiving endpoint

Automated Health Check

async function checkLinktreeHealth(): Promise<{
  status: string;
  latencyMs: number;
  profileOk: boolean;
  linkCount: number;
  analyticsAvailable: boolean;
}> {
  const apiKey = process.env.LINKTREE_API_KEY;
  const headers = { Authorization: `Bearer ${apiKey}` };
  const start = Date.now();

  const profileRes = await fetch("https://api.linktree.com/v1/user", { headers });
  const linksRes = await fetch("https://api.linktree.com/v1/links", { headers });
  const analyticsRes = await fetch("https://api.linktree.com/v1/analytics?period=7d", { headers });

  let linkCount = 0;
  if (linksRes.ok) {
    const data = await linksRes.json();
    linkCount = data.links?.length ?? 0;
  }

  return {
    status: profileRes.ok ? "healthy" : "degraded",
    latencyMs: Date.now() - start,
    profileOk: profileRes.ok,
    linkCount,
    analyticsAvailable: analyticsRes.ok,
  };
}

Resources

Next Steps

See linktree-rate-limits.

Keep looking

Skills are one crate of 328,083. Ordering is by how many stacks a row turns up in, so the top of any crate is what has actually been picked rather than what has the most stars.