# Cut your GetResponse bill by pruning contacts who never open

> 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.

- Workflow type: app
- Services: GetResponse, Google Sheets
- Categories: Marketing, Operations
- Published: 2026-08-22

## What it does

- Shows every GetResponse contact list with its current size, plus a running total across the whole account.
- Tells you which contact tier you are being billed in and how many contacts you would need to drop to fall back to the cheaper band below it.
- Splits any list into engagement buckets: active in the last 30 days, cooling, dormant, cold, and people who have never opened anything, with recent signups held back automatically.
- Lets you tag a selection for a win-back push, save it as a reusable segment, or remove it behind a typed confirmation, and writes every removal to a Google Sheets audit log.
- Adds a plan my win-back button that hands the dormant group to a background assistant, which studies what those people used to open and writes a three email win-back outline with subject line options.

## What you'll need

- A GetResponse account with the contact lists you want to clean up.
- A Google account and a spreadsheet to hold the record of everyone you remove.
- A view on how long someone can go quiet before you call them dormant. The app starts at 180 days and you can change it.

## Prompt

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.

## How to customize

- Move the dormant cutoff off its 180 day default, and adjust the cooling and cold ranges to match how often you actually send.
- Edit the contact tier ladder and prices in settings so the savings estimate matches the plan you are really on.
- Change the tag applied to win-back candidates, or point the removal log at a different spreadsheet and tab.

## FAQ

### Does removing contacts actually lower my GetResponse bill?

Yes. GetResponse prices by how many contacts you store, so falling below a tier threshold moves you into the cheaper band at your next renewal. That is why the sidebar shows exactly how many contacts stand between you and the band below, rather than just a total.

### Can I delete people by accident?

No. Removal only ever runs on rows you have ticked, it is never the default action on a row, and a confirmation dialog makes you type a confirmation word before the button will do anything. Anyone who joined in the last 30 days is held out of the prune buckets completely.

### What counts as dormant?

Out of the box, anyone with no open or click in the last 180 days. Contacts sit in five buckets: active in the last 30 days, cooling at 31 to 90 days, dormant at 91 to 180, cold beyond 180, and a separate bucket for people who have never engaged at all. Every boundary is editable.

### Do I have to remove anyone?

Not at all. Plenty of teams use it just to tag quiet contacts for a win-back campaign or to save a bucket as a segment they can mail separately. Removal is one option, not the point.

### How do I keep a record of what I pruned?

Every removal appends a row to a Google Sheet with the date, the list, the contact, which bucket they came from, and how long they had been quiet. The app also shows the most recent entries so you can see your last cleanup without leaving the screen.

Use this prompt in General Input: https://www.generalinput.com/prompts/cut-your-getresponse-bill-by-pruning-contacts-who-never-open