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)

A few things need to be in place before the integration can calculate tax. Make sure you have all three of these ready, and setup will go smoothly.

  • A PandaDoc Business or Enterprise workspace with Quote Builder enabled.
  • An active Avalara subscription with at least one company set up.
  • A valid US-based ship-from address for your business (this is your own address, the place you sell from).

Built for Quote Builder

(go to top)

Before you build anything, it helps to know which PandaDoc tool this integration plugs into. The answer is Quote Builder, and only Quote Builder.

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)

You only do this once. After these four steps, every new quote you build gets tax calculated automatically.

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 while you build a quote

(go to top)

Once you are connected, the integration does its work in the background while you build. Here is what you will see happen on a draft document.

While a document is in Draft, the integration checks it for changes every few seconds. 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.

When tax comes back as zero

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.

When a calculation cannot run

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 check restores the Sales Tax line automatically. If you would rather not receive these emails, you can mute them under Sync Settings (see Lifecycle and Sync Settings); the failure is still recorded in your Errors Logs view either way.

Lifecycle and Sync Settings

(go to top)

This section explains what the integration does at each stage of a document's life, and the handful of choices you control on the Sync Settings page in your portal.

  • Draft: tax recalculates in near real time as you edit.
  • Sent: tax is frozen on the document. Checking stops.
  • Paid: if you have chosen a commit mode (see below), the Avalara transaction is committed automatically and the tax becomes reportable.
  • Voided or declined: the Avalara transaction is cancelled automatically.
  • Deleted: when you delete a document in PandaDoc, the Avalara transaction is voided automatically too.

Turning the integration on or off

Your portal has a master Enable AvaTax switch under Sync Settings, and it is on by default. When you turn it off, the integration stops completely: no tax calculations, no Sales Tax line writes, and no commits or voids. Use it if you ever need to pause the integration without uninstalling it — for example, if you want to post a tax figure you calculated yourself on a particular document. Turn it back on to resume normal operation.

Choosing when tax is reported to Avalara

Also under Sync Settings, the commit-timing dropdown controls when a calculation becomes a reportable transaction in Avalara (one that rolls up into your filings). You have three choices:

  • Do not commit to Avalara (calculation only) — this is the starting default. Calculations still post to Avalara as SalesOrders so you can see them, but they never roll up into filings. Choose this if your accounting system is your source of truth for filing and you only use PandaDoc for quotes.
  • Commit to Avalara when the PandaDoc document is paid — recommended for most sellers. Tax becomes reportable when PandaDoc Payments marks the document paid.
  • Commit to Avalara when the PandaDoc document is created — tax becomes reportable as soon as the document is sent (leaves Draft), without waiting for payment.

If you do not have a payment processor connected to PandaDoc, the integration cannot detect payment, so use commit-on-creation or leave it on calculation-only.

Muting calculation-failure emails

By default, when a calculation fails the integration emails the address that connected it. If you would rather not get those emails, turn on Disable error notification emails under Sync Settings. The failure is still recorded in your Errors Logs view in the portal; only the email is suppressed.

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)

If you ship physical goods, how you list the shipping charge matters for tax, because many states tax shipping differently from the product itself.

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)

A tax code tells Avalara what kind of thing you are selling so it can apply the right rule in each state. When you are not sure which code fits a product, Avalara has a free tool that finds it for you.

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)

Accurate sales tax depends on an accurate delivery address. The good news is the integration handles this for you on every calculation.

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)

When you refund a customer, the tax you collected needs to be reversed in Avalara too. PandaDoc cannot tell us about refunds automatically, so the integration gives you a one-click button to record them.

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.

One thing to check first: a refund reverses the document's committed Avalara transaction, so the document must have actually been committed to Avalara. That means you need to be using one of the commit modes under Sync Settings (commit-on-payment or commit-on-creation), not calculation-only. If a document was only ever calculated and never committed, there is nothing in Avalara to refund, and the refund attempt will show an error in your Errors Logs view.

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)

Some buyers, like resellers, government agencies, and nonprofits, should not be charged sales tax. There are three ways to tell the integration a customer is exempt, and you can use whichever fits how you work.

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.

Marking exemptions in the portal. Your AvaTax for PandaDoc portal also has a Customer Exemptions screen that lists your PandaDoc contacts. For any contact, pick an Avalara entity use code (for example G for resale, A for federal government, E for a charitable organization) and save. From then on, every document whose primary recipient is that contact is calculated with the exemption applied, with no per-document work. If a specific document also carries the avatax_entity_use_code Variable token, the token wins for that document; otherwise the portal mapping is used.

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 your finance team pulls PandaDoc data into an accounting system, you want the collected tax to land in the right account. A one-time mapping takes care of it.

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)

A short list of the things that trip people up most often, and how to avoid them.

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 calculations 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 check.

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 checks each draft every few seconds, 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 check restores the Sales Tax line automatically.

Does the integration keep recalculating after I send the document?

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

Can I temporarily turn the integration off?

Yes. Under Sync Settings in your portal there is a master Enable AvaTax switch. Turn it off and the integration stops calculating, writing, committing, and voiding entirely, without uninstalling it. Turn it back on to resume. This is handy when you want to post a tax figure you calculated yourself on a particular document.

What happens when the customer pays?

If you have selected a commit mode under Sync Settings, the Avalara transaction is committed automatically 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. If you are on calculation-only (the starting default), nothing is committed and the calculation stays a non-reporting SalesOrder.

What happens if I void or decline the document?

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

How do I mark a customer as tax-exempt?

Three ways, use whichever fits. Best: upload an exemption certificate in Avalara CertCapture keyed to the buyer's PandaDoc contact_id, and it applies automatically. Easiest in the portal: open the Customer Exemptions screen, pick an entity use code for that contact, and save. Per document: add an avatax_entity_use_code Variable token to the document. See the Exempt customers section for details.

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. The document must have been committed to Avalara first (you must be on a commit mode). 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 check (within a few 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