Cut your GetResponse bill by pruning contacts who never open

By General Input

Sort every GetResponse list by how recently people engaged, see which billing tier you are in, and safely tag, segment, or remove the dead weight.

Integrations

  • GetResponse
  • Google Sheets

Type

App

Categories

  • Marketing
  • Operations

Build me a list hygiene console for GetResponse so I can see exactly who I am paying for and never hearing from. The home screen lists every GetResponse campaign (contact list) using List Campaigns, with each row showing the list name, its current contact count, and when it was created. Get the per-list count by calling List Contacts scoped to that campaign and reading the TotalCount response header rather than downloading every contact, and use Get Campaign when I expand a row for its details. Cache the counts in app storage with a fetched-at timestamp and give me a refresh button, because counting a large account takes a while and I do not want to re-count on every page load.

A persistent sidebar shows my billing position: total contacts across all lists, which GetResponse contact tier that lands me in, how many contacts I would have to drop to fall back under the next threshold down, and the monthly saving that implies. Ship a default tier ladder of 1,000 contacts at $19/mo, 2,500 at $29/mo, and 10,000 at $79/mo, and make the ladder fully editable in settings so I can add bands or correct prices when my plan differs. Crossing a threshold by a single contact bumps the whole plan, so if I am 40 contacts over a boundary the sidebar should say so loudly, in the shape of "drop 40 contacts to fall back to the $19 band".

Clicking a list opens a bucket view that splits its contacts by engagement recency: active (engaged in the last 30 days), cooling (31 to 90 days), dormant (91 to 180 days), cold (beyond 180 days), and never engaged (no open or click on record). Important constraint: our GetResponse catalog has no campaign or newsletter statistics operation, so these buckets must be built from saved segments, not a stats endpoint. Use Create Segment to save a search-contacts segment whose conditions express each recency window for that campaign, then read the membership back with Get Contacts In Segment. Before creating anything, call List Segments and reuse a matching segment the app made earlier, and name them predictably (for example "hygiene: dormant 91-180 / <list name>") so they are recognizable inside GetResponse too. When a bucket row needs a precise last-touch date, fall back to Get Contact Activities for that contact and show the most recent open or click, but do that lazily for visible rows only rather than for the entire list.

Always exclude anyone added in the last 30 days from the prune buckets no matter how they score, and label the exclusion visibly, in the shape of "12 recent signups excluded". Default the dormant threshold to 180 days but make it configurable in settings alongside the other bucket boundaries, and when I change a boundary, rebuild the affected segments instead of reading back stale ones.

From any bucket I can select rows with checkboxes and act on the selection three ways. Tag for win-back: Update Contact on each selected contact to add a win-back tag, remembering that GetResponse has no PUT or PATCH (an update is a POST to the contact's ID), that contact IDs are alphanumeric tokens rather than numbers, and that custom field values are always arrays of strings even when single-valued. Save as segment: Create Segment from the current selection or the bucket's conditions so I can reuse it inside GetResponse later. Remove: Delete Contact on each selected contact.

Deletion has to be impossible to trigger by accident. Put it behind a confirmation dialog that names the list and the exact count, requires me to type a confirmation word before the button enables, and never styles removal as the default or primary action in a row menu. Show progress while the deletions run and a summary of successes and failures at the end. Every removal appends a row to a Google Sheets audit log with Append Values: timestamp, list name, contact email, contact ID, bucket, days since last engagement, and who ran the prune. Let me set the spreadsheet ID and tab in settings, and read the most recent rows back with Get Values so the app shows a recent-prune history panel next to the buckets.

Add a "plan my win-back" button on the dormant bucket that kicks off a background agent. The agent samples the dormant cohort, reads their history with Get Contact Activities to learn what those people actually opened and clicked back when they were engaged, looks for the themes, offers, and content types that used to land, then writes a three email win-back sequence outline: for each email a purpose, an angle, the key points to cover, a suggested gap before the next send, and three subject line options. It writes the result back into the app so I can read it on a win-back plans screen that keeps past plans with the list and date they were generated. The whole point is that I get to review the plan before anyone gets deleted, so surface a link to the latest plan from the dormant bucket header.

Practical notes for the build. GetResponse list reads paginate with ?page=N&perPage=M and cap at 1000 per page, so page through rather than assuming one call returns everything. Writes are queued and return 202 Accepted, so do not expect immediate read-after-write consistency; re-fetch counts after a prune rather than decrementing blindly. Rate limits are generous overall but tighter on batch contact operations, so throttle bulk deletes and show progress instead of firing everything at once. Nothing in this app runs on a schedule: it is a console I open when I want to check my contact count before a renewal.

Related prompts

Explore more prompts
Call overdue Xero customers with an AI collections agentLocal listing health board for every location you manageLet support send one-off Loops emails without an engineerStop cold emails to anyone with a live deal in PipedriveiMessage campaign console with pre-flight checks and delivery boardLinkedIn Ads budget pacing dashboard for every client accountFront desk appointment confirmation board for the next 3 daysGive your team Looker numbers without buying more seatsBuild audience segments from product usage and push to LoopsTurn the people who engage with your posts into Pipedrive leads