Academy

How to Distribute Tokens to Active Members (NFTs: Not Yet)

Zealy cannot filter members by recent activity and cannot send NFTs today. The mechanism that works is a sprint — with the payout maths read from the code.

Zealy article cover on a dark textured background reading: Reward the people who showed up — tokens, NFTs and who actually gets them.
On this page

Short answer: Run a sprint. On Zealy a sprint is a leaderboard with a start date and an end date, so the XP it ranks is earned inside that window rather than accumulated forever. That is the one mechanism in the product that pays people for being active now instead of for having joined once. Zealy then decides who won and records which address to pay. It does not move the tokens, and it cannot attach an NFT at all — the reward field says so itself: NFT rewards are not yet available.

What this post will not do: hand you a filter that does not exist. You cannot ask Zealy for "members who claimed something in the last 30 days" and get a list. And it will not tell you how to send an NFT through Zealy, because there is no NFT reward to send. What it can do for the NFT half is get you a defensible list of recipients — the sprint decides who, and the minting and sending happen in your own tooling.

Disclosure: Zealy publishes this and Zealy sells the product being described. Every Zealy behaviour below was read out of the Zealy codebase rather than out of Zealy's own documentation, which turned out to be wrong in several places. Every external number carries its source at the point it appears.

Last verified: 15 August 2026.

Why "reward my active members" is harder than it sounds

Most token distributions pay for a snapshot of the past and then watch the tokens leave. In an academic study of nine airdrops, across most protocols the median recipient made a single token transfer, and the median gap between their first and last was zero days. Rewarding activity instead means paying for behaviour inside a window you set.

That study is "Airdrops: Giving Money Away Is Harder Than It Seems" by Johnnatan Messias, Aviv Yaish and Benjamin Livshits, covering nine protocol distributions. One transfer and no elapsed time is not a member you acquired. It is a queue you paid to stand in front of you once.

The usual response is to filter harder before you send, which works expensively and late. That approach, and what Optimism and LayerZero got for it, is the subject of how to run an airdrop that doesn't get farmed.

There is a cheaper version of the same idea. Instead of distributing to everyone and then subtracting the people you did not want, define a window, publish what earns credit inside it, and pay the ranking that comes out. Nobody has to be removed, because nobody was ever on the list for free.

You cannot filter Zealy members by recent activity

Zealy's member table filters on exactly thirteen columns: id, name, role, join date, Discord handle and ID, TikTok username, X username, X follower count, X ID, email, country and ETH address. Join date is the only date. There is no last-active filter, no last-claim filter, and no XP-in-the-last-30-days filter.

This surprises people, so it is worth being exact about how far it goes. The members page gives you the list above. XP is not even on it — XP is shown as a column but computed after the page of members has already been fetched, which is why it can be neither filtered nor sorted on. The public API is thinner still: search, roles, ids, joinedAfter, joinedBefore and a sort. Zealy's analytics do chart active users over time, but a chart is an aggregate. Zealy will tell you how many people were active last week and will not hand you their names.

Sorting by XP does not rescue you either, because a member's XP is a standing total rather than anything scoped to a period. A member who farmed hard in March and has not opened your questboard since still outranks someone who has claimed something every week this month. Sorting your community by XP sorts it by history.

So the honest statement of the constraint: on Zealy today, "active" is not a property of a member you can query. It is a property of a period of time you define.

The mechanism that works on Zealy: a sprint

A Zealy sprint is a leaderboard with a start date and an end date, counting XP from claims made inside that window on the quests the sprint includes. The ranking is a list of who was active during the period you chose. Members with zero sprint XP are excluded from the payout automatically.

That last detail does more than it looks. The dormant half of your community is not filtered out by a rule you wrote; it is absent from the result because it did nothing in the window. You get the filter you wanted as a side effect of the shape of the thing.

One caveat, because it decides whether you can call a sprint a clean measurement: XP an admin granted by hand inside the window counts toward the sprint too, alongside claims. If you hand out bonus XP, you are adjusting the same number the payout is computed from.

Sprints pay in one of two ways, and both are worth understanding before you pick a number.

Proportional. Each member receives floor(pool × their sprint XP ÷ total sprint XP). Take a 10,000-token pool, 250,000 XP across everyone eligible, and a member who earned 4,000 of it: their share is 160 tokens. Every share rounds down, so the payouts can sum to slightly less than the pool. Note that if you also set a reward zone, the total in that denominator is recomputed over the people inside the zone only — so adding a cutoff raises everyone's share as well as shortening the list.

Tiered. You define rank ranges, each taking a percentage of the pool, split evenly inside the range. Ranks 1–10 might take 40% between them and ranks 11–50 another 20%. You can define up to 50 tiers, and they can neither overlap nor leave a gap between ranges. Tiered pays position rather than effort, which is what you want when the point is a visible race.

On top of either, the reward zone is a hard top-N cutoff. Set it to 200 and rank 201 gets nothing, no matter how much XP they earned. A sprint has no raffle mode — payout is by rank and XP, so if you want randomness you are looking at a quest reward method rather than a sprint.

Communities have been running exactly this shape for years. Bandzaï described a sprint with almost 600,000 $BZAI and Zaï NFTs for the top 200 leaderboard players. CoinW ran a Top 50 leaderboard with a top reward of 100 USDT. Alphaday put the top 10 performers on its leaderboard in line for a share of a $300 prize pool in ETH. ShimmerSea offered 5,500 USDT and 404 special Lumi NFTs to get people testing every part of its protocol. All four case studies are from 2023, and all four are reward zones with a date attached.

One of them makes the NFT point for me. Bandzaï's prize was tokens and NFTs for a top-200 zone. The sprint picks the 200. Delivering the NFTs to them was, and still is, the project's own job — which brings us to what Zealy will and will not put in someone's hands.

What Zealy actually sends, reward type by reward type

Zealy's data model carries seven reward types and the quest editor offers six: XP, Discord role, Zaps, USDC, token, and a custom "other". USDC is the only one that lands by itself. Token rewards are recorded rather than sent, and NFT rewards are not available in the product today.

RewardIn the quest editor?Who actually moves it
XPYesZealy, inside Zealy
ZapsYesZealy, inside Zealy
Discord roleYesThe Zealy bot, asynchronously; a member with no linked Discord never receives one
USDCYesZealy, automatically on a successful claim, out of a balance you pre-fund
TokenYesYou. Zealy records the winner and the address to pay
Custom "other"YesYou, by whatever means you described
NFTNoNobody. The field reads NFT rewards are not yet available

The NFT row is the one to read twice. Zealy's data model still carries an NFT reward type and Zealy did once mint NFTs through an external service on Polygon behind a feature flag. In the product you use today, the NFT reward field renders a single string telling you it is not available, and everything behind it is switched off. Any guide that shows you how to attach an NFT reward to a Zealy quest is describing something that is not there.

Token rewards work, with a division of labour that is easy to misread. Zealy decides who won and writes a pending row holding the winner and their verified address. Then you send from your own wallet and paste the transaction hash back in — there is a bulk action that stamps one hash across every pending winner at once, which is how you settle a top-200 sprint without 200 copy-pastes. Zealy supports more than twenty network identifiers for this, two of which are testnets.

Four steps for a Zealy token reward. Zealy decides who won, then records the winner and the address to pay. You send the tokens and pay the gas, then paste the transaction hash back in.

Where Zealy stops and the community starts, for a token reward. USDC is the exception — it is credited automatically.

Two consequences follow, and neither is in the marketing copy. Zealy holds no signer for token rewards, so the community pays the gas. And Zealy does not currently verify on-chain that the right amount reached the right address. The single-winner form checks that the transaction ID at least has a valid shape; the bulk action that stamps one hash across every pending winner only checks that you typed something. The hash is a record of your claim to have paid, not a proof of payment. If your community is large enough for that distinction to matter, keep your own reconciliation.

USDC is the exception that behaves the way people expect a reward to behave. You top up a balance, each quest locks funds against it, and a successful claim credits the member automatically. The USDC accrues as a Zealy-side balance and is withdrawn to the member's linked Polygon wallet. Point people at the withdrawal screen for the current terms rather than promising them a net figure in your campaign brief.

What recipients owe on any of this is a separate question with real consequences, and earning crypto without buying any covers the recipient side.

Zealy vs Galxe on getting the reward out the door

Galxe ships an NFT reward type and executes token raffles on-chain. Zealy does neither: NFT rewards are disabled and token rewards are recorded, not sent. The counterpoint is that Galxe's on-chain raffle charges the user a gas fee, and Galxe's custom rewards are distributed by the project, the same as Zealy's tokens.

ZealyGalxe
NFT as a reward typeNot available; the field says NFT rewards are not yet availableSupported. Galxe lists its rewards as "Points, OAT, NFT, Custom Rewards, Mystery Boxes, Tokens, and Discord Roles" and says it "supports NFT rewards on any compatible blockchain network"
Token distributionZealy records the winner and address; the project sends"Token Raffles" operate on-chain, while "Token FCFS" remains off-chain without triggering a transaction
Who pays gasThe project, from its own walletFor raffle-mode token rewards, "requiring users to pay a gas transaction fee in G tokens on the Gravity network"
Custom rewardsThe project delivers, same as tokens"The project is responsible for distributing these rewards, which will be handled outside of Galxe"

Galxe quotes are from its published reward documentation, linked in the table header.

Read the trade honestly. If what you need is an NFT arriving in a wallet as the direct output of finishing a quest, Galxe does that and Zealy does not, and no amount of Zealy sprint design substitutes for it. If what you need is a distribution where the recipients pay nothing and touch no chain to receive, Zealy's USDC path does that and an on-chain raffle does not. Both platforms leave custom rewards on the project's desk, so nobody has solved the general case.

How to run a sprint payout on Zealy, step by step

Set the sprint dates first, because the window is the filter. Choose proportional or tiered payout and a reward zone. When the sprint closes, export the leaderboard or the reward winners to get wallet addresses, send from your own wallet, then paste the transaction hash back into Zealy.

1. Decide what the window is measuring. Sprint XP comes from claims made between the start and end dates, so the quests you publish inside that window are the definition of "active" you are paying for. If you want depth rather than clicks, weight the XP that way before the sprint opens, not after. Creating a sprint covers the setup.

2. Pick proportional or tiered. Proportional rewards volume of effort and produces a long tail of small payouts. Tiered concentrates value at the top and produces a race. A reward zone of a few hundred keeps the payout list a size you can actually settle by hand.

3. Gate the quests, not the members. There is no member allowlist on Zealy, so the way you keep a sprint honest is with quest conditions. Zealy accepts seven condition types — completing another quest, level, Discord role, date, holding an NFT, X follower count, and X account age — combined with AND or OR. Level conditions accept "above" and "below" only, and NFT gating is Polygon-only. The conditions documentation lists these, though it currently says six.

4. Choose the reward method per reward. Reward methods are all, first-come-first-served, raffle, top and vote, and they are set per reward rather than per quest. First-come-first-served and raffle each cap at 1,000 winners, top also caps at 1,000, and vote has no upper bound. A raffle draw is a random ordering of successful claims, and it needs either a claim limit or a closing date to be valid.

5. Export the right file. The members export gives you userId, name, role, XP, join date and ban status, and no wallet address. Addresses come from the leaderboard export or the reward-winners export — though the reward-winners file emits an Ethereum address column specifically, so a Solana or TON community should take the leaderboard export instead. Pulling the members list and wondering where the wallets went is the most common wasted hour in this whole workflow.

6. Send, then record. Pay from your wallet, paste the hash, use the bulk action if the winner list is long. Publish the hash to your community as well — since Zealy does not verify it on-chain, your members verifying it is the check that exists. Rewards documentation covers the reward setup itself.

The parts that will bite you

Zealy has no member allowlist, no token-balance gate, and no on-chain check that your payout transaction did what you say it did. Resetting the leaderboard is destructive and moves a live sprint's start date. The members export contains no wallet address. Each of these has a workaround, and none of them is obvious.

The leaderboard reset is the one that costs real money. Resetting wipes manual XP grants, zeroes every quest's claim counter, and — if a sprint is running — pulls that sprint's start date forward to the moment you reset. Half your sprint's history can disappear from a button that reads like housekeeping. Finish sprints before you reset, or do not reset at all.

The missing gates shape what you can promise. You cannot upload a list of addresses and restrict a quest to them, and a token-balance condition is not something you can set even though the concept exists in the codebase. So "holders only" is not a Zealy sprint you can configure; NFT holding on Polygon is the closest available gate.

Level gating deserves its own warning. You gate on level, not on raw XP, and only above or below a level. Level thresholds come from a fixed global curve that is identical in every Zealy community, so a "level 5 and above" tier means the same amount of accumulated XP in your community as in everyone else's. Design tiers knowing you are not setting the thresholds — how to run a crypto ambassador program works through building named ranks around that constraint.

None of this makes the sprint a bad answer. It makes it a specific one: Zealy is good at deciding who deserves the reward and unromantic about moving it. If you go in expecting a distribution engine, you will be annoyed. If you go in expecting a very precise scoreboard with an export button, you will get exactly that, and the sending is thirty minutes of your own wallet.

FAQs

Define a time window and pay the ranking that comes out of it, rather than filtering a member list after the fact. On Zealy that is a sprint: a leaderboard with a start and an end date, where XP only accrues from claims made inside the window and members with zero sprint XP are excluded from the payout automatically. Set a reward zone — the top 50, the top 200 — and pay proportionally by XP or in tiers by rank.

No. NFT rewards are not available in Zealy today. The reward type still exists in Zealy's data model, and Zealy did once mint NFTs on Polygon through an external service behind a feature flag, but the quest editor offers six reward types and NFT is not one of them. The field itself displays a single line: NFT rewards are not yet available. If NFT delivery as the direct output of a quest is what you need, Galxe lists NFT among its quest reward types and Zealy does not.

Only for USDC. USDC rewards are credited automatically on a successful claim out of a balance you pre-fund, and the member withdraws to their linked Polygon wallet. For a project's own token, Zealy decides who won and records which address to pay, then you send from your own wallet and paste the transaction hash back into Zealy. Zealy holds no signer for token rewards, so your community pays the gas, and Zealy checks the shape of that hash without verifying on-chain that the right amount reached the right address.

Use the leaderboard export or the reward-winners export. The members export is the wrong file — it returns userId, name, role, XP, join date and ban status, with no wallet address in it. The leaderboard and reward-winners exports do include addresses, which is why they are the ones you want at the end of a sprint.

No. Zealy's member filters are thirteen columns: id, name, role, join date, Discord handle and ID, TikTok username, X username, X follower count, X ID, email, country and ETH address. Join date is the only date field, so there is no last-active, last-claim or XP-in-the-last-30-days filter. XP is not filterable at all, and not sortable either: it is displayed, but computed after the page of members has already been fetched. Zealy charts active users as an aggregate over time without naming them. A sprint is the substitute: it produces the list of recently active members as a ranking instead of a query.

A Zealy sprint has no raffle mode — sprint payout is by rank and XP, with zero-XP members excluded and a hard top-N reward zone. Randomness lives on quest rewards instead: raffle is one of five reward methods alongside all, first-come-first-served, top and vote, it is set per reward rather than per quest, it caps at 1,000 winners, and the draw is a random ordering of successful claims. A raffle also needs either a claim limit or a closing date to be valid. Use the sprint when you want to pay the people who did the most, and a quest raffle when you want everyone who cleared a bar to have a chance.