# tinoho/sdr_agent.py — personalize outbound at scale import anthropic from typing import List from tinoho.icp import score_lead, ICP_PROFILE client = anthropic.Anthropic() def personalize_outreach(lead: Lead, signals: List[Signal]) -> str: """Generate a hyper-personalized first touch.""" system = ( "You are an SDR for a fractional CRO consultancy. " "Reference the prospect's recent funding, hiring " "signals, and tech stack. Keep under 90 words." ) response = client.messages.create( model="claude-sonnet-4-6", max_tokens=400, system=system, messages=[{ "role": "user", "content": f"Lead: {lead.json()}" }] ) return response.content[0].text # Score lead fit before queueing email for lead in apollo.fetch_new_leads(limit=250): score = score_lead(lead, ICP_PROFILE) if score >= 0.78: msg = personalize_outreach(lead, lead.signals) apollo.sequences.enroll( sequence_id="seq_outbound_v3", contact_id=lead.id, opener=msg, ) hubspot.contacts.update(lead.id, { "hs_lead_status": "sdr_engaged", "fit_score": score, }) # tinoho/sdr_agent.py — personalize outbound at scale import anthropic from typing import List from tinoho.icp import score_lead, ICP_PROFILE client = anthropic.Anthropic() def personalize_outreach(lead: Lead, signals: List[Signal]) -> str: """Generate a hyper-personalized first touch.""" system = ( "You are an SDR for a fractional CRO consultancy. " "Reference the prospect's recent funding, hiring " "signals, and tech stack. Keep under 90 words." ) response = client.messages.create( model="claude-sonnet-4-6", max_tokens=400, system=system, messages=[{ "role": "user", "content": f"Lead: {lead.json()}" }] ) return response.content[0].text # Score lead fit before queueing email for lead in apollo.fetch_new_leads(limit=250): score = score_lead(lead, ICP_PROFILE) if score >= 0.78: msg = personalize_outreach(lead, lead.signals) apollo.sequences.enroll( sequence_id="seq_outbound_v3", contact_id=lead.id, opener=msg, ) hubspot.contacts.update(lead.id, { "hs_lead_status": "sdr_engaged", "fit_score": score, }) # tinoho/sdr_agent.py — personalize outbound at scale import anthropic from typing import List from tinoho.icp import score_lead, ICP_PROFILE client = anthropic.Anthropic() def personalize_outreach(lead: Lead, signals: List[Signal]) -> str: """Generate a hyper-personalized first touch.""" system = ( "You are an SDR for a fractional CRO consultancy. " "Reference the prospect's recent funding, hiring " "signals, and tech stack. Keep under 90 words." ) response = client.messages.create( model="claude-sonnet-4-6", max_tokens=400, system=system, messages=[{ "role": "user", "content": f"Lead: {lead.json()}" }] ) return response.content[0].text # Score lead fit before queueing email for lead in apollo.fetch_new_leads(limit=250): score = score_lead(lead, ICP_PROFILE) if score >= 0.78: msg = personalize_outreach(lead, lead.signals) apollo.sequences.enroll( sequence_id="seq_outbound_v3", contact_id=lead.id, opener=msg, ) hubspot.contacts.update(lead.id, { "hs_lead_status": "sdr_engaged", "fit_score": score, }) # tinoho/sdr_agent.py — personalize outbound at scale import anthropic from typing import List from tinoho.icp import score_lead, ICP_PROFILE client = anthropic.Anthropic() def personalize_outreach(lead: Lead, signals: List[Signal]) -> str: """Generate a hyper-personalized first touch.""" system = ( "You are an SDR for a fractional CRO consultancy. " "Reference the prospect's recent funding, hiring " "signals, and tech stack. Keep under 90 words." ) response = client.messages.create( model="claude-sonnet-4-6", max_tokens=400, system=system, messages=[{ "role": "user", "content": f"Lead: {lead.json()}" }] ) return response.content[0].text # Score lead fit before queueing email for lead in apollo.fetch_new_leads(limit=250): score = score_lead(lead, ICP_PROFILE) if score >= 0.78: msg = personalize_outreach(lead, lead.signals) apollo.sequences.enroll( sequence_id="seq_outbound_v3", contact_id=lead.id, opener=msg, ) hubspot.contacts.update(lead.id, { "hs_lead_status": "sdr_engaged", "fit_score": score, }) # tinoho/sdr_agent.py — personalize outbound at scale import anthropic from typing import List from tinoho.icp import score_lead, ICP_PROFILE client = anthropic.Anthropic() def personalize_outreach(lead: Lead, signals: List[Signal]) -> str: """Generate a hyper-personalized first touch.""" system = ( "You are an SDR for a fractional CRO consultancy. " "Reference the prospect's recent funding, hiring " "signals, and tech stack. Keep under 90 words." ) response = client.messages.create( model="claude-sonnet-4-6", max_tokens=400, system=system, messages=[{ "role": "user", "content": f"Lead: {lead.json()}" }] ) return response.content[0].text # Score lead fit before queueing email for lead in apollo.fetch_new_leads(limit=250): score = score_lead(lead, ICP_PROFILE) if score >= 0.78: msg = personalize_outreach(lead, lead.signals) apollo.sequences.enroll( sequence_id="seq_outbound_v3", contact_id=lead.id, opener=msg, ) hubspot.contacts.update(lead.id, { "hs_lead_status": "sdr_engaged", "fit_score": score, }) # tinoho/sdr_agent.py — personalize outbound at scale import anthropic from typing import List from tinoho.icp import score_lead, ICP_PROFILE client = anthropic.Anthropic() def personalize_outreach(lead: Lead, signals: List[Signal]) -> str: """Generate a hyper-personalized first touch.""" system = ( "You are an SDR for a fractional CRO consultancy. " "Reference the prospect's recent funding, hiring " "signals, and tech stack. Keep under 90 words." ) response = client.messages.create( model="claude-sonnet-4-6", max_tokens=400, system=system, messages=[{ "role": "user", "content": f"Lead: {lead.json()}" }] ) return response.content[0].text # Score lead fit before queueing email for lead in apollo.fetch_new_leads(limit=250): score = score_lead(lead, ICP_PROFILE) if score >= 0.78: msg = personalize_outreach(lead, lead.signals) apollo.sequences.enroll( sequence_id="seq_outbound_v3", contact_id=lead.id, opener=msg, ) hubspot.contacts.update(lead.id, { "hs_lead_status": "sdr_engaged", "fit_score": score, })
// n8n workflow — SDR Agent v4 (build & handoff) { "name": "SDR Agent — Outbound Sequence", "active": true, "nodes": [ { "id": "trigger_schedule", "type": "n8n-nodes-base.scheduleTrigger", "parameters": { "rule": "0 */6 * * *" } }, { "id": "apollo_search", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.apollo.io/v1/mixed_people/search", "method": "POST", "body": { "person_titles": ["VP Sales", "CRO", "Head of GTM"], "organization_num_employees_ranges": ["50,200"], "organization_industry_tag_ids": ["saas"], "per_page": 100 } } }, { "id": "score_with_claude", "type": "@n8n/n8n-nodes-langchain.anthropic", "parameters": { "model": "claude-sonnet-4-6", "systemPrompt": "Score lead fit 0-1 vs ICP." } }, { "id": "branch_by_score", "type": "n8n-nodes-base.if" }, { "id": "hubspot_upsert", "type": "n8n-nodes-base.hubspot" } ] } // n8n workflow — SDR Agent v4 (build & handoff) { "name": "SDR Agent — Outbound Sequence", "active": true, "nodes": [ { "id": "trigger_schedule", "type": "n8n-nodes-base.scheduleTrigger", "parameters": { "rule": "0 */6 * * *" } }, { "id": "apollo_search", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.apollo.io/v1/mixed_people/search", "method": "POST", "body": { "person_titles": ["VP Sales", "CRO", "Head of GTM"], "organization_num_employees_ranges": ["50,200"], "organization_industry_tag_ids": ["saas"], "per_page": 100 } } }, { "id": "score_with_claude", "type": "@n8n/n8n-nodes-langchain.anthropic", "parameters": { "model": "claude-sonnet-4-6", "systemPrompt": "Score lead fit 0-1 vs ICP." } }, { "id": "branch_by_score", "type": "n8n-nodes-base.if" }, { "id": "hubspot_upsert", "type": "n8n-nodes-base.hubspot" } ] } // n8n workflow — SDR Agent v4 (build & handoff) { "name": "SDR Agent — Outbound Sequence", "active": true, "nodes": [ { "id": "trigger_schedule", "type": "n8n-nodes-base.scheduleTrigger", "parameters": { "rule": "0 */6 * * *" } }, { "id": "apollo_search", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.apollo.io/v1/mixed_people/search", "method": "POST", "body": { "person_titles": ["VP Sales", "CRO", "Head of GTM"], "organization_num_employees_ranges": ["50,200"], "organization_industry_tag_ids": ["saas"], "per_page": 100 } } }, { "id": "score_with_claude", "type": "@n8n/n8n-nodes-langchain.anthropic", "parameters": { "model": "claude-sonnet-4-6", "systemPrompt": "Score lead fit 0-1 vs ICP." } }, { "id": "branch_by_score", "type": "n8n-nodes-base.if" }, { "id": "hubspot_upsert", "type": "n8n-nodes-base.hubspot" } ] } // n8n workflow — SDR Agent v4 (build & handoff) { "name": "SDR Agent — Outbound Sequence", "active": true, "nodes": [ { "id": "trigger_schedule", "type": "n8n-nodes-base.scheduleTrigger", "parameters": { "rule": "0 */6 * * *" } }, { "id": "apollo_search", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.apollo.io/v1/mixed_people/search", "method": "POST", "body": { "person_titles": ["VP Sales", "CRO", "Head of GTM"], "organization_num_employees_ranges": ["50,200"], "organization_industry_tag_ids": ["saas"], "per_page": 100 } } }, { "id": "score_with_claude", "type": "@n8n/n8n-nodes-langchain.anthropic", "parameters": { "model": "claude-sonnet-4-6", "systemPrompt": "Score lead fit 0-1 vs ICP." } }, { "id": "branch_by_score", "type": "n8n-nodes-base.if" }, { "id": "hubspot_upsert", "type": "n8n-nodes-base.hubspot" } ] } // n8n workflow — SDR Agent v4 (build & handoff) { "name": "SDR Agent — Outbound Sequence", "active": true, "nodes": [ { "id": "trigger_schedule", "type": "n8n-nodes-base.scheduleTrigger", "parameters": { "rule": "0 */6 * * *" } }, { "id": "apollo_search", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.apollo.io/v1/mixed_people/search", "method": "POST", "body": { "person_titles": ["VP Sales", "CRO", "Head of GTM"], "organization_num_employees_ranges": ["50,200"], "organization_industry_tag_ids": ["saas"], "per_page": 100 } } }, { "id": "score_with_claude", "type": "@n8n/n8n-nodes-langchain.anthropic", "parameters": { "model": "claude-sonnet-4-6", "systemPrompt": "Score lead fit 0-1 vs ICP." } }, { "id": "branch_by_score", "type": "n8n-nodes-base.if" }, { "id": "hubspot_upsert", "type": "n8n-nodes-base.hubspot" } ] } // n8n workflow — SDR Agent v4 (build & handoff) { "name": "SDR Agent — Outbound Sequence", "active": true, "nodes": [ { "id": "trigger_schedule", "type": "n8n-nodes-base.scheduleTrigger", "parameters": { "rule": "0 */6 * * *" } }, { "id": "apollo_search", "type": "n8n-nodes-base.httpRequest", "parameters": { "url": "https://api.apollo.io/v1/mixed_people/search", "method": "POST", "body": { "person_titles": ["VP Sales", "CRO", "Head of GTM"], "organization_num_employees_ranges": ["50,200"], "organization_industry_tag_ids": ["saas"], "per_page": 100 } } }, { "id": "score_with_claude", "type": "@n8n/n8n-nodes-langchain.anthropic", "parameters": { "model": "claude-sonnet-4-6", "systemPrompt": "Score lead fit 0-1 vs ICP." } }, { "id": "branch_by_score", "type": "n8n-nodes-base.if" }, { "id": "hubspot_upsert", "type": "n8n-nodes-base.hubspot" } ] }
// tinoho/lead-router.ts — Apollo → enrich → HubSpot import { Apollo } from '@apollo/sdk' import { Client as HubSpot } from '@hubspot/api-client' import { Anthropic } from '@anthropic-ai/sdk' interface Lead { email: string company: string title: string fitScore: number signals: Signal[] } async function syncLeadToHubSpot(lead: Lead): Promise<Contact> { const enriched = await apollo.people.enrich({ email: lead.email, reveal_personal_emails: true, }) const contact = await hubspot.crm.contacts.upsert({ email: enriched.email, properties: { firstname: enriched.first_name, lastname: enriched.last_name, company: enriched.organization.name, jobtitle: enriched.title, lifecyclestage: 'lead', hs_lead_status: 'sdr_queue', fit_score: lead.fitScore, source: 'apollo_outbound_v3', }, }) return contact } async function runDailyBatch() { const leads = await apollo.searchPeople({ titles: ['VP Sales', 'CRO', 'Head of GTM'], employeeRange: [50, 200], industries: ['saas'], perPage: 100, }) for (const lead of leads) { const score = await scoreLeadFit(lead) if (score >= 0.78) await syncLeadToHubSpot({ ...lead, fitScore: score }) } } // tinoho/lead-router.ts — Apollo → enrich → HubSpot import { Apollo } from '@apollo/sdk' import { Client as HubSpot } from '@hubspot/api-client' import { Anthropic } from '@anthropic-ai/sdk' interface Lead { email: string company: string title: string fitScore: number signals: Signal[] } async function syncLeadToHubSpot(lead: Lead): Promise<Contact> { const enriched = await apollo.people.enrich({ email: lead.email, reveal_personal_emails: true, }) const contact = await hubspot.crm.contacts.upsert({ email: enriched.email, properties: { firstname: enriched.first_name, lastname: enriched.last_name, company: enriched.organization.name, jobtitle: enriched.title, lifecyclestage: 'lead', hs_lead_status: 'sdr_queue', fit_score: lead.fitScore, source: 'apollo_outbound_v3', }, }) return contact } async function runDailyBatch() { const leads = await apollo.searchPeople({ titles: ['VP Sales', 'CRO', 'Head of GTM'], employeeRange: [50, 200], industries: ['saas'], perPage: 100, }) for (const lead of leads) { const score = await scoreLeadFit(lead) if (score >= 0.78) await syncLeadToHubSpot({ ...lead, fitScore: score }) } } // tinoho/lead-router.ts — Apollo → enrich → HubSpot import { Apollo } from '@apollo/sdk' import { Client as HubSpot } from '@hubspot/api-client' import { Anthropic } from '@anthropic-ai/sdk' interface Lead { email: string company: string title: string fitScore: number signals: Signal[] } async function syncLeadToHubSpot(lead: Lead): Promise<Contact> { const enriched = await apollo.people.enrich({ email: lead.email, reveal_personal_emails: true, }) const contact = await hubspot.crm.contacts.upsert({ email: enriched.email, properties: { firstname: enriched.first_name, lastname: enriched.last_name, company: enriched.organization.name, jobtitle: enriched.title, lifecyclestage: 'lead', hs_lead_status: 'sdr_queue', fit_score: lead.fitScore, source: 'apollo_outbound_v3', }, }) return contact } async function runDailyBatch() { const leads = await apollo.searchPeople({ titles: ['VP Sales', 'CRO', 'Head of GTM'], employeeRange: [50, 200], industries: ['saas'], perPage: 100, }) for (const lead of leads) { const score = await scoreLeadFit(lead) if (score >= 0.78) await syncLeadToHubSpot({ ...lead, fitScore: score }) } } // tinoho/lead-router.ts — Apollo → enrich → HubSpot import { Apollo } from '@apollo/sdk' import { Client as HubSpot } from '@hubspot/api-client' import { Anthropic } from '@anthropic-ai/sdk' interface Lead { email: string company: string title: string fitScore: number signals: Signal[] } async function syncLeadToHubSpot(lead: Lead): Promise<Contact> { const enriched = await apollo.people.enrich({ email: lead.email, reveal_personal_emails: true, }) const contact = await hubspot.crm.contacts.upsert({ email: enriched.email, properties: { firstname: enriched.first_name, lastname: enriched.last_name, company: enriched.organization.name, jobtitle: enriched.title, lifecyclestage: 'lead', hs_lead_status: 'sdr_queue', fit_score: lead.fitScore, source: 'apollo_outbound_v3', }, }) return contact } async function runDailyBatch() { const leads = await apollo.searchPeople({ titles: ['VP Sales', 'CRO', 'Head of GTM'], employeeRange: [50, 200], industries: ['saas'], perPage: 100, }) for (const lead of leads) { const score = await scoreLeadFit(lead) if (score >= 0.78) await syncLeadToHubSpot({ ...lead, fitScore: score }) } } // tinoho/lead-router.ts — Apollo → enrich → HubSpot import { Apollo } from '@apollo/sdk' import { Client as HubSpot } from '@hubspot/api-client' import { Anthropic } from '@anthropic-ai/sdk' interface Lead { email: string company: string title: string fitScore: number signals: Signal[] } async function syncLeadToHubSpot(lead: Lead): Promise<Contact> { const enriched = await apollo.people.enrich({ email: lead.email, reveal_personal_emails: true, }) const contact = await hubspot.crm.contacts.upsert({ email: enriched.email, properties: { firstname: enriched.first_name, lastname: enriched.last_name, company: enriched.organization.name, jobtitle: enriched.title, lifecyclestage: 'lead', hs_lead_status: 'sdr_queue', fit_score: lead.fitScore, source: 'apollo_outbound_v3', }, }) return contact } async function runDailyBatch() { const leads = await apollo.searchPeople({ titles: ['VP Sales', 'CRO', 'Head of GTM'], employeeRange: [50, 200], industries: ['saas'], perPage: 100, }) for (const lead of leads) { const score = await scoreLeadFit(lead) if (score >= 0.78) await syncLeadToHubSpot({ ...lead, fitScore: score }) } } // tinoho/lead-router.ts — Apollo → enrich → HubSpot import { Apollo } from '@apollo/sdk' import { Client as HubSpot } from '@hubspot/api-client' import { Anthropic } from '@anthropic-ai/sdk' interface Lead { email: string company: string title: string fitScore: number signals: Signal[] } async function syncLeadToHubSpot(lead: Lead): Promise<Contact> { const enriched = await apollo.people.enrich({ email: lead.email, reveal_personal_emails: true, }) const contact = await hubspot.crm.contacts.upsert({ email: enriched.email, properties: { firstname: enriched.first_name, lastname: enriched.last_name, company: enriched.organization.name, jobtitle: enriched.title, lifecyclestage: 'lead', hs_lead_status: 'sdr_queue', fit_score: lead.fitScore, source: 'apollo_outbound_v3', }, }) return contact } async function runDailyBatch() { const leads = await apollo.searchPeople({ titles: ['VP Sales', 'CRO', 'Head of GTM'], employeeRange: [50, 200], industries: ['saas'], perPage: 100, }) for (const lead of leads) { const score = await scoreLeadFit(lead) if (score >= 0.78) await syncLeadToHubSpot({ ...lead, fitScore: score }) } }
I’m a hands-on revenue leader and GTM operator focused on scaling B2B businesses with
AI-powered systems.
Senior-level thinking. Fraction of the cost.
None of the hiring risk.
Results that move the needle.
One full revenue stack. Eight capabilities.
Each capability is a component of one integrated revenue system — designed to work together, built to scale.
01
Strategy
Commercial strategy, GTM motion selection.
03
RevOps
Pipeline architecture, tech stack optimisation, and full-funnel revenue engine design.
05
Sales
Pipeline development, and high-performance sales team building.
07
Board Advisory & Consulting
Strategic counsel for founders on revenue, growth, and investor readiness.
02
GTM Execution
Go-to-market execution across sales-led, product-led, partnership-led, marketing-led, and event-led motions.
04
Marketing
Demand generation, ABM, messaging framework, and campaign execution.
06
Brand
Segmentation, targeting, positioning, for B2B audiences.
What makes Tino different?
A unique combination across several areas.
Area
Others
Track Record in high-growth environments
Serial founder & operator
ASX-listed & VC-backed company experience
Advisor & board member to founder-led businesses
Strategy through to execution
AI-first mindset
GTM stack experience
Tino Ho
Built & ran multple businesses
From startup to public markets
Strategic counsel at board level
Not just decks — real outcomes
Builds with modern AI tools (n8n, Claude, etc)
Modern Tools (Hubspot, Zoominfo, Apollo, Expandi, etc.)