Integrate AWeber with Bolt.new using their REST API v1 and OAuth 2.0 authentication. For personal single-account integrations, generate an access token directly from the AWeber API management page. For multi-user apps, implement the OAuth authorization code flow. Store the access token in a server-side environment variable and call AWeber's API from a Next.js API route. OAuth callbacks require a deployed Netlify URL.
Add AWeber Email Marketing to Your Bolt.new App
AWeber has been an email marketing platform since 1998 — its longevity means it's deeply integrated into the marketing stacks of thousands of small businesses and content creators. Adding AWeber integration to a Bolt app lets you capture email subscribers directly from your app and feed them into AWeber's automated email sequences, broadcasts, and campaign analytics. Whether you're building a SaaS landing page, a content portal, or a product waitlist, a Bolt-to-AWeber integration keeps your marketing list synchronized without any manual export and import.
The integration uses AWeber's OAuth 2.0 API, which requires creating a developer app in AWeber's developer portal. AWeber provides both a web server OAuth flow (for user-facing apps where subscribers authenticate with their own AWeber accounts) and a way to use your own account credentials for service-level integrations. For most Bolt use cases — capturing form submissions from your app's visitors into your own AWeber list — you'll use your own account's access token, obtained through the OAuth flow for your AWeber account.
AWeber's API is well-documented at developer.aweber.com and follows standard REST conventions. The platform's free tier supports up to 500 subscribers with full API access, making it an accessible starting point for indie developers. The API covers the full subscriber lifecycle: adding new subscribers, tagging them based on actions, unsubscribing on request, and fetching analytics about email performance. Pair it with a lead magnet form in your Bolt app and AWeber handles all the follow-up automation.
Integration method
Bolt.new connects to AWeber through server-side API routes that use OAuth 2.0 for authentication and AWeber's REST API for subscriber management. The integration supports adding subscribers to lists, fetching subscriber counts, and building email capture forms. User-facing OAuth login requires a deployed callback URL, while API-level operations using a service account token can be tested in Bolt's WebContainer preview.
Prerequisites
- An AWeber account (free tier available at aweber.com for up to 500 subscribers)
- An AWeber developer app created at labs.aweber.com/apps (or developer.aweber.com) with OAuth 2.0 credentials
- Your AWeber Account ID (visible in AWeber Dashboard → Account → Account Settings)
- Your AWeber List ID (visible in AWeber Dashboard → List Options → List Settings)
- A deployed URL on Netlify or Bolt Cloud for registering the OAuth callback redirect URI
Step-by-step guide
Create an AWeber Developer App and Get OAuth Credentials
Create an AWeber Developer App and Get OAuth Credentials
AWeber's REST API uses OAuth 2.0 for all authentication. Start by creating a developer app at labs.aweber.com/apps (you'll need to be logged in to your AWeber account). Click 'Create an App', fill in the app name and description, and enter your redirect URL. For development, you can use a placeholder redirect URL like https://your-app.netlify.app/api/aweber/callback — update it after deploying. Once the app is created, you'll receive a Client ID and Client Secret. Store these in your .env file as AWEBER_CLIENT_ID and AWEBER_CLIENT_SECRET. AWeber uses the Authorization Code OAuth 2.0 flow — your app redirects users to AWeber's authorization page, AWeber sends an authorization code to your callback URL, and your callback exchanges it for an access token and refresh token. For integrations where you're connecting your own AWeber account (not your users' accounts), you can manually complete the OAuth flow once and save the access token as AWEBER_ACCESS_TOKEN — this token can be refreshed automatically. AWeber's access tokens expire after one hour; refresh tokens are valid for much longer. Implement token refresh logic in your API routes: if an API call returns 401, use the refresh token to obtain a new access token before retrying. Your AWeber Account ID is visible in the AWeber Dashboard URL when logged in: app.aweber.com/accounts/{account_id}/. Your List ID is found in List Options → Settings for each list.
Set up AWeber API authentication for my Bolt app. Create lib/aweber.ts with: a getAccessToken() function that checks for a cached token, refreshes it if expired using POST https://auth.aweber.com/oauth2/token with grant_type=refresh_token, client_id, client_secret, and AWEBER_REFRESH_TOKEN env var. Export an aweberRequest(path, method?, body?) function that adds Authorization: Bearer {token} to requests to https://api.aweber.com/1.0/${path}. Export addSubscriber(email, name?, listId?) and getListStats(listId?) helpers. Add AWEBER_CLIENT_ID, AWEBER_CLIENT_SECRET, AWEBER_ACCESS_TOKEN, AWEBER_REFRESH_TOKEN, AWEBER_ACCOUNT_ID, AWEBER_LIST_ID to .env.
Paste this in Bolt.new chat
1// lib/aweber.ts2interface TokenCache {3 accessToken: string;4 expiresAt: number;5}67let tokenCache: TokenCache | null = null;89async function getAccessToken(): Promise<string> {10 // Return cached token if still valid (with 5 min buffer)11 if (tokenCache && Date.now() < tokenCache.expiresAt - 300000) {12 return tokenCache.accessToken;13 }1415 // Refresh the token16 const params = new URLSearchParams({17 grant_type: 'refresh_token',18 refresh_token: process.env.AWEBER_REFRESH_TOKEN!,19 client_id: process.env.AWEBER_CLIENT_ID!,20 client_secret: process.env.AWEBER_CLIENT_SECRET!,21 });2223 const res = await fetch('https://auth.aweber.com/oauth2/token', {24 method: 'POST',25 headers: { 'Content-Type': 'application/x-www-form-urlencoded' },26 body: params.toString(),27 });2829 if (!res.ok) {30 throw new Error(`AWeber token refresh failed: ${res.statusText}`);31 }3233 const data = await res.json();34 tokenCache = {35 accessToken: data.access_token,36 expiresAt: Date.now() + data.expires_in * 1000,37 };3839 return data.access_token;40}4142export async function aweberRequest<T>(43 path: string,44 method: string = 'GET',45 body?: Record<string, unknown>46): Promise<T> {47 const token = await getAccessToken();48 const res = await fetch(`https://api.aweber.com/1.0/${path}`, {49 method,50 headers: {51 Authorization: `Bearer ${token}`,52 'Content-Type': 'application/json',53 Accept: 'application/json',54 },55 ...(body ? { body: JSON.stringify(body) } : {}),56 });5758 if (!res.ok) {59 throw new Error(`AWeber API error ${res.status}: ${await res.text()}`);60 }6162 return res.json();63}6465export async function addSubscriber(email: string, name?: string, listId?: string) {66 const accountId = process.env.AWEBER_ACCOUNT_ID;67 const targetListId = listId || process.env.AWEBER_LIST_ID;68 return aweberRequest(69 `accounts/${accountId}/lists/${targetListId}/subscribers`,70 'POST',71 { email, name: name || '', ad_tracking: 'bolt-app', status: 'subscribed' }72 );73}Pro tip: To obtain your initial access token and refresh token, complete the OAuth flow manually once using AWeber's authorization URL. Use a tool like Postman or build a quick /api/aweber/auth route in Bolt. Store the returned access_token as AWEBER_ACCESS_TOKEN and refresh_token as AWEBER_REFRESH_TOKEN in your .env.
Expected result: The AWeber authentication utility is set up with automatic token refresh. With valid credentials in .env, the aweberRequest function successfully calls the AWeber API.
Build the Email Signup Form and Subscriber Route
Build the Email Signup Form and Subscriber Route
With AWeber authentication ready, build the email capture form and the API route that handles subscriptions. The form should be simple but effective — typically an email field, optional name field, and a clear call-to-action button. Add client-side validation for email format before submitting to the API. The API route calls AWeber's subscriber creation endpoint, which either creates a new subscriber or updates an existing one if the email is already in the list. AWeber handles the double opt-in confirmation email automatically based on your list's settings — if double opt-in is enabled (recommended for list quality), the subscriber receives a confirmation email and is only added to the active subscriber count after clicking the link. The API route should handle the common error cases gracefully: duplicate email (AWeber returns an error when the email already exists with the same status — handle this as a success since the subscriber is already on the list), invalid email format, and API authentication errors. Add a rate limiting consideration: if your signup form is on a high-traffic page, implement basic request rate limiting on the API route to prevent abuse. For the form UI, a common pattern is a simple inline form in the hero section (email input + button on the same line for desktop, stacked for mobile). After a successful subscription, update the button to show 'Subscribed!' with a checkmark and disable the form to prevent duplicate submissions. Track signup sources using AWeber's ad_tracking field — set it to a string identifying where the subscriber signed up (e.g., 'blog-header-form', 'homepage-footer', 'exit-intent-popup') so you can see which forms drive the most subscriptions in AWeber's analytics.
Build an email signup form for my Bolt app. Create a form component with an email input (with validation) and optional first name input, and a Subscribe button. On submit, POST to /api/aweber/subscribe with { email, first_name, source: 'website' }. Create the API route at app/api/aweber/subscribe/route.ts that: validates the email format, calls AWeber's subscriber endpoint using addSubscriber from lib/aweber.ts, handles the case where email already exists (return success), and returns { success: true } or { error: string }. After successful submission, change the button to show a green checkmark and 'You're subscribed!' message. Show an error message if the API call fails. Add the form to my homepage hero section.
Paste this in Bolt.new chat
1// app/api/aweber/subscribe/route.ts2import { NextRequest, NextResponse } from 'next/server';3import { addSubscriber } from '@/lib/aweber';45export async function POST(request: NextRequest) {6 const { email, first_name, source } = await request.json();78 // Email validation9 if (!email || !/^[^@\s]+@[^@\s]+\.[^@\s]+$/.test(email)) {10 return NextResponse.json({ error: 'Please enter a valid email address' }, { status: 400 });11 }1213 try {14 await addSubscriber(15 email,16 first_name || '',17 process.env.AWEBER_LIST_ID18 );1920 return NextResponse.json({ success: true });21 } catch (error) {22 const errorMessage = String(error);2324 // Handle 'already subscribed' as success25 if (errorMessage.includes('already subscribed') || errorMessage.includes('duplicate')) {26 return NextResponse.json({ success: true });27 }2829 console.error('AWeber subscribe error:', error);30 return NextResponse.json(31 { error: 'Failed to subscribe. Please try again.' },32 { status: 500 }33 );34 }35}Pro tip: Use AWeber's ad_tracking field to identify where subscribers sign up — set different values per form (homepage, blog, popup) to track which placements convert best in AWeber's subscriber acquisition analytics.
Expected result: Submitting the signup form adds the email to your AWeber list. In AWeber Dashboard → Subscribers, the new subscriber appears. If double opt-in is enabled, they receive a confirmation email before being activated.
Implement the OAuth Callback for User-Facing Authentication
Implement the OAuth Callback for User-Facing Authentication
If you're building an app where users connect their own AWeber accounts (rather than using your own account credentials), you need to implement the full OAuth 2.0 web server flow with a browser redirect. This requires a deployed Bolt app with a stable callback URL — the WebContainer preview's dynamic URL cannot be registered as an OAuth redirect URI in AWeber's developer portal. Deploy to Netlify or Bolt Cloud first to get a stable URL (e.g., https://your-app.netlify.app), then update the redirect URL in your AWeber developer app settings to https://your-app.netlify.app/api/aweber/callback. The OAuth flow has three steps: your app redirects the user to AWeber's authorization URL (https://auth.aweber.com/oauth2/authorize) with your Client ID, requested scopes, and callback URL as query parameters. The user logs in to AWeber and grants your app permission to access their account. AWeber redirects back to your callback URL with an authorization code. Your callback exchanges the code for an access token and refresh token via POST to https://auth.aweber.com/oauth2/token. Store both tokens per user (in Supabase, associated with their account in your app). Include a CSRF protection state parameter in the authorization URL and verify it in the callback to prevent cross-site request forgery. AWeber's required scopes for list management are: subscriber.read, subscriber.write, list.read. Request the minimum scopes needed for your use case — users see the requested permissions on the authorization screen.
Add AWeber OAuth authentication to my deployed Next.js Bolt app. Create GET /api/aweber/auth that generates a random state string (store in a cookie), then redirects to: https://auth.aweber.com/oauth2/authorize?response_type=code&client_id=${AWEBER_CLIENT_ID}&redirect_uri=${APP_URL}/api/aweber/callback&scope=subscriber.read+subscriber.write+list.read&state={state}. Create GET /api/aweber/callback that: verifies the state param matches the cookie, POSTs to https://auth.aweber.com/oauth2/token with the code and client credentials, stores access_token and refresh_token in a database or secure cookie, then redirects to /dashboard. Add an 'Connect AWeber' button on the settings page that links to /api/aweber/auth.
Paste this in Bolt.new chat
1// app/api/aweber/callback/route.ts2import { NextRequest, NextResponse } from 'next/server';34export async function GET(request: NextRequest) {5 const { searchParams } = new URL(request.url);6 const code = searchParams.get('code');7 const state = searchParams.get('state');8 const stateCookie = request.cookies.get('aweber_oauth_state')?.value;910 // CSRF protection: verify state matches11 if (!state || state !== stateCookie) {12 return NextResponse.redirect(new URL('/settings?error=invalid_state', request.url));13 }1415 if (!code) {16 return NextResponse.redirect(new URL('/settings?error=no_code', request.url));17 }1819 const params = new URLSearchParams({20 grant_type: 'authorization_code',21 code,22 client_id: process.env.AWEBER_CLIENT_ID!,23 client_secret: process.env.AWEBER_CLIENT_SECRET!,24 redirect_uri: `${process.env.APP_URL}/api/aweber/callback`,25 });2627 const tokenRes = await fetch('https://auth.aweber.com/oauth2/token', {28 method: 'POST',29 headers: { 'Content-Type': 'application/x-www-form-urlencoded' },30 body: params.toString(),31 });3233 if (!tokenRes.ok) {34 return NextResponse.redirect(new URL('/settings?error=token_failed', request.url));35 }3637 const { access_token, refresh_token } = await tokenRes.json();38 // Store tokens in your database or secure session3940 const response = NextResponse.redirect(new URL('/dashboard', request.url));41 response.cookies.delete('aweber_oauth_state');42 return response;43}Pro tip: Always include a random state parameter in the OAuth authorization URL and verify it in the callback — this prevents CSRF attacks. Use crypto.randomUUID() to generate the state value and store it in an HTTP-only cookie.
Expected result: After deployment, clicking 'Connect AWeber' redirects to AWeber's login page. After authorization, users are redirected back to the dashboard with their AWeber account connected.
Deploy and Build the Analytics Dashboard
Deploy and Build the Analytics Dashboard
Deploy your Bolt app to access AWeber's analytics endpoints and complete the OAuth setup with your deployed callback URL. Deploy using Bolt's Publish button (deploys to Bolt Cloud) or push to GitHub and connect to Netlify. Set all environment variables on the hosting platform: AWEBER_CLIENT_ID, AWEBER_CLIENT_SECRET, AWEBER_ACCESS_TOKEN, AWEBER_REFRESH_TOKEN, AWEBER_ACCOUNT_ID, and AWEBER_LIST_ID. Update your AWeber developer app's redirect URL to use your deployed domain. Build the analytics dashboard to show list performance: subscriber count over time, recent campaign metrics (open rate, click rate, bounces), and subscriber acquisition by source (using the ad_tracking field data). AWeber's API provides list analytics at /accounts/{account_id}/lists/{list_id} and broadcast (campaign) metrics at /accounts/{account_id}/lists/{list_id}/messages. The broadcast metrics endpoint returns per-email stats: total sent, opens, clicks, unsubscribes, bounces. Display these in a table or card format. For subscriber growth trends, you may need to store historical counts in Supabase since AWeber's API returns current subscriber counts, not historical time series data — record the count daily via a scheduled function or simply on each API call. Remember: AWeber API calls are outbound requests from your server-side routes and work in the WebContainer preview, but the OAuth callback (browser redirect) requires a deployed URL. You can build and test the analytics dashboard in the preview using a static AWEBER_ACCESS_TOKEN, then update the deployed app to use the OAuth-refreshed tokens.
Build an AWeber analytics dashboard at /dashboard/email. Fetch list stats from GET /api/aweber/lists (call AWeber's accounts/{id}/lists endpoint). For each list, show: list name, total subscribers, new subscribers this month, unsubscribes this month. Fetch last 5 campaigns from GET /api/aweber/campaigns (call accounts/{id}/lists/{list_id}/messages). For each campaign: subject line, sent date, total sent, open rate (opens/sent), click rate (clicks/sent). Display with Recharts bar chart showing open rates. Add a status indicator: green if open rate > 20%, yellow if 10-20%, red if under 10% (industry benchmarks).
Paste this in Bolt.new chat
1// app/api/aweber/lists/route.ts2import { NextResponse } from 'next/server';3import { aweberRequest } from '@/lib/aweber';45export async function GET() {6 const accountId = process.env.AWEBER_ACCOUNT_ID;78 try {9 const data = await aweberRequest<{ entries: unknown[] }>(10 `accounts/${accountId}/lists`11 );12 return NextResponse.json(data);13 } catch (error) {14 console.error('AWeber lists fetch error:', error);15 return NextResponse.json({ error: 'Failed to fetch lists' }, { status: 500 });16 }17}1819// app/api/aweber/campaigns/route.ts20import { NextRequest, NextResponse } from 'next/server';21import { aweberRequest } from '@/lib/aweber';2223export async function GET(request: NextRequest) {24 const { searchParams } = new URL(request.url);25 const listId = searchParams.get('list_id') || process.env.AWEBER_LIST_ID;26 const accountId = process.env.AWEBER_ACCOUNT_ID;2728 try {29 const data = await aweberRequest(30 `accounts/${accountId}/lists/${listId}/messages?ws.size=10&ws.start=0`31 );32 return NextResponse.json(data);33 } catch (error) {34 return NextResponse.json({ error: 'Failed to fetch campaigns' }, { status: 500 });35 }36}Pro tip: AWeber's analytics API returns absolute counts (total opens, total clicks) not percentages — calculate open rate as (opens_total / total_sent * 100) in your API route before returning to the frontend to keep the calculation server-side.
Expected result: The analytics dashboard shows subscriber counts per list and campaign performance metrics. The open rate color coding quickly identifies which campaigns performed above or below industry average.
Common use cases
Email Capture Form with List Subscription
Add a newsletter signup form to your Bolt landing page that collects visitor emails and subscribes them to a specific AWeber list. On submission, the app calls an API route that authenticates with AWeber and creates or updates a subscriber profile — triggering any welcome email sequences configured in AWeber.
Create a newsletter signup form for my Bolt landing page. The form has an email field, optional first name field, and a Subscribe button. On submit, call POST /api/aweber/subscribe with { email, first_name }. The API route should POST to https://api.aweber.com/1.0/accounts/{AWEBER_ACCOUNT_ID}/lists/{AWEBER_LIST_ID}/subscribers with Authorization: Bearer ${AWEBER_ACCESS_TOKEN}. Use body: { email, name: first_name, ad_tracking: 'bolt-app', status: 'subscribed' }. Show a success message 'Check your inbox for confirmation!' on success. Add AWEBER_ACCESS_TOKEN, AWEBER_ACCOUNT_ID, AWEBER_LIST_ID to .env as placeholders.
Copy this prompt to try it in Bolt.new
Subscriber Tagging Based on In-App Actions
Tag AWeber subscribers based on actions they take in your Bolt app — purchased a plan, completed onboarding, used a specific feature. Tags trigger targeted email sequences in AWeber, enabling behavior-based email automation directly from your app's events.
Build a subscriber tagging integration with AWeber. When a user in my Bolt app completes a specific action (e.g., upgrades to Pro, downloads a resource, completes onboarding), call POST /api/aweber/tag with { email, tag }. The API route should: 1) Find the subscriber by email using GET https://api.aweber.com/1.0/accounts/{account_id}/lists/{list_id}/subscribers?ws.op=find&email={email}. 2) Add the tag using PATCH on the subscriber URL with { tags: { add: [tag] } }. Create tag constants: 'upgraded_to_pro', 'completed_onboarding', 'downloaded_guide'. Handle the case where the subscriber doesn't exist yet (subscribe them first, then tag).
Copy this prompt to try it in Bolt.new
Campaign Analytics Dashboard
Build an internal analytics dashboard in Bolt that shows AWeber campaign performance — subscriber count per list, recent campaign open rates, click rates, and unsubscribe trends. Gives your marketing team quick access to key metrics without opening AWeber's full interface.
Build an AWeber analytics dashboard. Create API routes that fetch: GET /api/aweber/lists — all email lists with subscriber counts using GET https://api.aweber.com/1.0/accounts/{account_id}/lists. GET /api/aweber/campaigns — recent 10 broadcasts with subject, send_date, total_sent, opens_total, clicks_total from the messages API. Display as: a list of lists with subscriber counts and growth badges, and a table of recent campaigns with open rate (opens_total/total_sent as percentage) and click rate. Add a Recharts bar chart showing open rates across the last 5 campaigns. Use AWEBER_ACCESS_TOKEN for auth.
Copy this prompt to try it in Bolt.new
Troubleshooting
AWeber API returns 401 Unauthorized after the initial setup works
Cause: AWeber access tokens expire after one hour. Without token refresh logic, requests fail after the initial token expires.
Solution: Implement the token refresh logic shown in lib/aweber.ts — before each API call, check if the token is within 5 minutes of expiry and refresh using the refresh token. Store the new access token in memory (module-level cache) so it persists across requests within the same server process.
1// Check expiry and refresh before API calls2if (!tokenCache || Date.now() > tokenCache.expiresAt - 300000) {3 // Refresh token using POST to https://auth.aweber.com/oauth2/token4 // with grant_type=refresh_token5}Subscriber creation fails with 'Subscriber already subscribed to this list'
Cause: AWeber raises an error when you attempt to subscribe an email that's already on the list with subscribed status.
Solution: Treat this error as success — the subscriber is already on the list, which is the desired state. Catch the error in your API route and check if the message contains 'already subscribed' before returning an error to the user.
1// Handle 'already subscribed' as success2catch (error) {3 const msg = String(error);4 if (msg.includes('already subscribed') || msg.includes('duplicate')) {5 return NextResponse.json({ success: true }); // Already subscribed is fine6 }7 throw error; // Re-throw other errors8}OAuth callback redirect URL mismatch error
Cause: The redirect_uri in the authorization URL doesn't exactly match the URL registered in your AWeber developer app, or you're testing with the WebContainer preview URL instead of a deployed URL.
Solution: The redirect URI must match exactly (including https vs http, trailing slashes, and path). Update your AWeber developer app's redirect URL to match your deployed domain. Remember that Bolt's WebContainer preview URL is dynamic and cannot be used as a stable OAuth redirect URI — deploy to Netlify or Bolt Cloud first.
Best practices
- Implement automatic token refresh using the refresh token — AWeber access tokens expire after 1 hour and manual rotation is impractical for production apps
- Treat 'already subscribed' AWeber errors as success responses — this provides a smooth user experience when visitors submit the form multiple times
- Use the ad_tracking field to label where each subscriber joined (e.g., 'blog-header', 'exit-popup', 'product-launch') — AWeber analytics show subscription source, helping you optimize form placement
- Never put AWeber OAuth tokens or client secrets in client-side code — always proxy AWeber API calls through server-side routes
- Test the AWeber subscription API route in Bolt's WebContainer preview during development — the outbound API calls work fine without deploying
- Register the OAuth callback URL with your deployed domain before testing user-facing authentication — the WebContainer's dynamic preview URL cannot be registered as a stable redirect URI
- Store subscriber tags in your own database alongside AWeber tags — having a local record makes it easier to re-tag subscribers if you ever switch email platforms
Alternatives
ConvertKit (now Kit) uses tag-based subscriber management preferred by creators and has a more modern API — better for content-driven businesses that segment audiences by interest tags.
Mailchimp has a larger ecosystem, more design templates, and a more accessible free tier for basic use cases — better for traditional list-based email newsletters.
GetResponse includes landing page builder and webinar features alongside email marketing — better for businesses that want an all-in-one marketing platform.
Constant Contact is better suited for small businesses and nonprofits with phone support and simpler tooling — AWeber is typically preferred by online content creators and bloggers.
Frequently asked questions
Can I use AWeber's API in Bolt's WebContainer preview?
Yes — outbound API calls to AWeber's REST API work fine in Bolt's WebContainer preview. You can test subscriber creation, list fetching, and campaign analytics during development using credentials stored in your .env file. The limitation is OAuth callback flows: if you need users to authorize your app through AWeber's login page, the callback URL must be a deployed, stable URL — not the WebContainer's dynamic preview URL.
Is AWeber free to use for API integrations?
AWeber's free plan supports up to 500 subscribers and includes full REST API access — there's no separate charge for using the API. Creating a developer app and obtaining OAuth credentials is also free. Paid plans start at $12.50/month for larger subscriber lists. The developer app creation at labs.aweber.com/apps requires an active AWeber account (free tier works).
Does AWeber support double opt-in confirmation emails?
Yes — AWeber has configurable double opt-in (DOI) settings per list. When DOI is enabled, subscribers added via the API receive a confirmation email and are only activated after clicking the confirmation link. The API creates the subscriber in 'unconfirmed' status until they confirm. This is the recommended setting for maintaining list quality and reducing spam complaints.
How do I get my AWeber Account ID and List ID?
Your Account ID appears in the URL when logged in to AWeber: app.aweber.com/accounts/{account_id}/. Your List ID is found in the AWeber Dashboard → List Options → List Settings → the URL contains the list ID. You can also fetch both via the API: GET https://api.aweber.com/1.0/accounts returns your account ID, and GET /1.0/accounts/{account_id}/lists returns all lists with their IDs.
Can I subscribe users without them receiving a confirmation email?
Yes — when creating a subscriber via the API, set status: 'subscribed' with the ad_tracking field. If your list has double opt-in disabled, subscribers are added as active immediately without a confirmation email. If double opt-in is enabled at the list level, the confirmation email sends regardless of the API status parameter. Check your list's opt-in settings in AWeber → List Options → Confirmation Message.
Talk to an Expert
Our team has built 600+ apps. Get personalized help with your project.
Book a free consultation