Cover photo

POAP-Powered Pathways to Participation

How I Turned a One-Time Event Attendance POAP into Ongoing Community Engagement with Farcaster Channel Invites

Welcome to the people who've joined since last article!

Thank you to those of you that collect my writings, it helps me out and keeps me going!

Grateful to all 337 folks for reading, hope you have a wonderful week!


Tabletop.xyz, a Next.js app hosted on Vercel, gives out POAPs (Proof of Attendance Protocol) as engagement tools for onboarding board gamers onchain and to streamline user engagement in the /tabletop Farcaster channel. This guide explains how we implemented a POAP-based channel invite flow for new members, the lessons we learned, and how you can replicate the process.

Overview

Problem Statement

During events like Devcon, we distribute POAPs to attendees who verifiably play board games. However, we faced challenges in ensuring these participants could join the Tabletop channel:

  • Many attendees hadn’t signed into the event platform (Lu.ma).

  • POAP holders lacked a direct invite flow to access the Farcaster channel.

  • We had little way of associating the wallets with POAPs to users' social identities on Farcaster.

Solution

We built a custom flow that transforms POAP claims into Farcaster channel invites. This flow:

  1. Retrieves wallet addresses that claimed the POAP via POAP.tech.

  2. Matches these wallets to Farcaster FIDs using Neynar APIs.

  3. Creates an FID allowlist for invites.

  4. Delivers channel invites through a custom Farcaster frame.

Technical Components

  • POAP.tech API: Handles POAP wallet lookups.

  • Neynar SDK/API: Resolves wallet addresses to Farcaster FIDs.

  • Frog.fm: Delivers interactive invites or redirects users via Farcaster frame.

  • Next.js: API service that handles frame interactions on Warpcast to deliver invites to users.


Implementation Details

Architecture

We structured the solution into four main stages:

1. POAP Lookup

  • Query the POAP.tech API: GET /event/{id}/poaps.

  • Collect wallet addresses holding the specified POAP.

2. Convert Wallets to Farcaster FIDs

  • Use the Neynar SDK/API: GET /v2/farcaster/user/bulk-by-address.

  • Match wallets to their Farcaster user profiles.

3. Generate the Invite Allowlist

  • Compile eligible Farcaster IDs for channel invites.

  • Use the allowlist to enable interactive invite flows via Farcaster frames (Frog.fm).

4. Deliver Invites

  • Post a frame for invite interactions.

Invites could also be delivered via direct messages as a link for users to click, or as direct channel invites in Warpcast. We decided to go with the private invites in public offered by using frames to maximize attention for /tabletop during Devcon.

  • If a user isn’t on the allowlist, redirect them to joining instructions.


Flow Diagrams

Sequence Diagram

Process Diagram

We decided to use a public frame to leverage attention for /tabletop on Farcaster despite it being a more involved solution than private DMs.


Deployment

We shipped the first version of this flow during Devcon on November 17 on Vercel. This deployment revealed several key insights:

  1. Dynamic Image Generation: We encountered compatibility issues with dynamic image generation with Satori inside Frog. We ended up using static assets and plan to return to do dynamic images.

  2. Distribution Impact:

    • Folks like to engage with frames! Comments boosted the cast and the frame cast got over 1k views despite it being a very simple 2 stage frame.


Challenges & Learnings

  1. Improving Invite Distribution:

    • Wider Farcaster distribution increased visibility but didn’t significantly boost activity.

  2. Understanding User Preferences:

    • Users preferred standalone posts for invites over nested comments.

  3. Optimizing Dynamic Frames:

    • We needed to fine-tune dynamic frame generation for reliability.


Open Source Code

I open-sourced this implementation so others can make their own version and innovate on the idea:

How to Use

Follow the repository README:

  • Refer to the GitHub README for step-by-step instructions, examples, and configurations specific to the implementation.


Live Demo

Check out the frame in action:

Invite Frame Screens

The invite frame looks like this:

  1. Start frame entrypoint

  1. Split viewers if their FID is on the allowlist or not

    1. If the viewer's FID is on the allowlist they receive the invite link.

      • The JOIN NOW link is the Warpcast invite link which opens to:

    2. If their FID is not on the allowlist, they receive a link inviting them to join an alternate way.

      Comment to join /tabletop


Epilogue: Warpcast's User Onboarding with Channel Invites

Since implementing this POAP-based invite flow, Warpcast introduced a streamlined channel invites for new users feature. This update improves how communities onboard new members by simplifying the process:

  • Gift Farcaster Accounts: Send an invite that creates a new Farcaster account.

  • Pre-Select Channels: Ensure new users automatically join specific channels as part of the onboarding.

  • Share Seamlessly: Generate a link or QR code, eliminating the need for outdated email flows.

  • Improved Claim Flow: Users can now redeem their invite with a code, further optimizing the onboarding experience.

This innovation expands opportunities for community growth while removing barriers to entry. Future iterations of the POAP invite flow for Tabletop.xyz and other channels could integrate these new Warpcast features, creating even smoother pathways for user participation.



If you enjoyed this,

  1. Please subscribe

  1. Give me a shout on Farcaster!

  2. Share this post with someone who will enjoy it!



Thank you to cameron, benadamsky, samuellhuber, kevinoconnell, and links for feedback.

Loading...
highlight
Collect this post to permanently own it.
0xNerdery logo
Subscribe to 0xNerdery and never miss a post.
#farcaster#development#tabletop#poap