Skip to content

Givebutter Overview

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 DataLGL FieldNotes
Transaction (donation/ticket)GiftAmount, date, payment method
Supporter (donor/registrant)ConstituentName, email, phone, address
Campaign (event/fundraiser)Fund/CampaignMapped via dashboard Mappings page
Custom Fields (shirt size, etc.)LGL Custom FieldsConfigured per campaign
Payment MethodGift TypeAuto-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

  1. Type Default - All donations of a specific type go to a default fund

    • Example: "General Donation" → "Unrestricted Fund"
  2. Campaign Override - Specific Givebutter campaign overrides the default

    • Example: "Not One More Rally 2026" → "Event Fund"
  3. Fallback - If no mapping exists, uses LGL default fund

Example Mappings

Givebutter Transaction TypeDefault LGL FundCampaign Overrides
donationUnrestricted Fund"End of Year Campaign" → Restricted Fund
ticketEvent Fund"Rally 2026" → Rally Fund
peer_to_peerGeneral 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/ticket
  • ticket.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)

Next Steps