play icon for videos
← Academy
Analyze · Other

How to build a relationship record

Relationship intelligence should be a record, not a mailbox of interactions. Here is how to join every touch, document, and number onto one Contact ID, code it to a codebook, and read a whole relationship into a single cited brief.

<!DOCTYPE html> <html lang="en"> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width, initial-scale=1"> <style> *{box-sizing:border-box} body{margin:0;font-family:'Hanken Grotesk',-apple-system,BlinkMacSystemFont,sans-serif;background:#F7F4EC;padding:24px;display:flex;justify-content:center} .card{width:600px;max-width:100%;background:#FFFFFF;border:1px solid #ECE4D4;border-radius:20px;box-shadow:0 24px 60px -34px rgba(60,40,20,.34),0 2px 4px rgba(60,40,20,.05);overflow:hidden} .hdr{display:flex;align-items:center;gap:11px;padding:16px 20px;border-bottom:1px solid #F0E9DB;background:#F7F4EC} .hdr .n{font-family:'Newsreader',Georgia,serif;font-weight:600;font-size:16px;color:#2A2118;letter-spacing:-.2px;line-height:1.25;min-width:0} .hdr .pill{margin-left:auto;display:inline-flex;align-items:center;gap:6px;font-size:11.5px;font-weight:700;color:#C05B3F;background:#F6E7E1;padding:5px 11px;border-radius:20px;white-space:nowrap;flex-shrink:0} .hdr .pill .d{width:6px;height:6px;border-radius:50%;background:#C05B3F} .tabs{display:flex;gap:0;padding:12px 14px 0;background:#F7F4EC;flex-wrap:wrap} .tab{flex:1;min-width:76px;display:flex;flex-direction:column;align-items:center;gap:5px;cursor:pointer;font-family:inherit;font-size:11px;font-weight:700;color:#8A7B66;background:transparent;border:none;border-bottom:2px solid transparent;padding:8px 4px 10px} .tab .lbl{line-height:1.2;text-align:center} .tab.on{font-weight:800;color:#C05B3F;border-bottom-color:#C05B3F} .tab .num{display:inline-flex;width:20px;height:20px;align-items:center;justify-content:center;border-radius:50%;font-size:11px;font-weight:800;color:#8A7B66;background:#F0E9DB} .tab.on .num{color:#fff;background:#C05B3F} .divider{height:1px;background:#F0E9DB} .body{padding:20px} .what{font-size:13.5px;line-height:1.55;color:#4A4030;margin:0 0 14px} .promptlbl{font-size:10px;font-weight:800;letter-spacing:1px;text-transform:uppercase;color:#B0A48D;margin-bottom:7px} .bubble{position:relative;font-family:ui-monospace,'SF Mono',Menlo,monospace;font-size:11.5px;line-height:1.55;color:#2A2118;background:#F7F4EC;border:1px solid #ECE4D4;border-left:3px solid #C05B3F;border-radius:12px;padding:13px 14px;white-space:pre-wrap;word-break:break-word} .actions{display:flex;align-items:center;gap:14px;margin-top:13px;flex-wrap:wrap} .copy{font-family:inherit;font-size:12px;font-weight:700;color:#C05B3F;background:#F6E7E1;border:1px solid #EFD5CC;border-radius:9px;padding:8px 14px;cursor:pointer} .copy.done{color:#15884F;background:#E4F1EA;border-color:#CBE6D6} .demo{font-size:12.5px;font-weight:700;color:#C05B3F;text-decoration:none} .demo:hover{text-decoration:underline} </style> </head> <body> <div class="card"> <div class="hdr"> <div class="n">How to build a relationship record</div> <span class="pill"><span class="d"></span>Sopact Sense</span> </div> <div class="tabs" id="tabs"></div> <div class="divider"></div> <div class="body"> <p class="what" id="what"></p> <div class="promptlbl">Copy-paste Sopact Assistant prompt</div> <div class="bubble" id="prompt"></div> <div class="actions"> <button type="button" class="copy" id="copyBtn">Copy prompt</button> <a class="demo" href="https://www.sopact.com/request-demo" target="_blank" rel="noopener">Request a demo &rarr;</a> </div> </div> </div> <script> (function(){ var D = {"title":"How to build a relationship record","pill":"Sopact Sense","steps":[{"n":1,"tab":"One record","what":"Bring every interaction — survey, document, meeting note, check-in — onto the same stakeholder Contact ID instead of scattered threads.","prompt":"Attach every interaction for this stakeholder — surveys, documents, meeting notes, check-ins — to their single persistent Contact ID [ID]. List anything currently living in a separate thread or spreadsheet that needs to be joined to the record."},{"n":2,"tab":"Code to codebook","what":"Map the qualitative signal to your codebook so a score and the sentence behind it live together on the record.","prompt":"Code the qualitative signal in this stakeholder's record [RECORD] against our codebook. For each theme, return the score and the exact source sentence behind it, so the number and its evidence stay together."},{"n":3,"tab":"One-page brief","what":"Synthesize the whole record into a single relationship brief — everything cited, nothing inferred.","prompt":"Synthesize this stakeholder's full record [RECORD] into a one-page relationship brief: current status, key needs or commitments with the source sentence, open flags, and what changed since the last touch — everything cited to the record, nothing inferred."},{"n":4,"tab":"Keep it safe","what":"Keep the record first-party and reproducible — exclude sensitive fields from AI and run on anonymized IDs where needed.","prompt":"Re-run this synthesis excluding the sensitive fields [FIELD LIST] and using anonymized IDs. Confirm the output is reproducible from the record and flag any line that could not be traced to a source sentence."}]}; var tabsEl = document.getElementById('tabs'); var whatEl = document.getElementById('what'); var promptEl = document.getElementById('prompt'); var copyEl = document.getElementById('copyBtn'); var cur = 0; function renderTabs(){ tabsEl.innerHTML=''; D.steps.forEach(function(st,i){ var b=document.createElement('button'); b.type='button'; b.className='tab'+(i===cur?' on':''); b.innerHTML='<span class="num">'+st.n+'</span><span class="lbl">'+st.tab+'</span>'; b.addEventListener('click',function(){cur=i;render();}); tabsEl.appendChild(b); }); } function render(){ renderTabs(); var st=D.steps[cur]; whatEl.textContent=st.what; promptEl.textContent=st.prompt; copyEl.textContent='Copy prompt'; copyEl.classList.remove('done'); } copyEl.addEventListener('click',function(){ var txt=D.steps[cur].prompt; function ok(){copyEl.textContent='Copied ✓';copyEl.classList.add('done');} if(navigator.clipboard&&navigator.clipboard.writeText){ navigator.clipboard.writeText(txt).then(ok,function(){fallback(txt,ok);}); }else{fallback(txt,ok);} }); function fallback(txt,ok){ var ta=document.createElement('textarea'); ta.value=txt;ta.style.position='fixed';ta.style.opacity='0'; document.body.appendChild(ta);ta.focus();ta.select(); try{document.execCommand('copy');ok();}catch(e){} document.body.removeChild(ta); } render(); })(); </script> </body> </html>

In short: Build a relationship record by attaching every interaction — survey, document, meeting note, check-in — to one persistent Contact ID, coding the qualitative signal against a codebook so a score and its source sentence live together, and synthesizing the whole record into a single cited brief. Keep it first-party and reproducible rather than a fresh guess each run. In Sopact Sense relationship intelligence becomes a record you can trace, not a mailbox of interactions you re-read from memory.

1 · Bring every interaction onto one Contact ID

A relationship without a record forgets what was said. The first move is to stop treating a stakeholder as a set of scattered threads — an email chain here, a meeting note there, a survey in a separate tool — and attach every interaction to the same persistent Contact ID. In Sopact Sense that ID is assigned at first contact and carried forward, so surveys, uploaded documents, meeting notes, and check-ins all land on one record instead of four disconnected places you have to reassemble by hand.

Attach every interaction for this stakeholder — surveys, documents, meeting notes, check-ins — to their single persistent Contact ID [ID]. List anything currently living in a separate thread or spreadsheet that needs to be joined to the record.

2 · Code the qualitative signal to a codebook

Once the interactions live on one record, the qualitative signal — what the stakeholder actually said — has to be coded consistently, or the record is just a longer pile of text. Map each open response and note to your codebook so the score and the exact sentence behind it stay together. That pairing is what makes the record defensible: every rating points back to the words that produced it. The codebook itself is worth building deliberately — see how to build a data dictionary.

Code the qualitative signal in this stakeholder's record [RECORD] against our codebook. For each theme, return the score and the exact source sentence behind it, so the number and its evidence stay together.

Expected output. A themed table for the stakeholder: each code with its score and the source sentence that justifies it, so a reviewer can trace every number to the record. Input: the coded interactions on the Contact ID plus your codebook. Output: a score-plus-evidence table per theme.

3 · Synthesize the whole record into one brief

With the record joined and coded, read one stakeholder's entire history into a single relationship brief — the Intelligent Row view of that person or organization. The brief states current status, key needs or commitments with the source sentence, open flags, and what changed since the last touch. Everything is cited to the record; nothing is inferred.

Synthesize this stakeholder's full record [RECORD] into a one-page relationship brief: current status, key needs or commitments with the source sentence, open flags, and what changed since the last touch — everything cited to the record, nothing inferred.

Expected output. A one-page brief with four blocks — status, needs and commitments, open flags, and change-since-last-touch — each line carrying the source sentence it came from. Input: the coded record on the Contact ID. Output: a cited one-page relationship brief.

GRADE: green | status + change-since-last-touch | every line cited to the record; amber | needs/commitments | coded but not yet verified with the stakeholder; red | open flags | inferred rather than drawn from a source sentence

Green is a brief where status and what-changed are each backed by a source sentence on the record. Amber is a coded need or commitment that has not yet been confirmed with the stakeholder. Red is any flag the model inferred without a sentence behind it — those get removed or traced before the brief is used.

4 · Keep the record first-party and reproducible

The record is only an asset if it can be trusted twice. Exclude sensitive fields from AI processing and run synthesis on anonymized IDs where the work requires it, and require every line of a brief to trace to a source sentence so the same run returns the same cited result rather than a fresh guess.

Re-run this synthesis excluding the sensitive fields [FIELD LIST] and using anonymized IDs. Confirm the output is reproducible from the record and flag any line that could not be traced to a source sentence.

Tricks, tips, and troubleshooting

A relationship without a record forgets what was said. The value is not any single interaction — it is the connected history on one ID. If you find yourself re-reading old threads to remember where a relationship stands, the record has not actually been built yet.

Keep score and sentence together. A theme score with no source sentence is an opinion; a source sentence with no code is unstructured text. The record earns its keep only when every number carries the words behind it.

Exclude sensitive fields and run on anonymized IDs. Where a record holds personal or protected information, keep those fields out of AI processing and synthesize on anonymized IDs, so the brief stays useful without exposing what should not be exposed.

Improve your synthesis accuracy with your own language. Point the Assistant at your program page or brief so it uses your framework and terms, not generic labels, when it codes and summarizes the record.

Read our program page [URL] and re-run the record synthesis using our own outcome and indicator language, so the brief speaks in our framework rather than generic terms.

Frequently asked questions

How do you build a relationship record?

Build a relationship record by attaching every interaction — survey, document, meeting note, check-in — to one persistent Contact ID for the stakeholder, instead of leaving them scattered across threads and spreadsheets. Map the qualitative signal to a codebook so a score and the source sentence behind it live together, then synthesize the whole record into a single one-page brief that cites everything to the record and infers nothing. In Sopact Sense the record is first-party and reproducible, so relationship intelligence is a durable asset rather than a mailbox of interactions you re-read from memory each time.

What is the difference between relationship intelligence and a CRM inbox?

A CRM inbox stores interactions as separate threads — emails here, meeting notes there, a survey somewhere else — so understanding a relationship means re-reading and re-remembering every time. Relationship intelligence joins all of it onto one Contact ID and codes the qualitative signal against a codebook, so the current status, open commitments, and what changed since the last touch can be read from one record with the evidence attached. The record remembers what was said; an inbox only holds where it was said.

How do you keep a relationship record safe and reproducible?

Keep a relationship record safe by excluding sensitive fields from AI processing and running synthesis on anonymized IDs where needed, and keep it reproducible by ensuring every line of a brief traces to a source sentence in the record rather than to an inference. Because Sopact Sense works over a first-party record, the same synthesis run twice returns the same cited result — so a relationship brief can be defended, not just generated.

Related from the Academy

Ready to try it for yourself?

Open Sopact Sense, paste your program description, and put it to work.

Try in Sopact