AvaTax for PandaDoc Integration Guide

Built by Taxiom

PandaDoc Avalara
Back

AvaTax for PandaDoc connects PandaDoc Quote Builder to Avalara, adds calculated sales tax as a visible line item on your quote, and keeps it in sync as you edit.

If you haven't already, pay the setup fee to receive your AvaTax for PandaDoc portal credentials. The portal (our integration) is how you'll connect PandaDoc to Avalara. If you have any questions, please email us at avataxforpandadoc@taxiom.com.

Two ways to learn the integration

Watch the walkthrough, or scroll down to the written guide for step-by-step detail on every feature.

Prefer reading? Skip to the written guide ↓

Prefer to have us walk you through this on a live call? Add our Guided Setup add-on ($299) — two calls with our team, up to 45 minutes each. Add Guided Setup — $299

What you need before you start

(go to top)

You need a PandaDoc Business or Enterprise workspace with Quote Builder enabled, an active Avalara subscription with at least one company set up, and a valid US-based ship-from address for your business.

Built for Quote Builder

(go to top)

This integration is built for PandaDoc's Quote Builder content block. Quote Builder gives the integration full control over the line items in a section, which is what lets us add an explicit Sales Tax line showing the dollar amount Avalara returned and roll it into the section total. If your existing proposals use a different PandaDoc content block for line items, rebuild those templates using Quote Builder before connecting the integration.

One-time setup

(go to top)

1. Build a Quote Builder template

Start a new template (or open the one you want to add tax to). Drag in a Quote Builder block. Configure your sections, columns, and products the way you normally would. Leave the section's built-in tax settings unconfigured: do not turn on the section's Tax row, do not set a percentage, and do not configure any per-item Tax field. The integration manages tax through its own Sales Tax line item, and the section's built-in tax settings will conflict with it if they are turned on.

2. Add an Avalara Tax Code to each Catalog Item (recommended)

The cleanest setup is catalog-driven: you set the Avalara Tax Code once per product, at the catalog level, and every quote that uses that product gets the right code automatically without any per-row work. In your PandaDoc Catalog, open each item and add a metadata field named Avalara Tax Code (or avalara_tax_code) with the appropriate Avalara code as the value. The integration matches each Quote Builder row to its catalog item by SKU and applies the catalog's tax code at calc time. The most common values are P0000000 for general goods, SW054000 for SaaS, FR020000 for shipping and handling, SW052000 for cloud-hosted software, and SE221000 for professional services. If you are unsure, leave the field unset on the catalog item and the integration will fall back to your Avalara account default.

3. Optional: add a manual Avalara Tax Code column for ad-hoc rows

If your team builds quotes with one-off rows that don't come from the catalog (for example, a custom service line typed in by hand), add a custom column named exactly Avalara Tax Code (Text type) to your Quote Builder section and type the code on each ad-hoc row. Open the column's display settings and turn Show to recipient OFF so the Avalara Tax Code stays internal. The catalog value wins when present; the manual column is consulted only when the row has no SKU match in the catalog (or when the matching catalog item has no Avalara Tax Code set). If both are blank, the integration falls back to your Avalara account default.

4. Connect your account

Sign up at taxiom.com/avatax-for-pandadoc, then in your AvaTax for PandaDoc portal click Connect PandaDoc and authorize the integration. Enter your Avalara credentials under Avalara Settings, and configure your ship-from address under Company Settings. Make sure the recipient or contact you use for testing has a complete US shipping address on file (street, city, state, postal code, country); the integration uses that as the ship-to.

How it works at runtime

(go to top)

While a document is in Draft, the integration polls every few seconds for changes. When you add, edit, or remove a product, change a price or quantity, or change the Avalara Tax Code on a row, the integration sends the updated quote to Avalara, gets the calculated tax back, and writes a Sales Tax line item into the section with the dollar amount. The section total and document total update automatically to reflect the tax. You will typically see the line refresh within four to seven seconds of saving an edit.

Once you Send the document, recalculation stops. The Sales Tax line that was on the doc at Send time is what the buyer sees, what gets charged through Payments, and what gets committed in Avalara when the document is paid.

Zero-tax behavior

If Avalara returns zero tax (because the destination is in a state where you do not collect, or because the product is non-taxable in that jurisdiction), the integration still writes a Sales Tax $0.00 line. The line stays visible as confirmation that tax was assessed. The total equals the subtotal.

Failure behavior

If the integration cannot calculate tax (most commonly because the recipient has no shipping address, or your workspace's ship-from address is not configured), the Sales Tax line is removed from the document and a notification email is sent to the email address that connected the integration. That disappearance is the buyer-facing signal that tax could not be assessed. Once you fix the underlying problem (typically by adding the missing address), the next polling cycle restores the Sales Tax line automatically.

Lifecycle

(go to top)
  • Draft: tax recalculates in near real time as you edit.
  • Sent: tax is frozen on the document. Polling stops.
  • Paid: the Avalara transaction is committed automatically. Tax is now reported.
  • Voided: the Avalara transaction is cancelled automatically.
  • Deleted: when you delete a document in PandaDoc, the Avalara transaction is voided automatically too.

Configurable commit timing

Under Sync Settings in the Taxiom portal you can choose:

  • Commit on document creation — tax is reportable as soon as the document is created.
  • Commit on payment (default when a payment processor is connected to the workspace) — tax is reportable when PandaDoc Payments marks the document paid.
  • Don’t commit — calculations still post to Avalara as SalesOrders for visibility but never roll up into filings. Choose this if your accounting system is the source of truth and you only use PandaDoc for quotes.

If you do not have a payment processor connected to PandaDoc, the integration cannot detect payment, so use commit-on-creation or don’t-commit.

Finding the transaction in Avalara

The Avalara document code is the PandaDoc document identifier. Open the document in PandaDoc and copy the long alphanumeric string from the URL (for example app.pandadoc.com/a/#/documents/HyfqtTrwCy7Q2Fu3eNoxjN/... → document code HyfqtTrwCy7Q2Fu3eNoxjN). Use it in the Avalara Transactions search to locate the matching record.

Shipping and freight

(go to top)

Avalara treats shipping and freight as separate taxable categories from your product. When you ship a physical good, enter the shipping or freight charge as its own line item in the Quote Builder section, and set its Avalara Tax Code (either on the catalog item, or via the manual column if it is an ad-hoc shipping line) to the appropriate freight code so Avalara applies the right rule per state.

Common freight codes:

  • FR020100 — shipping by common carrier, separately stated (most common for B2C and B2B physical goods).
  • FR020200 — shipping handled by the seller’s own vehicles.
  • FR020800 — handling charges (sometimes taxed even where freight is exempt).

If you do not separate freight as its own line, Avalara will roll it into your product’s taxability, which is usually wrong for states that exempt separately-stated shipping. If you are unsure which code applies, FR020100 is the safe default for typical e-commerce or wholesale shipping. Avalara’s full freight code list is at the tax code reference linked below.

Looking up Avalara tax codes

(go to top)

Avalara publishes a free, public lookup tool for every tax code in their system. Use it to find the right code for SaaS, services, food, clothing, freight, digital goods, or anything else you sell.

taxcode.avatax.avalara.com

Type a few words from your product description into the search box, and Avalara will return the matching codes along with state-by-state taxability notes. Copy the code (for example SW054000 for SaaS, PS080100 for cleaning services, FR020100 for shipping by common carrier) onto the catalog item's Avalara Tax Code metadata field, or into the manual Avalara Tax Code column on the row in your Quote Builder section if you use the fallback path.

If you leave the column blank, Avalara will use the default tax code configured on your Avalara account, which is usually P0000000 (tangible personal property). If that default isn’t right for what you sell, set the code per row.

Validating ship-to addresses

(go to top)

The integration calls Avalara’s address resolution service automatically on every tax calculation, so when you send a document the ship-to address on the recipient is already validated. You don’t need to validate addresses one-by-one to make the integration work.

If you want to clean up a large list of existing customer or contact addresses before importing them into PandaDoc — for example, before bulk-creating a list of recipients — there is an Excel-based bulk validation tool that takes a list of addresses and returns normalized, jurisdictionally-resolved versions you can re-import:

Validate and Fix Addresses in Excel

Drop your address list in, get a cleaned version back, then import into PandaDoc contacts.

Refunds

(go to top)

PandaDoc does not currently emit refund events to integrations, which means the AvaTax for PandaDoc connector cannot automatically detect when you refund a paid document. We have added a manual refund action so you can record the refund in Avalara without leaving the integration portal.

If you refund a paid PandaDoc document (through PandaDoc Payments, Stripe, PayPal, or any other payment provider), record the refund in Avalara by going to Avalara Tax Logs in your AvaTax for PandaDoc portal and clicking the Issue refund button next to the document. The button appears on rows whose PandaDoc status is document.sent, document.paid, or document.completed — that is, documents that have been finalized for the customer (a draft has nothing to refund, so the button is hidden until the document is at least sent). This sends a ReturnInvoice to Avalara with:

  • The original tax calculation date so the refund uses the rate that was in effect at sale.
  • Today’s date as the transaction date for reporting.
  • Negative line amounts with positive quantities, matching Avalara’s refund convention.
  • Commit on, so the refund lands as a permanent Avalara record.

Only use the button after you have actually refunded the customer outside the integration. Issuing the ReturnInvoice in Avalara only records the tax adjustment; it does not move money.

Exempt customers

(go to top)

The integration sends each PandaDoc recipient's contact_id as the Avalara customerCode on every transaction. If you upload an exemption certificate in Avalara CertCapture keyed to that contact_id, Avalara will automatically apply the exemption and return $0 tax for that buyer on every future quote — no per-document work in PandaDoc. The cert on file is the cleanest path; for one-off exemptions (federal government, foreign diplomats, etc.) you can also set a document-level entity use code via the avatax_entity_use_code Variable token, or override per line via an Avalara Entity Use Code custom column.

Document-level tax override (rare). For unusual cases where you need to record an exact tax dollar amount on a document instead of computing it from line items, add a PandaDoc Variable token named avatax_tax_override_amount to your template and fill it on the specific document. Avalara still requires active nexus in the destination jurisdiction or the override is rejected with TaxOverrideError. Use this sparingly — the catalog-driven tax codes are almost always the right answer.

QuickBooks and other accounting connectors

(go to top)

If you use PandaDoc's QuickBooks integration (or any similar accounting connector), map the AVATAX-SALES-TAX SKU to your sales tax payable account, not to a sales revenue account. The SKU is stable across all documents the integration writes, so a one-time mapping handles every future quote. A line-item-based approach gives you cleaner books because the SKU maps directly to a single account in your accounting system. Avalara remains the system of record for your filings.

Tips and gotchas

(go to top)

The integration only runs while the document is in Draft. If you have not yet sent the document and tax is missing, check that you are still in Draft, that the recipient has a complete US shipping address, that your ship-from address is set in the integration portal, and that the Avalara Tax Code column is named exactly Avalara Tax Code. If everything looks right and tax is still missing, check your notification email for a calculation-failure message with details.

If your PandaDoc workspace has more than a handful of active Draft documents open at once, you may see polling slow down due to PandaDoc API rate limits. Sending or closing finished drafts releases capacity for the ones you are actively working on.

Do not edit the Sales Tax line item by hand. It is identified by the SKU AVATAX-SALES-TAX, and the integration manages its name, quantity, and price on every recalc. Manual edits will be overwritten on the next polling cycle.

FAQ

(go to top)

What PandaDoc workspace do I need?

A PandaDoc Business or Enterprise workspace with Quote Builder enabled. Quote Builder is the content block this integration is built on. If you are not sure whether your workspace has Quote Builder, check the content blocks panel in your template editor; if Quote builder appears, you are set.

Will this work with my existing proposals?

If your existing proposals use Quote Builder, yes. If they use a different PandaDoc content block for line items, you will need to rebuild those templates using Quote Builder before connecting. The integration is built for Quote Builder only because it is the block that lets us add an explicit Sales Tax line item with a controlled dollar amount.

Should I configure tax settings on my Quote Builder section?

No. Leave the section's built-in tax settings unconfigured (do not set a percentage, do not enable any per-item Tax field). The integration manages tax through its own visible Sales Tax line item, and built-in section tax settings will conflict with it. Once a section's built-in tax field is set, it cannot be cleared through the API, so it is best not to touch it.

How do I add the Avalara Tax Code column?

In your Quote Builder template, open the section's column settings and add a custom column named exactly Avalara Tax Code (Text type). Then open the column's display options and turn Show to recipient OFF. The Avalara Tax Code is an internal classification, not something the buyer needs to see.

What Avalara tax code should I use?

If you sell general tangible goods, leave the column blank and let Avalara apply your account's default. For SaaS use SW054000, for shipping and handling use FR020000, for cloud-hosted software use SW052000, for professional services use SE221000. For anything else, look up the right Avalara TaxCode in Avalara's reference and enter it in the column.

How quickly does tax update when I edit?

About 4 to 7 seconds. The integration polls every 4 seconds while the document is in Draft, sends changes to Avalara, and writes the Sales Tax line back into the section. You will see the section total and document total refresh in roughly the time it takes to switch tabs.

What does the Sales Tax line look like?

A regular line item in the Quote Builder section with the name Sales Tax, a quantity of 1, and a price equal to the dollar amount Avalara calculated. The SKU is AVATAX-SALES-TAX. The section total reflects subtotal plus tax.

What if Avalara says zero tax is due?

The Sales Tax line still appears, showing Sales Tax $0.00. That is intentional. It tells the buyer that tax was assessed and confirmed at zero (because the destination is in a state where you do not collect, or because the product is non-taxable in that jurisdiction). The total equals the subtotal.

Why is my Sales Tax line missing?

If the integration cannot calculate tax, it removes the Sales Tax line so the missing line is the buyer-visible signal that something needs attention. The two most common causes are a recipient without a shipping address, or a ship-from address not configured in your AvaTax for PandaDoc portal. The email address that connected the integration will receive a notification with the specific reason. Once you fix the underlying problem, the next polling cycle restores the Sales Tax line automatically.

Does the integration keep recalculating after I send the document?

No. Once the document leaves Draft, polling stops. The Sales Tax line that was on the document at Send time is what the buyer sees and pays.

What happens when the customer pays?

The Avalara transaction is automatically committed when PandaDoc fires the document.paid webhook, usually within seconds of the customer completing payment. Committed transactions show up in your Avalara reporting and on your filings.

What happens if I void the document?

The Avalara transaction is automatically cancelled when PandaDoc fires the document.voided webhook. In Avalara's reports, the transaction will show as Cancelled (with void code DocVoided), which means the same thing as voided.

How do refunds work?

PandaDoc does not fire a webhook when a payment is refunded, so the integration cannot detect refunds automatically. After you refund a customer outside the integration, go to Avalara Tax Logs in your AvaTax for PandaDoc portal and click Issue refund next to the document. The integration sends a ReturnInvoice to Avalara using the original sale date for tax calculation, today’s date as the transaction date for reporting, and negative line amounts with positive quantities. The ReturnInvoice is committed automatically and shows up as a permanent record in your Avalara account. See the Refunds section above for details.

I use PandaDoc's QuickBooks integration. How does tax flow into QuickBooks?

Map the AVATAX-SALES-TAX SKU to your sales tax payable account in QuickBooks. The SKU is stable across every document the integration writes, so a one-time mapping handles every future quote. Avalara remains the system of record for your filings.

Tax is not appearing on my draft. What do I check?

Confirm the document is still in Draft state (the integration only runs in Draft). Confirm the recipient has a complete US shipping address (street, city, state, postal code, country) on their PandaDoc Contact record. Confirm your ship-from address is set in the AvaTax for PandaDoc portal under Company Settings. Confirm the custom column is named exactly Avalara Tax Code (case and spelling matter). If all four check out and tax is still missing, check the email address that connected the integration for a calculation-failure notification.

I changed the Avalara Tax Code on a row but the tax amount did not change. Why?

It will, on the next polling cycle (within about 4 seconds). The integration treats tax-code changes the same as price or quantity changes and recalculates accordingly.

How do I contact support?

Email avataxforpandadoc@taxiom.com. Response within 4 business hours. Include your PandaDoc workspace name and the document ID for the document you are asking about so we can look up the audit trail.

Get a tax operations team without adding headcount

If sales tax is slowing down finance, we can own execution end to end.

Book a Meeting