copywriting
Marketing copy for homepages, landing pages, pricing pages, and other conversion-focused web pages.
discovery-specialist
Contact discovery specialist - handles contact classification, email verification, GDPR compliance, and opportunity enrichment.
Full skill instructions
Technical specialist for contact discovery and enrichment in totalaud.io.
Help Scout Mode deliver accurate, GDPR-compliant contact information for music industry opportunities.
apps/aud-web/src/lib/discovery/contactClassifier.ts - B2B/B2C classificationapps/aud-web/src/lib/discovery/emailVerifier.ts - Email validationapps/aud-web/src/lib/discovery/suppressionService.ts - GDPR suppressionapps/aud-web/src/lib/discovery/domainPatterns.ts - Domain matchingDistinguish B2B (legitimate business contacts) from B2C (personal contacts):
interface ClassificationResult {
type: 'B2B' | 'B2C' | 'UNKNOWN'
confidence: number // 0-100
signals: Signal[]
reasoning: string
}
// B2B Signals (increase score)
const b2bSignals = [
'info@', 'press@', 'music@', 'submissions@', // Role-based
'bbc.co.uk', 'spotify.com', // Known industry
'Company page', 'Business account', // Platform indicators
'playlist curator', 'A&R', 'radio DJ' // Job titles
]
// B2C Signals (decrease score)
const b2cSignals = [
'gmail.com', 'hotmail.com', 'yahoo.com', // Personal email
'Personal account', 'Fan account', // Platform indicators
'listener', 'music lover' // Personal descriptors
]
interface VerificationResult {
isValid: boolean
deliverable: boolean
reason?: 'invalid_format' | 'domain_not_found' | 'mailbox_not_found'
confidence: number
}
async function verifyEmail(email: string): Promise<VerificationResult> {
// Format check
if (!isValidEmailFormat(email)) {
return { isValid: false, deliverable: false, reason: 'invalid_format', confidence: 100 }
}
// Domain check (MX records)
const hasMX = await checkMXRecords(email.split('@')[1])
if (!hasMX) {
return { isValid: false, deliverable: false, reason: 'domain_not_found', confidence: 90 }
}
// Additional verification via API if available
return { isValid: true, deliverable: true, confidence: 80 }
}
// Music industry domains by category
const domainPatterns = {
radio: [
/bbc\.co\.uk/,
/radiox\.co\.uk/,
/capitalfm\.com/,
/absoluteradio\.co\.uk/
],
streaming: [
/spotify\.com/,
/apple\.com/,
/deezer\.com/,
/tidal\.com/
],
press: [
/nme\.com/,
/diymagazine\.com/,
/clashmusic\.com/,
/thefader\.com/
],
blogs: [
/earmilk\.com/,
/thissongissick\.com/,
/hypem\.com/
],
pr: [
/libertymusic\.co\.uk/,
/musicgateway\.com/
]
}
function categoriseDomain(domain: string): string | null {
for (const [category, patterns] of Object.entries(domainPatterns)) {
if (patterns.some(p => p.test(domain))) {
return category
}
}
return null
}
import { createHash } from 'crypto'
class SuppressionService {
private suppressedHashes: Set<string>
// Hash email for privacy-preserving suppression
private hashEmail(email: string): string {
return createHash('sha256')
.update(email.toLowerCase().trim())
.digest('hex')
}
async isSupressed(email: string): Promise<boolean> {
const hash = this.hashEmail(email)
return this.suppressedHashes.has(hash)
}
async addToSuppression(email: string, reason: string): Promise<void> {
const hash = this.hashEmail(email)
this.suppressedHashes.add(hash)
// Log for audit trail (without PII)
await logSuppressionEvent(hash, reason)
}
}
interface OpportunityScore {
overall: number // 0-100
contactQuality: number
relevance: number
freshness: number
signals: string[]
}
function scoreOpportunity(opp: Opportunity, artist: Artist): OpportunityScore {
let contactQuality = 50
// Email verification
if (opp.emailVerified) contactQuality += 30
if (opp.emailType === 'role-based') contactQuality += 10
if (opp.lastContacted && daysSince(opp.lastContacted) < 30) contactQuality += 10
// Relevance scoring
const relevance = calculateRelevance(opp, artist)
// Freshness
const freshness = opp.lastVerified
? Math.max(0, 100 - daysSince(opp.lastVerified))
: 50
return {
overall: (contactQuality + relevance + freshness) / 3,
contactQuality,
relevance,
freshness,
signals: collectSignals(opp)
}
}
Marketing copy for homepages, landing pages, pricing pages, and other conversion-focused web pages.
Fast image generation with Flux 2 Klein, optimized for sub-second iteration and multi-reference brand styling.
Psychological principles and mental models for understanding customer behavior and influencing marketing decisions.
Plan searchable and shareable content that drives traffic, builds authority, and generates leads.
Build SEO-optimized pages at scale using templates, data, and proven playbook patterns.
Brainstorm and prioritize marketing strategies tailored to your SaaS stage, budget, and goals.
Optimize content for discovery, citation, and visibility across AI search platforms and LLM assistants.
Systematic improvement of existing marketing copy through seven focused editing passes.
Plan and optimize your website's page hierarchy, navigation, URL structure, and internal linking.
Design and optimize systems connecting marketing, sales, and customer success into a unified revenue engine.
Applies Anthropic's official brand colors and typography to any sort of artifact that may benefit from having Anthropic's look-and-feel. Use it when brand colors or style guidelines, visual formatting, or company design standards apply.
Convert websites into professional HyperFrames videos with guided storyboarding and brand-aligned composition.
Revolutionize Video Creation with AI-Generated Avatars and Voices
Social media on autopilot
Design custom logos instantly with AI.
Text-heavy marketing and design images
Boost Your SEO with Content and SEO Silos
Revolutionize Your Marketing with AI-Powered MarketingBlocks!
10X faster & free AI content creation for 100+ use cases
Tribescaler | Make Your Tweets Go Viral