Back to Blog
Tutorial14 min read

How to Filter Junk and Duplicate Calls in Pay-Per-Call Campaigns

Stop junk calls from eating your pay-per-call budget with these filters.

A home services buyer in Dallas paid $47 for a "qualified" call last Tuesday. The caller said three words — "wrong number, sorry" — and hung up at 94 seconds. Two seconds past the 90-second billing threshold. The call qualified. The buyer paid.

Same number called back four days later. Different tracking number, same campaign. Same three words. Another $47.

That's the junk call problem in pay-per-call. Not sophisticated fraud rings (though those exist too) — just garbage calls that slip past basic filters because nobody set up the filters right. I've watched buyers lose 15-25% of their monthly spend to calls that never had a chance of converting. Honestly, I've been that operator. Set a 30-second threshold once because I thought we were fast. We weren't fast. We were just paying for hang-ups.

The fix isn't hard. It's specific.

This tutorial walks through filtering junk calls at every layer: duplicate caller suppression, short-call billing thresholds, repeat-caller windows, and spam-score blocking. By the end, you'll have a filter stack that catches the obvious trash and flags the suspicious stuff for review. If you're also running paid search campaigns to drive calls, pair this with click fraud protection to stop fake traffic before it even dials.

Prerequisites

  • A call tracking or pay-per-call platform with conditional routing (VeloCalls, Ringba, CallRail, or similar)
  • Access to your IVR or call flow editor
  • Historical call data (at least 30 days) to set baseline thresholds
  • Basic familiarity with call duration billing and payout structures

Step 1: Set Short-Call Billing Thresholds

The minimum duration threshold is your first filter. Calls below this don't qualify for payout — they don't even enter your conversion funnel.

Standard thresholds by vertical:

VerticalTypical ThresholdWhy
HVAC / Plumbing emergency60-90 secondsHigh intent, quick qualification
Home services (general)90 secondsIndustry standard
Insurance120-180 secondsLonger qualification required
Legal intake180-240 secondsDetailed screening needed
Medicare180-240 secondsCompliance disclosures add time

How to find your number: Pull your last 90 days of calls. Filter to converted leads only. Sort by talk time ascending. What's the shortest call that actually converted? Set your threshold 15-20 seconds below that floor.

I know operators who set their threshold at 30 seconds because "we can qualify fast." They're wrong. Nobody — and I mean nobody — qualifies a real lead in 30 seconds. They're just paying for hang-ups and wrong numbers that lasted past half a minute. At 30 seconds, you're filtering nothing. I'd argue anything under 60 seconds is too permissive for most verticals, but your data should tell you.

In VeloCalls, you set this in the payout rules per buyer or per campaign. On Ringba, it's in the target settings under "Call Duration." CallRail handles it in their call scoring rules.

What you should see: After implementing, your "qualified but didn't convert" rate should drop. If it doesn't, your threshold is still too low. Tighten by 15-second increments until you see the garbage calls stop qualifying.

Step 2: Configure Duplicate Caller Suppression

Same phone number, multiple calls, multiple payouts. This is the most common junk pattern — and the easiest to fix.

Set a repeat-caller window. When a phone number calls twice within X days, the second call gets flagged or blocked. The window depends on your vertical:

  • Home services: 7-14 days. Someone shopping for HVAC quotes might call back after getting competitor pricing.
  • Insurance: 14-30 days. Policy shopping takes longer.
  • Legal: 30-60 days. Claimants sometimes call multiple times before retaining.
  • Medicare: 30 days during AEP. Shorter windows in off-cycle periods.

What to do with duplicates:

Option A: Block entirely. The call doesn't ring. Caller hears a message like "We've already received your inquiry" with a callback number. Aggressive, but stops abuse cold.

Option B: Route to low-priority queue. The call connects, but doesn't qualify for payout. Useful for catching legitimate callbacks without paying twice.

Option C: Flag for manual review. The call qualifies provisionally. Someone reviews before payout release. More work, but catches edge cases.

Most operators run Option B for the first call within the window and Option A for the third+ call. One callback might be legitimate. Five callbacks in a week? That's abuse.

Important caveat: Add a bypass for calls routed to the same buyer. If a homeowner calls back to confirm their appointment with the same plumber, that's not abuse — that's a warm lead checking in. Block duplicates across different buyers; allow them within the same buyer relationship.

Duplicate Rule:
IF caller_phone has called within 14 days
  AND previous_call routed to different buyer
  THEN flag as duplicate, route to review queue

IF caller_phone has called 3+ times within 14 days
  THEN block call, play "inquiry received" message

Step 3: Implement Spam-Score Blocking

Carrier-reported spam scores catch the obvious junk before it ever rings your buyers.

Most telephony providers (Twilio, Telnyx, Bandwidth) expose a spam likelihood score — typically 0-100, where higher means more likely to be spam. These scores come from carrier databases and crowd-sourced blocking apps. They're not perfect, but they catch the robocall numbers and known spam sources.

Setting your threshold:

Start at 70. Block calls scoring above 70. Monitor for two weeks.

Too many false positives? Legitimate callers getting blocked. Raise to 80.

Too much garbage still getting through? Lower to 60.

The tricky part: spam scores are inconsistent across carriers. A number scoring 85 on one carrier might score 40 on another. And VoIP-originated calls often don't have spam scores at all — the carriers can't track them the same way they track mobile numbers.

For VoIP calls specifically: Don't rely on spam scores. Instead, use these signals:

  • Call velocity (more than 3 calls from the same number in 24 hours)
  • Geographic mismatch (caller area code doesn't match the IP of the click that generated the call — if you have click attribution from ClickzProtect or JustAnalytics, you can cross-reference)
  • Caller behavior (zero DTMF input when IVR requires it, silence for 20+ seconds after connect)

In VeloCalls, spam-score filtering is configurable per routing rule. On Ringba, you'll need to pull spam scores via webhook and build conditional logic. CallRail doesn't expose carrier spam scores directly — you're limited to their internal spam detection, which is less granular.

Step 4: Build IVR-Based Pre-Qualification

Your IVR is a filter, not just a router. Use it to wash out junk before the call reaches a buyer.

Require DTMF input. "Press 1 to speak with a specialist." Bots and robodialers fail this. So do pocket dials. A caller who can't press a button probably isn't a qualified lead.

Add a zip code prompt. "Please enter your 5-digit zip code." This does double duty: filters non-engaged callers and gives you routing data. Spam calls won't enter a zip. Real callers will — typically in 8-12 seconds, though some fumble around for 20.

Ask an intent question. "Are you calling about a new project, or an existing service? Press 1 for new, press 2 for existing." Segment your traffic and filter out callers who are confused or non-intent.

IVR Flow:
1. "Press 1 to continue" — filters bots
2. "Enter your zip code" — filters non-engaged + enables geo-routing
3. "Press 1 for emergency service, 2 for quotes" — intent segmentation
4. Route to buyer based on zip + intent

The tradeoff: Every IVR step adds 10-15 seconds and drops 5-10% of callers. Three steps might lose 20% of your volume. But if that 20% was mostly junk anyway, your effective lead quality goes up.

Here's where I'll admit something annoying: I spent weeks building a five-step IVR that asked for zip, intent, homeownership, timeline, and budget. Felt thorough. Looked professional. Lost 45% of callers before they reached a human. Sometimes simpler is just... better.

Track your IVR abandonment rates per step. If step 2 (zip code) is losing 25% of callers, that step is either too slow or your traffic source is garbage. See our IVR abandonment rate study for benchmarks by vertical.

Step 5: Set Up Pattern Detection Rules

Beyond simple duplicates, look for behavioral patterns that signal abuse.

Call velocity spikes. A phone number that suddenly generates 10 calls in 24 hours — across your campaigns or to different tracking numbers — is almost certainly abuse. Set an alert at 5 calls per 24 hours per originating number.

Duration clustering. Calls that consistently end 2-5 seconds past your billing threshold are suspicious. Someone knows your threshold and is gaming it. Pull weekly reports of calls ending within 10 seconds of threshold and spot-check them.

After-hours anomalies. Legitimate home services calls are rare at 3am. Fraud calls aren't. If more than 5% of your volume comes between midnight and 5am local time — and your buyers are closed anyway — something's off with your traffic source. Look, I get that "24/7 emergency plumber" is a thing, but if your 3am calls never convert, they're not emergencies.

Silent connect patterns. Call connects, then silence for 30+ seconds. Either a dropped call (happens) or an intentional duration stuff (abuse). Flag calls with 30+ seconds of silence post-connect for manual review.

Pattern Rules:
IF same_number calls > 5 times in 24 hours
  THEN block + add to suppression list

IF call_duration between (threshold) and (threshold + 10 seconds)
  AND call_frequency from source > normal
  THEN flag for review

IF call_time between 00:00 and 05:00 local
  AND buyer.hours = closed
  THEN route to voicemail, do not qualify

Step 6: Configure Suppression Lists

Suppression lists are your long-term memory. Once you've identified a junk number, make sure it never costs you again.

Internal suppression list. Phone numbers you've flagged as fraudulent, abusive, or otherwise worthless. Auto-block or route to dead-end. Update daily based on your pattern detection alerts.

Industry-shared suppression. Some networks share fraud phone numbers across buyers. Ringba has their Trust Network; some affiliate networks maintain shared blocklists. If your platform supports it, opt in.

DNC integration. Different from junk filtering, but related. Numbers on the Do Not Call registry shouldn't be getting your calls anyway — TCPA compliance. See our TCPA one-to-one consent breakdown for the compliance layer. For automated outbound email sequences tied to your call campaigns, JustEmails handles deliverability and compliance.

Suppression list hygiene: Numbers rotate. A spam number today might be reassigned to a legitimate user in 18 months. Age off your suppression list entries after 12-18 months unless they've triggered multiple times. (This is annoying to maintain. Nobody wants to do it. Do it anyway.)

Common Errors and How to Fix Them

Error: Legitimate callbacks getting blocked

Cause: Duplicate suppression window too short, or no same-buyer bypass.

Fix: Lengthen the window (14 days → 30 days) and add logic that allows duplicates when the previous call routed to the same buyer. Real callbacks are usually to the same company.

Error: Spam-score blocking too aggressive

Cause: Threshold set too low, or carrier spam data unreliable for your traffic mix.

Fix: Raise threshold in 10-point increments. Monitor false positive rate by sampling blocked calls (some platforms let you log blocked call metadata without connecting). If a carrier's spam scores are consistently wrong, weight them lower or disable.

Error: IVR filtering losing too many real callers

Cause: Too many steps, or prompts are confusing.

Fix: Simplify to two steps max. Rewrite prompts to be shorter. Test the flow yourself — time how long it takes to get through. If it's over 25 seconds, trim.

Error: Pattern detection generating too many false alerts

Cause: Thresholds too tight for your actual traffic patterns.

Fix: Pull baseline data. What's the 95th percentile for call velocity from a single number in your campaigns? Set your alert 20% above that. Same for duration clustering — find your natural variance before calling something an anomaly.

Error: Suppression list not updating

Cause: Manual process, nobody owns it.

Fix: Automate. Pattern detection should auto-add numbers to suppression. Review queue should have a "block forever" button that adds to suppression with one click. If it's not automated, it won't happen.

Next Steps

You've got the junk filter stack in place. Here's where to go next.

Add source-level quality scoring. Some traffic sources are cleaner than others. Track junk call rate by source — publisher, affiliate, campaign. Cut sources running above 20% junk. For granular attribution on web-to-call traffic, tools like JustAnalytics can help correlate click sources to call outcomes. This one change often saves more than all the call-level filtering combined.

Implement real-time alerts. Don't wait for weekly reports to catch abuse patterns. Set up Slack or email alerts for velocity spikes, unusual after-hours volume, and suppression list triggers. Catch problems in hours, not weeks.

Layer on conversation intelligence. Short-call thresholds and IVR filtering catch obvious junk. Calls that connect, talk for 3 minutes, and still don't convert? Those are harder to catch — unless you're analyzing what was said. VeloCalls' AI conversation intelligence (transcription, sentiment analysis, call summaries at 4¢/min + 10¢/call for AI summary) surfaces these patterns. On other platforms, you'll need to build the integration to a third-party transcription service yourself. Which, frankly, is a pain.

Review your billing structure. If you're paying per call at a flat rate, every junk call costs the same as a converting lead. Per-minute billing (like VeloCalls' 4¢/min Managed or 2¢/min BYOC pricing) means junk calls that don't qualify cost you less — 90 seconds of silence at 4¢/min is $0.06, not $47. The billing model itself is a filter.

For more on call routing logic — geographic routing, time-zone awareness, after-hours fallback — see our caller location routing guide. And if click fraud is eating your budget before calls even arrive, ClickzProtect handles the paid search side.

Frequently Asked Questions

What's a good short-call billing threshold for pay-per-call?

For most verticals, 90 seconds is the standard minimum duration — it filters accidental dials and wrong numbers without excluding legitimate quick qualifications. High-intent verticals like plumbing emergencies can go as low as 60 seconds. Insurance and legal typically run 120-180 seconds because qualification takes longer. Test your threshold against historical data: pull calls that converted and check the shortest talk time among them, then set your floor 15-20 seconds below that.

How do I set up duplicate caller suppression?

Configure a repeat-caller window in your routing rules — typically 7-30 days depending on vertical. When the same phone number calls within that window, either block the call entirely, route it to a low-priority queue, or flag it for manual review. For legitimate callbacks (customer checking on a quote), add a bypass for calls routed to the same buyer. The goal is blocking abuse patterns, not annoying real prospects.

What spam-score blocking threshold should I use?

Start with blocking calls scoring above 70 on carrier-reported spam scores (most platforms use a 0-100 scale). Monitor for false positives for two weeks — if you're blocking legitimate callers, drop to 80. If you're still seeing obvious spam get through, tighten to 60. VoIP-originated calls need separate handling since they often lack carrier spam scores entirely; use call velocity and pattern matching instead.

Should I filter calls before or after they connect?

Both. Pre-connect filtering (blocking known spam numbers, VoIP detection, spam-score rejection) saves you from paying for garbage calls at all. Post-connect filtering (short-call thresholds, IVR dropoff, intent qualification) catches the calls that got through but shouldn't qualify for payout. Layer them — pre-connect catches the obvious abuse, post-connect catches the sophisticated abuse that looks legitimate until the conversation starts.


Try VeloCalls for Your Vertical

Pay-per-call routing platform built for HVAC, plumbing, roofing, PI lawyers, Medicare brokers, and insurance. Smart routing, real-time bidding, visual IVR builder, AI conversation intelligence. Per-minute pricing — Managed starts at 4¢/min, BYOC at 2¢/min, dropping to 2¢/min and 0.5¢/min respectively at Enterprise volume (200K+ lifetime minutes).

See pricing → · Book a demo

junk-call-filteringduplicate-caller-suppressionpay-per-callcall-fraud-detectionshort-call-billingbuildinpublicsaasstudioaiworkforcebuildwithclaude
Share

Ready to try VeloCalls?

Set up intelligent call tracking and routing in minutes. No credit card required.

Get Started Free

Stay Updated

Get the latest articles and industry insights delivered to your inbox.

No spam. Unsubscribe anytime.

Related Articles