hyperfx-ai/marketing-skills

reddit-ads

Plan and create Reddit Ads campaigns end-to-end via the Hyper MCP — campaign, ad group, ad build order with subreddit / interest / geo targeting, promoted posts, custom and saved audiences, Reddit pixel conversion tracking, and reporting, with micro-currency budgets.

First seen Jul 5, 2026

Installation

$ npx skills add hyperfx-ai/marketing-skills --skill reddit-ads

Summary

  • Plan and create Reddit Ads campaigns end-to-end via the Hyper MCP — campaign, ad group, ad build order with subreddit / interest / geo targeting, promoted posts, custom and saved audiences, Reddit pixel conversion tracking, and reporting, with micro-currency budgets.
  • Use when the user wants to launch Reddit ads, promote a Reddit post, target subreddits, set up a Reddit pixel, or pull Reddit ad reports.
  • Also triggers on reddit campaign, reddit ppc, or reddit ads manager.

Similar popular skills

Related neighbors and high-traction skills in the same topics — useful to compare before installing.

Also in this package

Other skills from hyperfx-ai/marketing-skills · top by installs.

npx skills add hyperfx-ai/marketing-skills

Browse all from hyperfx-ai/marketing-skills

More details

Agent compatibility

Declared targets from SKILL.md / docs. Unmarked agents are not listed — the skill may still install via the CLI.

Claude Code Not declared
Cursor Not declared
Codex Not declared
GitHub Copilot Not declared
Windsurf Not declared
Gemini CLI Not declared
Cline Not declared
OpenCode Not declared

Repository health

Stars 84
License LICENSE
Default branch main
Open issues 0
Status Active

Package contents

Files included with this skill beyond the listing page.

  • skill md SKILL.md 15,646 B
  • docs SUMMARY.md 494 B

History

  1. First seen on skills.sh
  2. First recorded snapshot · 87 installs

SKILL.md

Reddit Ads Campaigns

Strategic guide for managing Reddit advertising via the Reddit Ads API v3. The toolkit is a raw-HTTP client, so parameter types must be sent exactly as documented — strings as strings, integers as integers, and all money in micro-currency.

Requirements

If redditadsgetme / redditadslistbusinesses is not in the tool list, stop and tell the user to enable Hyper MCP and connect Reddit Ads. Serving ads also requires an active funding instrument on the ad account — campaigns and ad groups can be created without one, but the account must be funded for ads to run.

Out of scope — defer to other skills

  • Organic Reddit research (mining subreddit discussions, pain points, voice-of-customer) → [customer-research](../customer-research).
  • Creative generation (ad copy, images) → [ad-creative-generation](../ad-creative-generation).
  • Cross-platform campaign launches → use this skill for Reddit, then invoke meta-ads / google-ads / tiktok-ads separately.

Critical Rules

CRITICAL: All budgets and bids are in micro-currency. $1.00 = 1,000,000 micros. A $50/day budget is goalvalue=50000000; a $0.50 CPC is bidvalue=500000. Never pass dollar amounts directly.

CRITICAL: Create campaigns, ad groups, and ads with configured_status="PAUSED" (the toolkit default). Never launch live without explicit user review. Because everything defaults to PAUSED, you can build a full campaign and archive it without spending — ideal for demos.

CRITICAL: Discovery flows through businesses, not a flat account list: redditadsgetmeredditadslistbusinessesredditadslistadaccounts(business_id=...). There is no top-level "list all ad accounts" call.

CRITICAL: An ad promotes a post — it needs a postid (or a profileid + creation), not raw creative fields. Before creating an ad, find an existing post (redditadslistposts) or create one (redditadscreatepost). Only community posts can be promoted via the API.

CRITICAL: The ad group targeting.communities array takes subreddit NAMES, not the t5 IDs that searchtargeting returns. Use the name field from the search results: "communities": ["marketing", "SaaS", "Entrepreneur"] — passing t5_... IDs fails with "You cannot set invalid communities". (interests does use the IDs; geolocations uses country codes like "US".)

CRITICAL: Resolve targeting with redditadssearchtargeting before building — never guess values. targeting is a named parameter on createadgroup; pass any other variant-heavy fields (audiences, schedule) via inputdata.

CRITICAL: starttime is required when creating an ad group (ISO 8601). On a campaign, starttime is only valid with CBO enabled — for non-CBO campaigns, omit it at the campaign level and set it on the ad group, or you get "Cannot set start_time for a campaign without having campaign budget optimization enabled."

CRITICAL: bidvalue is always required for bidtype CPC/CPM/CPV/CPV6 — even with bidstrategy="MAXIMIZEVOLUME". Set a cap (e.g. bidvalue=600000 = $0.60) or get one from redditadsgeneratebid_suggestion.

CRITICAL: There is no instant hard delete. Reddit requires an entity to be ARCHIVED for 3+ hours before it can be permanently DELETED. redditadsdelete* tries the real delete and falls back to archiving (which stops delivery) when it isn't deletable yet. Check the returned configuredstatus (ARCHIVED vs DELETED) and tell the user a hard delete is possible ~3h after archiving.

CRITICAL: Reporting (redditadsgetreport) requires fields, startsat, and ends_at. Spend metrics come back in micro-currency.

IMPORTANT: Campaigns require name, objective, and (to serve) a fundinginstrumentid — list them with redditadslistfundinginstruments. Conversion-optimized ad groups need a conversionpixelid (redditadslistpixels). From 2026-07-13, ad groups and CBO campaigns require conversionpixel_id.

IMPORTANT: Lead generation works as a campaign objective (LEAD_GENERATION), but lead-gen form management is not available via this toolkit (it needs a feature-gated scope) — build lead-gen forms in Reddit Ads Manager.

CRITICAL (CONVERSIONS campaigns): the ad group optimizationgoal is required and, for standard (non-CBO) CONVERSIONS campaigns, the only accepted value is CLICKS. SIGNUP, PAGEVISIT, PURCHASE, etc. are valid enum values but are rejected for this campaign type ("Conversion goal ... is not valid for Conversions Campaigns"). Reddit validates in two layers — enum membership, then campaign-type allowance. Use optimizationgoal="CLICKS"; the CONVERSIONS objective still governs delivery.

CRITICAL (post types): valid post type values are IMAGE, VIDEO, CAROUSEL, TEXTnot LINK. TEXT posts are "free-form ads": they cannot carry a click_url and CANNOT be used in CONVERSIONS-campaign ads. For any ad with a destination (especially CONVERSIONS), promote an IMAGE / VIDEO / CAROUSEL post.

CRITICAL (creating posts with new media): prefer redditadscreatestructuredpost — it takes media as a URL that Reddit downloads and re-hosts, so it needs no pre-uploaded asset. Creation is an async job: the tool polls up to waitseconds (default 45) and returns the job; on status="SUCCESS" use job.postid as the ad's postid, else poll redditadsgetstructuredpostjob. IMAGE needs mediaurl + destinationurl; VIDEO also needs thumbnailurl; CAROUSEL takes 1–6 {imageurl, destinationurl, ...} cards; PROMOTEDPOST promotes an existing SFW community post by id. calltoaction is a display label ("Sign Up", "Learn More"), never "SIGNUP". The legacy redditadscreatepost cannot fetch media by URL — its content[].mediaurl must reference an already-uploaded Reddit asset (redditadslistcreative_assets), CTA lives inside content[], and TEXT posts must have an empty content[]. Use the legacy tool only to reuse an existing asset.

IMPORTANT: Posts are immutable after creation except comments — to change headline/media/destination, create a new structured post. redditadsupdatepost(postid=..., allowcomments=...) only toggles comments (set isstructured_post=True for structured posts).

Tool surface

Group Tools
Identity & discovery redditadsgetme, redditadslistbusinesses, redditadslistadaccounts, redditadsgetadaccount, redditadslistfundinginstruments
Campaigns redditadslistcampaigns, redditadsgetcampaign, redditadscreatecampaign, redditadsupdatecampaign, redditadsdelete_campaign
Ad groups redditadslistadgroups, redditadsgetadgroup, redditadscreateadgroup, redditadsupdateadgroup, redditadsdeleteadgroup
Ads redditadslistads, redditadsgetad, redditadscreatead, redditadsupdatead, redditadsdelete_ad
Posts & creative redditadslistprofiles, redditadsgetprofile, redditadslistposts, redditadscreatepost, redditadsgetpost, redditadsupdatepost, redditadslistcreativeassets, redditadsgetcreativeasset
Structured posts (media by URL) redditadscreatestructuredpost, redditadsgetstructuredpostjob, redditadsliststructuredposts, redditadsgetstructured_post
Targeting redditadssearchtargeting, redditadssuggestkeywords, redditadsvalidatekeywords, redditadsvalidategeolocations
Audiences redditadslistcustomaudiences, redditadscreatecustomaudience, redditadsgetcustomaudience, redditadsdeletecustomaudience, redditadsupdatecustomaudienceusers, redditadslistsavedaudiences, redditadscreatesavedaudience, redditadsgetsavedaudience, redditadsupdatesaved_audience
Pixels & Conversions API redditadslistpixels, redditadslistpixelsbybusiness, redditadspostconversionevents, redditadsgetpixellastfiredat
Forecasting & access redditadsgeneratebidsuggestion, redditadsgetreachforecast, redditadsgetfeatureaccess
Apps / SKAdNetwork redditadslistapps, redditadsgetskanavailability, redditadsgetapplastfiredatreport
Reporting & history redditadsgetreport, redditadsgetaccount_history

All reference files live in references/. Read them at references/<file> (e.g. references/discovery.md).

Routing table

The user wants to… Read these files first
Launch a Reddit campaign (any objective) [references/discovery.md](references/discovery.md) → [references/campaign-creation.md](references/campaign-creation.md)
Promote a post / create a post (incl. media by URL) [references/campaign-creation.md](references/campaign-creation.md)
Forecast reach before launch [references/discovery.md](references/discovery.md)
Manage custom or saved audiences / resolve targeting [references/audiences-and-targeting.md](references/audiences-and-targeting.md)
Set up pixel / Conversions API tracking [references/conversions-and-reporting.md](references/conversions-and-reporting.md)
Pull reports / update or delete entities [references/conversions-and-reporting.md](references/conversions-and-reporting.md)
Goal not yet clear [references/discovery.md](references/discovery.md) — discovery clarifies the goal

Campaign Workflow

Discover business/account → audit account → research (objective, targeting, budget, post) → resolve targeting IDs → confirm strategy → create campaign (PAUSED) → create ad group → find/create post → create ad → review with user → activate (update_* to ACTIVE).

Known Limitations

Issue Workaround
No instant hard delete; "A campaign must be archived before it can be deleted" / "cannot be deleted until three hours after it was archived" Expected — delete_* auto-archives (stops delivery); hard delete is possible ~3h after archiving. Re-run delete later to remove permanently.
Ad creation needs a post_id Promote an existing community post (listposts) or create one (createpost); only community posts can be promoted via the API.
Conversion ad groups rejected without a pixel Set conversionpixelid (from list_pixels). Required for ad groups / CBO from 2026-07-13.
Campaign won't serve Attach a fundinginstrumentid (from listfundinginstruments); the account must be funded.
Lead-gen forms can't be created via API Build the form in Reddit Ads Manager; the API only sets the LEAD_GENERATION objective.
Variant create fields (targeting, schedule, creative) aren't named params Pass them through input_data (a dict), which is merged into the request body.
No flat ad-account list Discover via getme → listbusinesses → listadaccounts(business_id).
"You cannot set invalid communities: {t5_...}" The targeting.communities array wants subreddit names, not the t5 IDs from searchtargeting. Use the name field.
"Cannot set start_time ... without ... campaign budget optimization" Campaign-level starttime is CBO-only. Omit it on non-CBO campaigns; set starttime on the ad group.
Ad group create: "Input should be a valid datetime" on start_time start_time is required on ad groups — always pass it.
bidvalue demanded despite MAXIMIZEVOLUME bidvalue is always required for CPC/CPM/CPV/CPV6. Provide a cap or use generatebid_suggestion.
generatebidsuggestion: "Additional fields not permitted" / "'start_time' is a required property" duration is an ISO start/end range ({"starttime": ..., "endtime": ...}), not {"days": N}.
Varnish 503 on create Transient Reddit backend error. Verify no duplicate was created (list_campaigns) before retrying.
effectivestatus shows PENDINGAPPROVAL right after create Normal even for PAUSED entities (ad review) — it clears automatically; not a failure.
CONVERSIONS ad group: "Conversion goal (optimization goal) is required" / "... is not valid for Conversions Campaigns" optimizationgoal is required and, for non-CBO CONVERSIONS, must be CLICKS (SIGNUP/PAGE_VISIT/PURCHASE are rejected for this campaign type).
"'LINK' is not one of [CAROUSEL, IMAGE, TEXT, VIDEO]" Post type must be IMAGE/VIDEO/CAROUSEL/TEXT — there is no LINK type.
Ad create: "Posts used for ads in Conversion campaigns cannot be free-form ad" / "Free form ads cannot have a click url" TEXT posts are free-form — use IMAGE/VIDEO/CAROUSEL for CONVERSIONS ads.
IMAGE post: "Image is required" With legacy createpost, put the asset in content[].mediaurl (an already-uploaded Reddit asset from listcreativeassets); a posturl alone is not enough. To create from a fresh media URL, use redditadscreatestructured_post instead.
Structured post job not done yet (status QUEUED/PROCESSING) Creation is async; the create tool polls to waitseconds (default 45). If still pending, poll redditadsgetstructuredpostjob(postcreationjobid=...) until SUCCESS (then use postid) or CLIENTERROR/SERVERERROR (read error_message).
Need to change a post's headline/media/destination Not possible — posts are immutable. Create a new structured post. redditadsupdatepost only toggles allowcomments.
Post: calltoaction "Additional fields not permitted" calltoaction belongs inside content[], not top-level, and uses display labels ("Sign Up"), not enum constants ("SIGN_UP").
TEXT post: "Post content must be empty for this post type" TEXT posts can't carry a content[] block — only IMAGE/VIDEO/CAROUSEL do.
Dollar amounts Always micro-currency (×1,000,000).

Safety Rules

Never:

  • Assume business, ad account, campaign, post, pixel, or targeting IDs — look them up or ask.
  • Skip the account audit phase.
  • Create campaigns, ad groups, or ads without explicit user approval.
  • Set anything to ACTIVE without user consent.
  • Pass dollar amounts instead of micro-currency.
  • Create an ad without a valid post_id.
  • Promise an instant permanent delete — Reddit requires ARCHIVED for 3+ hours first.
  • Guess targeting IDs — resolve them with redditadssearch_targeting.