Membership
The Downtown Alliance has a tiered membership model with automation that keeps everything in sync without manual board intervention.
The three tiers
Section titled “The three tiers”| Tier | How you join | What you get |
|---|---|---|
| Verified | Create a free account at faydta.com | Vote on surveys, RSVP for meetings, comment on bulletins. On Discord: the @DTA Verified role unlocks most public channels. |
| Member | Pay dues via Stripe | All Verified benefits + member-only bulletins, the member referral network, member meetings, the #members-chat Discord channel for shoutouts and referrals. |
| Board | Appointed by the existing board | All Member benefits + board governance, the private #meeting-plans channel, the #to-dta-board inbox channel. |
Board membership is governance, not a perk. Board members serve terms and have specific committee responsibilities.
How membership automation works
Section titled “How membership automation works”When someone pays for membership via Stripe:
- Stripe fires a
customer.subscription.createdwebhook to FAYDTA - FAYDTA records the membership in its database (the canonical record)
- FAYDTA sends a welcome email with login + Discord linking instructions
- If the member has already linked their Discord account, the
@DTA Memberrole is assigned automatically within seconds - The member’s Discord nickname is set to
"Name — Business"if their Discord nickname was blank (we never overwrite a nickname they set themselves) - The bot sends a welcome DM with a 3-channel tour
When a membership lapses:
- Stripe fires
customer.subscription.deletedafter the grace period - FAYDTA marks the membership as cancelled
- The
@DTA MemberDiscord role is removed - The member keeps
@DTA Verified— they still have a FAYDTA account; just no longer a paying member
Linking Discord to FAYDTA
Section titled “Linking Discord to FAYDTA”A member runs /link on Discord. The bot:
- DMs them a single-use link valid for 10 minutes (the link is never posted in a channel — it goes only to their DM to avoid the wrong person clicking on a shared screen)
- They click the link → land on
faydta.com/account/link-discord→ log in → confirm
We then:
- Write the Discord ↔ FAYDTA mapping to our database
- Apply roles based on their current tier
- Set nickname if blank
- Send the welcome DM
- Show a success page with their assigned role badge
If they later lose their membership and rejoin, the cycle repeats automatically.
What the board sees
Section titled “What the board sees”The /account page on faydta.com shows whether a member has linked their Discord, with an “Unlink” button if they want to disconnect. The board can also see, in the admin portal:
- Total active members
- New members in the last 7/30/90 days
- Members who lapsed
- Which members are linked to Discord vs not
Daily reconcile
Section titled “Daily reconcile”Once a day at 6 AM ET, a background job re-checks every linked Discord user against their FAYDTA tier and applies any drift:
- Member who was promoted to board → @DTA Board added
- Member whose subscription lapsed → @DTA Member removed
- Discord user who left the server → marked unlinked in our database (so we stop trying to sync them)
This is the safety net. If any single sync misfires (Discord API blip, network glitch), the next day’s reconcile catches it. The system stays in eventual consistency even if individual events fail.
For other boards
Section titled “For other boards”Membership automation is the most common place small non-profits hand-roll. Common patterns we’ve seen elsewhere:
- A spreadsheet of paid members, manually updated, maintained by one volunteer who burns out
- A CRM (Salesforce / HubSpot) for tracking, but disconnected from where the community lives
- Email lists managed in Mailchimp that drift out of sync with actual paying members
The pattern that’s worked for us:
- One database of record. Stripe → our database → everywhere else flows out.
- Tier == access. Role assignment is automatic and downstream of payment status. No board member is granting role-based access by hand.
- Daily reconcile. Eventual consistency is fine. Real-time isn’t worth the engineering complexity.
- Audit trail of who’s linked. When a Discord-side problem happens, we know which FAYDTA user it maps to.
What we deliberately avoid:
- Charging different prices for different tiers within “Member” (it adds complexity for marginal value)
- Making Discord required (some board members in their 60s+ never use Discord; they still need their @DTA Member role to mean something even if they’re not in the server)
- Marketing-style “tier upsell” prompts on the dashboard (we’re a non-profit, not a SaaS)
What we don’t share publicly
Section titled “What we don’t share publicly”Per-member data — payment amounts, contact info, exact join date, address — is private. Aggregate counts (total active members, average tenure) are board-visible. Identifying information about specific members appears in public records only when the member themselves chose to (e.g., their business name on the public directory).