# Draft a sales proposal and approve it in Slack

Give the sales team a draft built from the right call and the terms they’ve already agreed. Azure OpenAI writes the introduction and objective. PandaDoc receives the approved scope, timeline, and price directly from intake. The assigned Slack reviewer checks the document before delivery.

**Category** Revenue Operations  
**Tools** n8n, Fireflies, Azure OpenAI, PandaDoc, Slack, Airtable  
**Trigger** Authenticated POST from an internal proposal intake system  
**Package** [Workflow JSON](proposal-draft-and-approval.n8n.json) · [Test payloads](test-payloads.json) · [Validation report](validation-report.txt)

## How it works

1. Validate the intake and confirm the client email belongs to a participant in the specified Fireflies transcript. Create the narrative and fill a PandaDoc template using the approved commercial fields.
2. Reserve an Airtable record using the proposal revision ID, then store the PandaDoc document ID. Once the document reaches draft status, send a Slack approval request restricted to the configured reviewer.
3. Record the decision, reviewer ID, and response time. If delivery is enabled, check that the draft content version and recipient still match, send through PandaDoc, and record its status in Airtable.

## How to use

1. Import on n8n with Slack’s **Capture Who Responded** support. The package was built for n8n 2.47.4. Run **Run with sample data** and inspect the sample tokens in **Assemble PandaDoc fields**.
2. Create a PandaDoc template with one recipient role and these exact variables. Add the signature fields for that role and check how the approved price appears in your template.

   - `Proposal.Introduction`
   - `Proposal.Objective`
   - `Proposal.ApprovedScope`
   - `Proposal.ApprovedTimeline`
   - `Proposal.ApprovedPrice`

3. Create an Airtable Proposals table with the text fields **Proposal ID, Client Email, Document ID, Status, Reviewer ID, Reviewed At**. Set `airtableBaseId` and `proposalsTableId` in **Setup**.
4. Configure the credential on each node using the corresponding header.

   | Service | Credential |
   | --- | --- |
   | Inbound intake | Header Auth with a private `X-Uptune-Webhook-Key` value |
   | Fireflies | Header Auth using `Authorization: Bearer <Fireflies API key>` |
   | Azure OpenAI | Header Auth using `api-key: <Azure OpenAI key>`. Set the resource and a JSON-mode deployment in **Setup**. |
   | PandaDoc | Header Auth using `Authorization: API-Key <PandaDoc key>`. Set the template ID and exact recipient role. |
   | Airtable | Header Auth using `Authorization: Bearer <Airtable token>` with record read and write access to the base |
   | Slack | Slack API credential with a bot token and signing secret. Configure Slack Interactivity for the n8n callback and set `slackReviewerId` in **Setup**. |

5. Forward the example intake fields from an internal form or CRM. Send a new `proposalId` for each approved revision and keep the ID stable on delivery retries. Use an approved value for `approvedScope`, `approvedTimeline`, `approvedPrice` (decimal string), and `currency` (three-letter code). Supply the Fireflies `meetingId` and client identity fields from verified records. The HTTP response acknowledges receipt. Airtable and the n8n execution show the actual outcome.
6. Run a staging proposal with `dryRun: false` and `sendApprovedProposal: false`. Verify the reviewer can approve and decline inside Slack. Enable delivery only after a controlled test with an address you own. Approval requests expire after two days.

## Test and operate

| Scenario | Expected result |
| --- | --- |
| Reviewer approves with delivery disabled | Airtable records `approved`. The document stays in PandaDoc for manual handling. |
| Reviewer declines or does not respond | Airtable records `changes_requested` or `approval_expired`. |
| Someone edits the draft after the approval request | The pre-send content check stops delivery and flags the execution. |
| PandaDoc creation or delivery stalls | Check the stored document ID, or search PandaDoc for the Proposal ID. Confirm its status before releasing a reservation or attempting another send. |

Use a fresh revision ID to submit a corrected draft after review. Signature tracking and reminder sequences can be handled by Uptune’s separate proposal follow-up system. Use a trusted intake source and restrict access to the template, transcripts, and approval logs. [Uptune proposal follow-up system](https://uptune.io/templates/hubspot-ghosted-proposal-followup-system)

[Community source by Sparsh from Automation Jinn](https://n8n.io/workflows/11123-generate-ai-sales-proposals-from-transcripts-using-azure-openai-pandadoc-and-slack-approval/) · [Slack approvals in n8n](https://docs.n8n.io/integrations/builtin/app-nodes/n8n-nodes-base.slack/approvals) · [PandaDoc document details](https://developers.pandadoc.com/reference/document-details)
