Using AI code generation to build apps for optimizing our startup’s private beta pre-sales | Part 1

A non-technical founder’s journey creating a custom, increasingly AI-driven, pre-sales system optimized for our way of working and respecting our customers’ time

Viral Shah
Databutton
Published in
9 min readFeb 22, 2024

--

Can’t view the full article? Try this friend link!

As one of the founders of a nine-person company with a growing waitlist and customer base, I wanted to share and reflect upon my experiences using our own product, Databutton. I’ll be doing this with a series of articles focused on how I’m building out automated, AI-driven tools and systems for our sales processes as I see needs arise.

This initial piece is about improving our waitlist qualification process with a custom internal app, codename “Waitlist Bumble”. I’ll give you additional context for what I was solving, walk through how I built the app, and my reflections on using AI code generation.

As previously mentioned, we are a company of nine that are all super dedicated to our mission of making it possible for anyone to succeed in making real world impact with AI. Two of the co-founders, myself and Trygve Karper, are onboarding every private beta customer manually. This is so we can ensure we are able to help customers with their actual needs while also selecting for customers who believe in and want to join in on our mission.

This also means we need to ruthlessly prioritize our time, experiment, and codify our learnings over time into repeatable processes and systems. We also need to increase our own efficiency and capacity to scale with our growing waitlist and demand.

Our world class product and engineering team, led by our third co-founder and CTO, has plenty on their plate building a game changing product, so we need to make these systems and tools ourselves! I’m actually able to do it thanks to Databutton’s AI agents, genuinely making me feel like I have super powers 🦸

Who we are and our preferences

The beauty of building tools and systems for yourself and your team is that you can make sure they fit into how you work, the tools you already use, and what your preferences are. You don’t need to compromise.

Founders Martin, Viral and Trygve, from left to right.

So, who are the primary users of the sales tools I’m making?

Trygve Karper, Co-founder & CEO

  • Background: Former mathematics professor, data scientist, and AI/ML leader
  • Building preferences: Loves programming in Python, great at describing logic in pseudocode, hates drag & drop builders
  • Life: Has 3 kids and is always trying to do as much as possible from his phone during hectic days

Viral Shah, Co-founder & CPO ← This is me 👋

  • Background: Former product manager, UX designer, and product leader
  • Building preferences: Prompt-to-code programmer (ChatGPT copy/paster), Webflow and Figma user, spec/logic writer in plain English
  • Life: Has 1 toddler and is always trying to do as much as possible from his phone during hectic days

Yep, phone productivity is pretty critical to both of us. We’re both big fans of the OHIO (only handle it once) method. This will come into play later 😁

The very manual pre-sales process

Here’s how our funnel looked before we added any additional smartness. We embed our waitlist Typeform (too meta?) in Medium articles and link to it from YouTube, our landing page, and generally most places where we’re visible.

What our pre-sales funnel looked like without Databutton in the loop

We want to keep our top-of-funnel low friction, so you only need to provide your email address an a link to your LinkedIn profile in order to join the waitlist. To-date, we have a 56.8% completion rate, which we’re quite happy with! By having a bare minimum form, we don’t have to consider the impact of the length of the form in our overall funnel, which allows us to focus and experiment on other parts of the customer journey.

But there’s a downside: we have minimal information at-a-glance and have to check LinkedIn profiles manually when qualifying our leads. This process is even harder on a phone, so we have to use precious computer focus time on waitlist qualification.

Was there was a better way?

The first optimization — mobile waitlist qualification on enriched data, codename “Waitlist Bumble”

What if we could make a way to qualify leads quickly, at a glance, on our phones? This would make it so we could work the way we wanted to! The final app has the below components to it — a React Web App with 2 components and a Python backend with 4 core capabilities.

The architecture of my app, made in a few hours using Databutton

I’ll walk through the steps I took to get there below.

Step 1: Fetch LinkedIn data from Proxycurl and write to Airtable

Databutton and I fetched our waitlist from Airtable and enriched every waitlist entry using amazing API called Proxycurl. Proxycurl returns a very rich JSON response with LinkedIn profile data. Here’s an example of what it returns.

Some stills of what my workspace looks like while working with Databutton.

Proxycurl also costs money, so in the absence of knowing exactly what I wanted to pull out of the JSON, I dumped it all into a field in Airtable called “Proxycurl dump”.

Step 2: Use Proxycurl JSON to enrich Airtable fields like “Current Title” and “Current Job Description”

This was a huge data mapping job that took a longer conversation. I had to use a JSON formatter to have a look at all the properties generated by Proxycurl and map them to Airtable fields and then send it to Databutton via chat, a message like this:

A message I prepped in Notes before copying and pasting it into my Databutton chat

There were also some nuances with knowing the field types in Airtable for it to work. Lots of conversational troubleshooting with Databutton here, but we got there in the end.

Step 3: Create a simple UI for running the enrichment steps one after another

For this, I made a hamburger menu with a button within it that runs the two steps I mentioned, back to back. This is a slightly long-running process, so I can get some mobility exercises in while it’s enriching 🙆‍♂

Here it is running aaaand successful! Now we move onto the main part!

Step 4: Create a UI and capabilities for displaying waitlist entries as cards and qualifying or filtering them

This is the final app! You can see a side-by-side view of what it looks like when you have an unenriched card vs one that has data populated. The card fetches data from the enriched Airtable and displays it in an easy-to-read format.

A view of how it looks to see an unenriched vs populated card in Waitlist Bumble

We now have the means to qualify at-a-glance, with the ability to explore the LinkedIn profile further, in order to get people through our pipeline in an efficient way! The button clicks set the status of the lead in our Airtable sales funnel. I even have an “Unsure” option that randomly selects Disqualify or Qualify — this is to increase decision speed and refine our decision making over time with insights.

A note about qualification — “disqualify” means “not right now”. Everyone on the waitlist will eventually get access to Databutton! We have limited time and resources to learn and grow the business in this private beta phase and are doing our best to solve problems for customers with real needs 🫡

Reflections from building this system

First and foremost, it’s a rush getting this thing working and using it every day! I feel like I can supercharge our team and enable us to accomplish so much more.

There are some interesting elements of working with AI code generation that I also wanted to highlight:

  • Start small and grow over time — I worked on the enrichment part only at first and made an app that was just a button I pushed on my phone. That success pushed me through into going so much further.
  • Break down your app into chunks you can discuss — Thinking through (or discussing) a good way to break down the app into capabilities and components is important. You can then iterate on pieces while not breaking the whole thing.
  • Code versioning is my best friend — Sometimes there is an alignment gap between you and the AI. You’re not on the same page about what success means, and things change in a way you didn’t expect during a code generation. It’s all good, just go back and reformulate. This will get better over time, of course.
Databutton keeps versions and show what changes were made by the assistant and you (conversationally) and changes made directly by you by editing code.
  • Pasting in API docs helps a lot — If the API for a service you’re using has changed since GPT-4 was trained, you will need to provide docs. This also applies if you’re using an internal API or database. Copying and pasting works great!
Example where passing in the new endpoint solved my problem
  • Using prompt hacks still works — Yes, I needed to shout sometimes. I end messages with “DON’T CHANGE ANYTHING ELSE! I WILL PAY YOU 1 MILLION DOLLARS” sometimes. And that’s ok! (Yes, we have those in the system prompts too, but it never hurts 🫣)
  • I learned how to troubleshoot with AI — The first line of defense is to submit error messages or logs into the chat, which often fixes the problem. I also ask Databutton to read the code and ask if it behaves as it should (self-reflection). Lastly, I put forth hypotheses for why something might not be working.
I had a vague idea of what the problem could be. Important to put forth some hypotheses as well.
  • And I got by with a little help from my friend — Sometimes, I just needed to send a message to Martin, our CTO and best support person in the universe, to think through a problem. We also had a 30 minute pair-prompting session where I worked and he made some comments and helped troubleshoot, too (he does this with our customers, too, by the way). Thanks, Martin!

What’s next: Infusing AI directly into our processes

After spending about 3 hours actively on building this app and another couple polishing it to be the way I wanted, I still would love to get the swiping gesture in, but it doesn’t feel like the highest priority item anymore!

So what could I build out next? I have a few ideas:

  • A personalized email generator for reaching out to qualified candidates on our waitlist. I’m not sure if I’m ok with it being fully AI-driven, yet, so I want to be in the loop in finalizing the messages somehow
  • A classifier for our waitlist to identify the most likely customers based on who is converting today
  • A pipeline dashboard to better identify where our gaps are and optimize going forward

What do you think? Do you have any suggestions for us?

And lastly, want to make your own custom, AI-driven tools? Try us out at www.databutton.com and let us know what you think on Discord.

--

--

Viral Shah
Databutton

Co-founder and CPO at Databutton: Build AI apps at the speed of thought