# Draft partner introductions for approval

Turn a permissioned Crossbeam signal into a Salesforce account-owner review. The approved draft goes to Gmail for a final check before sending.

**Category** Revenue Operations  
**Tools** n8n, Crossbeam, Salesforce, Claude, Slack, Gmail, n8n Data Tables  
**Trigger** Authenticated POST from a Crossbeam connector or trusted relay  
**Package** [Workflow JSON](partner-intro-approval.n8n.json) · [Test payloads](test-payloads.json) · [Validation report](validation-report.txt)

Import the JSON in n8n and run **Run with sample data**. The workflow imports inactive with **dryRun** enabled. The sample run uses fictional data and skips connected apps. Select credentials on the named nodes before testing live inputs.

## How it works

1. Validate the approved partner and the signal's Salesforce account ID and domain. Read Salesforce and match the owner to a Slack member.
2. Draft the email in Claude from the approved account and context. Use the recipient address from the partner configuration and send the exact draft to the account owner for review.
3. After approval, recheck the Salesforce owner before creating the optional Gmail draft. Record the draft ID for repeat events.

## How to use

1. Create an n8n Data Table with text columns **event_key**, **status**, **detail**, and **result_id**. Add its ID in **Setup**.
2. Populate **partners** with an approved key, contact name, and email per partner. Populate **ownerSlackIds** with Salesforce owner IDs mapped to Slack member IDs. The account must have a **Website** matching the signal domain.
3. Connect **Salesforce OAuth2 API** to both account lookup nodes, and configure Claude **Header Auth** with **x-api-key**. Select a Claude model your account can use. Connect Slack for signed approvals and Gmail for draft creation.
4. Put a private **Header Auth** credential on **Receive event**. The upstream Crossbeam connector or relay supplies **signalId**, **salesforceAccountId**, **accountDomain**, **partnerKey**, **shareApproved**, and a short approved **context**. Forward only signals covered by your sharing agreement. The webhook acknowledges receipt.
5. Stage with **createDraftAfterApproval** false. Check the approval goes to the mapped owner. Enable drafts after verifying the matching and account permissions.

## Test and operate

- A mismatched website, unknown partner, or unmapped owner stops before drafting.
- Approval from a different Slack user cannot create a draft.
- If the Salesforce owner changed while review was pending, the flow stops before Gmail. Reconcile and submit a fresh review for the new owner.
- The same signal ID is processed once in normal serial delivery. Check Gmail before clearing a **draft_pending** entry.

The relay is required for mapping Crossbeam signals and checking data-sharing eligibility. Process signals with the same ID serially.

[n8n source](https://n8n.io/workflows/20565-draft-partner-intro-emails-from-crossbeam-deal-signals-with-claude-and-slack-approval/) · [Crossbeam API](https://developers.crossbeam.com/) · [Claude Messages API](https://platform.claude.com/docs/en/api/messages)
