The problem: Meta optimises for the click it can see
A Facebook or Instagram ad that promotes a Discord server has one visible outcome for Meta: the link click. What happens next takes place in the Discord app or web client, where Meta has no pixel, no confirmation page and no cookie. Ads Manager therefore reports cost per click and, at best, landing page views. The number that matters to you, cost per member, is not in it.
That gap is not only a reporting problem. Meta's delivery system learns from the events it receives. If the only event is a click, the system looks for people who click, and an audience of clickers is not the same as an audience of people who join and stay. Campaigns drift towards cheap, curious traffic while the server grows more slowly than the click numbers suggest.
The fix is to send the join itself back to Meta, server to server, with the identifiers of the original click, so it lands in the conversion columns of the ad that produced it and can become the event the campaign optimises for.
What has to happen between the click and the report
Three things must be true for a Discord join to count as a Meta conversion:
- The click must be recorded before the visitor leaves for Discord. That means the fbclid Meta appends to the ad URL, the browser id, the IP address, the user agent and your campaign parameters, all stored against one click id.
- The join must be matched to that click, not guessed. Discord's API tells an app that someone joined, but not through which invite, so invite links per ad leave you comparing counts. A match needs a step where the visitor and the click meet.
- The join must reach Meta through the Conversions API with the click's identifiers and an event id, so Meta can attribute it to the ad and deduplicate it.
Tellmetric covers all three. The matching step is Discord's own authorise screen: the visitor approves your Discord app once, and your app adds them to the server. The click id travels through that screen in a signed value, so when the visitor comes back the join belongs to exactly one click.
Setting it up, step by step
- Connect Meta. In Tellmetric, open Ad accounts → Meta and enter your dataset (pixel) id and a Conversions API access token from Events Manager. Each field explains where to find its value.
- Connect Discord. Create an application in the Discord Developer Portal, paste its Application ID, client secret and bot token on Connections, add the bot to your server with the button there and pick the channel people land in. The bot needs only the Create Instant Invite permission. The full walkthrough with every screen is in Discord ads tracking setup.
- Create a tracking link. Under Links, choose "Your Discord server", name it after the campaign, and copy the link.
- Use the link as the ad's destination. Paste it as the website URL of the ad. If you prefer a landing page, put the tracking link behind its buttons and add the one-line Tellmetric script to the page, which passes the click ids through.
- Add the URL parameters. In the ad's URL parameters, add
utm_campaign={{campaign.name}}&utm_content={{ad.name}}&meta_campaign_id={{campaign.id}}&meta_adset_id={{adset.id}}&meta_ad_id={{ad.id}}. Meta fills them per click, and Tellmetric stores them so every report can be broken down by campaign, ad set and ad.
- Test it. Open Test your setup in Tellmetric, follow the test link from your phone with a Discord account that is not in the server yet, and watch the click, the authorise step, the join and the Meta delivery arrive. With a test event code set on the Meta page, the join also shows in Events Manager under Test events within a minute.
What Meta receives for each join
Each new member becomes one CompleteRegistration event in the dataset you connected. CompleteRegistration is one of Meta's standard events, which matters: Meta can optimise delivery for standard events, while custom events can only be measured. If you already use CompleteRegistration for something else, the event name can be changed per workspace.
The event carries what the ad click carried: the fbc parameter rebuilt from the fbclid, the fbp browser id when a landing page set one, the IP address and user agent of the click, and the action source. It also carries a stable event id, so a retry never counts twice. The click id is what Meta matches on most reliably, and every attributed join has one.
What it never carries is anything from Discord about the person. Discord's developer policy forbids passing data from its API to advertising networks, and Tellmetric is built so that it cannot happen: no Discord id, username, avatar or email is sent. That is why Event Match Quality for Discord joins can sit slightly below a Telegram join, which may include more identifiers. In practice the click id does most of the matching work.
After the number of days you choose on Connections (1, 3, 7, 14 or 30; 7 by default), Tellmetric asks Discord whether each new member is still in the server. Those who are become a Retained event, sent to Meta as a custom event with the same click identifiers. Those who left are recorded as a Leave in your reports and never sent as a conversion.
Setting the campaign to optimise for members
Once joins arrive in Events Manager, the campaign can use them:
- Objective. Choose a conversion objective (Leads or Sales in the current Ads Manager), set the conversion location to Website, and select your dataset with CompleteRegistration as the conversion event.
- Volume first. Meta's learning phase needs a steady flow of conversions per ad set. A new server with a handful of joins a week is better served by fewer, broader ad sets than by many narrow ones.
- Quality next. Retained is a stronger signal than a join, because it filters out people who join and leave the same day. You can create a custom conversion on the Retained event in Events Manager and use it for reporting, or as the optimisation event once it has enough volume.
- Deposits, if you sell. If members later buy or deposit on your site or platform, report those through Tellmetric's postback or event API. They arrive at Meta as Purchase with value and currency, credited to the same click, and let you optimise for revenue.
Reading the results
In Ads Manager, add the CompleteRegistration columns (results, cost per result) to see joins per campaign, ad set and ad. Meta's own reporting applies its attribution setting, so numbers there can differ slightly from Tellmetric's, which counts each join once against the click that led to it.
In Tellmetric's dashboard the same joins appear with their campaign, source, ad and country, next to clicks and deposits. Connect the Meta ad account and Tellmetric imports daily spend, so the dashboard shows cost per join and cost per deposit per campaign without a spreadsheet. If you run a Telegram group as well, the dashboard splits joins into Telegram and Discord and lets you filter by community. Discord server growth tracking covers those reports in detail.
Common mistakes
- Pointing the ad at a plain discord.gg invite. The visitor joins, but nothing connects the join to the click. Use the tracking link, or a landing page whose buttons use it.
- Testing with an account already in the server. A person who is already a member is not counted again. Test with a second account or one that left.
- Leaving the test event code set. While it is set, joins go to Test events instead of counting towards your campaigns. Clear it on the Meta page in Tellmetric when the test passes.
- Removing the bot from the server. Without it the app cannot add visitors. Tellmetric notices within half an hour and shows what to fix on Connections; meanwhile visitors get a plain invite and join unmatched.
Plans
Reporting to Meta and one Discord server are on every plan, including Free with 1,000 tracked users a month. Pro adds TikTok, Snapchat, Reddit, Spotify, X and Google Ads and up to five communities; see pricing. For the other ad platforms, read tracking Discord joins from TikTok, Snapchat, Reddit and other ads; for how the matching works in general, Discord conversion tracking.
Frequently asked questions
Which Meta event does a Discord join become? CompleteRegistration, a standard event. Members still in the server after the days you set arrive as the custom event Retained.
Can Meta optimise a campaign for Discord joins? Yes: pick a conversion objective, your dataset and CompleteRegistration as the conversion event.
Does Meta receive any Discord data about the person? No. Only what the ad click carried, plus the event name and time.
Is this available on the Free plan? Yes, with one Discord server and up to 1,000 tracked users a month.