# Enable W-8 and W-9 collection

Configure W-8 and W-9 collection in the Dashboard for eligible connected accounts.

## Before you begin

Configuring W-8 and W-9 form collection requires:

- A user on your platform with the Administrator or Super Administrator [role](https://docs.stripe.com/get-started/account/teams/roles.md).
- At least one [eligible](https://docs.stripe.com/connect/w8-w9-tax-forms.md#eligibility) connected account.

## Enable W-8 and W-9 collection

1. Go to [Tax forms > W-8 & W-9](https://dashboard.stripe.com/connect/taxes/w8_w9_forms) in the Dashboard, and click **Get started**.
2. Select **Enable W-8/W-9 form collection**, then click **Enable**.

After you enable W-8 and W-9 collection, you can’t disable it. You can only set **Collect tax details from** to **No accounts** to stop Stripe from requesting forms from any connected accounts.

## Configure collection from new accounts

In the [W-8 and W-9 settings](https://dashboard.stripe.com/settings/connect/tax-reporting/w8-w9-forms) Dashboard page, set the values for collection and enforcement:

1. **Collect tax details from**: Choose how you’ll request forms:
   - **New accounts only** requests a form for every eligible connected account added to your platform.
   - **No accounts** requires you to manually request forms for new accounts.
2. **Default enforcement**: Choose how to respond if a connected account doesn’t submit a form:
   - **Enforcement**
     - **Pause payouts** to pause only the connected account’s payouts.
     - **Pause payouts and payments** to pause the connected account’s payouts and its ability to accept payments.
   - **Condition**
     - **Time Limit**: Apply the enforcement after requesting the form:
       - Immediately after requesting the form (default)
       - After 7, 30, 60, or 90 days
       - After a custom number of days between 1 and 365
     - **Volume Limit**: Apply the enforcement when the connected account’s total payment volume exceeds the amount you enter, from 0.01 USD to 1 trillion USD.
3. **Form requirements**: Choose which form to request from connected accounts:
   - **No form restrictions** (default) allows the connected account to submit either a W-8 or a W-9.
   - **Require W-8 tax forms** requires every connected account to submit a W-8.
   - **Require W-9 tax forms** requires every connected account to submit a W-9.
4. **W-8 tax form details**: Choose which of the following W-8 forms to require by default:
   - Substitute (default): Basic W-8 details, without a foreign tax ID or tax treaty claim
   - Standard: Basic W-8 details, a foreign tax ID, and tax treaty claim information. Generates Form W-8BEN for individuals or Form W-8BEN-E for entities. This selection requires you to enter the types of income that you pay under **How do you classify income?**. The default withholding rate for these income types is 30%.
5. Click **Review and apply changes**, check the current and new value of each setting that you changed, then click **Apply**.

Enforcement changes apply to future requests only. Existing requests keep their enforcement. A volume limit counts all of the connected account’s payment volume, including volume from before the request. In a sandbox, Stripe applies the enforcement only when the time limit is **Immediately**. Other time limits and volume limits don’t apply.

## Request forms from existing connected accounts

If **Collect tax details from** is **New accounts only**, Stripe requests a form from each eligible connected account when you create it. To request forms from your existing connected accounts, select them on the Tax forms page or import a CSV file.

Stripe applies the same enforcement values you set for new accounts to existing connected account form requests.

Requested connected accounts appear on the **Requested** tab.

> #### Check your enforcement settings
> 
> The default enforcement setting pauses a connected account’s payouts as soon as you request a form. Consider setting an enforcement time or volume limit to give connected accounts time to satisfy the request.

### Select connected accounts

Request a form to ask a connected account to submit a W-8 or W-9.

1. On the [Tax forms](https://dashboard.stripe.com/connect/taxes/w8_w9_forms) page of the Dashboard, select individual connected accounts from the **Not requested** tab. You can also select the checkbox in the table header to select all the connected accounts shown on the current page.
2. Click **Manage requests**.
3. Click **Request forms**.

Stripe checks every selected connected account for [eligibility](https://docs.stripe.com/connect/w8-w9-tax-forms.md#eligibility) and status before sending a form request, skipping connected accounts that already have an open request or a form, and returning an error for ineligible connected accounts. Follow its progress on the [Exports & imports](https://docs.stripe.com/connect/w8-w9-tax-forms/manage.md#jobs) tab.

### Import a CSV file

You can import a CSV file to request forms for up to 10,000 existing connected accounts at a time, and you can set separate enforcement rules for each connected account.

1. Create a UTF-8 CSV file (limit 2MB) with a header row and one connected account per row. The header row can include either of the following sets of case-insensitive columns in any order:

   - Universal enforcement: Include only a `connected_account_id` column to apply your enforcement settings to every account in the file.
   - Specific enforcement: Include `connected_account_id`, `enforcement`, `enforcement_after_days`, and `enforcement_after_volume_usd` columns. For each row, specify either the time or volume enforcement, not both.

| Column                         | Description                                                                                                                                                     |
| ------------------------------ | --------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| `connected_account_id`         | Required. The Stripe ID of the connected account.                                                                                                               |
| `enforcement`                  | What to pause if the connected account doesn’t submit a form: `payouts` or `payouts_and_payments`.                                                              |
| `enforcement_after_days`       | Apply the enforcement this many days after the request: `0` to `365`. Use `0` to apply  immediately.                                                            |
| `enforcement_after_volume_usd` | Apply the enforcement when the connected account’s total payment volume, in USD, reaches this amount: `0.01` to `1000000000000`, with up to two decimal places. |

2. On the [Tax forms](https://dashboard.stripe.com/connect/taxes/w8_w9_forms) page of the Dashboard, click **Import**, then **Request**.

3. Upload the file, or drag it into the dialog.

4. Confirm the number of connected accounts, then click **Import**.

Stripe validates the entire file before requesting forms from any connected account, then redirects to the [Exports & imports](https://docs.stripe.com/connect/w8-w9-tax-forms/manage.md#jobs) tab, where you can follow the process. During validation:

- Stripe filters out duplicate account IDs.
- Duplicate connected account rows with different enforcement values invalidate the file.
- Any invalidation fails the job and returns the Validation report.
- Successful validation results in a Results report detailing which connected accounts Stripe requested forms for.

#### Validation report 

Invalid files generate a report listing each problem with the following details:

| Column | Description |
| --- | --- |
| `line` | The applicable row in your file. The header row is line 1. Errors that apply to the whole file list line 1. |
| `connected_account_id` | The connected account ID of the row. Blank for errors that apply to the whole file or to invalid IDs. |
| `error_code` | The [validation error code](https://docs.stripe.com/connect/enable-w8-w9-tax-forms.md#validation-errors). |

#### Result report 

Successfull process files generate a report that lists each connected account with the following details:

| Column | Description |
| --- | --- |
| `connected_account_id` | The connected account ID. |
| `outcome` | - `changed` if Stripe completed the request.
- `skipped` if Stripe took no action (for example, if Stripe alrady requested a form for the connected account).
- `failed` if Stripe couldn’t update the connected account. |
| `error_code` | The [processing error code](https://docs.stripe.com/connect/enable-w8-w9-tax-forms.md#processing-errors) for failed connected accounts. |
| `enforcement_source` | - `row` for enforecement set by your file.
- `default` for your configured enforcement.
- `not_applied` for skipped connected accounts.
- Blank for withdrawals and failed connected accounts. |

You can create a file with only failed connected accounts and import it again to retry them.

#### Validation error codes 

The following errors describe why file validation failed.

| Error code | Description |
| --- | --- |
| `missing_header` | The first row of the file must be a header row with the prescribed columns. |
| `unexpected_columns` | The header row must follow the prescribed column names exactly. |
| `empty_file` | The file doesn’t contain any rows after the header row. |
| `too_many_rows` | The file contains more than 10,000 unique connected accounts. |
| `file_unreadable` | The file must be a UTF-8 CSV file of 2 MB or smaller and every quoted value must be closed. |
| `invalid_format` | - The connected account ID must be a valid ID starting with `acct_`.
- A row can’t have more values than header columns. |
| `unknown_account` | No connected account exists with this ID. |
| `not_on_platform` | The connected account doesn’t belong to your platform. |
| `livemode_mismatch` | The connected account was created in legacy test mode and you’re importing in live mode, or the other way around. |
| `not_express_eligible` | The connected account has access to the full Stripe Dashboard. |
| `connected_account_ineligible` | The connected account isn’t [eligible](https://docs.stripe.com/connect/w8-w9-tax-forms.md#eligibility) for W-8 and W-9 collection, for example because it’s closed. |
| `invalid_enforcement` | The enforcement values aren’t valid. Set `enforcement` to `payouts` or `payouts_and_payments`, and set only one of `enforcement_after_days` or `enforcement_after_volume_usd` to a value in its range. To apply your configured enforcement, leave all three blank. |
| `enforcement_not_applicable` | The row has enforcement values in a [withdrawal](https://docs.stripe.com/connect/w8-w9-tax-forms/manage.md#withdraw) file. |
| `conflicting_duplicate` | The connected account appears on an earlier line with different enforcement values. |
| `validation_activity_failed` | Stripe couldn’t check the connected account. Import the file again. |

#### Processing error codes 

The following errors describe issues with individual connected accounts in the result report, or to the entire job.

| Error code | Description |
| --- | --- |
| `ineligible_account` | The connected account stopped being eligible for W-8 and W-9 collection after Stripe validated the file. |
| `w8_w9_state_mismatch` | The connected account’s latest form request doesn’t match its W-8 and W-9 configuration. [Contact support](https://support.stripe.com/contact). |
| `w8_w9_config_missing` | Stripe couldn’t find or create the connected account’s W-8 and W-9 configuration. |
| - `w8_w9_config_update_failed`
- `w8_w9_update_failed`
- `target_activity_failed` | Stripe couldn’t update the connected account. Import the connected account again. |
| `consecutive_failure_limit` | Stripe stopped the job after 50 consecutive connected accounts failed, before it processed this connected account. |
| - `workflow_failed`
- `operation_not_in_progress` | The job ended before Stripe processed this connected account, for example because it timed out. Import the connected account again. |

## See also

- [US tax reporting for Connect platforms](https://docs.stripe.com/connect/tax-reporting.md)
