Dein Partner-CRM aus Code verwalten

Du liest, änderst und synchronisierst dein Partner-CRM aus einem Workflow, einer App-Action oder einem Agent.

Wer es nutzen kann

Der Workspace-Sponsor muss ein aktiver Partner sein. Der Code jedes Mitglieds handelt dann auf dem CRM dieses Partners: Er kann jeden Lead lesen und ändern und aus Orbitype auf die Credits des Partners importieren. Es funktioniert in Workflows, Agents und App-Actions. Öffne das Partner-Portal für dieselbe Pipeline. Methoden geben { error } zurück, statt zu werfen.

Leads lesen

  • partner.crm.list(filters) gibt { leads, total } zurück.
  • partner.crm.get(id) gibt einen Lead mit seiner Timeline zurück. Die Timeline zeigt deine eigene Aktivität. Aktivität eines früheren Partners ist ausgeblendet.
  • partner.crm.lookup({ email, linkedinUrl, website }) prüft eine Person, bevor du sie anlegst.
  • partner.crm.forecast(filters) gibt Pipeline-Summen zurück.
  • partner.crm.dealTotals(deal) gibt die Rechnung für einen Deal zurück.
async ({ partner }) => {
  const { leads } = await partner.crm.list({ status: "New" })
  return leads
}

Anlegen und importieren

  • partner.crm.create({ profile, deal }) braucht eine E-Mail oder eine LinkedIn-URL.
  • partner.crm.import(rows) nimmt bis zu 500 Zeilen.

Ein gesperrtes Konto kommt als { error } zurück (403). Ein Lead, den ein anderer Partner besitzt, kommt als { error } zurück (409).

Leads verschieben und Deals ändern

  • partner.crm.update({ id, profile, deal, status })
  • partner.crm.setStatus(id, status, fadedReason)
  • partner.crm.updateDeal(id, deal)

Status, der Reihe nach: New, First email, First call, Deploy Pilot / Trial Sign up, Provide Feedback, Implement Changes, Analyze Data, Meet with other stakeholders, Design full scale and scope, Leadership approval, IT department approval, Legal Approval, Budget Approval, Signed Contract, Money Received, Faded Out.

Ein Lead, der noch in New ist, wird 7 Tage nach der Zuweisung freigegeben. Danach gibt jeder Wechsel in eine Stufe, die der Lead noch nicht erreicht hat, 83 weitere Tage, 90 Tage insgesamt. Zurück und wieder vor verlängert das Fenster nicht. Jeder offene Lead hat releaseAt.

Aktivität festhalten

  • partner.crm.addActivity({ id, type, title, body }) — type ist note, call oder email.
  • partner.crm.addNote(id, body)
async ({ partner }) => {
  await partner.crm.setStatus(leadId, "First email")
  await partner.crm.addNote(leadId, "Sent the intro mail")
}

Aus einem ICP importieren

  • partner.crm.icps() gibt die drei ICPs und creditsLeft zurück.
  • partner.crm.importIcp(icpId) füllt New-Leads bis 100 auf. 80 in New importieren 20.

Die ICPs sind saas-founder, agency und enterprise. Jeder Kontakt kostet den normalen Preis für volle Kontaktdaten, bis zu 18 Lead Credits. Der Stapel stoppt, wenn die Credits aufgebraucht sind. Du kannst einmal pro Lauf importieren. Ein neuer Lead muss New innerhalb von 7 Tagen verlassen, sonst geht er zurück in den Pool.

async ({ partner }) => {
  return await partner.crm.importIcp("saas-founder")
}

Mit einem anderen CRM abgleichen

partner.crm.changes({ since, cursor }) gibt Leads zurück, die sich nach since geändert haben, plus removed und nextCursor. partner.crm.allChangesSince(since) geht jede Seite durch.

partner.crm.upsert({ match, profile, deal, status }) ändert deinen Lead oder legt einen an. Die Treffer-Reihenfolge ist id, dann externalId, dann email, dann linkedinUrl.

async ({ partner }) => {
  const { leads, removed } = await partner.crm.allChangesSince("2026-01-01T00:00:00.000Z")
  for (const lead of leads) {
    await partner.crm.upsert({
      match: { externalId: lead.profile.externalId ?? lead.id },
      profile: lead.profile,
      status: lead.status,
    })
  }
  return { pulled: leads.length, removed }
}

Fehler und Grenzen

Die Wrapper-Methoden geben { error } zurück. Die API ist gedrosselt. Jeder ICP-Import gibt Credits aus. Prüfe deshalb creditsLeft aus partner.crm.icps(), bevor du in einer Schleife importierst.