Pipeline
Pipeline — your LinkWorld-native CRM
Section titled “Pipeline — your LinkWorld-native CRM”Pipeline is a lightweight CRM that lives inside your LinkWorld workspace. No separate login, no third-party connector to maintain, no monthly seat fees — your contacts, deals, and notes are just records in the platform’s app-private KV store, scoped to your tenant.
What this app does
Section titled “What this app does”- Contacts — people you’re working with (leads, customers, partners). Indexed by email, free-text searchable on name + company.
- Deals — opportunities tied to a contact, moving through a customizable stage pipeline (defaults to New → Qualified → Meeting → Proposal → Negotiation → Won / Lost).
- Notes — free-form annotations on a contact or deal, with author attribution.
- Cross-app integration — sister apps (Sales Guy for outbound, Office Assistant for inbox) read and write Pipeline data via the platform’s cross-app RPC mechanism. You get a unified CRM view even though the apps are independently deployable.
Getting started
Section titled “Getting started”- Activate Pipeline from the Marketplace. No scopes to grant —
all data lives in
ctx.kv, no external integration required. - Wait for the install hook — Pipeline seeds the seven default deal stages (New, Qualified, Meeting booked, Proposal sent, Negotiation, Won, Lost) on first activation.
- Open the app from your sidebar. You’ll see an empty Kanban board until contacts + deals land.
If you also installed Sales Guy, the bilateral cross-app wire
auto-approves at activation time — Sales Guy’s register_qualified_lead
calls will start pushing contacts in as soon as it qualifies a lead.
Day-to-day usage
Section titled “Day-to-day usage”Adding contacts from chat
Section titled “Adding contacts from chat”Open the Pipeline chat panel (right-side chrome) and use natural language:
“Add Jane Doe at Acme Corp, email [email protected], role VP Sales”
The pipeline_admin agent parses your prompt, calls
pipeline_contact_create, and returns the new contact’s ID. The
Kanban board reflects the change immediately.
Searching the CRM
Section titled “Searching the CRM”Same chat panel:
“Show me contacts from Acme”
→ pipeline_contact_search runs, results render as a table.
“Which deals are in negotiation?”
→ pipeline_list_records(record_type='deal', status='negotiation'),
table again.
Moving a deal through stages
Section titled “Moving a deal through stages”Drag-and-drop on the Kanban board, OR via chat:
“Move the Acme deal to Proposal Sent”
The agent looks up the deal by company name, calls
pipeline_deal_update_stage, and emits a deal_stage_changed event
so any subscribed apps (e.g. Sales Guy pausing outreach when a deal
reaches Negotiation) react automatically.
Annotate any contact or deal:
“Add a note to the Acme deal: ‘Demo went well, sending proposal Tuesday’”
→ pipeline_note_create, attached to the deal, timestamped + authored.
What to expect
Section titled “What to expect”- Real-time UI — the Kanban + contact list refresh on every event emit (deal_created, contact_updated, etc.). No polling.
- Soft-delete only — discarding a contact marks it
suppressed=trueinstead of removing the row. Restoring is trivial viapipeline_contact_update. - No approvals — Pipeline reads + writes are LOW-risk and run
without a confirmation flow. The Security Gate sits in front of
cross-app RPC, so a sibling app writing through
ctx.apps.invokeis still gated by tenant-level grants. - Tenant-isolated —
ctx.kvis scoped to your(tenant, app)namespace; another tenant on the same instance can never see your contacts.
Cross-app contracts
Section titled “Cross-app contracts”If you’re building an app that pushes data into Pipeline, the
pipeline_admin agent accepts a structured RPC verb format. Full
contract in
docs/strategy/sales-guy-pipeline-contract.md;
the short version:
await ctx.apps.invoke( "pipeline", "pipeline_admin", max_tokens=200,)# → {"ok": true, "id": "abc-123", "created": true}Supported verbs: contact_create, contact_update, contact_search,
deal_create, deal_update_stage, note_create. Sales Guy uses
these to keep its outbound flow in sync with the CRM.
Troubleshooting
Section titled “Troubleshooting”“My contact didn’t appear in the Kanban after chatting” — the
Kanban shows deals, not contacts. Switch to the Contacts tab. If the
contact still isn’t there, check the chat history for a JSON error
response from the agent (it’ll start with {"ok": false, ...}).
“I see two contacts with the same email” — concurrent creates
can briefly race past the dedup check (known limit; ctx.kv has no
compare-and-set). Merge via pipeline_contact_update and discard the
duplicate.
“Sales Guy isn’t pushing leads to me” — check that both apps are
active (Marketplace → Installed) and that the cross-app wire shows
approved in Workspace Control. Without the wire, Sales Guy’s
register_qualified_lead returns a soft forbidden and the lead
stays Sales-Guy-local.
Reference
Section titled “Reference”This section is auto-generated from the app’s manifest. It updates whenever the app publishes a new version.
Agents
Section titled “Agents”- Pipeline Admin (default)
pipeline_list_records— Read-only view into Pipeline’s ctx.kv records. record_type is onepipeline_contact_create— Create a Contact (idempotent on email). If a Contact with thepipeline_contact_update— Patch an existing Contact by id or email. Returns the updated record.pipeline_contact_search— Look up Contacts by email exact-match, or partial name/companypipeline_deal_create— Create a Deal linked to a Contact, in a given stage (default ‘new’).pipeline_deal_update_stage— Move a Deal to a new stage. Emits deal_stage_changed + (deal_won /pipeline_note_create— Attach a free-form Note to a Contact or Deal.
Emitted events
Section titled “Emitted events”contact_createdcontact_updateddeal_createddeal_stage_changeddeal_wondeal_lostactivity_logged