Parent: #877
Depends on: #878
Scope
Complete referral system: code generation (with Farcaster username option), registration (via URL + manual input), and story share integration.
Referral Code
POST /api/airdrop/referral-code
Generate or retrieve referral code for connected wallet.
- Default: 8-char nanoid → store in
pl_referral_codes
- Farcaster username option: If request includes
useFarcasterUsername: true:
- Verify wallet owns a Farcaster account (check
users table for matching FID)
- Set
code = username, is_farcaster_username = true
- Reject if username already taken as a code by another wallet
- Return existing code if already generated (immutable — cannot change once set)
Referral Registration
POST /api/airdrop/register-referral
Record referral relationship.
- Called when user connects wallet with a ref code (from URL param or manual input)
- Lookup referrer by code in
pl_referral_codes
- Store in
pl_referrals (referrer_address, referred_address, referral_code)
- Reject if referred address already has a referrer (one referrer per wallet, first-come)
- No retroactive points — referral only applies to future buy-points
Client-Side
- Global
useReferralCapture hook (root layout or provider):
- On any page load, read
?ref= query param
- Store in localStorage if present
- On wallet connect, submit stored ref code via
register-referral API
- Works on
/airdrop, /story/*, and any other page
- Manual input on
/airdrop page:
- "Who referred you?" input field
- Only visible when user has no referrer set
- Non-editable once submitted
- Shows "Referred by: @username" after set
Story Share Integration
- Modify existing story share button to append
?ref=CODE when user has a referral code
- Example:
plotlink.xyz/story/48?ref=project7
- Works on all story pages (
/story/[id])
Files
src/app/api/airdrop/referral-code/route.ts
src/app/api/airdrop/register-referral/route.ts
- Add:
useReferralCapture hook or root layout effect
- Modify: story share button component (append
?ref=CODE)
Acceptance Criteria
Parent: #877
Depends on: #878
Scope
Complete referral system: code generation (with Farcaster username option), registration (via URL + manual input), and story share integration.
Referral Code
POST /api/airdrop/referral-codeGenerate or retrieve referral code for connected wallet.
pl_referral_codesuseFarcasterUsername: true:userstable for matching FID)code = username,is_farcaster_username = trueReferral Registration
POST /api/airdrop/register-referralRecord referral relationship.
pl_referral_codespl_referrals(referrer_address, referred_address, referral_code)Client-Side
useReferralCapturehook (root layout or provider):?ref=query paramregister-referralAPI/airdrop,/story/*, and any other page/airdroppage:Story Share Integration
?ref=CODEwhen user has a referral codeplotlink.xyz/story/48?ref=project7/story/[id])Files
src/app/api/airdrop/referral-code/route.tssrc/app/api/airdrop/register-referral/route.tsuseReferralCapturehook or root layout effect?ref=CODE)Acceptance Criteria
?ref=captured on any PlotLink page via global hook → localStorage?ref=CODEwhen user has a code