GiveLinkDocs
API ReferenceCampaigns

Campaign Analytics

Per-campaign donation analytics with trend data, top donors, and breakdowns.

GET /api/reporting/campaign/:id

Returns detailed analytics for a single campaign. Includes a daily donation trend, top donor list, payment method breakdown, frequency breakdown, UTM source breakdown, and peak donation hour.

Path Parameters

ParameterTypeRequiredDescription
idstringYesThe campaign ID to retrieve analytics for

Query Parameters

ParameterTypeRequiredDefaultDescription
orgIdstringYesThe organization ID. Used to verify access.
startDatestringNo30 days agoISO 8601 start date for the trend window
endDatestringNoTodayISO 8601 end date for the trend window

Authentication

Requires a valid Clerk session JWT in the Authorization: Bearer header. The authenticated user must be a member of the organization that owns this campaign.

Response

campaign object

FieldTypeDescription
idstringCampaign ID
titlestringCampaign title
goalAmountCentsinteger or nullFundraising goal in cents
raisedAmountCentsintegerRunning total raised (all-time)
donationCountintegerTotal succeeded donation count (all-time)
statusstringCampaign status
startDatestring or nullISO 8601 campaign start date
endDatestring or nullISO 8601 campaign end date

summary object

FieldTypeDescription
totalRaisedCentsintegerTotal amount raised in cents
donationCountintegerTotal number of succeeded donations
avgGiftCentsintegerAverage donation amount in cents
uniqueDonorsintegerNumber of unique donors
recurringCountintegerNumber of recurring donations
oneTimeCountintegerNumber of one-time donations

trend array

Daily donation data for the requested date range. One entry per calendar day.

FieldTypeDescription
datestringDate in YYYY-MM-DD format
amountCentsintegerTotal donated on this day in cents
countintegerNumber of donations on this day

topDonors array

Up to 10 top donors by total amount given.

FieldTypeDescription
donorIdstringInternal donor ID
firstNamestringDonor first name, or "Anonymous"
lastNamestringDonor last initial (e.g., "S.")
totalCentsintegerTotal amount given in cents
countintegerNumber of donations

paymentMethods array

FieldTypeDescription
methodstring"CARD", "ACH", "APPLE_PAY", "GOOGLE_PAY", or "UNKNOWN"
countintegerNumber of donations via this method
amountCentsintegerTotal donated via this method in cents

frequencyBreakdown array

FieldTypeDescription
frequencystring"ONE_TIME", "MONTHLY", "QUARTERLY", or "ANNUAL"
countintegerNumber of donations at this frequency
amountCentsintegerTotal donated at this frequency in cents

topSources array

Up to 5 top UTM sources by total amount raised.

FieldTypeDescription
sourcestringUTM source value (e.g., "email")
countintegerNumber of donations from this source
amountCentsintegerTotal donated from this source in cents

peakHour

The UTC hour of day (0-23) that received the most donations. null if the campaign has no donations.

Example

curl "https://givelink-api-production.up.railway.app/api/reporting/campaign/clx9876543210?orgId=clxabc123456&startDate=2026-02-01&endDate=2026-03-04" \
  -H "Authorization: Bearer <clerk-session-jwt>"
{
  "campaign": {
    "id": "clx9876543210",
    "title": "Spring 2026 Annual Fund",
    "goalAmountCents": 5000000,
    "raisedAmountCents": 1245000,
    "donationCount": 87,
    "status": "ACTIVE",
    "startDate": "2026-03-01T00:00:00.000Z",
    "endDate": "2026-06-30T23:59:59.000Z"
  },
  "summary": {
    "totalRaisedCents": 1245000,
    "donationCount": 87,
    "avgGiftCents": 14310,
    "uniqueDonors": 74,
    "recurringCount": 23,
    "oneTimeCount": 64
  },
  "trend": [
    { "date": "2026-02-01", "amountCents": 0, "count": 0 },
    { "date": "2026-02-02", "amountCents": 25000, "count": 2 },
    { "date": "2026-02-03", "amountCents": 100000, "count": 7 }
  ],
  "topDonors": [
    { "donorId": "clxdonor001", "firstName": "Margaret", "lastName": "T.", "totalCents": 250000, "count": 1 },
    { "donorId": "clxdonor002", "firstName": "Robert", "lastName": "K.", "totalCents": 100000, "count": 2 }
  ],
  "paymentMethods": [
    { "method": "CARD", "count": 70, "amountCents": 900000 },
    { "method": "ACH", "count": 17, "amountCents": 345000 }
  ],
  "frequencyBreakdown": [
    { "frequency": "ONE_TIME", "count": 64, "amountCents": 800000 },
    { "frequency": "MONTHLY", "count": 23, "amountCents": 445000 }
  ],
  "topSources": [
    { "source": "email", "count": 45, "amountCents": 650000 },
    { "source": "facebook", "count": 12, "amountCents": 180000 }
  ],
  "peakHour": 19
}

Error Responses

StatusErrorDescription
400Validation failedorgId is missing or invalid
401UnauthorizedMissing or invalid Authorization header
403ForbiddenAuthenticated user is not a member of the specified org
404Campaign not foundNo campaign with this ID exists for the given org
How is this guide?

On this page