Automatically ingests market intelligence from 55 RSS and LinkedIn sources, scores each article for relevance to Kinage ICP domains, prunes to the top 300 signals, and publishes the ranked feed to the live dashboard.
Runs Monday and Thursday at 6am UTC via GitHub Actions (.github/workflows/biweekly-ingest.yml)
- Fetches articles from all 55 configured sources
- Filters to US-only content published within the last 6 months
- Scores each article using OpenAI embeddings compared against 11 ICP domain definitions
- Applies intersection bonuses when articles touch multiple key domains
- Applies time decay and source authority weighting
- Prunes corpus to top 300 files by score
- Builds ranked_chunks.json and curated_signals.json
- Extracts named professionals from top articles using Claude
- Uploads output to Vercel Blob
- Pushes to GitHub which triggers Vercel auto-deploy
Clay sends enriched contact data to the platform, Claude classifies each contact ICP role, and the result is written back to HubSpot automatically.
- Clay enriches a contact with name, job title, company, and LinkedIn URL
- Clay fires a POST request to https://kinagehal.com/api/clay/enrich-callback
- The endpoint calls Claude Haiku with the contact data and a classification prompt
- Claude returns one of: DMM, Estate Planner, Elder Care Advisor, Partner, Other, Unknown
- The endpoint writes icp_role, icp_confidence (Inferred), last_enriched_date, jobtitle, and hs_linkedin_url back to HubSpot
- Clay subscription plan and provider configuration to be confirmed
HubSpot is the system of record for all contact and deal data. The platform reads from and writes to HubSpot in real time.
- No contacts should be written to HubSpot without a validated workflow approved by Rick and Roger
- Portal ID: 244850752
- Custom properties: icp_role (DMM/Estate Planner/Elder Care Advisor/Partner/Other/Unknown), influence_tier (A/B/C/Unscored), lead_score (Number), social_score (Number), last_enriched_date (Date), icp_confidence (Confirmed/Inferred/Unknown), hs_linkedin_url (existing field)
Automatically emails the top 10 signals from the latest pipeline run to the full GTM team every Monday morning.
Every Monday at 9am UTC (cron: 0 9 * * 1)
- Cron triggers the digest endpoint on Monday at 9am UTC
- Pulls the top 10 signals from the latest ranked_chunks.json in Vercel Blob
- Formats an HTML email with domain tag, title, AI summary, and article link for each signal
- Sends via Mailgun from digest@alerts.kinage.co
- Footer includes a View full dashboard button linking to kinagehal.com
- Recipients: Lapo, Ben, Rick, Alex, Roger
- Sending domain: alerts.kinage.co
Allows team members to mark any signal as Reviewed, Outreach sent, or Not relevant directly on the dashboard. Status persists across all sessions and devices.
- User clicks a status button on any signal card
- The status is written to Vercel Blob at signal_statuses.json
- On next load the dashboard reads from the same blob and restores all statuses
- The last synced bar updates to reflect review progress
- Blob URL: gmfi9pr14tuzujww.public.blob.vercel-storage.com/signal_statuses.json
- Status data is public read. Do not store sensitive information in signal statuses.
Claude reads the top articles from each pipeline run and extracts named professionals who are mentioned or quoted. These appear on the HAL Signal Contacts tab as potential outreach targets.
- After scoring, the pipeline sends the top articles to Claude
- Claude identifies named professionals, their role, organisation, and context
- Extracted contacts are stored in the pipeline output and served via the contacts page API
- Each contact card shows name, role, company, why they appeared, and ICP fit assessment
- Add to HubSpot button is present but gated pending workflow approval from Rick and Roger
- Add to HubSpot workflow requires approval from Rick and Roger before activation
- Contacts extracted: 29 named persons across 18 articles (last pipeline run)