Not every team that tracks relationships should be given a seat in the company CRM. Here is the model behind a small one, the prompts to build it, and what it takes to run it.
Your private status link is on its way to your inbox.
A lightweight CRM is four parts: organisations and contacts kept as separate records, an interaction log that is append-only, a pipeline with stages that mean something to this team, and a clear boundary with the company CRM so the two never compete. The reason to build one rather than buy a seat is that partnerships, recruiting, investor relations and community teams all track relationships that would pollute the sales pipeline. The reason most fail is that nobody decides which system wins when they disagree.
Partnerships CRM
184
Organisations
612
Contacts
11
Gone quiet, 90 days
4
In both systems, no owner
Cordell Group
Reseller partner since March 2025 · owner T. Okafor · also in Salesforce, owned there
Interaction history
You run partnerships, recruiting, investor relations, community or supplier management. You track relationships, and putting them in the sales CRM would be wrong for both of you. What you want is something small that does not pretend to be Salesforce.
What a partnerships or recruiting team actually does with it, week to week.
Linked by a dated relationship, so when somebody changes company the history follows the person rather than vanishing.
Paste an email or notes and let the assistant draft the fields. Interaction logs stay empty when filling them in is tedious.
Introduced, exploring, agreed in principle, contracted, live. Copying the sales stages produces a pipeline nobody updates.
Ranked by importance rather than by how long it has been, because the two are different questions.
Whether it also exists in the company CRM, and which system owns the relationship.
That is the row where two teams eventually contradict each other in front of the customer.
A lightweight CRM is not a smaller Salesforce. It is four parts, and the fourth one is the decision most people skip.
The company, fund, agency or institution. With a type, a status, an owner, and the attributes this team actually segments on, which will not be the ones sales uses.
People, linked to an organisation but kept as their own record. People move between organisations and the history should move with them rather than vanishing.
Every meeting, call, email and introduction, appended, with who was there and what came of it. This is the part that makes the system worth opening.
A written rule about which system owns which relationship, what syncs, and which wins when they disagree. Without it you have two truths.
These prompts start from a Helix project, which is what handles sign-in, credentials and hosting. Start with Helix
Paste these into Claude Code, Codex or Cursor in order. Each one leaves you with something that runs, so you can stop after any step.
Because people move and the history should survive it.
In this Helix project, build me a lightweight CRM for a team whose
relationships do not belong in the sales CRM.
Two record types, and keep them genuinely separate.
Organisations: name, type, website, region, size band, status, a named
owner on our side, and a few attributes I will define, because what this
team segments on is not what sales segments on.
Contacts: name, role, email, phone, and a link to their organisation, as
a relationship with a start and end date rather than a field. When
somebody moves to a new company, the history stays with the person and
the new relationship is added. Losing that history is the most common
way this kind of app disappoints.
Let one contact be linked to several organisations over time, and show
the full history on the contact.
I sign in through Helix, so do not build a login page. Read the signed-in
user from the runtime. And do not put any key or connection string in the
code: if this needs to reach another system, tell me and I will create the
connection in my workspace. Worth knowing. Modelling the person-to-organisation link as a dated relationship rather than a foreign key costs nothing now and is expensive to retrofit the first time somebody changes job.
The part that makes it worth opening.
Add interactions, and make logging one take under thirty seconds.
Each interaction: date, type (meeting, call, email, event, introduction,
note), the organisation, which contacts were involved, who from our side,
a summary, and any follow-up with an owner and a date.
Append-only. Corrections are new entries referencing the earlier one.
Let me paste an email or a set of notes and have you draft the fields for
me to correct, because the reason interaction logs stay empty is that
filling them in is tedious.
Show the full history on both the organisation and every contact
involved, and surface the ones that have gone quiet: organisations with
no interaction for longer than a threshold I set, ranked by how important
they are rather than how long it has been. Not a copy of the sales one.
Add a pipeline, and let this team define the stages.
A pipeline record links to an organisation, has a stage, an owner, an
expected value or outcome, an expected date, and a next step.
Put the stages in a config file and seed them with something generic, but
make it obvious they are meant to be replaced. A partnerships pipeline is
not prospecting, qualification, proposal, closed. It is more like
introduced, exploring, agreed in principle, contracted, live. A recruiting
pipeline is different again.
Copying the sales pipeline into a partnerships tool produces a pipeline
nobody updates, because the stages do not describe anything that
actually happens.
Show it as a board, with anything that has not moved for a set period
flagged. The decision most of these apps skip.
Last, and most important: define the boundary with the company CRM.
Add a field on every organisation recording whether it also exists in the
company CRM, with the link if so, and which system owns the
relationship.
Then pick a rule and enforce it in the app. Either this system is
authoritative for its own relationships and never writes to the CRM, or
it reads the CRM for shared accounts and marks those records read-only
here. Both are defensible. Having neither is not.
Flag any organisation that exists in both with no owner recorded, because
that is the row where two teams will eventually contradict each other in
front of the customer.
Then a handful of reports: interactions per organisation over time, the
relationships gone quiet, pipeline by stage, and contacts whose email has
bounced or whose role has changed, which is the maintenance nobody
does. Worth knowing. The boundary rule is what stops this becoming a shadow CRM. It is a paragraph of policy and a field, and skipping it is how you end up with two truths.
The step that turns a working prototype into something with your data in it.
Now connect it to the systems we actually run, so it works on real data
rather than the rows you seeded.
Anything in angle brackets is a placeholder. Swap it for whatever we use
instead, and have the app name the connection it wants rather than assume
a vendor, so changing my mind later is a config change and not a rewrite.
<Salesforce>. Read shared accounts so the boundary is real, and mark those
records read-only here rather than maintaining two truths.
<Okta>. Authenticate every user, because contact records are personal data
about people outside your company and an anonymous reader is not
acceptable.
<Gmail>. Log interactions from email without anybody retyping them, which
is what keeps the history alive.
<Google Calendar>. Pull meetings automatically so a logged interaction is
the default rather than an act of discipline.
<Slack>. Nudge an owner when an important relationship has gone quiet.
<DocuSign>. Read whether the agreement behind a contracted relationship
was actually signed.
<Snowflake>. Land the interaction history, so a question like which
relationships have gone quiet can be asked across years rather than
months.
Only write where I have said to write. Everything else is read only.
Do not write a key, a token or a connection string anywhere in the code,
and do not ask me to paste one. Tell me which connections you need and I
will create each as an authentication in my Helix workspace. Reference
them by alias. Worth knowing. Every name in angle brackets is a placeholder for whatever you run. Helix holds the credential as a workspace authentication, so the app references an alias and never the secret itself.
The last step of every build: a URL, and the right people on it.
Deploy my app. Worth knowing. Your assistant runs helix deploy underneath and the app comes back as a URL. Contact records are personal data, so set Access Control before sharing and decide your retention rule early.
A lightweight CRM should read from the company CRM rather than compete with it, which is most of what these connections are for.
Salesforce
Read shared accounts so the boundary is real, and mark those records read-only here rather than maintaining two truths.
Okta
Authenticate every user, because contact records are personal data about people outside your company and an anonymous reader is not acceptable.
Gmail
Log interactions from email without anybody retyping them, which is what keeps the history alive.
Google Calendar
Pull meetings automatically so a logged interaction is the default rather than an act of discipline.
Slack
Nudge an owner when an important relationship has gone quiet.
DocuSign
Read whether the agreement behind a contracted relationship was actually signed.
Snowflake
Land the interaction history, so a question like which relationships have gone quiet can be asked across years rather than months.
Each line says whether the app reads, writes or both. Anything not described as writing should be read only.
Named systems are the ones most teams actually run, not a list of the only ones that work. Swap in whatever you use.
Each connection is an authentication in your Helix workspace, referenced by alias. The app names the connection it wants and never holds the credential, so nothing here ends up in your code and any of it can be rotated or revoked without a redeploy.
The build gets you a working CRM. It holds personal data about people outside your company, which brings obligations, so it needs to be run properly.
AI Deployment
One command takes the app from your assistant to a live address, so the people who need it get a link rather than instructions for running it locally.
App Security
Contact records are personal data about people outside your company. SSO means every reader is a verified person, and scoped access keeps the records to the team that owns them. That pair is the baseline expectation for holding personal data at all.
App Security
Reading the company CRM to respect the boundary, and enriching contacts, needs real access. Granting it to the app rather than pasting a key into it means it can be rotated or revoked without a redeploy.
App Registry
Every app carries a named owner and an entry IT can see, so the tool does not become nobody's problem when the person who built it changes role.
Cost Management
Per-app spend visibility, with budgets and caps, so an internal tool cannot quietly become a line item nobody can explain.
Because partnerships, recruiting, investor relations and community relationships would pollute the sales pipeline, and giving those teams CRM seats usually means giving them a tool shaped for a different job. A small system that does not pretend to be Salesforce is often the right answer.
Storing the contact's organisation as a field rather than a dated relationship. People move between companies, and when they do the history should follow the person rather than disappearing with their old employer.
The interaction log, and how fast it is to add to. A CRM without interaction history is an address book with extra fields, and one where logging a meeting takes two minutes stays empty.
No. Prospecting, qualification, proposal and closed describe a sales motion. A partnerships pipeline runs introduced, exploring, agreed in principle, contracted, live. Copying the sales stages produces a pipeline nobody updates because it does not describe what happens.
Decide the boundary before you build. Either this system is authoritative for its own relationships and never writes to the company CRM, or it reads the CRM for shared accounts and marks them read-only. Both work. Having no rule means two truths and an eventual contradiction in front of a customer.
Yes. The prompts here are written for Claude Code, Codex or Cursor and stage the build. The judgement calls are your stages and your boundary rule, and the second one matters more.
Sales and RevOps
Register referrals, protect them for a defined window, show partners the status of their own deals, and calculate what you owe. Prompts to build it, and what it takes to run it.
Sales and RevOps
Assemble what you already know about an account, add what is public, and keep the result so the next person does not start from nothing. Prompts to build it, and what it takes to run it.
Customer Success
Build a health score from signals that actually predict renewal, show the trend rather than the number, and turn a red account into a named action. Prompts to build it, and what it takes to run it.
Last reviewed September 2026.
Helix is the governed runtime for AI-built apps. Deploy what you build, put SSO in front of it, connect it to your systems with managed credentials, and give it a named owner.
Your private status link is on its way to your inbox.