PandaDoc → Attio: contract status without leaving the pipeline

Most sales teams send a PandaDoc, then live in fear of whether the prospect opened it. They ping each other, they refresh PandaDoc, they forward the email. Meanwhile the CRM has a Deal stuck in "proposal sent" for three weeks. We wire PandaDoc into Attio so every document event - sent, viewed, commented, signed - lands on the Deal automatically. Stale proposals become a filterable list. Signed docs trigger the handoff to onboarding. No more "did they sign it yet?" slack threads.

Direction

PandaDoc → Attio (documents, status, signatures)

Stack

PandaDoc API, Attio API, n8n

The what

What this integration actually does

Every PandaDoc state change writes an activity on the linked Attio Deal: sent, first-viewed, commented, fully-viewed, signed, declined, expired. Key fields (sent date, signature date, contract value) become structured data on the Deal - queryable, reportable, and available to downstream automations.

The how

How we build it

  1. 1

    Link PandaDoc templates to Attio Deal objects - metadata on the document carries the Deal ID.

  2. 2

    Register PandaDoc webhooks on document.state_changed and document.viewed events.

  3. 3

    Write back: document_status, document_sent_at, document_signed_at, document_value fields on the Deal.

  4. 4

    Stale-proposal detection: anything sent more than X days without view or with no progress flags for review.

  5. 5

    Handoff trigger: signed doc moves the Deal to "closed-won" and creates onboarding tasks.

Under the hood

What lives inside the pipeline

  • Contract value parsed from the doc (custom field or pricing table) and written to the Deal.
  • Signer tracking - multi-signer docs show which signers have completed vs pending.
  • View events collapsed - one activity per session, not one per page view.
  • Template-level reporting: which templates convert, which stall.
  • Expired/declined docs trigger a next-step task on the Deal owner.

Hard-earned lessons

What we learned the hard way

  • Don't write a viewed event per page view. One session activity is enough; pipeline feed gets unreadable otherwise.
  • PandaDoc custom fields on the doc are the canonical place to store the Attio Deal ID. Don't rely on the document name.
  • Handle declined/expired states explicitly - they're real outcomes, not just "not signed yet".
  • Signature order matters for multi-party docs. Track each signer individually or reporting gets muddy.

Case study

B2B SaaS with a 3-week sales cycle

Problem

AEs were sending contracts and then losing visibility. Deal reviews relied on "I think they looked at it last Tuesday." Renewals slipped because signed-date data was in email.

Solution

PandaDoc → Attio for every proposal. Sent/viewed/signed timestamps as Deal fields. Stale-proposal list refreshes daily.

Outcome

Time-to-close dropped because AEs finally saw who was sitting on contracts. Renewal tracking became trivial - signature date is just a field.

FAQ

Questions we get

Same pattern. PandaDoc is our reference because it has the best webhook payload and the clearest state model. Docusign works equally well with slightly more transformation logic.

Yes - an Attio action that triggers an n8n workflow which builds the doc from a template and sends via the PandaDoc API. Usually simpler than it sounds.

Comments are captured as activities. Redlines (track-changes) aren't pushed in the webhook but we can pull them on demand if your negotiation process needs it.

Want this running on your Attio?

Book a free 30-min call. We'll map your use case to what we've already shipped and tell you whether this fits - honestly.

Book a 30-min call