Updated: Mar 26, 2026
Setting up S3-compatible storage integrations
The beehiiv S3 integration lets you export subscriber interaction data, including email clicks, opens, and bounces, directly to your own cloud storage bucket for ingestion into an external database or analytics platform.
The following S3-compatible storage providers are supported:
- Amazon Web Services (AWS S3)
- Cloudflare R2
- Backblaze B2
- Wasabi Cloud Storage
In this article, you'll learn how to:
- Configure your bucket and user permissions for each platform.
- Connect your storage provider to your beehiiv workspace.
- Understand the CSV data that beehiiv uploads to your storage platform.
How to connect your storage account to your publication
- Click on Settings in the bottom left corner of your beehiiv account.
- From the left panel menu, go to Integrations > Browse apps. Once the Available Apps open, navigate to your storage provider and click Connect.
- A setup wizard will walk you through the process. You'll first be prompted to enter your bucket name.
Once entered, the IAM Policy field below will populate with a JSON object showing the access policy required to access your bucket. Copy this policy and apply it to your bucket permissions before proceeding. When ready, click Next. - In the Test your connection step, enter your bucket's region and the credentials used to access it. When done, click Next.
- On the final screen, configure your delivery settings. Specify a directory name, file type, and compression type, then click Connect.
Data can be exported in CSV or Parquet format, with the following compression options: LZ4, GZIP, or no compression. Uncompressed files are split into 16 MB parts.
AWS S3
Access Control Lists are used to access buckets on AWS S3. Before testing your connection, make sure ACLs are enabled in your bucket's permissions settings.
You'll need to provide an Access Key and Secret Access Key from AWS to grant access to your S3 bucket. If you're unfamiliar with IAM users and access keys, refer to the AWS IAM documentation.
Backblaze B2
Default B2 bucket permissions are sufficient for this integration. When creating an application key scoped to your bucket, be sure to grant read/write permissions and list access.
In the setup wizard, enter your credentials as follows:
- Key ID: Access Key ID
- Application Key: Secret Access Key
Your bucket's region can be found in the Endpoint field on the bucket details page.
Wasabi Cloud Storage
After entering your bucket name, you’ll see an access policy displayed as a large JSON object. Follow the steps in the Wasabi documentation to add this access policy to your bucket. Once done, navigate to Access Keys in the left toolbar and create a set of access keys.
Cloudflare R2
The R2 setup requires two pieces of information.
Bucket URL: Navigate to your R2 bucket and click Settings. The bucket URL appears under the General section, labeled S3 API.
API credentials: The API credentials will need to be generated on the R2 Overview page. Once there, find Account Details on the right side and then on the click Manage next to API Tokens.
Understanding exported data
Data is exported from beehiiv to your bucket on a nightly basis. The exported files follow the schema below. Fields marked as nullable may not always contain a value.
| Column Name | Data Type | Nullable | Description | Sample Value |
| event_id | String | No | Unique identifier for the event | 5732d85c-95e5-4dd3-939b-30523c0710f1 |
| publication_name | String | No | Name of the publication | John Doe’s Newsletter |
| publication_id | String | No | Unique identifier for the publication | pub_b95740fa-<yourpublicationid> |
| post_name | String | No | Title of the post | Example Newsletter: Feb 2nd, 2026 |
| post_id | String | No | Unique identifier for the post | post_4e498cac-57e6-460b-84c1-<id> |
| String | No | Subscriber email address | [email protected] | |
| subscription_id | String | No | Unique identifier for subscriber | sub_e53b0251-b57a-<id> |
| timestamp | DateTime | No | Time of event | January 21, 2026, 12:41 PM |
| event | String | No | Type of event | One of: click, delivered, processed, deferred, open, bounce, dropped, spamreport |
| is_verified | Boolean | Yes | Whether click is verified | One of: True, False |
| ip_address | String | Yes | IP address of subscriber | 2a09:bac3:c911:2da5::48c:68 |
| user_agent | String | Yes | User agent string of subscriber | Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/143.0.0.0 Safari/537.36 |
| latitude | String | Yes | Latitude coordinate (if available) | 45.10 |
| longitude | String | Yes | Longitude coordinate (if available) | -94.39 |
| city | String | Yes | City of subscriber (if available) | Darwin |
| region | String | Yes | Region (state) of subscriber (if available) | Minnesota |
| country | String | Yes | Country of subscriber (if available) | US |
| subscriber_timezone | String | Yes | Timezone of subscriber (if available) | America/Chicago |
| url | String | Yes | Full URL of event click | https://www.example.com/category/article.html?foo=bar |
| url_host | String | Yes | Hostname of the URL | https://www.example.com |
| url_path | String | Yes | Path portion of URL | /category/article.html |
| url_query | String | Yes | Query string parameters of URL | ?foo=bar |
Was this article helpful?
Related Articles