{"slug": "three-gpu-affiliate-programs-i-wired-into-an-ai-tool-directory", "title": "Three GPU affiliate programs I wired into an AI tool directory", "summary": "A developer integrated three GPU cloud affiliate programs—RunPod, Vast.ai, and Hetzner Cloud—into an AI tools directory after finding Amazon's conversion weak for developer-adjacent products. The monetization uses simple referral codes in URLs without JavaScript dependencies, and GPU links appear only for model types where self-hosting is plausible, such as LLMs and vision models. Early observations indicate RunPod offers a smoother onboarding experience than Vast.ai, while Hetzner's longer conversion path may limit revenue.", "body_md": "When I decided to [drop AdSense and bet on affiliate monetization](https://dev.to/articles/why-affiliate-beats-adsense-new-ai-directories) for my AI tools directory, Amazon was the obvious first integration — books and GPU hardware are contextually reasonable on a site full of open-source AI models. But Amazon's conversion story for developer-adjacent products is weak. The users landing on a LLaMA or Whisper model page are not there to buy a deep learning textbook; they're evaluating whether to self-host something.\n\nThat realization pointed toward GPU cloud affiliates. People who read model pages are more likely to spin up a pod than click a book link. Here's what I integrated, how, and what I'm watching.\n\n| Program | Commission structure | Referral mechanism |\n|---|---|---|\n| RunPod | % of referred user's spending | Referral code in URL |\n| Vast.ai | % of referred user's spending | Referral code in URL |\n| Hetzner Cloud | One-time credit on signup | Custom referral link |\n\nAll three use simple referral codes embedded in URLs — no SDK, no iframe, just a URL parameter. That's intentional; I didn't want JavaScript dependencies on a statically generated site.\n\nThe monetization package exports three URL builder functions:\n\n```\n// packages/shared/src/monetization/index.ts\n\nexport function runpodReferralUrl(ref: string | null): string | null {\n  if (!ref) return null;\n  return `https://www.runpod.io/?ref=${encodeURIComponent(ref)}`;\n}\n\nexport function vastReferralUrl(ref: string | null): string | null {\n  if (!ref) return null;\n  return `https://cloud.vast.ai/?ref_id=${encodeURIComponent(ref)}`;\n}\n\nexport function hetznerReferralUrl(ref: string | null): string | null {\n  if (!ref) return null;\n  return `https://hetzner.cloud/?ref=${encodeURIComponent(ref)}`;\n}\n```\n\nEach function returns `null`\n\nwhen the environment variable isn't set — so links simply don't render in development or in preview deployments where I haven't configured the ref codes. No dead links, no placeholder text.\n\nOn the model detail page, I build the affiliate sidebar conditionally based on `pipeline_tag`\n\n:\n\n``` js\nconst aff = getAffiliateConfig();\n\n// Only show GPU affiliates for model types where self-hosting is plausible\nconst showGpuLinks = isLLM || isVision;\n\nconst gpuLinks = showGpuLinks ? [\n  { label: \"RunPod\", note: \"On-demand GPU pods\", url: runpodReferralUrl(aff.runpodRef) },\n  { label: \"Vast.ai\", note: \"Marketplace GPUs\", url: vastReferralUrl(aff.vastRef) },\n].filter((p): p is { label: string; note: string; url: string } => p.url !== null) : [];\n```\n\nEmbedding models, classification models, and anything with a null `pipeline_tag`\n\ndon't get the GPU sidebar. The reasoning: someone using a 384-dim sentence transformer doesn't need a GPU pod — they're calling an API or running inference on CPU. Showing GPU rental links there would be noise.\n\nI won't fabricate numbers at week four. What I can say:\n\n**RunPod is easier to link to than Vast.ai.** [RunPod's](https://www.runpod.io/) referral URL resolves cleanly with no login wall before the landing page. [Vast.ai](https://vast.ai/) drops you directly on the instance marketplace, which is great if you already know what you're doing and confusing if you don't. For a cold click from a model page, RunPod's onboarding is softer.\n\n**Hetzner is the odd one out.** Hetzner Cloud is a German VPS provider — good for CPU-heavy workloads, affordable storage, strong EU datacenter story. It's on the model pages for users who want to run lighter inference (embedding models on CPU, small classifiers) at a lower cost than GPU cloud. The problem: the conversion path is long. A user has to sign up, set up a server, install dependencies, and deploy a model before Hetzner earns anything. I added it anyway because the referral credit structure means even a few conversions matter, but I'm skeptical it'll generate meaningful revenue without editorial content guiding the setup.\n\n**Amazon still outranks all of them in raw click volume** — because the Amazon links are on more pages (all model pages, not just LLM/vision) and Amazon's brand is more trusted for an impulse click. Whether clicks convert is a different question I can't answer yet.\n\n**DigitalOcean and Vultr** are already in the affiliate config object but not yet wired to any page. DigitalOcean's GPU droplets are new-ish and not as well-known as RunPod; Vultr has a straightforward referral program. I'll add both once I have any signal about whether the current GPU links are being used.\n\n**Contextual text around the affiliate links.** Right now the sidebar is just label + note + arrow. A one-sentence \"why you'd use this\" blurb next to each link would reduce the blank-stare click gap — especially for Vast.ai, where first-time users don't immediately understand the marketplace model.\n\n**Separate referral codes per site.** I'm running the same referral codes across all three directories right now, which means I can't attribute a conversion to the AI tools directory vs a future expansion. When the programs reach any meaningful click volume, I'll register site-specific codes.\n\nThe actual implementation is simple — three URL builder functions, one conditional block in the page component, and a handful of env variables. The hard part isn't the code; it's choosing contextually relevant programs and placing them on pages where a user actually has purchase intent.\n\n*Part of an ongoing 6-month experiment running three AI-curated directory sites. The technical claims here are real; this article was AI-assisted.*", "url": "https://wpnews.pro/news/three-gpu-affiliate-programs-i-wired-into-an-ai-tool-directory", "canonical_source": "https://dev.to/morinaga/three-gpu-affiliate-programs-i-wired-into-an-ai-tool-directory-11fb", "published_at": "2026-06-15 22:18:24+00:00", "updated_at": "2026-06-15 22:47:14.437997+00:00", "lang": "en", "topics": ["developer-tools", "ai-tools", "ai-infrastructure", "ai-products"], "entities": ["RunPod", "Vast.ai", "Hetzner Cloud", "Amazon", "LLaMA", "Whisper"], "alternates": {"html": "https://wpnews.pro/news/three-gpu-affiliate-programs-i-wired-into-an-ai-tool-directory", "markdown": "https://wpnews.pro/news/three-gpu-affiliate-programs-i-wired-into-an-ai-tool-directory.md", "text": "https://wpnews.pro/news/three-gpu-affiliate-programs-i-wired-into-an-ai-tool-directory.txt", "jsonld": "https://wpnews.pro/news/three-gpu-affiliate-programs-i-wired-into-an-ai-tool-directory.jsonld"}}