Appearance
What is the Givebutter integration?
The Givebutter integration is the primary integration for NOMA's donor management. It handles:
- Event registration & tickets (e.g., "Not One More Rally")
- Peer-to-peer fundraising (fundraiser pages)
- General donations (one-time and recurring)
- Campaign-to-fund mapping (Givebutter campaigns → LGL funds)
What Gets Synced
| Givebutter Data | LGL Field | Notes |
|---|---|---|
| Transaction (donation/ticket) | Gift | Amount, date, payment method |
| Supporter (donor/registrant) | Constituent | Name, email, phone, address |
| Campaign (event/fundraiser) | Fund/Campaign | Mapped via dashboard Mappings page |
| Custom Fields (shirt size, etc.) | LGL Custom Fields | Configured per campaign |
| Payment Method | Gift Type | Auto-detected (credit card, cash, check) |
How It Works
Real-Time Webhook Flow
Backup Polling (Safety Net)
Every 15 minutes, NOMA Sync polls Givebutter API for transactions from the last 24 hours. If webhook was missed, polling catches it and syncs.
Campaign Mapping
Problem: Givebutter uses "campaigns" (events, fundraisers), LGL uses "funds" (restricted, unrestricted). They don't auto-match.
Solution: Map Givebutter campaigns to LGL funds in the Mappings page.
Mapping Rules
Type Default - All donations of a specific type go to a default fund
- Example: "General Donation" → "Unrestricted Fund"
Campaign Override - Specific Givebutter campaign overrides the default
- Example: "Not One More Rally 2026" → "Event Fund"
Fallback - If no mapping exists, uses LGL default fund
Example Mappings
| Givebutter Transaction Type | Default LGL Fund | Campaign Overrides |
|---|---|---|
| donation | Unrestricted Fund | "End of Year Campaign" → Restricted Fund |
| ticket | Event Fund | "Rally 2026" → Rally Fund |
| peer_to_peer | General Fund | — |
Custom Fields
Givebutter collects custom form fields (shirt size, dietary restrictions, etc.). NOMA Sync maps these to LGL custom fields. Mapping is configured in campaign overrides or in code (apps/worker/src/lib/campaign-mapping.ts and LGL adapter).
Payment Method Detection
NOMA Sync auto-detects payment method from the transaction payload and maps to LGL "Gift Type" (e.g. credit card, cash, check). See lib/payment-type-auto-detect.ts.
Supported Events
The Givebutter integration listens for:
transaction.succeeded- New donation/ticketticket.created- Event ticket purchase- Polling backs up any missed webhooks
Error Handling
Common errors:
- LGL constituent duplicate - Uses existing, logs warning
- Invalid campaign mapping - Uses fallback fund, logs error
- LGL API timeout - Retries 3x, then logs error for manual resync
All errors appear in Syncs page with full details.
Dashboard Features
Syncs Page
- Filter by "Givebutter" source
- View full transaction details
- Resync failed transactions
- Resolve errors
Mappings Page
- Configure type defaults (donation → fund)
- Add campaign overrides (specific Givebutter campaign → fund)
- Refresh Givebutter campaign cache
Performance
- Average sync time: 300-500ms
- Webhook → LGL delay: 5-10 seconds
- Polling frequency: Every 15 minutes
- Reliability: 99.9% (webhooks + polling)

