Jan Berning
GTM Engineer
A portfolio of go-to-market playbooks.
About
I build the systems a go-to-market team runs on, from outbound and enrichment to scoring, content, and revenue analytics, and increasingly I build and run them end to end from Claude Code. For two years I was Head of Growth at Databar, where I built much of what you see here, plus selected freelance projects like Roopairs.
Cases
| 01 | Intent-based outbound from Claude Code10.76% reply rate, high five-figure pipeline | Outbound |
| 02 | Hyper-targeted ICP definition from Claude Codea data-backed ICP and buying signals, built in hours | ICP & Data |
| 03 | Account scoring at scale4,000 accounts scored into HubSpot | ICP Scoring |
| 04 | Always-on CRM hygiene and write-back~2,000 companies fixed, CRM stays clean on its own | CRM enrichment |
| 05 | Local lead-gen where LinkedIn failsowner contacts in a segment LinkedIn cannot reach | Outbound |
| 06 | Case-study-mention outbound at scalea researched opener for every company, 5 to 15k scale | Outbound |
| 07 | Blog content at scale on first-party dataunique content built for SEO and AI search | Content |
| 08 | Revenue analytics and attribution dashboardone model for what drives revenue | Analytics |
| 09 | Evergreen signal campaignsthree always-on signal campaigns, no list to rebuild | Outbound |
| 10 | Build Roopairs' entire addressable market19K-record CRM rebuilt into a full, ICP-segmented market | TAM building |
Tools & use cases
Every tool I worked with, and the cases where it shows up. Tool proficiency at a glance.
Case 01Outbound · Claude Code
Intent-based outbound from Claude Code, over 10% reply rate
Designed and built
We launched Databar's MCP, SDK, and API (a data layer you call from the terminal). I was responsible for the cold email campaign and the distribution behind the launch. My hypothesis: the people already using Claude Code for go-to-market are the ones who would want to call 100+ data providers from inside it.
Problem
Cold outbound mostly gets ignored. Databar's ICP is RevOps and GTM operators, and the sharpest slice for this launch was the ones already running go-to-market in Claude Code. I had to reach exactly those people, and say something relevant enough that a busy operator bothers to reply.
Approach
I started from intent. People who comment on Claude-Code-for-GTM posts have already raised their hand. So I scraped them, qualified them hard against our ICP, and only reached out to the ones who genuinely fit, with a message that sounded like a person wrote it.
The build, every step from Claude Code
- Scrape the engagers (likers, commenters) on posts about Claude Code for go-to-market, using Apify and Databar.
- Enrich the company and the person first, just enough to qualify them. No email yet.
- Qualify against our ICP from Claude Code (role, company type, size), with a partner and competitor exclusion list.
- Only for the people who pass, run the Databar waterfall across 10+ email providers to find a work email.
- Verify deliverability with ZeroBounce.
- Write a human opener that picks up on the prospect's own Claude Code interest and pitches the SDK and MCP as "Clay that lives in the terminal."
- Push the qualified, verified list into Smartlead and run a 3-sequence campaign.
Results
- 6,875 emails sent, 76% open rate, 10.76% reply rate, 199 replies (Smartlead). That is exceptional for outbound at this scale.
- Generated high five figures in new pipeline and deals.
Proof
Case 02ICP & Data · Claude Code
Hyper-targeted ICP definition from Claude Code
Designed and built
Delivered for Databar and for several agencies and B2B customers.
Problem
Most teams define their ICP from intuition rather than evidence. Without a data-backed view of which customers convert and retain, and why, segmentation and targeting stay imprecise.
Approach
I built the ICP on a solid data foundation. The foundation is the data pulled in the build below: closed-won and churned accounts, product usage, call transcripts, and firmographic and timing signals. On top of it, Claude Code runs the analyses that surface the patterns, and those define the segments, the buying criteria, and the right moment to engage.
The build, from Claude Code, data via APIs
- Pull closed-won deals, active customers, and churned accounts from the CRM (e.g. HubSpot).
- Pull product usage from Mixpanel: power users, feature adoption, and where accounts activate or stall. This profiles a high-retention account and flags accounts ready to expand.
- Pull call transcripts for buyer language and objections in their own words.
- Enrich firmographics through Databar (industry, size, funding via CrustData and Owler, tech stack via BuiltWith, geography), and add buying-timing signals such as open job postings and new hires. A company hiring a RevOps lead, for example, signals near-term need for a tool like Databar.
- Let Claude Code run the analyses across that data: a closed-won analysis for the traits the best customers share, a win/loss and churn analysis for what separates them from the accounts that left, and a feature-adoption analysis for the usage that predicts fit and expansion. The output is explicit buying criteria (for example, only teams of 15+ buy), the signals that mark the right moment to engage, and the timing for expansion.
Results
- A data-backed ICP delivered in hours, not weeks, with explicit buying criteria, engagement-timing signals, the features that predict fit, and expansion timing.
- The segments fed directly into targeted outbound and expansion plays.
Case 03ICP Scoring
Account scoring at scale
Designed and built
A workflow I run for customers fairly often. This one was a B2B SaaS selling into manufacturing in North America.
Problem
The sales team had thousands of accounts and no reliable way to rank them. The signals that predict fit were missing or wrong across providers, and a wrong value is worse than a blank one.
Approach
I scored on a handful of high-value criteria, not everything, and kept fit separate from momentum. The hard part is the signals nobody publishes. For the data points that are rarely stated outright, I triangulated each one from several sources, including the tech stack, open job postings, and AI web research, and kept the source on every value. Across most fields I leaned on the AI researcher agent more than on any single provider, because it returns "none available" rather than a wrong value.
The build
- Load 4,000 accounts into a Databar table.
- Headcount growth from CrustData, Owler, and Diffbot, split into 6-month and 1-year windows.
- Manufacturing sites from Diffbot plus the AI researcher, which returns the count and a source.
- ERP detection from BuiltWith tech stack, open job postings (PredictLeads), and AI research, each with its source.
- Manufacturing model (engineer-to-order vs make-to-order) inferred from job posts, and company news from PredictLeads and Owler filtered by AI for new facilities, supply chain, ERP changes, and M&A. Several more providers went in per field, with the AI researcher doing a lot of the heavy lifting wherever no single provider was reliable.
- Every signal is stored as value plus detail plus source. A final scoring prompt outputs a fit label and a momentum score, written into HubSpot lead scoring. I validated on 50 accounts, then narrowed to three core signals to cut credits before the full run.
Results
- 4,000 accounts scored on a fit label and a momentum score.
- Reps stopped guessing and worked the top tier first, off data they could trust.
Case 04CRM enrichment
Always-on CRM hygiene and write-back
Designed, built with the GTM team
A mobile ad-tech company running HubSpot, synced into Salesforce.
Problem
About 2,000 companies had no lead type. Plenty were missing country, domain, or vertical, and some URLs were just wrong (an account named Amazon pointing at linkedin.com). The bad formatting also kept breaking the HubSpot to Salesforce sync.
Approach
Run it continuously, touch only what is empty or wrong, and keep the formatting strict so the sync holds. Where a field needs judgment, use the records that are already correct as examples.
The build, two scheduled Databar workflows, one for companies, one for contacts
- Pull companies and contacts from HubSpot through the native integration.
- Run each enrichment only when the field is empty, so good data never gets re-spent on.
- Fill HQ and contact location from LinkedIn-sourced provider data, formatted strictly ("United States" not "US", full state names) so the sync does not choke.
- Fill the missing domain, website, and LinkedIn URL.
- Fix wrong URLs with a custom AI prompt, fed examples of good and bad.
- Classify lead type and vertical with an AI prompt mapped to the existing HubSpot pick-list values, using already-correct accounts as examples.
- Write back on a schedule so the Salesforce sync stays clean.
Results
- Around 2,000 companies given a lead type, with country, domain, vertical, and broken URLs corrected across the base.
- From there the CRM keeps itself accurate on a schedule, and the HubSpot to Salesforce sync stays intact.
Case 05Outbound
Local lead-gen where LinkedIn fails
Designed and built
A US home-services and local-business lead-gen operator.
Problem
For local home-services businesses, LinkedIn and Apollo data is thin to useless. The owners simply are not on LinkedIn. The operator needed owner names and phone numbers by city, at volume.
Approach
Go where the data lives. For this segment that means Google Maps, niche local directories, and the BBB, not LinkedIn. Finding the right person at a local business is harder than at a company with a LinkedIn page, so the contact step leans on web research and verification.
The build
- Start with a master search table. Give it a location and a query (for example "Home Cleaning, Los Angeles"). A Google Maps parser (Outscraper) returns every matching business with its phone, rating, address, and website.
- Pull in niche local directories and BBB listings for the same area, so coverage is not limited to what Maps returns.
- Send each business to a companies table and run a qualifier that splits franchises (one corporate office behind many locations) from independent solo-owner shops. The owner lookup is completely different for each.
- For the solo owners, an AI researcher runs a live web search for the owner's name, phone, and email. It gets the full address as input, so it matches the right location and not a same-named business in another city.
- A phone verifier checks the number and cross-checks the owner against their BBB profile, the most reliable source in this segment.
- Run 10+ contact providers in parallel (ContactOut, RocketReach, LeadMagic, Findymail, Hunter.io, and more) and merge their results into one owner contact per business, recording which provider supplied it.
Results
- A repeatable lead engine that runs monthly per location.
- Owner names and phone numbers in a segment where the standard B2B tools return nothing.
Case 06Outbound
Case-study-mention outbound at scale
Scoped and advised
A lead-gen agency running cold email across client verticals, where the first line decides whether the email gets read.
Problem
Generic outbound was not landing. The opener that did work was "I saw you worked with company A", but pulling a relevant case study per target by hand does not scale past a few dozen.
Approach
Referencing a real client of theirs proves you did the homework, and that is what lifts replies. The work is doing that research automatically for every company on a five-figure list, not just the first few. So I pick the right companies, then automate the one thing that makes the opener land: a relevant case study per target, run across the whole list.
The build
- Scrape a company list from Clutch and other directories (Apify) into a Databar table, 5,000 to 15,000 rows.
- For each company, run the Databar AI research agent to find a notable client they have worked with and summarize it for the opener.
- Waterfall-enrich a verified email and phone across several providers.
- Generate the personalized opener that references the case study.
- Export to Smartlead and send.
Results
- The agency's best-performing angle, run at five-figure list scale instead of by hand. (Result reported by the agency.)
- Every one of 5,000 to 15,000 companies gets its own researched case-study opener, with no manual research per account.
Case 07Content · Claude Code
Blog content at scale on first-party data
Designed and built
Databar's own blog. A content play I built on Databar.
Problem
Generic AI articles read like everyone else's, so they do not rank and they do not get cited. I wanted articles no competitor could write, that both Google and the LLMs want to surface.
Approach
Feed the writer data nobody else has. Combine our own performance data, real external keyword demand, and the language our customers use, so every article is specific and hard to copy.
The build, pipeline from Claude Code
- Pull internal performance data via the Google Search Console and Google Analytics APIs (top queries, rankings, CTR gaps, page performance).
- Pull external keyword KPIs via the DataForSEO and SpyFu APIs through Databar (search volume, SERP, related keywords, People Also Ask).
- Pull proprietary signal from our CRM and call-recording tool (Attio): anonymized customer pain points and phrasing that only we have.
- Run web research alongside it, then write articles grounded in those specific points.
- Validate with a Python quality gate (structure, data tables, banned phrases, keyword placement), then publish to Framer CMS with relevant internal links to existing articles and CTAs added automatically.
Results
- Articles built on first-party data points competitors cannot replicate, and that AI search engines like to cite (GEO).
- Each piece runs through an automated quality gate and publishes to the CMS with internal links and CTAs already in place.
Case 08Analytics · Claude Code
Revenue analytics and attribution dashboard
Designed and built
A direct-to-consumer subscription business.
Problem
Marketing, product, payments, and pipeline data each lived in its own tool. Nobody could say which activities drove revenue, or forecast what was coming.
Approach
Pull every touchpoint into one model, connect spend to revenue, and show only the numbers that change a decision. Built and run from Claude Code.
The build, Claude Code pulling each source via API, then building the dashboards
- Ads: the Meta Marketing API (Ads Insights) and Google Ads for spend, impressions, clicks, and conversions across paid social and search.
- Product: Mixpanel for funnel events, activation, and retention.
- Revenue: PayPal for transactions, subscriptions, and refunds.
- Email: Brevo, the newsletter tool, for sends, opens, clicks, and conversions.
- Traffic and source: web analytics with UTM tracking (GA4). Pipeline: CRM data.
- Source tracking: tag each signup with its first-touch source from the UTM, so you can see where customers come from.
- Metrics: spend, blended CAC and ROAS, LTV, MRR, and churn.
- Forecasting: a simple revenue forecast, and how marketing spend tracks against revenue over time.
Results
- One model that unifies the marketing, product, payments, and pipeline data that used to sit in separate tools.
- Surfaces blended CAC and ROAS, the most valuable customers and where they first came from, and how spend tracks against revenue, with a simple forecast.
Case 09Outbound · Claude Code
Evergreen signal campaigns
Designed, run with the team
Three always-on outbound campaigns I built at Databar, each tied to a buying signal.
Problem
A one-off blast goes stale the moment you hit send, and someone has to keep rebuilding the list. The outbound that compounds is tied to a signal that keeps producing fresh, in-market accounts on its own.
Approach
Build evergreen campaigns, one per high-intent signal, that pull in new accounts every week as the signal fires. I built three: companies hiring for relevant roles, companies that recently raised funding, and companies with specific, relevant news. Each one is set up once and then runs on its own.
The build, the hiring-signal campaign, from Claude Code
- Continuously scrape open job postings from LinkedIn and Indeed (via Apify) for the roles that signal need: a first RevOps or GTM-engineer hire, 3+ open SDR/BDR roles, or a content or SEO manager opening.
- Qualify the company against ICP, and drop staffing firms, competitors, and existing customers.
- Find the right person (the hiring manager, the function owner, the founder) via Databar.
- Waterfall-enrich a verified email and phone, then verify with ZeroBounce.
- Write the opener straight off the trigger ("saw you're hiring your first RevOps lead").
- Push to the sending tool. New postings show up daily, so fresh in-market accounts flow into the campaign without anyone rebuilding the list.
The other two run the same way
One watches for recent funding rounds, where there is new budget and an active buying mindset. One watches for specific company news, like an expansion or a launch, the kind of event that creates a reason to reach out. Same shape every time: a trigger source that feeds fresh leads, enrichment and verification, then a message written off the signal.
Results
- Three always-on campaigns that surface fresh, in-market accounts every week, each with a real reason to reach out.
- Set up once, they pull in new accounts on their own, with no list to rebuild.
Case 10TAM building · freelance
Build Roopairs' entire addressable market from scratch
Designed and built, freelance
Roopairs, a US platform for commercial-kitchen equipment repair. They had a strong outbound motion already, a 9-channel signal-based sender on top of Attio. The problem was the data underneath it.
Problem
The outbound side was in good shape. The ~19,000 companies already in Attio were not. There was no employee-count field, so none of their five headcount-based ICPs could be assigned. Only about 18% had a website, 7% a location, 69% had no contact at all, and only 27% of contacts had a phone, even though three of the nine channels are phone-based. A large share of the list was residential HVAC rather than commercial-kitchen, so it sat outside the ICP entirely.
Approach
Rather than tidy a messy list, I built the whole market: one canonical database of every US commercial-kitchen repair company, segmented by ICP from day one, on modern AI-era data sources. The existing 19K folds in as one input, so their customers and anyone they had already spoken to stay out of cold outreach. First focus: the Small (4-12) and Medium (13-24) shops, which convert best.
The build, orchestrated from Claude Code
- Pull the full company universe from maps and directories (Apify and the Apify MCP, Rapid API, Blitz API).
- Crawl each website with an HTML-to-text step and process it with GPT-5 Nano via the Batch API to pull signals: current software and portals, hiring, tooling.
- Use AI web research (Exa.ai, Parallel.ai) for the harder signals.
- Add only the fields that earn their place: employee count (assigns the ICP), an ICP segment tag, website and location, the right decision-makers per segment (owner, office manager, ops or service manager), CFESA membership as a fit signal, current software and portals as the outreach angle, and hiring or growth signals for timing.
- Get verified work emails and mobiles with Databar, and validate every address with Million Verifier so the contact data is clean.
- Push the clean, ICP-segmented database into Attio, ready for the team to work, and easy to refresh on a schedule so it stays current.
Results
- Rebuilt a 19,000-record, largely inert CRM into a complete, ICP-segmented market, built fresh rather than salvaged.
- Every company carries its ICP segment, the right decision-makers, verified contact info, and the signal that drives the outreach angle.
- Proven on a 200 to 500 company test batch first, to lock data quality before scaling to the full market.
There is a lot more where this came from
This portfolio is a selection. I built a large library of ready-to-run playbook tables on Databar. If a play here is interesting, that is the place to go deeper.