# AWeber

- Tool: Bubble
- Difficulty: Intermediate
- Time required: 1.5–2.5 hours
- Last updated: July 2026

## TL;DR

Connect Bubble to AWeber using the API Connector with an OAuth 2.0 Bearer token stored as a Private header. Wire the 'Subscribe user' POST call to Bubble's sign-up workflow so every new user is automatically added to your AWeber list. Build a Backend Workflow to refresh the token before it expires, and store your AWeber account ID in a Data Type so all endpoint paths resolve correctly.

## Auto-Subscribe Bubble Users to AWeber Email Lists

AWeber is the email marketing platform of choice for creators, coaches, and solopreneurs who want reliable list management and autoresponder sequences. Connecting Bubble to AWeber enables the most requested integration pattern: automatically subscribing every new Bubble user to an AWeber list the moment they register. This turns your Bubble sign-up flow into a list-building machine without any manual exports or Zapier automations. AWeber API v1 uses OAuth 2.0, and the Bubble integration requires two things you need to get right upfront. First: the AWeber account ID is a numeric value that appears in every API endpoint path (e.g., /accounts/1234567/lists) — get it from the Initialize call and store it in a Bubble Data Type. Second: AWeber OAuth tokens have a limited lifespan and need to be refreshed using a refresh token endpoint. Build the refresh Backend Workflow before launching to users so the integration does not silently stop subscribing people when the token expires. Beyond subscribe-on-registration, the integration supports tagging subscribers based on in-app actions (which list they signed up for, which plan they chose) and fetching your subscriber counts for dashboard display.

## Before you start

- An AWeber account (Free plan supports up to 500 subscribers and includes basic API access; Pro from $12.50/month for larger lists)
- An AWeber Developer App created at labs.aweber.com — note your Client ID and Client Secret
- An OAuth 2.0 access token and refresh token obtained by completing AWeber's authorization flow
- Your AWeber account ID (a numeric value extracted from the /accounts API response during setup)
- A Bubble app on any plan for initial setup (paid plan required for scheduled Backend Workflow token refresh)

## Step-by-step guide

### 1. Create Your AWeber Developer App and Prepare for OAuth

Navigate to labs.aweber.com and log in with your AWeber credentials. Click Create an App (or find the equivalent in the developer portal navigation). Fill in the app name (e.g., 'Bubble Integration'), a brief description, and set the OAuth 2.0 redirect URI. The redirect URI is where AWeber will send the authorization code during the OAuth flow — use a URL you control, such as https://yourbubblebapp.bubbleapps.io/aweber-callback or even a temporary URL from a service like httpbin.org/get for one-time setup. After creating the app, AWeber shows your Client ID and Client Secret. Copy both and save them securely — you will need them for the token exchange. AWeber includes API access on all plans including their free tier (500 subscribers limit on the free plan, but the API itself works). If you do not see labs.aweber.com in your account context, try navigating directly or searching the AWeber Help Center for 'Developer Application' — the portal URL may have changed.

**Expected result:** You have an AWeber Developer App with a Client ID and Client Secret. The redirect URI is configured. You are ready to start the OAuth authorization flow.

### 2. Complete the OAuth 2.0 Flow to Get Your Access and Refresh Tokens

AWeber uses OAuth 2.0 Authorization Code flow. Construct the authorization URL: https://auth.aweber.com/oauth2/authorize?response_type=code&client_id=YOUR_CLIENT_ID&redirect_uri=YOUR_REDIRECT_URI&scope=subscriber.read%20subscriber.write%20list.read%20account.read&state=random_string. Open this URL in your browser while logged into AWeber, click Authorize, and AWeber redirects to your redirect URI with a code= parameter. Copy that authorization code — it expires in minutes. Now exchange it for tokens: send a POST request to https://auth.aweber.com/oauth2/token with Content-Type: application/x-www-form-urlencoded and the body parameters grant_type=authorization_code, code=YOUR_AUTH_CODE, redirect_uri=YOUR_REDIRECT_URI, client_id=YOUR_CLIENT_ID, client_secret=YOUR_CLIENT_SECRET. Use a REST client (Insomnia, Postman) for this step. The response contains an access_token, a refresh_token, and an expires_in field showing the token lifespan. Copy both tokens immediately. Store the access_token and refresh_token in a Bubble Data Type called 'App Config' with text fields aweber_access_token and aweber_refresh_token. You will use these fields dynamically in the API Connector and the token refresh Backend Workflow.

```
// Step 1: Authorization URL
// https://auth.aweber.com/oauth2/authorize
//   ?response_type=code
//   &client_id=YOUR_CLIENT_ID
//   &redirect_uri=YOUR_REDIRECT_URI
//   &scope=subscriber.read%20subscriber.write%20list.read%20account.read
//   &state=random_string

// Step 2: Token Exchange
// POST https://auth.aweber.com/oauth2/token
// Content-Type: application/x-www-form-urlencoded

grant_type=authorization_code
&code=THE_CODE_FROM_REDIRECT
&redirect_uri=YOUR_REDIRECT_URI
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET

// Response:
{
  "access_token": "eyJ...",
  "token_type": "Bearer",
  "expires_in": 3600,
  "refresh_token": "eyJ_refresh...",
  "scope": "subscriber.read subscriber.write list.read account.read"
}
```

**Expected result:** You have an AWeber access_token and refresh_token stored in your Bubble App Config Data Type. The access token is ready to paste into the API Connector, and the refresh token is safely stored for automated renewal.

### 3. Configure the API Connector and Extract Your Account ID

In your Bubble editor, open the Plugins tab and click Add plugins. Search for API Connector (by Bubble) and install it. Click API Connector, then Add another API. Name the group AWeber. Set the base URL to https://api.aweber.com/1.0. In the Shared headers section, click Add a shared header. Set the key to Authorization, set the value to Bearer YOUR_ACCESS_TOKEN (pasting the access_token from Step 2), and check the Private checkbox. This keeps your AWeber token out of the browser — important because this token grants full list and subscriber management access. Add a second shared header: key Content-Type, value application/json (no Private flag needed). Now add your first call: click Add a call, name it Get Accounts, set the method to GET, and the endpoint to /accounts. Click Initialize call — Bubble makes a live request to AWeber and detects the response fields. The response contains your AWeber account data, including a self link in the format https://api.aweber.com/1.0/accounts/1234567 — the number at the end is your account ID. Also, the entries array item will have an id field directly. Note this account ID — it is a required path segment in every subsequent AWeber endpoint. Store it in your App Config Data Type as a field named aweber_account_id (as a number or text).

```
// API Connector group: AWeber
// Base URL: https://api.aweber.com/1.0

// Shared headers:
{
  "Authorization": "Bearer eyJ_YOUR_ACCESS_TOKEN",  // <-- mark Private
  "Content-Type": "application/json"
}

// Initialize call: GET /accounts
// Expected response:
{
  "entries": [
    {
      "id": 1234567,
      "email": "you@yourdomain.com",
      "username": "yourusername",
      "self_link": "https://api.aweber.com/1.0/accounts/1234567",
      "lists_collection_link": "https://api.aweber.com/1.0/accounts/1234567/lists"
    }
  ],
  "total_size": 1
}
```

**Expected result:** The API Connector group 'AWeber' is configured with the base URL and both shared headers including the Private Authorization header. The Initialize call on /accounts succeeds and shows your account ID in the response. You've stored the account ID in your App Config Data Type.

### 4. Get Your Email Lists and Add the Subscribe User Call

Add a second call named Get Lists. Set the method to GET and endpoint to /accounts/YOUR_ACCOUNT_ID/lists (replacing YOUR_ACCOUNT_ID with your actual numeric ID, or using a dynamic reference to your App Config field). Initialize this call — the response shows all your AWeber email lists with fields including id (the list ID), name, total_subscribers, and a self_link. Note the list ID for the list you want to use for auto-subscription (e.g., 12345678). Now add a third call named Subscribe User. Set the method to POST and endpoint to /accounts/YOUR_ACCOUNT_ID/lists/YOUR_LIST_ID/subscribers. Set the body type to JSON. Add the body parameters: email (dynamic, mark as required), name (dynamic), and optionally ip_address and tags. Click Initialize call — for POST calls, Bubble needs you to provide test values for the body fields. Enter a real email address you own and a test name. AWeber will actually create a subscriber record during initialization, so use a disposable or test email address. When the Initialize succeeds, Bubble recognizes the call structure. Set Use as to Action (since this is a data-modifying POST call). Now wire this to your sign-up workflow: In Bubble's Workflow editor, find your user registration action (or add a new workflow triggered when a User is created). Add a Make API Call action → Subscribe User. Bind the email parameter to Current User's email, and the name parameter to Current User's name or display name.

```
// GET /accounts/1234567/lists
// Expected response:
{
  "entries": [
    {
      "id": 12345678,
      "name": "Main Newsletter",
      "total_subscribers": 432,
      "self_link": "https://api.aweber.com/1.0/accounts/1234567/lists/12345678"
    }
  ]
}

// POST /accounts/1234567/lists/12345678/subscribers
// Body (JSON):
{
  "email": "newuser@example.com",
  "name": "Jane Doe",
  "ip_address": "127.0.0.1",
  "tags": ["bubble-signup"]
}

// Bubble workflow trigger: User is created
// Action: Make API Call → Subscribe User
//   email = Current User's email
//   name = Current User's name
```

**Expected result:** Three API Connector calls are configured: Get Accounts, Get Lists, and Subscribe User. The Subscribe User call is wired to your Bubble sign-up workflow. New users who register on your Bubble app are automatically added to your AWeber email list.

### 5. Add Subscriber Tagging with Chained API Calls

AWeber subscriber tagging lets you segment your list based on in-app actions. Tagging requires two API calls chained in sequence: first, look up the subscriber's AWeber ID by email; then, PATCH the subscriber record to add tags. Add a fourth call named Find Subscriber by Email. Set the method to GET and endpoint to /accounts/YOUR_ACCOUNT_ID/lists/YOUR_LIST_ID/subscribers. Add the URL parameter ws.param.email (this is AWeber's filtering parameter for email lookup — note it is a URL query parameter, not a body field). Initialize this call with a real email address that exists in your list. The response returns a matching subscriber entry with an id field — this is the AWeber subscriber ID. Add a fifth call named Tag Subscriber. Set the method to PATCH and endpoint to /accounts/YOUR_ACCOUNT_ID/lists/YOUR_LIST_ID/subscribers/SUBSCRIBER_ID (where SUBSCRIBER_ID is a dynamic path parameter). Set the body type to JSON with the field tags as an array. Initialize with a test subscriber ID. Now build the tagging workflow in Bubble: trigger it on a relevant user action (e.g., plan upgrade). Action 1: Make API call → Find Subscriber by Email, passing Current User's email. Action 2: Make API call → Tag Subscriber, passing the subscriber ID from Action 1's response's entries:item #1's id field, and the tags array with the relevant tag string. The chained workflow takes a few seconds to run but requires no backend server — Bubble's workflow engine handles the sequential execution natively.

```
// GET /accounts/1234567/lists/12345678/subscribers?ws.param.email=user@example.com
// Expected response:
{
  "entries": [
    {
      "id": 987654321,
      "email": "user@example.com",
      "name": "Jane Doe",
      "status": "subscribed",
      "tags": ["bubble-signup"]
    }
  ],
  "total_size": 1
}

// PATCH /accounts/1234567/lists/12345678/subscribers/987654321
// Body (JSON):
{
  "tags": ["pro-upgrade"]
}

// Bubble Workflow: 'User Plan Upgraded' event
// Action 1: Make API call → Find Subscriber by Email
//   ws.param.email = Current User's email
// Action 2: Make API call → Tag Subscriber
//   SUBSCRIBER_ID = Result of Step 1's entries:item #1's id
//   tags = ["pro-upgrade"]
```

**Expected result:** Your Bubble app can tag AWeber subscribers based on in-app actions. When a user upgrades their plan (or completes any workflow-triggering action), Bubble looks up their AWeber subscriber ID by email and patches the record with the appropriate tag — triggering AWeber automation sequences automatically.

### 6. Build a Token Refresh Backend Workflow (Paid Plan Required)

AWeber OAuth access tokens have a limited lifespan (the exact duration is shown in the expires_in field of your token response — often 3,600 seconds or up to several days depending on AWeber's configuration). When the token expires, all API calls return 401 and users stop getting subscribed to your list. Build automated token refresh on a paid Bubble plan. First, add a new call to the AWeber group named Refresh Token. Set it to POST at https://auth.aweber.com/oauth2/token. Override the Content-Type header at the call level to application/x-www-form-urlencoded (AWeber's token endpoint requires form encoding, not JSON). Add body parameters: grant_type=refresh_token and refresh_token=YOUR_STORED_REFRESH_TOKEN (dynamic, from App Config's aweber_refresh_token field). Go to Settings → API in Bubble and enable 'This app exposes a Workflow API'. Navigate to Backend Workflows and create a new workflow named 'Refresh AWeber Token'. Add two actions: (1) Make API call → Refresh Token, passing App Config's aweber_refresh_token; (2) Make changes to Thing → App Config record, setting aweber_access_token to the access_token from the API response. Set up a recurring event to run this workflow on a schedule — for a token with expires_in of 3600 seconds (1 hour), run every 50 minutes; for a token that lasts days, run daily. RapidDev's team frequently helps founders set up this kind of token refresh automation for AWeber and similar integrations — book a free scoping call at rapidevelopers.com/contact.

```
// POST https://auth.aweber.com/oauth2/token
// Content-Type: application/x-www-form-urlencoded
// (Override at call level — group is application/json)

// Body (form-encoded):
grant_type=refresh_token
&refresh_token=eyJ_STORED_REFRESH_TOKEN
&client_id=YOUR_CLIENT_ID
&client_secret=YOUR_CLIENT_SECRET

// Response:
{
  "access_token": "eyJ_NEW_ACCESS_TOKEN",
  "token_type": "Bearer",
  "expires_in": 3600
}

// Backend Workflow: Refresh AWeber Token
// Trigger: Recurring event (every 50 minutes if expires_in=3600)
// Action 1: Make API call → Refresh Token
//   refresh_token = App Config's aweber_refresh_token
// Action 2: Make changes to App Config
//   aweber_access_token = Result of Step 1's access_token
```

**Expected result:** A recurring Backend Workflow keeps your AWeber access token fresh automatically. Your sign-up subscription workflow continues subscribing new users without interruption, even after the initial token's expiry period.

## Best practices

- Mark the Authorization header Private in the API Connector group. AWeber tokens grant full subscriber and list management access — exposure through a client-side call would allow anyone to access your email list.
- Store the AWeber account ID in your Bubble App Config Data Type rather than hardcoding it in every API Connector endpoint path. If you ever migrate to a different AWeber account, you update one field instead of editing every call.
- Store the refresh_token in your App Config Data Type and build the token refresh Backend Workflow before going live. AWeber token expiry causing silent subscriber failures is the most common production failure for this integration.
- Use the ws.param.email URL parameter (not a body field) for subscriber lookup by email. This is AWeber-specific behavior — putting the filter in the body is a frequent mistake that returns unfiltered results.
- Apply Data tab Privacy rules to any Bubble Data Type that caches subscriber data or list statistics. AWeber subscriber email addresses and list metrics are PII and business-sensitive data that should only be visible to admin users.
- For double opt-in AWeber lists, check the subscriber status after the POST call — the subscriber will be in 'pending' status until they confirm. Handle this in your Bubble UI by showing a 'Check your email to confirm your subscription' message if you detect pending status.
- Add the bubble-signup or similar tag to every subscriber created through the Bubble workflow. This makes it easy to segment AWeber-sourced subscribers from other channels and measure Bubble's contribution to your email list growth.

## Use cases

### Auto-Subscribe New Users to AWeber List on Registration

Connect Bubble's user sign-up workflow to AWeber so every new account creation automatically subscribes the user's email to a designated AWeber list. This eliminates manual CSV exports, keeps your AWeber list current with your Bubble user base, and triggers any AWeber welcome sequences or autoresponders automatically.

Prompt example:

```
Build a Bubble workflow that triggers when a new User is created, calls AWeber's subscriber endpoint to add the user's email and name to a specific list, and handles the case where the user's email is already subscribed gracefully.
```

### Tag Subscribers Based on In-App Actions

Use AWeber's PATCH endpoint to add tags to subscribers when users complete key actions in your Bubble app — such as upgrading to a paid plan, completing onboarding, or joining a specific cohort. Tags trigger AWeber automation sequences so users receive relevant follow-up emails based on what they did in your app.

Prompt example:

```
Create a Bubble workflow that fires when a User upgrades to the Pro plan, looks up their AWeber subscriber ID by email, and patches the subscriber record with a 'pro-upgrade' tag to trigger an AWeber automation sequence.
```

### Subscriber Count Dashboard for Bubble Admin Panel

Display AWeber subscriber counts across your email lists in a Bubble admin dashboard. Pull list statistics including total subscribers, pending confirmations, and unsubscribes so you can monitor list health without logging into AWeber separately.

Prompt example:

```
Build a Bubble admin page that shows all AWeber lists with subscriber count, total active subscribers, and last 30-day growth, refreshed daily via a Backend Workflow.
```

## Troubleshooting

### Initialize call returns 'There was an issue setting up your call' immediately after pasting the Bearer token

Cause: The Authorization header value is formatted incorrectly, or the access token has already expired. AWeber tokens have a limited lifespan — if you took too long between the OAuth exchange and configuring Bubble, the token may be stale.

Solution: Verify the header value is exactly: Bearer YOUR_ACCESS_TOKEN with a capital B and one space between Bearer and the token. Confirm the Private checkbox is checked. If the token is stale (expired), re-run the OAuth flow from Step 2 to get a fresh access token and update the API Connector group header.

### Subscriber lookup by email (ws.param.email) returns all subscribers instead of the filtered one

Cause: The ws.param.email parameter is being passed in the request body instead of as a URL query parameter. AWeber's subscriber filtering requires this to be a URL parameter.

Solution: In Bubble's API Connector for the Find Subscriber by Email call, make sure ws.param.email is added in the URL Parameters section, not in the Body section. The complete endpoint URL should look like: /accounts/ID/lists/LIST_ID/subscribers with ws.param.email=value appended as a query string parameter.

### New users are not being subscribed to AWeber after sign-up — no error is shown

Cause: The Make API Call action in the sign-up workflow is firing before the user record is fully created, or the email value binding is empty at the moment the action runs.

Solution: In your sign-up workflow, ensure the Make API Call → Subscribe User action comes after the account creation step (not before). Use a 'Only when' condition on the API call action: only when Current User's email is not empty. Also check the workflow logs in Bubble's Logs tab to see if the API call is running and what response AWeber returns.

### AWeber returns 401 Unauthorized and the integration stops working

Cause: The OAuth access token has expired. AWeber tokens have a limited lifespan, and without an automated refresh workflow, the token becomes invalid after expiry.

Solution: Use your stored refresh_token to request a new access_token by calling https://auth.aweber.com/oauth2/token with grant_type=refresh_token. Update the access_token in your App Config Data Type and in the API Connector Authorization header. Build the recurring Backend Workflow in Step 6 to prevent this from happening again.

## Frequently asked questions

### Does AWeber's free plan include API access?

Yes, AWeber's free plan includes API access and supports up to 500 subscribers. You can complete this full integration on the free plan. Paid plans (from $12.50/month) remove the 500-subscriber cap and add features like split testing and advanced analytics.

### What is the AWeber account ID and where do I find it?

The AWeber account ID is a numeric value (e.g., 1234567) that must be included in every API endpoint path. It appears in the response from the GET /accounts Initialize call — specifically in the self_link field URL, which ends with /accounts/YOUR_ID. Store this number in a Bubble App Config Data Type field so you can reference it dynamically in all endpoint paths without hardcoding it.

### Why does the subscriber lookup by email return all subscribers instead of just one?

The ws.param.email parameter must be added as a URL query parameter, not in the request body. In Bubble's API Connector, add it in the URL Parameters section of the Find Subscriber by Email call. AWeber only applies the email filter when it receives the parameter as a query string in the URL.

### Can I use the Bubble Free plan for this integration?

The API Connector setup, subscribe call, and tagging workflow all work on Bubble's Free plan. However, the scheduled Backend Workflow for automated token refresh requires a paid Bubble plan. On Free, you must manually refresh the AWeber access token each time it expires. For a production subscriber pipeline where new users should be auto-subscribed reliably, a paid Bubble plan is strongly recommended.

### What happens if a user's email is already subscribed to the list when the Bubble workflow fires?

AWeber typically returns a 400 error or an error payload indicating the subscriber already exists. To handle this gracefully in Bubble, add an error handling workflow step after the Subscribe User API call action, and show a silent no-op (don't show an error to the user since duplicate sign-ups are expected). Alternatively, check for an existing subscriber with the Find Subscriber by Email call before attempting to subscribe.

---

Source: https://www.rapidevelopers.com/bubble-integrations/aweber
© RapidDev — https://www.rapidevelopers.com/bubble-integrations/aweber
