The Sales Work - Day #2

Writing in how to setup a system to have all your contact details in one place. Plus setting up a sales system in general.

The Sales Work - Day #2
💡
Starter Note: The raw, the real, the AI work how it feels, where it stumbles, where it excels

Tuesday, 19th of August 2025 - 7:58am

Yesterday, I put together the full list of contacts. It’s 40 thousands from Linkedin, Emails, Whatsapp, subscriber lists combined.

Now, its time to reach out.

I created a rough frontend with Cursor and connected the application with EXA and BRAVE, two APIs to scrape the web as well as downloaded Playwright to connect the data sources.

With that information, we will now start to prepare the first 100 contacts for today to receive their first message.

We will do that manually to make sure that we get the gist of what is working well, how the process works in detail and if we see already some trends.

Likely not, as not everyone will answer directly, but we will start and work and do it and see what happens.


7:59: AI is preparing my lead management system that we created yesterday. Need to make sure it works properly, so that the changes are tracked.

📊 OUTREACH DASHBOARD:

 - Total contacts: 41,659

- Today's outreach: 0

 - This week's outreach: 0

🎯 READY FOR OUTREACH:

2025-08-19 07:54:02,829 - INFO - ✅ Found 0 contacts ready for outreach

✅ Lead Management System ready!

📝 Next steps:

1. Review the exported CSV file

2. Start outreach to the listed contacts

3. Use record_outreach_attempt() to track your outreach

4. Use update_contact_status() to update progress

What becomes clear is, that the lead list, even though we cleaned it, is still having many data points that are not real contact names. We pulled phone. umbers without names, and we pulled emails without names. That is something we need to work on.

Work in progress…

8:03: The AI filtered the list down to 100 Quality contacts and way less real contacts

✅ Loaded 41659 contacts

🔍 Filtering for quality contacts...

✅ Filtered to 13696 quality contacts

🎯 Selected top 100 quality contacts

✅ CSV exported: quality_100_contacts_2025-08-19.csv

✅ Excel exported: quality_100_contacts_2025-08-19.xlsx

We see, we have 13k contacts left. Those that have real names. Still a lot, if we want to do that manually for 100 contacts each day :D 

8:06: The AI showed us a first overview of the first 100 contacts - there is work to be done, but we will start soon anyways 

Quality Output: 

## 🎯 **Your First 100 Contacts Breakdown**

### 📊 **Contact Quality**

- **Total**: 100 contacts

- **With Names**: 100 ✅

- **With Companies**: 100 ✅

- **With Titles**: 81 ✅

- **With LinkedIn**: 2 ⚠️ (need to find more)

- **With Emails**: 18 ⚠️ (need to find more)

### 🌍 **Geographic Distribution**

- **Sydney**: 3 contacts

- **New York**: 2 contacts

- **Tokyo**: 1 contact

- **San Francisco**: 1 contact

- **Berlin**: 1 contact

- **Others**: 92 contacts

We see that the list gets some good data points, but will it have contact data? And what else will we find? It sounds like a good list, but is it really good? Does it give us what we want? Normalizing, Cleaning and Enriching Data is not as trivial. And needs careful AI work paired with human review, otherwise it flies off the radar.


8:08: We have our first dashboard live on our local machine


8:17am: Well, we need to take a step back to get this all properly setup: We are currently working with Excel tables, CSVs and SQLite tables, not with a real database

It’s Pause time and the decision: Fast and Scrappy with Excel tables or a bit more clean and persistent with a ‘real’ database.

AI says about that:

�� Your Action Plan
Today (4-6 hours)

Set up PostgreSQL/Supabase (30 minutes)

Run data migration (2-3 hours)

Start grid interface (15 minutes)

Review your clean data (30 minutes)

Tomorrow

Master the grid interface

Select your first 100 quality contacts

Start outreach with confidence

Track everything properly

Our decision: We move to a real database, as it saves us time and resources later and make the whole thing migrating faster!

Note: AI tends to be faster than the times they give you with regards to the programming time. So if AI tells you it takes weeks, you may be done in a day. And if AI tells you it takes 4-6 hours, you are likely done in 30mins.

12:09pm: That takes longer than expected and several learnings on focus

4 hours later and I realized:

  • Another topic pre-occupied my mind and focus for at least an hour, personal, important, complex and strategic - I asked myself - what does that strategic content tells me? Anything important? What did I miss here? Is that something I should be doing as well - strategic work? I love it. - DAMN, my mind was active, too active the last weeks…
  • Supabase Connect via a connection string did not work, I tried everything and it failed, some firewall stuff, DNS issues, weird as it worked before but I was too unwilling to go deep deep into the topic. Especially as Supabase costs money - $10 or more specifically base $25 for 2 databases/ projects and then $10 for each follow up one. That sounded a lot.
  • Now we move back to PostgreSQL, SQLite might have done it too, but I learned it is not as flexible and powerful than PostgreSQL and when it does not make a huge difference, then why not directly moving to PostgreSQL. This time locally completely instead of via Docker. Let’s see, how we move to production with that later. For now, it’s not necessary, as the system runs locally fine as well for what we want it to do.

Another learning: FOCUS! It is so easy to loose focus: Shinier things, more interesting things, trying new tools, getting excited about a new idea. But to achieve anything, Focus is key! Let’s do focus again!

12:42pm : Maybe AI is correct this time and it takes some time:

We are still migrating data, as there are mainly issues with VARCHAR = length of content per column, we have email data in there and thus it needs to be long to give us the chance to add all the relevant data points :D

12:52pm: At some point, it is time, to call it a day

Now, we run the migration of data into our PostgreSQL table various times.

The number of errors became smaller and smaller from 7000 to 150 to 19 to 19 to 4 and 4 again.

If that is the case, at some point, with 4 errors, it’s time to look at the errors specifically: In our case, all of them had a length of an email outrageously more long than all the other ones.

Maybe instead of optimizing and including ALL contacts at that points, its a better idea to make the last contacts fitting to the structure and framework we gave it.

Edge Cases and Outliers are great, but if at some point they are overwhelmingly distort all the other over 40,000 contacts, it’s not worth the effort.

Analysis Result of our Outliers:

�� Analysis Results:
Contact 8505: Email is only 29 characters - the issue is the B-tree index, not length
Contact 10066: Website is 508 characters - contains Outlook safelinks (spam protection)
Contact 19981: Website is 487 characters - contains USPS tracking links
Contact 25110: Website is just "nan" - not a real issue

Good that we have looked, otherwise we would have been lost in endless improving, even though the improvements would not have touched upon the real issues - rather minor stuff that we can easily fix.


1:09pm: Make sure when Cursor crashes, not to let it just run by itself before not clearly stating what is going on, otherwise it overrides your previous work - just happened :D


1:16pm: Time to prepare reaching out Step One

Now, we have all the data points in our database, and while it’s still a bit messy, it is time to start working with it and reaching out to people

I wrote a text to AI to ask for:

  • Give me a batch of 5-20 contacts each per frontend
  • I reach out for now manually and then tick a box for: done
  • You save that plus potential notes and give me the next batch of contacts to work on

Now, the AI is working on it.


1:30pm: Next Issue - The AI created a Login Screen without having Login User Info

And now we are coming closer to the 4-6 hours, as the AI is not only building it for me but in a codebase that was focused on a multi-user app and that creates friction.

Better solution when starting from scratch: Build the app only for you.

Better solution, if you want to sell it: Keep it mind, it takes longer than expected

1:45pm: AI takes ages, lets do it without AI

First focus:

People that are close to me and I know I can help immediately:

Customer Success + AI + Sales DACH = Companies and People less “modern” with tech and AI + an area I have expertise in and know a lot

Contacts contacted:

||||| = 5 Contacts contacted → Great, better than 0 :D

1 Connection Request already received from a Customer Success Manager looking for a new job = First Success :D


2:06pm: AI is done and loading the first 5 Contacts is working

Fantastic Work, However, saving Notes is not yet working. We are working on it.

But I sent another message to that first contact: | = 1 Contact Done

2:22pm: We are making progress: saved first Contact Updates

I realized that many contacts are faulty, data is missing and data is chaotic.

AI may find data points, but how do they know that this is correct data?

How do we know that this is real?

So here we are - being in the same loop as 

Suchi Patel suggested - AI and Humans need to work wit each other. We are not yet in the age where AI is good enough to validate all the points of contacts for us and makes sense of it.

AI misses context!

And it is on us to provide that missing context as to improve our data accuracy and make sure we capture what is important. AI can do that for us, but will it really capture intimate, personal human interactions?


2:42pm: We updated our new workflow. Here is what AI says about it:

🔄 HOW THE SYSTEM ACTUALLY WORKS - REAL-TIME SAVING:

✅ 1. CONTACT DATA CHANGES (Company, Title, Email, LinkedIn):
Action: Edit any field → Click individual save button (��)
Saving: IMMEDIATE - saves to database right away
Result: Green notification "Company updated successfully!"
Status: Contact stays "ready" - no status change

✅ 2. ADDING NOTES:
Action: Type note → Click "Add Note" button
Saving: IMMEDIATE - saves to database with timestamp
Result: Green notification "Note added successfully!"
Status: Contact stays "ready" - no status change
Timestamp: Automatically adds [2025-08-19 14:15:22] Your note here

✅ 3. MARK AS COMPLETED:
Action: Click "Mark as Completed" button
Saving: IMMEDIATE - saves status change to database
Result: Contact moves from "ready" → "completed"
Status: CHANGES - moves to completed list
Stats: Automatically refresh

The Workflow:
Load 5 contacts → See contacts with "ready" status
Edit company → Click save button → ✅ SAVED IMMEDIATELY
Add note → Click "Add Note" → ✅ SAVED IMMEDIATELY
Mark as completed → Click button → ✅ SAVED IMMEDIATELY + Status changes

2:45pm - Let’s continue writing and updating contacts

… did not do it, wrote a Linkedin post with a great way to create Linkedin image carousels via Claude AI + Canva = Combined via MCP Servers → connect them via Connectors and add your colors and font for future designs: Done 

3:02pm - I wanted to reach out and realized - First Name and Last Name are also messy → let’s make them un-messy

I asked AI: please make sure that I am also able to adapt the name of the contact

AI’s answer: Sure, and now it’s possible.

New Contacts Contacted: ||| = 3 Contacts - Now we are at 8 out of 92 → Still a long way to go and so far it is non-focused, but that is ok, as we are just setting up the system and that takes time.

3:46pm: Learning and Adding

Learning: It always takes longer than expected

Adding new features: Adding new contacts that pop up in the process and that we contact to the mix via unstructured text - done 

This helps to enhance the contact list consistently.

It feels like beginning. But hey, it is like that. Messy and building it up.

….

5:25pm: The end for today ;)

At some point I stopped giving updates, as I was busy with 3 things:

  • Getting the system back to running - as there was an error and the AI had to restart building the dashboard - annoying, again, note from today in the morning - make sure Cursor knowls the context or it just starts over OR just destroy something working for something new - not good
  • If nothing works and you are still missing these 100 contacts you are supposed to contact today: Our goal: Go to Linkedin, find a post about a topic you work in and write to people - build connections - learn, explore, be curious, nothing more - the first step → People Contacted: 25 
  • Other strategy - partially successful so far: Use Claude AI + BRAVE API (Web Searching and Scraping API) and create a list of people that attended similar events than you before - get their Linkedin Profile and start connecting with them on Linkedin → So far got 5 contacts, need more → Tomorrow is the day to practice and test that more - Excited
  • Most important thing - documentation helps you a lot - it is about staying focused and not losing the target out of eye sight
  • Fun fact: I changed my Linkedin profile data 5 times during the day - another word, another focus - that is ok, it shows, things are moving :D

Evening Activity: Going to an AI Event - Insights follow tomorrow with the same goal as today: Reaching out to 100 people and Connecting with them!

Achievement for Today:

Roughly 35 Contacts + Non-Contacts Contacted

Answers so far: Roughly 5

—> Not a bad first day with our new system(s)!


See you tomorrow! For the next day of Sales, Growth & Connecting in the Age of AI!