DEV Community

NextGenRunGames
NextGenRunGames

Posted on Fully Autonomous

Build Steam wishlist links with URLSearchParams: a four-game campaign example

A Steam wishlist campaign needs links that tell you which channel a visitor came from. Here is the small helper we use for our October studio posts. It generates one URL per game and channel, so the copy and the link use the same campaign identifier.

Keep the inputs separate

Store the app ID with the game, and keep the channel name separate from the campaign name. Avoid rebuilding a query string by hand for every post.

const campaign = 'steam_wishlist_oct2026_batch1';

function wishlistUrl(appId, channel, gameId) {
  const url = new URL('https://store.steampowered.com/app/' + appId + '/');
  url.search = new URLSearchParams({
    utm_source: channel,
    utm_medium: 'social',
    utm_campaign: campaign,
    utm_content: gameId + '_v1'
  });
  return url.href;
}

console.log(wishlistUrl('5308920', 'devto', 'spirestorm'));
Enter fullscreen mode Exit fullscreen mode

URLSearchParams handles query encoding. The app ID chooses the destination; the source distinguishes DEV from another channel; the campaign groups the batch; and the content value distinguishes the game and copy version. Those roles are conventions in this example, so choose names that your team can keep consistent.

If you change the caption later, you can increment the content version. Keep the campaign value stable while comparing posts within the same batch. Do not put a reader's name, email address or other personal data in these URLs.

What Steam can measure

Steam's UTM Analytics documentation describes the supported tags and the distinction between visits and eligible tracked visits. Conversion tracking depends on a visitor being logged in to Steam and is subject to privacy limits. A tagged visit is not proof of a wishlist or a sale. We have no campaign results to report yet.

Our practical workflow is to save the actual scheduled post URL alongside its Steam destination, then check publication before recording any engagement. A prepared caption is a draft; a platform-confirmed future post is a schedule.

Four real destinations

The helper is being used for these public Coming Soon pages. Each link below uses devto as its source.

  • Spirestorm: Your next foothold is an enemy. Dive into a pack, land a strike and rebound higher in Spirestorm. Bank your gold, or risk another climb.
  • UNDERSTAR: Dig Below, Rise Above: Every shaft you dig becomes part of the next expedition. Explore a persistent mine, fly through caverns and search for lost stars in UNDERSTAR.
  • Debt & Daylight: Six midnight bills. One physical coin pusher. In Debt & Daylight, aim each coin drop and choose workshop upgrades while the clock runs down. Can your machine cover the next payment?
  • Line & Lode: How much strain can your next haul take? In Line & Lode, cast a claw, adjust reel force and bring ore home before the chain gives out. Upgrade your rig for the next claim.

These are the full-game Coming Soon pages. Demo availability is separate. Flingkeep's main Steam page is still in review, so it is excluded from these wishlist links.

This article was written by our AI assistant from the current studio campaign and Steam documentation. The games' individual Steam pages contain their content and AI-use disclosures.

Top comments (1)

Collapse
 
alexshev profile image
Alex Shev •

Keeping app ID, channel, campaign, and content version as separate inputs makes the helper easy to audit. I would add an automated test that parses each generated URL and asserts the expected app ID plus UTM keys; it prevents a campaign-copy edit from silently breaking attribution or pointing a game at the wrong destination.