linktree-prod-checklist
Prod Checklist for Linktree. Trigger: "linktree prod checklist".
What this skill does
# Linktree Production Checklist
## Overview
Linktree profiles serve as the single gateway between a creator's social audience and their monetized destinations. A misconfigured integration can silently drop link-click analytics, leak API keys through client-side calls, or trip the 100 req/min rate limit during viral traffic spikes. This checklist hardens your Linktree API integration for production-grade reliability, ensuring click tracking stays accurate, webhook delivery remains verified, and your link-in-bio pages load under high concurrency.
## Prerequisites
- Production Linktree API key (not sandbox/dev key)
- Secrets manager configured (Vault, AWS Secrets Manager, or GCP Secret Manager)
- Monitoring stack operational (Datadog, Grafana, or CloudWatch)
- Staging environment validated with synthetic traffic test
## Authentication & Secrets
- [ ] API keys stored in vault/secrets manager (never in code or environment files)
- [ ] Key rotation schedule configured (every 90 days)
- [ ] Separate keys for staging vs production environments
- [ ] Bearer token included in Authorization header, not query params
- [ ] API key scopes restricted to minimum required permissions (read-only where possible)
## API Integration
- [ ] Base URL points to `https://api.linktr.ee/v1` (production, not sandbox)
- [ ] Rate limiting enforced client-side at 90 req/min (buffer below 100 req/min hard limit)
- [ ] Pagination implemented for profile link listing (cursor-based, not offset)
- [ ] Request timeout set to 10 seconds for profile reads, 30 seconds for analytics queries
- [ ] `Content-Type: application/json` and `Accept` headers set on every request
- [ ] Link click tracking webhook endpoint registered and reachable from Linktree servers
- [ ] Bulk link updates batched to avoid rate limit bursts during campaign launches
## Error Handling & Resilience
- [ ] Circuit breaker configured for Linktree API calls (open after 5 consecutive failures)
- [ ] Retry logic with exponential backoff for 429 (rate limit) and 5xx responses
- [ ] 429 responses parse `Retry-After` header to schedule next attempt
- [ ] Graceful degradation serves cached profile data when API is unreachable
- [ ] Link click events queued locally during outages and replayed on recovery
- [ ] Timeout errors distinguished from authentication errors in alerting
## Monitoring & Alerting
- [ ] API latency tracked (p50, p95, p99) with 500ms p95 threshold
- [ ] Error rate alerts configured (threshold: >1% over 5-minute window)
- [ ] Rate limit headroom monitored (alert when usage exceeds 80 req/min sustained)
- [ ] Click tracking event delivery lag measured (alert if >60s behind real-time)
- [ ] Profile cache hit ratio tracked (target: >90% for high-traffic creators)
- [ ] Webhook delivery failures logged with payload for manual replay
## Security
- [ ] Webhook signatures verified using HMAC-SHA256 with shared secret
- [ ] CORS restricted to known frontend domains (no wildcard origins)
- [ ] API responses sanitized before rendering user-generated link titles/descriptions
- [ ] Click analytics data access restricted by creator account scope
- [ ] No PII logged in plain text (creator emails, visitor IPs masked)
## Validation Script
```typescript
async function validateLinktreeProduction(apiKey: string): Promise<void> {
const base = 'https://api.linktr.ee/v1';
const headers = { Authorization: `Bearer ${apiKey}`, 'Content-Type': 'application/json' };
// 1. Connectivity check
const ping = await fetch(`${base}/health`, { headers, signal: AbortSignal.timeout(5000) });
console.assert(ping.ok, `API unreachable: ${ping.status}`);
// 2. Auth validation
const profile = await fetch(`${base}/me`, { headers });
console.assert(profile.status !== 401, 'Invalid API key');
console.assert(profile.status !== 403, 'Insufficient key permissions');
// 3. Rate limit headroom
const remaining = parseInt(profile.headers.get('X-RateLimit-Remaining') ?? '0');
console.assert(remaining > 20, `Rate limit headroom low: ${remaining} remaining`);
// 4. Webhook endpoint reachable
const webhookUrl = process.env.LINKTREE_WEBHOOK_URL;
if (webhookUrl) {
const wh = await fetch(webhookUrl, { method: 'HEAD', signal: AbortSignal.timeout(5000) });
console.assert(wh.ok, `Webhook endpoint unreachable: ${wh.status}`);
}
// 5. Click tracking active
const links = await fetch(`${base}/links`, { headers });
console.assert(links.ok, `Links endpoint failed: ${links.status}`);
console.log('All Linktree production checks passed');
}
```
## Risk Matrix
| Check | Risk if Skipped | Priority |
|---|---|---|
| HMAC webhook verification | Spoofed click events corrupt analytics | Critical |
| Rate limit client-side cap | 429 storm during viral spikes, data loss | Critical |
| Bearer token in vault | Key leak via repo/logs, full account takeover | Critical |
| Cached profile fallback | Blank link-in-bio page during outage | High |
| Click event replay queue | Permanent analytics gaps after transient failures | High |
## Resources
- [Linktree Developer Docs](https://linktr.ee/marketplace/developer)
## Next Steps
See `linktree-security-basics`.
Related in General
modeling-omnistudio-epc-catalog
IncludedSalesforce Industries CME EPC product-modeling skill for Product2-based catalog creation. Use when creating EPC products, configuring product attributes, building offer bundles with Product Child Items, or reviewing EPC DataPack JSON metadata for product catalog changes. TRIGGER when: user creates or updates Product2 EPC records, AttributeAssignment payloads, AttributeMetadata/AttributeDefaultValues, Offer bundles, or ProductChildItem relationships. DO NOT TRIGGER when: designing OmniScripts/FlexCards/Integration Procedures (use building-omnistudio-omniscript, building-omnistudio-flexcard, or building-omnistudio-integration-procedure), implementing Apex business logic (use generating-apex), or troubleshooting deployment pipelines (use deploying-metadata).
relationship-science-coach
IncludedUse this skill for direct, practical adult relationship coaching: couples conflict, repair, trust, marriage, dating, flirting, attachment patterns, emotional connection, sex, desire differences, eroticism, kink negotiation, affection, love languages, breakups, and long-term passion. Draw on Gottman, EFT and Hold Me Tight, attachment science, modern sex research, Perel, Nagoski, Kerner, Schnarch, Love and Stosny, and flexible love-language tools. Be concrete and low-hedge. Redirect only for imminent danger, abuse, coercive control, minors, non-consent, self-harm, stalking, or medical/legal/psychiatric decisions.
building-sf-integrations
IncludedSalesforce integration architecture and runtime plumbing with 120-point scoring. Use this skill to set up Named Credentials, External Credentials, External Services, REST/SOAP callout patterns, Platform Events, and Change Data Capture. TRIGGER when: user sets up Named Credentials, External Services, REST/SOAP callouts, Platform Events, CDC, or touches .namedCredential-meta.xml files. DO NOT TRIGGER when: Connected App/OAuth config (use configuring-connected-apps), Apex-only logic (use generating-apex), or data import/export (use handling-sf-data).
venue-templates
IncludedAccess comprehensive LaTeX templates, formatting requirements, and submission guidelines for major scientific publication venues (Nature, Science, PLOS, IEEE, ACM), academic conferences (NeurIPS, ICML, CVPR, CHI), research posters, and grant proposals (NSF, NIH, DOE, DARPA). This skill should be used when preparing manuscripts for journal submission, conference papers, research posters, or grant proposals and need venue-specific formatting requirements and templates.
let-fate-decide
IncludedDraws the 12 Houses of the Zodiac Tarot spread to inject entropy into planning when prompts are vague, ambiguous, or casually delegated. Interprets the spread to guide next steps. Use when the user says 'let fate decide', 'YOLO', 'whatever', 'idk', or other nonchalant phrases, makes Yu-Gi-Oh references, or when you are about to arbitrarily pick between multiple reasonable approaches. Prefer over ask-questions-if-underspecified when the user's tone is casual or playful rather than precision-seeking.
net-ops
IncludedCross-platform network troubleshooting (Windows, macOS, Linux) via local or remote shell. Use for: DNS broken, can't resolve hostnames, nslookup/dig works but apps fail, NRPT, WFP, scutil, /etc/resolver, systemd-resolved, /etc/resolv.conf, NetworkManager, VPN DNS leak residue (ProtonVPN/Mullvad/WireGuard/AnyConnect), AV/firewall blocking DNS or DoH, Tailscale DNS interaction, intermittent connectivity, remote diagnostics over SSH.