Start by separating the two bounce types, because they call for different responses. Permanent failures are addresses to delete. Temporary ones are full mailboxes and busy servers, and those addresses are usually fine.
Check that automatic suppression is actually switched on. Every established platform suppresses hard bounces by default, and the cases where it is not are almost always a custom integration writing directly to an API and bypassing the safety.
Verification is the one-off correction for data that already decayed. It finds the addresses that died since you last sent, which on a year-old business list can be a fifth of the file.
Collection is the permanent fix. A real-time check at the signup form, a typo suggestion when someone writes gmial.com, and a honeypot field to catch scripts together stop most bad addresses before they are stored.
Then watch the number by source rather than in total. One lead vendor bouncing at 12% inside an overall 3% is a contract conversation, and the average is exactly what conceals it.
From 6.1% to under 2%, step by step
Say your last campaign went to 40,000 addresses and 2,440 bounced, a rate of 6.1%. Of those, 2,000 were hard bounces and 440 were soft.
Step one costs nothing. Confirm those 2,000 are suppressed, and they can't bounce again. Your list is now 38,000. Step two is a verification run on what's left. Suppose it finds 1,500 more dead addresses that hadn't bounced yet, because they sat in a segment you mail less often. Remove them and you're at 36,500.
On the next send, the hard bounces can come only from recent job changes and from the unproven catch-all addresses you kept. If that's 250, your hard rate is 0.7%. Add a similar number of soft bounces to last time and the total lands near 1.9%. You'd be under the line after one cleanup, and the two steps took an afternoon.
Test your own safety nets before you trust them
Don't assume suppression works. Test it. Add an address you know is dead to a small test list and send to it twice, a day apart. After the first send it should show as bounced. On the second send your platform should skip it. If the second message goes out, something in your setup is bypassing the safety. It's often an API integration that re-adds contacts on every sync.
Give your signup form the same treatment. Type test@gmial.con into it and see what happens. A good form offers a correction or asks you to look again. Weak forms say thanks and store the address, and you've now found where your bad data comes from.
Look at imports last. Find out who in your company can upload a CSV straight into the email platform. Every one of those people can undo a cleanup in a single upload, so agree a rule that files get checked first.
Related questions
What is the fastest way to lower a bounce rate?
Verify the list before the next send and suppress everything invalid. That removes what has already died in a single pass.
How do I stop bad addresses entering?
Real-time verification at the form, a typo suggestion for common domain mistakes, and a honeypot field against scripts.
Should I remove unengaged subscribers too?
Yes, for placement rather than bounces. They do not bounce, and they drag down the engagement signal that decides the inbox.
What bounce rate should I aim for?
Under 2%. Above 5% providers begin treating the list as unmaintained.