Skip to main content

General statistics per campaign

This report provides an overview of campaign statistics, including the number of contacted prospects, response rate, bounce rate, interest levels, and more. It focuses on campaign-level metrics. For detailed statistics at each step of the campaign, please refer to the Complete statistics for each level of campaign report.

  • All of the campaign metrics are counted as distinct events per prospect, in a given period - if one prospect receives an opening email and a followup in one campaign, in the defined period, the delivered statistic will be counted as 1, as one prospect has been delivered an email.
  • The statistics are grouped by campaign and sending email. This means that you might see statistics for the same campaign multiple times if it is sent from multiple mailboxes.
  • Campaigns that did not send any messages during the selected period will not be included in the results.

You can preview example results below

Generating a report

Use the below endpoint to generate a report hash. Afterwards use the rest/v2/reports/{hash} to retrieve the statistics data.

Request

Endpoint

POST https://api.woodpecker.co/rest/v2/reports/campaigns

Headers

x-api-key: {YOUR_API_KEY}
Content-type: application/json

For details on how to authenticate your requests, please see the authentication guide.

Body

A JSON object containing from and to date fields, that define the date period for the report's data generation.

info

You can generate data for up to 30 last days

{
"from": "YYYY-MM-DD",
"to": "YYYY-MM-DD"
}
FieldTypeDescriptionExample
fromstringStart date of the report in ISO 8601 format"2025-01-01"
tostringEnd date of the report in ISO 8601 format"2025-01-31"

Request sample

Generate a report hash
curl --request POST \
--url "https://api.woodpecker.co/rest/v2/reports/campaigns" \
--header "Content-Type: application/json" \
--header "x-api-key: {YOUR_API_KEY}" \
--data '{
"from": "YYYY-MM-DD",
"to": "YYYY-MM-DD"
}'

Response

Response examples

The response is a hash that you should use the fetch the report content using the rest/v2/reports/{hash} endpoint.

{
"hash":"c966572e5b7c12d73f....347b5186242782c9550d"
}
Body schema
FieldTypeDescription
hashstringRepresentation of the report's ID. Use it to fetch the generated data

Retrieving a report

After requesting the report generation, you can fetch it using the below endpoint. Insert the hash, obtained from the above request, to the URL.

Preparing the data may take some time. Please check the status value to monitor the progress. The possible statuses are PENDING, WAITING, IN_PROGRESS, READY and FAILED.

Request

Endpoint

GET https://api.woodpecker.co/rest/v2/reports/{hash}

Headers

x-api-key: {YOUR_API_KEY}

For details on how to authenticate your requests, please see the authentication guide.

Parameters

By default, the results are sorted by data[].id ascending. You can change the order by using the sort parameter.

KeyValueRequiredDescription
sort+id/-idNoSort the results by data[].id. Use - for descending and + for ascending

Request sample

Retrieve a report using the hash
curl --request GET \
--url "https://api.woodpecker.co/rest/v2/reports/{hash}" \
--header "x-api-key: {YOUR_API_KEY}"

Response

Response examples

This example presents campaign statistics for the period from January 1 to January 31, 2025, covering two campaigns sent from two email addresses. You can observe three objects as the "First Successful Campaign" utilizes inbox rotation and includes statistics for both senders, while "Second campaign" uses one sending address.

{
"status": "READY",
"report": {
"description": "General_statistics_per_campaign_2025-01-01-2025-01-31",
"data": [
{
"id": 1234567,
"name": "First successful campaign",
"status": "RUNNING",
"sent_from": "email-1@gmail.com",
"contacted_prospects": 64,
"bounced": 0,
"bounced_rate": "0.0%",
"opened": 0,
"open_rate": "0.0%",
"clicked": 0,
"opt_out": 0,
"delivered": 64,
"responded": 7,
"response_rate": "10.9%",
"interested": 2,
"maybe_later": 1,
"not_interested": 4
},
{
"id": 1234567,
"name": "First successful campaign",
"status": "RUNNING",
"sent_from": "email-2@gmail.com",
"contacted_prospects": 67,
"bounced": 0,
"bounced_rate": "0.0%",
"opened": 0,
"open_rate": "0.0%",
"clicked": 0,
"opt_out": 0,
"delivered": 67,
"responded": 8,
"response_rate": "11.9%",
"interested": 0,
"maybe_later": 0,
"not_interested": 6
},
{
"id": 9876543,
"name": "Second campaign",
"status": "RUNNING",
"sent_from": "email-1@gmail.com",
"contacted_prospects": 56,
"bounced": 0,
"bounced_rate": "0.0%",
"opened": 0,
"open_rate": "0.0%",
"clicked": 0,
"opt_out": 0,
"delivered": 56,
"responded": 8,
"response_rate": "14.3%",
"interested": 3,
"maybe_later": 0,
"not_interested": 4
}
]
}
}
Body schema
FieldTypeDescription
statusstringStatus of the generation. PENDING, WAITING, IN_PROGRESS, READY,FAILED
reportobject/nullContainer for report details. Null if status is not READY
└─report.descriptionstringFull name of the report and its period
└─report.dataarrayList of campaign statistics
    └─data[].idintegerUnique ID of the campaign
    └─data[].namestringName of the campaign
    └─data[].statusstringCurrent status of the campaign. One of: RUNNING PAUSED STOPPED EDITED DRAFT COMPLETED DELETED
    └─data[].sent_fromstringEmail address used to send the campaign
    └─data[].contacted_prospectsintegerNumber of contacted prospects
    └─data[].bouncedintegerNumber of prospects who bounced
    └─data[].bounced_ratestringPercentage of prospects who bounced
    └─data[].openedintegerNumber of prospects who opened an email
    └─data[].open_ratestringPercentage of prospects who opened an email
    └─data[].clickedintegerNumber of prospects who who clicked a link
    └─data[].opt_outintegerNumber of prospects who opted-out
    └─data[].deliveredintegerNumber of prospects who received an email
    └─data[].respondedintegerNumber of prospects who responded
    └─data[].response_ratestringPercentage of prospects who responded
    └─data[].interestedintegerNumber of "interested" responses
    └─data[].maybe_laterintegerNumber of "maybe later" responses
    └─data[].not_interestedintegerNumber of "not interested" responses