This recipe transforms raw retail distress signals (inventory anomalies, job posting patterns, SEC filing keywords, satellite data) into enriched company profiles with verified decision-maker contacts. The output is a structured database mapping each detected signal to a specific company, its firmographic profile, and the 2-3 people most likely to authorize a purchase — ready for outreach sequence loading. [src3, src5]
signal-library/retail/detection-rules/2026 — Retail Detection RulesWhich path?
├── Budget = free tier only
│ └── PATH A: Free — Apollo.io free (50 credits) + Hunter.io free (50 verifications)
├── Budget = up to $200/month AND region = US only
│ └── PATH B: Paid US — Apollo.io Basic ($49) + Hunter.io Starter ($49) + LinkedIn Sales Nav ($99)
├── Budget = up to $200/month AND region includes EU
│ └── PATH C: Paid EU-Compliant — Apollo.io Basic ($49) + Dropcontact ($24) + Hunter.io Starter ($49)
└── Budget = $500+/month (enterprise)
└── PATH D: Enterprise — Apollo.io Professional ($99) + LinkedIn Sales Nav ($99) + Dropcontact ($96) + Hunter.io Growth ($99)
| Path | Tools | Cost | Speed (50 companies) | Output Quality |
|---|---|---|---|---|
| A: Free | Apollo.io free + Hunter.io free | $0 | 2-3 hours | Basic — 50 credits limits depth, ~60% email coverage |
| B: Paid US | Apollo.io + Hunter.io + LinkedIn | $197/mo | 30-45 min | High — full firmographic + verified contacts, US-optimized |
| C: Paid EU | Apollo.io + Dropcontact + Hunter.io | $122/mo | 45-60 min | High — GDPR-compliant EU contacts, full firmographic |
| D: Enterprise | Full stack | $393/mo | 20-30 min | Excellent — multi-source verification, deepest coverage |
Duration: 10-15 minutes per 50 signals · Tool: Python/Node.js script + signal source data
Resolve raw signal data to specific company identities. Each signal type produces different identifiers that must be mapped to a canonical company record.
Verify: Each resolved company has a company_name and either a domain or CIK identifier. Resolution confidence > 0.80 for all entries. · If failed: For signals with confidence < 0.80, run manual lookup via Apollo.io company search using company name + location.
Duration: 10-15 minutes per 50 companies · Tool: Apollo.io API
Rate limit: Free tier: 10 req/min. Paid tier: 100 req/min. Sleep 1s between requests on free tier.
Enrich resolved companies using Apollo.io organization enrichment endpoint. Use domain enrichment (highest accuracy) when domain is available, fall back to name search otherwise.
Fields to capture: company_name, domain, HQ location (city/state/country), employee_count, annual_revenue_estimate, industry, LinkedIn URL, phone.
Verify: > 80% of companies have employee_count and annual_revenue_estimate populated. Domain field populated for > 90%. · If failed: If Apollo.io returns sparse data (< 60% field coverage), supplement with Clearbit Enrichment API as secondary source.
Duration: 5-10 minutes per 50 companies · Tool: Apollo.io technographics + manual web research
Augment firmographic data with retail-specific fields not available from standard enrichment APIs:
Verify: At least 3 of 5 retail-specific fields populated per company. · If failed: Flag companies with < 3 fields for manual research using SEC 10-K, SimilarWeb, and BuiltWith.
Duration: 10-15 minutes per 50 companies · Tool: Apollo.io people search + LinkedIn Sales Navigator
Identify 2-3 decision-makers per company based on the signal type that triggered enrichment:
| Signal Type | P1 Targets (Primary) | P2 Targets (Secondary) |
|---|---|---|
| Inventory / Supply Chain | VP Supply Chain, Chief Merchandising Officer | COO |
| Digital Transformation | CTO, VP Digital, Head of Ecommerce | CMO |
| AI Readiness | Chief Data Officer, VP Analytics, CTO | Chief Digital Officer |
| Store Operations | COO, VP Retail Operations | CFO, VP Real Estate |
| Mixed / Compound | COO, CTO, Chief Digital Officer | CFO, CEO |
Search Apollo.io with organization domain + person titles + seniority filter (VP, C-suite, Director). [src5]
Verify: At least 1 P1 contact identified for > 75% of companies. All contacts are Director-level or above. · If failed: Use LinkedIn Sales Navigator manual search for gap companies: filter by company + seniority (VP+) + function.
Duration: 5-10 minutes per 50 contacts · Tool: Hunter.io (US contacts) + Dropcontact (EU contacts)
Rate limit: Hunter.io: 10 verifications/second on paid plans.
Verify all email addresses before adding to final output. Use Hunter.io for US contacts and Dropcontact for EU contacts (GDPR compliance). [src6]
Verify: Email verification rate > 75% (verified emails / total emails attempted). No disposable or webmail addresses in final list. · If failed: If verification rate < 60%, enrichment source data may be stale. Re-run Step 4 with LinkedIn Sales Navigator as primary source.
Duration: 5 minutes · Tool: Python script
Generate final enriched company profiles and decision-maker contact list in structured format.
Output files:
enriched_companies_{timestamp}.json — Full firmographic profiles with retail-specific fields, sorted by signal scoredecision_makers_{timestamp}.csv — Verified contacts with role, email, LinkedIn, priority tier, signal relevance{
"output_type": "enriched_retail_signal",
"format": "JSON + CSV",
"company_columns": [
{"name": "company_name", "type": "string", "required": true},
{"name": "domain", "type": "string", "required": true},
{"name": "hq_country", "type": "string", "required": true},
{"name": "employee_count", "type": "number", "required": true},
{"name": "annual_revenue_estimate", "type": "string", "required": true},
{"name": "store_count", "type": "number", "required": false},
{"name": "ecommerce_presence", "type": "object", "required": false},
{"name": "primary_retail_category", "type": "string", "required": true},
{"name": "tech_stack_signals", "type": "array", "required": false},
{"name": "current_vendors_inferred", "type": "array", "required": false}
],
"contact_columns": [
{"name": "full_name", "type": "string", "required": true},
{"name": "title", "type": "string", "required": true},
{"name": "email", "type": "string", "required": false},
{"name": "email_verified", "type": "boolean", "required": true},
{"name": "linkedin_url", "type": "string", "required": false},
{"name": "priority", "type": "string", "required": true},
{"name": "signal_relevance", "type": "string", "required": true}
],
"expected_row_count": "100-150 contacts for 50 companies",
"sort_order": "priority ascending, then company_name",
"deduplication_key": "email OR linkedin_url"
}
| Quality Metric | Minimum Acceptable | Good | Excellent |
|---|---|---|---|
| Company resolution rate | > 70% of signals resolved | > 85% resolved | > 95% resolved |
| Firmographic completeness | > 60% fields populated | > 80% populated | > 90% populated |
| Email verification rate | > 65% verified | > 80% verified | > 90% verified |
| P1 contact coverage | > 60% of companies have P1 | > 75% have P1 | > 90% have P1 |
| Duplicate rate | < 5% | < 2% | < 0.5% |
| Director+ title accuracy | > 85% at Director+ level | > 90% | > 98% |
If below minimum: Re-run Step 2 with Clearbit as secondary enrichment source. If P1 contact coverage is low, supplement with LinkedIn Sales Navigator manual search for gap companies.
| Error | Likely Cause | Recovery Action |
|---|---|---|
| Apollo.io 429 (rate limit) | Too many requests in time window | Wait 60 seconds, reduce batch size to 5 per minute on free tier |
| Apollo.io 401 (auth failed) | API key expired or invalid | Regenerate API key at apollo.io/settings, update config |
| Hunter.io returns "accept_all" | Company mail server accepts all addresses | Treat as unverified — use LinkedIn as primary channel |
| Empty Apollo.io results | Company too small or not in database | Try Clearbit enrichment, or manual LinkedIn company search |
| GDPR region detected, non-compliant tool | EU company routed through Apollo.io | Re-route EU contacts through Dropcontact pipeline |
| Duplicate contacts across companies | Same person at multiple subsidiaries | Deduplicate by email + LinkedIn URL; keep parent company record |
| SEC CIK lookup returns no match | Company is private or different filing entity | Fall back to company name fuzzy match + domain enrichment |
| Component | Free Tier | Paid Tier | At Scale (500 companies) |
|---|---|---|---|
| Company enrichment (Apollo.io) | 50 credits/mo (50 companies) | $49/mo = 500 credits | $99/mo = 2000 credits |
| People search (Apollo.io) | Included in credits | Included | Included |
| Email verification (Hunter.io) | 50 verifications/mo | $49/mo = 1000 verifications | $99/mo = 5000 verifications |
| LinkedIn Sales Navigator | N/A | $99/mo | $99/mo |
| EU contacts (Dropcontact) | N/A | $24/mo = 1000 contacts | $96/mo = 5000 contacts |
| Total for 50 companies | $0 | $147-$221/mo | $393/mo |
Sending raw signal data (lat/lon coordinates, SEC CIK numbers, job posting URLs) directly to enrichment APIs without first resolving to a canonical company identity. Result: duplicate records, mismatched firmographics, and wasted API credits when the same company appears via multiple signal types under different identifiers. [src5]
Always run Step 1 (Company Resolution) first to create a deduplicated company list with canonical identifiers. Then enrich once per company, not once per signal.
Loading unverified email addresses directly into outreach sequences. Result: 15-25% bounce rate, sender domain reputation damage, potential blacklisting by ESPs, and all future emails routed to spam. [src6]
Run all emails through Hunter.io or equivalent verification. Remove emails scoring below 85% confidence. For contacts with no verified email, use LinkedIn InMail or connection request as fallback channel.
Using the same decision-maker titles regardless of signal type. Sending supply chain distress signals to the CTO, or AI readiness signals to the VP Supply Chain. Result: irrelevant outreach, low response rates, and wasted contacts. [src3]
Use the signal-type-to-role mapping table (Step 4) to route each signal type to the correct decision-maker function. Inventory signals go to VP Supply Chain (P1) and COO (P2). Digital transformation signals go to CTO and VP Digital (P1) and CMO (P2).
Use this recipe when raw retail distress signals have been detected and scored but have not yet been mapped to specific companies and contacts. This is the bridge between signal detection (upstream) and outreach execution (downstream). Without enrichment mapping, detected signals remain abstract market intelligence rather than actionable sales opportunities.