Skip to main content
RapidDev - Software Development Agency
lovable-integrationsEdge Function Integration

How to Integrate Lovable with GetResponse

To integrate GetResponse with Lovable, store your GetResponse API key in Cloud → Secrets and create an Edge Function that calls the GetResponse API v3. GetResponse's unique advantage is combining email marketing with built-in webinar hosting and landing page tools — unlike Constant Contact which focuses purely on email campaigns, GetResponse lets you add contacts to webinar registrations and email lists from the same Lovable integration.

What you'll learn

  • How to find your GetResponse API key and store it in Lovable Cloud → Secrets
  • How to create an Edge Function that adds contacts to a GetResponse list
  • How to register webinar attendees from a Lovable app using the GetResponse webinar API
  • How to retrieve GetResponse list IDs and webinar IDs for use in your Edge Function
  • When to choose GetResponse over Constant Contact or ConvertKit for webinar-based marketing funnels
Book a free consultation
4.9Clutch rating
600+Happy partners
17+Countries served
190+Team members
Intermediate16 min read30 minutesMarketingMarch 2026RapidDev Engineering Team
TL;DR

To integrate GetResponse with Lovable, store your GetResponse API key in Cloud → Secrets and create an Edge Function that calls the GetResponse API v3. GetResponse's unique advantage is combining email marketing with built-in webinar hosting and landing page tools — unlike Constant Contact which focuses purely on email campaigns, GetResponse lets you add contacts to webinar registrations and email lists from the same Lovable integration.

Connect Lovable to GetResponse for email marketing and webinar registration

GetResponse sits in an interesting position among email marketing platforms: it includes built-in webinar hosting as a core feature, not an add-on. If you are building a Lovable app that promotes and registers users for online events, masterclasses, or live Q&A sessions, GetResponse lets you handle the entire funnel — email list building, webinar registration, post-webinar follow-up — in one platform. Constant Contact is simpler but has no webinar capability. ConvertKit has strong creator tools but no webinars. GetResponse is the platform to choose when email and webinars need to be tightly integrated.

Lovable does not have a native GetResponse connector, so the integration runs through a server-side Edge Function. Your Lovable app captures contact information through a form, the Edge Function calls the GetResponse API to create the contact and optionally register them for a webinar, and GetResponse handles all subsequent email communication and webinar reminders. The API key never touches the browser — it stays in Cloud → Secrets and is accessed only from the Deno runtime.

GetResponse's API v3 uses a simple API key authentication model: every request includes an X-Auth-Token header with the value 'api-key your-api-key'. Lists in GetResponse are called 'campaigns' in the API (a legacy naming convention), and contacts are 'subscribers'. Understanding this terminology ahead of time prevents confusion when reading the API documentation. This guide walks through the complete setup, including how to find campaign IDs and webinar IDs from the GetResponse interface.

Integration method

Edge Function Integration

GetResponse has no native Lovable connector. Contact management, list operations, and webinar registration are all handled via a Lovable Edge Function that calls the GetResponse API v3. Your API key is stored in Cloud → Secrets and accessed via Deno.env.get(), keeping credentials server-side and preventing CORS errors from direct frontend API calls.

Prerequisites

  • A Lovable project with Lovable Cloud enabled (Edge Functions require Lovable Cloud)
  • A GetResponse account — free trial for 30 days with full API access (getresponse.com)
  • Your GetResponse API key (My Account → Integrations → API → Generate API key)
  • A GetResponse list (called a 'campaign' in the API) already created — note the list ID from the URL when viewing the list
  • If using webinar registration: a webinar created in GetResponse and its webinar ID (visible in the webinar URL)

Step-by-step guide

1

Generate your GetResponse API key and locate your list and webinar IDs

Before building the integration, gather three pieces of information from GetResponse: your API key, your list (campaign) ID, and optionally your webinar ID. To get your API key: log in to GetResponse and click your account name in the top-right corner. Go to My Account → Integrations → API. If you do not already have an API key, click 'Generate API Key'. Copy the key — it is a long alphanumeric string. This key provides full access to your GetResponse account via the API. To find your list ID: in GetResponse, go to Contacts → Lists. Click on the list you want to use. Look at the browser URL — the list ID appears as a string like 'abc123' in the URL path (e.g., /en/contacts/list/abc123). GetResponse list IDs are short alphanumeric strings, not UUIDs. Alternatively, you can call the GetResponse API endpoint GET https://api.getresponse.com/v3/campaigns to retrieve all your lists with their IDs. To find your webinar ID (if using webinar registration): in GetResponse, go to Webinars → My Webinars. Click on your webinar. The webinar ID appears in the URL as a string like 'xxxxxxxx'. Copy this ID — you will store it as a secret so you can change which webinar contacts are registered for without code changes. Note: GetResponse uses the word 'campaign' in the API to mean what the interface calls a 'list'. This is a legacy naming convention — whenever you see 'campaignId' in GetResponse API documentation, it refers to your email list ID, not an email campaign or broadcast.

Pro tip: GetResponse has a free 30-day trial that includes full API access including the webinar features. After the trial, webinars require the Plus plan or higher. The Basic plan includes email marketing and the API but not webinar hosting.

Expected result: You have your GetResponse API key, a list ID (8-12 character alphanumeric string from the list URL), and optionally a webinar ID ready to store as Lovable secrets.

2

Add GetResponse credentials to Lovable Cloud Secrets

Store your GetResponse credentials in Lovable's Cloud Secrets panel. In your Lovable project, click the '+' icon at the top of the editor to open the Cloud panel. Click the 'Secrets' tab and add the following secrets by clicking 'Add new secret' for each one. First secret — Name: GETRESPONSE_API_KEY, Value: your full GetResponse API key. This is used in the X-Auth-Token header as 'api-key {your-key}' for every API request. Second secret — Name: GETRESPONSE_LIST_ID, Value: the list (campaign) ID from the GetResponse URL (e.g., 'abc123'). This tells the API which list to add contacts to. Optional third secret — Name: GETRESPONSE_WEBINAR_ID, Value: your webinar ID if you plan to use webinar registration features. Storing this as a secret means you can change the active webinar without code changes. GetResponse's authentication header format is 'X-Auth-Token: api-key {your-api-key}' — note that it includes the literal text 'api-key' as a prefix before the actual key value. This is a non-standard format and is easy to get wrong. The Edge Function code in Step 3 handles this correctly, but if you are debugging raw API calls, make sure the header value is exactly 'api-key ' followed by your key with no extra spaces.

Pro tip: GetResponse also supports OAuth2 authentication for multi-account access scenarios, but for a single-account Lovable integration, API key authentication is simpler and sufficient. Stick with API keys unless you are building a multi-tenant SaaS where each customer has their own GetResponse account.

Expected result: GETRESPONSE_API_KEY and GETRESPONSE_LIST_ID (and optionally GETRESPONSE_WEBINAR_ID) appear in your Cloud → Secrets panel with values masked.

3

Create the GetResponse contact and webinar registration Edge Function

Create the Edge Function that adds contacts to GetResponse and optionally registers them for a webinar. The GetResponse API v3 uses POST https://api.getresponse.com/v3/contacts to create a new subscriber. The contact payload requires email and name fields, plus a campaign object containing the id of your list. The dayOfCycle field controls where the new contact enters your autoresponder sequence. A value of 0 means they start from the beginning (Day 0, the first message). If you have a 7-day sequence, setting dayOfCycle to 3 would start them at the Day 3 email. For most use cases, 0 is the correct value. For webinar registration, the GetResponse API endpoint is POST https://api.getresponse.com/v3/webinars/{webinar_id}/registrants. This requires the contact's email and name, and returns a registration confirmation with the webinar access URL. The Edge Function below handles both contact creation and webinar registration, with the webinar step being optional based on whether GETRESPONSE_WEBINAR_ID is configured. If the contact already exists in GetResponse (HTTP 409), the function handles it gracefully by returning a success response.

Lovable Prompt

Create an Edge Function called getresponse-subscribe at supabase/functions/getresponse-subscribe/index.ts. It should accept { email, firstName, lastName } and: 1) Add the contact to GetResponse using GETRESPONSE_API_KEY (X-Auth-Token: api-key KEY), GETRESPONSE_LIST_ID in the campaign.id field, set dayOfCycle to 0. 2) If GETRESPONSE_WEBINAR_ID exists in env, also register the contact as a webinar registrant. Handle 409 conflicts gracefully. Include CORS headers.

Paste this in Lovable chat

supabase/functions/getresponse-subscribe/index.ts
1import { serve } from 'https://deno.land/std@0.168.0/http/server.ts'
2
3const corsHeaders = {
4 'Access-Control-Allow-Origin': '*',
5 'Access-Control-Allow-Headers': 'authorization, x-client-info, apikey, content-type',
6}
7
8const BASE = 'https://api.getresponse.com/v3'
9
10serve(async (req) => {
11 if (req.method === 'OPTIONS') {
12 return new Response('ok', { headers: corsHeaders })
13 }
14
15 try {
16 const { email, firstName = '', lastName = '' } = await req.json()
17
18 const apiKey = Deno.env.get('GETRESPONSE_API_KEY')
19 const listId = Deno.env.get('GETRESPONSE_LIST_ID')
20 const webinarId = Deno.env.get('GETRESPONSE_WEBINAR_ID')
21
22 if (!apiKey || !listId) {
23 throw new Error('Missing required secrets: GETRESPONSE_API_KEY and GETRESPONSE_LIST_ID')
24 }
25 if (!email || !email.includes('@')) {
26 return new Response(
27 JSON.stringify({ error: 'A valid email address is required' }),
28 { status: 400, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
29 )
30 }
31
32 const authHeader = { 'X-Auth-Token': `api-key ${apiKey}`, 'Content-Type': 'application/json' }
33 const fullName = [firstName, lastName].filter(Boolean).join(' ') || email.split('@')[0]
34
35 // Step 1: Add contact to the list
36 const contactPayload = {
37 email,
38 name: fullName,
39 campaign: { campaignId: listId },
40 dayOfCycle: '0',
41 }
42
43 const contactRes = await fetch(`${BASE}/contacts`, {
44 method: 'POST',
45 headers: authHeader,
46 body: JSON.stringify(contactPayload),
47 })
48
49 let contactMessage = 'Contact added successfully'
50 if (!contactRes.ok) {
51 const contactError = await contactRes.json().catch(() => ({}))
52 // 409 = contact already exists
53 if (contactRes.status === 409) {
54 contactMessage = 'Contact already exists in list'
55 } else {
56 throw new Error(`GetResponse contact error ${contactRes.status}: ${JSON.stringify(contactError)}`)
57 }
58 }
59
60 // Step 2: Register for webinar (optional)
61 let webinarMessage = ''
62 if (webinarId) {
63 const webinarPayload = { email, name: fullName }
64 const webinarRes = await fetch(`${BASE}/webinars/${webinarId}/registrants`, {
65 method: 'POST',
66 headers: authHeader,
67 body: JSON.stringify(webinarPayload),
68 })
69 if (!webinarRes.ok) {
70 const webinarError = await webinarRes.json().catch(() => ({}))
71 // Log but don't fail the whole operation
72 console.error('Webinar registration error:', JSON.stringify(webinarError))
73 webinarMessage = 'Webinar registration failed — contact was still added to list'
74 } else {
75 const webinarData = await webinarRes.json()
76 webinarMessage = `Registered for webinar. Join URL: ${webinarData.joinUrl || 'see email'}`
77 }
78 }
79
80 return new Response(
81 JSON.stringify({
82 success: true,
83 contactMessage,
84 webinarMessage: webinarMessage || undefined,
85 }),
86 { headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
87 )
88 } catch (error) {
89 return new Response(
90 JSON.stringify({ error: error.message }),
91 { status: 500, headers: { ...corsHeaders, 'Content-Type': 'application/json' } }
92 )
93 }
94})

Pro tip: The dayOfCycle field in the GetResponse API must be a string, not a number — pass '0' not 0. Passing an integer causes a 400 validation error that can be confusing to debug.

Expected result: The getresponse-subscribe Edge Function is deployed. Test it by submitting your own email address — you should appear as a new contact in GetResponse → Contacts → All contacts within a few seconds, and receive a webinar registration email if GETRESPONSE_WEBINAR_ID is configured.

4

Build the webinar registration form in your Lovable frontend

With the Edge Function deployed, build the registration form in your Lovable app. A webinar registration form typically collects first name, last name, and email address — the minimum information needed for GetResponse's contact and webinar registrant records. The form should have a clear heading explaining what the webinar is about, the date and time, and what attendees will learn. After a successful registration, show a confirmation message that tells the user to check their email for the webinar access link. GetResponse automatically sends a confirmation email with the webinar join URL after registration. Consider adding a countdown timer or 'Add to Calendar' link to the success state so registered users are more likely to actually attend. These elements are pure React UI — they do not require any additional Edge Function calls. For maximum conversion, keep the form short (first name and email is often sufficient — you can collect last name later). The longer the form, the lower the registration rate. GetResponse's contact record can be updated later with additional fields if needed.

Lovable Prompt

Create a webinar registration page with a form collecting first name, email, and a 'Register Now' button. The page should show the webinar title, a brief description, and the upcoming date/time. When submitted, call the getresponse-subscribe Edge Function. Show a loading state and on success display 'You're registered! Check your email for the webinar link and add-to-calendar options.' Handle errors with a friendly retry message.

Paste this in Lovable chat

src/components/WebinarRegistration.tsx
1import { useState } from 'react'
2import { supabase } from '@/lib/supabase'
3import { Button } from '@/components/ui/button'
4import { Input } from '@/components/ui/input'
5import { Label } from '@/components/ui/label'
6import { toast } from '@/components/ui/use-toast'
7
8export const WebinarRegistration = () => {
9 const [email, setEmail] = useState('')
10 const [firstName, setFirstName] = useState('')
11 const [loading, setLoading] = useState(false)
12 const [registered, setRegistered] = useState(false)
13
14 const handleSubmit = async (e: React.FormEvent) => {
15 e.preventDefault()
16 setLoading(true)
17 try {
18 const { data, error } = await supabase.functions.invoke('getresponse-subscribe', {
19 body: { email, firstName },
20 })
21 if (error) throw error
22 setRegistered(true)
23 } catch (err) {
24 toast({
25 title: 'Registration failed',
26 description: 'Please check your details and try again.',
27 variant: 'destructive',
28 })
29 } finally {
30 setLoading(false)
31 }
32 }
33
34 if (registered) {
35 return (
36 <div className="text-center space-y-3 py-8">
37 <p className="text-2xl"> You're registered!</p>
38 <p className="text-muted-foreground">Check your inbox for the webinar access link and calendar invite.</p>
39 </div>
40 )
41 }
42
43 return (
44 <form onSubmit={handleSubmit} className="space-y-4 max-w-sm mx-auto">
45 <div>
46 <Label htmlFor="firstName">First Name *</Label>
47 <Input id="firstName" value={firstName} onChange={(e) => setFirstName(e.target.value)} placeholder="Your first name" required />
48 </div>
49 <div>
50 <Label htmlFor="email">Email *</Label>
51 <Input id="email" type="email" value={email} onChange={(e) => setEmail(e.target.value)} placeholder="you@example.com" required />
52 </div>
53 <Button type="submit" disabled={loading} className="w-full">
54 {loading ? 'Registering...' : 'Reserve My Spot'}
55 </Button>
56 </form>
57 )
58}

Pro tip: For complex multi-webinar Lovable apps where different pages register users for different webinars, RapidDev's team can help implement dynamic webinar routing that reads the active webinar ID from your Supabase database rather than a fixed secret.

Expected result: The registration form is live on your page. Submitting it adds the contact to GetResponse and (if configured) registers them for the webinar. The user receives a confirmation email from GetResponse with their webinar access link.

Common use cases

Register new users for a free webinar from a Lovable landing page

Build a webinar registration landing page in Lovable. When a visitor submits their details, the Edge Function adds them to a GetResponse contact list AND registers them for a specific webinar. GetResponse automatically sends webinar reminder emails, access links, and post-webinar follow-up sequences — all managed in GetResponse without additional code in your Lovable app.

Lovable Prompt

Create an Edge Function called getresponse-register that accepts { email, firstName, lastName } and does two things: 1) Adds the contact to my GetResponse list using GETRESPONSE_LIST_ID from secrets, and 2) Registers them for a webinar using GETRESPONSE_WEBINAR_ID from secrets. Use the X-Auth-Token: api-key {GETRESPONSE_API_KEY} header. Return success when both operations complete. Then add a webinar registration form to my landing page that calls this function.

Copy this prompt to try it in Lovable

Add newsletter subscribers to a GetResponse autoresponder sequence

Build a newsletter signup form in Lovable. When users subscribe, the Edge Function adds them to a GetResponse list that has an autoresponder sequence configured — a series of pre-written emails sent at intervals (Day 1: welcome, Day 3: tips, Day 7: case study). GetResponse manages the entire sequence delivery automatically after the contact is added to the list.

Lovable Prompt

Create an Edge Function that adds email subscribers to my GetResponse list GETRESPONSE_LIST_ID with their firstName and lastName. Set dayOfCycle to 0 so they start at the beginning of my autoresponder sequence. Use GET/GETRESPONSE_API_KEY for the X-Auth-Token header. Handle the case where the contact already exists. Return a success message or error details.

Copy this prompt to try it in Lovable

Sync Lovable app users to GetResponse for post-signup nurturing

When a user registers for your Lovable SaaS app via Supabase Auth, silently add them to a GetResponse list configured for user onboarding nurturing. GetResponse can send a series of educational emails about your product features, tips for getting value, and upgrade prompts — all automated once the contact is in the system. The integration happens in the background with no visible effect on the user's registration flow.

Lovable Prompt

After a user successfully creates an account in my Lovable app, call a getresponse-add-contact Edge Function in the background. Pass their email, first name, and a custom field 'signup_source' with value 'app'. Add them to GETRESPONSE_ONBOARDING_LIST_ID. If there is an error, log it but don't show it to the user — the signup should succeed regardless of whether the GetResponse call succeeds.

Copy this prompt to try it in Lovable

Troubleshooting

GetResponse API returns 401 with 'Invalid API key' message

Cause: The GETRESPONSE_API_KEY secret is incorrect, or the authentication header format is wrong. The header must be 'X-Auth-Token: api-key {key}' — including the literal text 'api-key ' as a prefix before the actual key value.

Solution: Go to Cloud → Secrets and verify GETRESPONSE_API_KEY contains just the API key string with no prefix. The Edge Function constructs the full header value as 'api-key ' + apiKey. Regenerate your API key in GetResponse → My Account → Integrations → API if needed, update the secret, and trigger a redeployment by asking Lovable to make a minor code change to the function.

Contact creation returns 400 with 'Campaign not found' error

Cause: The GETRESPONSE_LIST_ID contains the wrong list ID. GetResponse refers to lists as 'campaigns' in the API, and the list ID is the short alphanumeric string from the list URL, not the list's display name.

Solution: In GetResponse, navigate to Contacts → Lists and click on your target list. Copy the ID from the browser URL bar — it appears as a short string like 'abc123' in the URL path. Update GETRESPONSE_LIST_ID in Cloud → Secrets with this exact string. You can also use the API endpoint GET https://api.getresponse.com/v3/campaigns with your API key to list all available campaigns and verify the correct ID.

Contacts are added but dayOfCycle error appears — contacts do not enter the autoresponder

Cause: The dayOfCycle field was passed as an integer (e.g., 0) instead of a string (e.g., '0'). GetResponse's v3 API strictly requires dayOfCycle to be a string representation of the day number.

Solution: Update the Edge Function to ensure dayOfCycle is always passed as a string: dayOfCycle: '0'. If you have custom day values, convert them: dayOfCycle: String(dayNumber). The code in Step 3 already handles this correctly with the quoted '0' value.

typescript
1// Wrong:
2campaign: { campaignId: listId },
3dayOfCycle: 0,
4
5// Correct:
6campaign: { campaignId: listId },
7dayOfCycle: '0',

Webinar registration returns 404 even though the webinar exists in the GetResponse dashboard

Cause: The GETRESPONSE_WEBINAR_ID is incorrect, refers to an archived or deleted webinar, or the GetResponse account does not have access to the webinar API (requires Plus plan or higher).

Solution: Verify the webinar ID by navigating to the webinar in GetResponse and copying the ID from the URL. Also confirm the webinar is in an active or upcoming state — GetResponse may not allow registrations for completed webinars via the API. If you are on the Basic plan, webinar features require upgrading to Plus or higher.

Best practices

  • Store GETRESPONSE_WEBINAR_ID as a secret rather than hardcoding it, so you can update the active webinar for each new event by changing a single secret value without code changes.
  • Always pass dayOfCycle as a string ('0') not an integer — the GetResponse v3 API strictly validates this field type and returns a confusing 400 error if an integer is passed.
  • Make webinar registration a non-blocking fallback in your Edge Function — if the webinar registration API call fails, still add the contact to the email list and log the error, so list growth continues even if the webinar API has issues.
  • Use GetResponse's autoresponder sequence (dayOfCycle: '0') for automated onboarding rather than building complex conditional logic in your Edge Function — let GetResponse handle the nurture timing.
  • Test with your own email address end-to-end before going live — verify you receive both the GetResponse confirmation email and the webinar access link, and that you appear in the correct list in GetResponse.
  • Handle the 409 'contact already exists' response gracefully in your UI — returning a success message for existing contacts prevents a frustrating experience for users who register multiple times.
  • Review your GetResponse account's sending limit based on your plan tier before launching high-traffic registration campaigns — the API will add contacts but email delivery may queue if you exceed plan limits.

Alternatives

Frequently asked questions

Does GetResponse's free trial include the webinar API?

GetResponse's free 30-day trial includes all features including webinars and the full API. After the trial, webinar hosting requires the Plus plan (starting at around $49/month). The Email Marketing and Marketing Automation plans include the contacts API and email features but not webinars. If webinar registration is core to your Lovable app, factor in the Plus plan cost when planning your infrastructure.

Why does GetResponse call lists 'campaigns' in the API?

This is a legacy naming convention from GetResponse's earlier product versions. In the GetResponse interface, what you see as 'Lists' are called 'campaigns' in the API with the parameter name 'campaignId'. When you browse the API documentation or make API calls, remember that campaignId always refers to your email list ID, not an email blast or broadcast campaign. The list ID is the short alphanumeric string visible in the URL when you view a list in the GetResponse interface.

Can I create GetResponse landing pages or forms from the Lovable integration?

The GetResponse API v3 includes endpoints for managing landing pages and forms, but for a Lovable integration, it's more practical to build your forms and landing pages directly in Lovable (which is better at UI generation) and use the Edge Function only for the data synchronization to GetResponse. GetResponse landing pages are most useful as standalone pages hosted on GetResponse's infrastructure, independent of your Lovable app.

How do I handle users who register but don't attend the webinar?

GetResponse automatically sends reminder emails before the webinar and follow-up emails after — configure these in GetResponse's webinar settings rather than in your Lovable app. For post-webinar follow-up based on attendance, GetResponse provides attendance data in the Webinars analytics dashboard. If you want to trigger different email sequences for attendees vs. no-shows, this is best managed using GetResponse's built-in automation rules rather than additional Lovable integration code.

What is the difference between the GetResponse API and the Constant Contact API for adding contacts?

Both integrate via Edge Functions with API key authentication, but the request format differs. GetResponse requires contacts to reference a campaign (list) by its short alphanumeric ID and uses a campaign object in the payload. Constant Contact uses UUID list IDs in a list_memberships array. GetResponse also uses the non-standard X-Auth-Token header format, while Constant Contact uses standard Bearer token authentication. Functionally, both accomplish the same goal for a Lovable app.

RapidDev

Talk to an Expert

Our team has built 600+ apps. Get personalized help with your project.

Book a free consultation

Need help with your project?

Our experts have built 600+ apps and can accelerate your development. Book a free consultation — no strings attached.

Book a free consultation

We put the rapid in RapidDev

Need a dedicated strategic tech and growth partner? Discover what RapidDev can do for your business! Book a call with our team to schedule a free, no-obligation consultation. We'll discuss your project and provide a custom quote at no cost.