Skip to content

System Architecture

The Big Picture ​

NOMA Sync Engine is the central integration layer that keeps Little Green Light (your main donor database) in sync with all external platforms.

NOMA Sync Architecture Diagram

System Components ​

1. NOMA Sync Engine ​

What it is: The backend that receives data from Givebutter, Square, and Mailchimp and writes to LGL. It runs in the cloud; your developer manages the technical setup (see Developer setup).

What it does:

  • Receives webhooks from Givebutter, Square, Mailchimp
  • Processes donations, orders, signups in real-time
  • Maps campaigns/funds to LGL
  • Creates/updates constituents and gifts in LGL
  • Logs all sync activity
  • Runs backup polling and summary emails

2. Little Green Light (Main Database) ​

What it is: NOMA's donor CRM and fundraising database.

What gets synced:

  • Constituents - Donor profiles (name, email, phone, address)
  • Gifts - Donations, purchases, event registrations
  • Funds/Campaigns - Where money is designated
  • Custom Fields - Shirt sizes, event choices, referral sources
  • Tags - Mailchimp list membership, unsubscribe status

LGL Environments:

  • Production - Live donor data
  • Sandbox - Testing (switch in dashboard Settings)

3. Integration Sources ​

Givebutter (primary) ​

  • Purpose: Donations, event registration, peer-to-peer fundraising
  • What syncs: Donor/registrant → LGL constituent; donation/ticket → LGL gift; campaign → LGL fund; custom fields

Square ​

  • Purpose: Online store orders (merchandise, products)
  • What syncs: Customer → LGL constituent; order → LGL gift; location → LGL campaign (via overrides)

Mailchimp ​

  • Purpose: Newsletter signups, unsubscribes, list management
  • What syncs: New contact → LGL constituent + tag; unsubscribe → remove newsletter tag; list/tag changes → LGL

4. Dashboard (React App) ​

URL: https://noma.21adsmedia.io/

Purpose: Web interface for monitoring, configuring, and managing syncs.

Pages:

  • Dashboard - Overview, stats, recent syncs
  • Syncs - Full sync log with filters, detail view, resolve/resync
  • Mappings - Configure Givebutter/Square → LGL campaign mappings
  • Square Orders - View orders, enrich customer data
  • Mailchimp Settings - List mapping, tag rules
  • Settings - LGL environment, alerts, testing
  • Teams - User management (admin only)

Auth: JWT-based login with magic links

Roles:

  • Viewer - Read-only access
  • Admin - Full access except user management
  • Super Admin - Everything (Andrew only)

Data Flow Examples ​

Givebutter Donation ​

mermaid
sequenceDiagram
    participant Donor
    participant Givebutter
    participant Worker as NOMA Sync Engine
    participant LGL as Little Green Light

    Donor->>Givebutter: Makes $50 donation
    Givebutter->>Worker: POST /webhooks/givebutter
    Worker->>Worker: Verify signature
    Worker->>Worker: Map campaign to LGL fund
    Worker->>LGL: Search for constituent by email
    alt Constituent exists
        Worker->>LGL: Create gift ($50)
    else New constituent
        Worker->>LGL: Create constituent
        Worker->>LGL: Create gift ($50)
    end
    Worker->>Dashboard: Log sync event (success)

Square Order ​

mermaid
sequenceDiagram
    participant Customer
    participant Square
    participant Worker as NOMA Sync Engine
    participant LGL as Little Green Light

    Customer->>Square: Purchases t-shirt ($25)
    Square->>Worker: POST /webhooks/square (order.created)
    Worker->>Worker: Verify signature
    Worker->>Square: Fetch full customer details
    Worker->>Worker: Apply location override (map to campaign)
    Worker->>LGL: Create/update constituent
    Worker->>LGL: Create gift ($25, mapped campaign)
    Worker->>Dashboard: Log sync event (success)

Mailchimp Unsubscribe ​

mermaid
sequenceDiagram
    participant Subscriber
    participant Mailchimp
    participant Worker as NOMA Sync Engine
    participant LGL as Little Green Light

    Subscriber->>Mailchimp: Clicks unsubscribe
    Mailchimp->>Worker: POST /webhooks/mailchimp (unsubscribe)
    Worker->>Worker: Verify signature
    Worker->>LGL: Find constituent by email
    Worker->>LGL: Remove newsletter tag
    Worker->>Dashboard: Log sync event (success)

Error Handling & Retry ​

Webhook failures:

  • Worker returns 500 → Source platform retries (3x with backoff)
  • Logged in Syncs page with full error details
  • Admin can manually resync from dashboard

LGL API failures:

  • Retries up to 3 times with exponential backoff
  • Logged as error in Syncs page
  • Alert email sent to configured recipients

Idempotency:

  • Duplicate webhooks detected and skipped
  • Safe to retry any sync operation

Backup & Monitoring ​

Cron Jobs:

  • Polling (every 15 minutes): Checks for missed Givebutter/Square events
  • Weekly Summary (Sundays): Email with sync stats, error count, campaign totals
  • Campaign Sync (hourly): Refreshes Givebutter campaign cache

Alerts:

  • Email sent when sync fails
  • Configurable recipients in Settings

Health Check:

  • GET /health - Returns system status
  • Dashboard "Test Connection" buttons verify LGL/Givebutter/Square connectivity

Performance ​

  • End-to-end sync: 5–10 seconds (event → LGL)
  • Backup: Polling every 15 minutes; weekly summary email

Roadmap ​

Planned:

  • Manual Donation Form integration
  • Quiz App & Resource sync
  • Donorbox (optional upgrade)
  • Mailchimp blog content sync

Current Focus:

  • Givebutter, Square, Mailchimp are production-ready
  • Dashboard feature complete
  • LGL environment switching live