# POAP-Powered Pathways to Participation

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

By [0xNerdery](https://paragraph.com/@ispeaknerd.eth) · 2024-11-25

farcaster, development, tabletop, poap

---

_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](http://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](https://warpcast.com/~/channel/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](http://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](http://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**](http://POAP.tech) **API:** Handles POAP wallet lookups.
    
*   [**Neynar**](https://neynar.com/) **SDK/API:** Resolves wallet addresses to Farcaster FIDs.
    
*   [**Frog.fm**](https://frog.fm)**:** Delivers interactive invites or redirects users via Farcaster frame.
    
*   [**Next.js**](https://nextjs.org)**:** 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](https://documentation.poap.tech/reference/geteventpoaps-2)[.tech](http://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](https://docs.neynar.com/reference/fetch-bulk-users-by-eth-or-sol-address): `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](http://Frog.fm)).
    

4\. **Deliver Invites**

*   Post a frame for invite interactions.
    

![](https://paragraph.xyz/editor/callout/tip-icon.png)

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**

![](https://storage.googleapis.com/papyrus_images/5cfd212a9e4d6a2b06c8828f5ef3c6e0.png)

**Process Diagram**

![](https://storage.googleapis.com/papyrus_images/a19ce742ca82974864f52834b0f1f28c.png)

![](https://paragraph.xyz/editor/callout/information-icon.png)

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:

*   View the [announcement cast](https://warpcast.com/ispeaknerd.eth/0xafe8abd3) on Farcaster.
    
*   [Source code](https://github.com/iSpeakNerd/poap-invites-frame) on GitHub.
    

[![](https://storage.googleapis.com/papyrus_images/46a87a40fc860e830dd6f468a992773d.png)](https://github.com/iSpeakNerd/poap-invites-frame)

**How to Use**

Follow the repository README:

*   Refer to the [GitHub README](https://github.com/iSpeakNerd/poap-invites-frame?tab=readme-ov-file#using-this-repository) for step-by-step instructions, examples, and configurations specific to the implementation.
    

* * *

**Live Demo**
-------------

Check out the frame in action:

*   Channel [Invite Frame](https://warpcast.com/ispeaknerd.eth/0xd0cf927a) on Farcaster.
    

**Invite Frame Screens**

The invite frame looks like this:

1.  Start frame entrypoint
    

![](https://storage.googleapis.com/papyrus_images/ba04ee4fb7bb8bf5ac13afa553d92e90.png)

2.  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.
        
        ![](https://storage.googleapis.com/papyrus_images/b1d46a4891ccce8b50067ff65ebb6c37.png)
        
        *   The JOIN NOW link is the Warpcast invite link which opens to:
            
        
        ![](https://storage.googleapis.com/papyrus_images/e5c7b7ac19ad85e96f33afda3f5883f3.png)
        
    2.  If their FID is not on the allowlist, they receive a link inviting them to join an alternate way.
        
        ![](https://storage.googleapis.com/papyrus_images/d5d2512415833ada897e15a3b07c1573.png)
        
        [![](https://storage.googleapis.com/papyrus_images/578b33299a2d0ce0c20bdba3c863d924.png)](https://warpcast.com/ispeaknerd.eth/0xa691b67b)
        
        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](https://warpcast.com/dwr.eth/0xbf740a94) 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](http://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 ![](https://cdn.jsdelivr.net/npm/emoji-datasource-apple/img/apple/64/1f49c.png)
    

[Subscribe](https://paragraph.xyz/@ispeaknerd.eth/memberships)

2.  Give me a [shout on Farcaster](https://warpcast.com/~/compose?text=Hey+%40ispeaknerd.eth%2C+thought+your+most+recent+0xNerdery+article+on+%2Fparagraph+was+interesting%21)!
    
3.  Share this post with someone who will enjoy it!
    

[Share](https://paragraph.xyz/@ispeaknerd.eth/OBq1n6JIx2ESj6bwePox)

* * *

* * *

_Thank you to_ [_cameron_](https://warpcast.com/cameron)_,_ [_benadamsky_](https://warpcast.com/ba)_,_ [_samuellhuber_](https://warpcast.com/samuellhuber.eth)_,_ [_kevinoconnell_](https://warpcast.com/kevinoconnell)_, and_ [_links_](https://warpcast.com/links) _for feedback._

---

*Originally published on [0xNerdery](https://paragraph.com/@ispeaknerd.eth/poap-powered-pathways-to-participation)*
