- Ramsey's Blog
- Posts
- The Perfect DIY Sales Pipeline
The Perfect DIY Sales Pipeline
DW #86 🟡 (using Notion, Zapier, and Slack)

Every B2B startup needs a CRM — a place to keep tabs on your leads / prospects / customers along with any notes or status information about each of them.
But most of the popular CRM platforms out there (Hubspot, Salesforce, etc.) are clunky, cost a bunch or money, and I hate using them. So recently I decided to build my own CRM using Notion, Zapier and Slack (for free!)
Specifically, I created a simple database + dashboard in Notion that tracks each of our sales prospects across a few important dimensions, then sends a daily message into a Slack channel with an overview of our pipeline, important deals, and urgent tasks
Here’s how I built it in ~45min, and how you can do it to supercharge your business’ sales pipeline too:
Part 1: Build Sales Pipeline in Notion

Our simple sales dashboard in Notion
First, go into Notion and create a new database (ie. their fancier version of a table or spreadsheet). Each row in this table will be a client/prospect/lead. I chose to include the following fields for each:
Company Name (title property)
Created Data (so we know how long we’ve known them)
Owner: (who on our team is the lead point of contact with them)
Status: (how interested are they? ex: Qualifying, Interested, Trialing, Paid, etc)
Stage: (have we met? ex: Uncontacted, Attempted Contact, Met Once, etc.)
Value: (how big is the deal, with $ format)
Latest Notes: (1 sentence summarizing what happened in our last touchbase)
Last Touch / Days Since: (how long since we last were in contact with them?)
Pro Tip: ⭐️ tailor your Status and Stage options to match your actual sales process. Don’t copy mine or someone else’s, that how you end up with fields no one uses. Our sales process currently is pretty much email outreach → demo call → documentation/paperwork → trial period → active customer
For visualization, I added a few simple database views (you can see the charts in the image above):
Deal Value by Status (column chart)
Deals by Stage (bar chart)
% at Each Status (pie chart)
Table (of all prospects sorted by status + value)
This gives me a good visual overview of generally how many deals we have and where they are in the pipeline, in monetary terms to help me understand the financial implications.
Part 2: Daily Slack Message Summary
Here is where the magic happens; we use Zapier to automatically read the data from our Notion database and send a summary message into Slack every morning at 9am:

Zapier automation (left) to send Daily Slack message (right)
Here is how we are going to do it.
First, we use Zapier (a low-code integration/automation tool for connecting different apps together in all sorts of ways) to create an automation (“Zap”) that pulls data from Notion each morning and formats it into a clean report for slack:
I) Trigger Event
The automation begins with a simple “Schedule by Zapier” action, set for 9am daily
II) Get Notion Data
Next step is to get the data from our Notion database by connecting Zapier to Notion API:
Use a “Notion” step and choose “API Request (Beta)” as the trigger action. To consider it, you just need to set HTTP Method to POST
For the URL field, enter your Notion database ID https://api.notion.com/v1/databases/{YOUR_DB_ID}/query
Set body to blank: “{}” — this way you will get the entire response body
III) Process the Data
Use “Cody by Zapier (Javascript)” as your third step. This is where we will take the data from Notion via API and format it into something that can be put into a slack message each day.
In the input data, create the following variable to intake the data from step 2:
Name = “notionData”, Value = Response Body field from step 2
I am including the code I use here below — it calculates pipeline value overall and by status group, identifies any clients in trial or that are overdue for outreach and outputs our ‘latest notes’ for each
TBH this is the hardest part… but the good news I did not actually have to write the code. I just took the output for Response Body from step 2 and pasted it into ChatGPT along with instructions for what I wanted the output to look like and it wrote the code for me :-)
NOTE: if your database fields are different (even different names) or you want different output in your slack message, you will need to update this code!
const data = JSON.parse(inputData.notionData);
const pages = data.results;
const statusCounts = {};
const trials = [];
const critical = [];
const today = new Date();
pages.forEach(page => {
const props = page.properties;
const company = props["Company Name"]?.title?.[0]?.plain_text || "Unknown";
const status = props["Status"]?.select?.name || "No Status";
const stage = props["Stage"]?.select?.name || "";
const notes = props["Latest Notes"]?.rich_text?.[0]?.plain_text?.toLowerCase() || "";
const kickoff = props["Trial Kick-Off"]?.date?.start || null;
// Count statuses
statusCounts[status] = (statusCounts[status] || 0) + 1;
// Trials
if (status === "5. Signed Trial") {
trials.push(`${company} (Kickoff: ${kickoff || 'TBD'})`);
}
// Critical follow-ups
if (stage.includes("Due for Outreach") || notes.includes("awaiting") || notes.includes("follow-up")) {
critical.push(`${company} – ${notes}`);
}
});
// Format status breakdown
let statusSummary = Object.entries(statusCounts)
.map(([k, v]) => `- ${k}: ${v}`)
.join("\n");
return {
total: pages.length,
statusSummary,
trials: trials.join(", ") || "None",
critical: critical.join("\n") || "None"
};
IV) Send to Slack
Once you have the data formatted in step 3, finally we will send it to slack (each day at 9am according to the schedule defined in Step 1). Format everything into a clean message with sections for:
Pipeline Summary (total value, active opportunities)
Status Breakdown (deals in each stage with values)
Upcoming Trial Ingestions (from your Signed Trial status)
Critical Items (the stuff you need to follow up on ASAP)

Step 4: Slack Message Template
Part 3: Why This System Actually Works
I’ve tried many CRM solutions before, from simple google sheets to fancy $1K+/mo tools. They always ended up being more work than they were worth. This set up is different in a few ways:
Minimal manual reporting. The daily Slack update is a simple, easy reminder that happens automatically — no one needs to remember to run reports or send messages
It fits in our workflow. We already live in Notion and Slack, so building our CRM in these spots was a natural fit and keeps things close together
It focuses on what matters. The daily report highlights two main things - deals that need attention, and bird’s eye view of the whole pipeline. Not a data dump of everything
It cost $0 to build (well if you’re already paying for Zapier, Notion, and Slack, which we are, then the marginal cost is 0)
The Results?
Since implementing this system earlier this month, our team has:
Reduced deals that go cold by 80%
Cut our sales meeting time in half (the report answers most questions)
Closed 3 new trial clients that might have fallen through the cracks
Saved approximately $4,500/year vs. using a traditional CRM
Takeaways / Considerations
There are some ways to improve this, and a few caveats:
Again, you will need to customize the database / code here to fit YOUR pipeline
This overview does not cover how to actually design your sales process (that’s another story) just how to monitor it
You could improve this by adding other things like flagging deals that haven’t moved in >30days or specific follow-up notes for high-value deals
So there you have it — a lightweight sales pipeline that costs nothing but delivers actual value. You can build this in an afternoon, and your team will thank you for not making them learn another clunky tool.
In the end, who really needs Salesforce anymore?
IF you found this helpful, here is another post I wrote about how to use Notion effectively for startups. You will see I have actually changed my view on Notion as a CRM, it’s actually really great if used properly for a relatively small set of clients
Peace,
Ramsey