Walkthrough

What a W-9 looks like in a native app, and what happens under the hood.

🚧

In development

Native Tax Documentation Collection is in development. If you're interested in using it, reach out to your Taxbit contact.

This walkthrough follows one W-9 from your app's side, then shows what the questionnaire and Taxbit exchange behind the scenes. The exchange explains why it stays up to date without app releases.

What your app does

Your app adds the questionnaire screen, tells it which form to collect, and handles the result.

import TaxbitTaxDocumentation   // working name

struct TaxFormView: View {
    var body: some View {
        TaxbitQuestionnaire(
            questionnaire: "W-9",
            theme: .standard,
            onComplete: { receipt in
                saveReceipt(receipt.document_id)
            }
        )
    }
}

That's the whole required setup. The questionnaire draws every screen, moves the user through the form, and submits it when it's complete.

What the user sees

  • The first question is how the account is taxed. Choosing Limited liability company adds a question about how the LLC is classified, and the TIN label changes from SSN to EIN.
  • The address fits the country. Switching from the US to Canada changes state and ZIP to province and postal code.
  • Errors appear at the right moment. A blank required field is only flagged when the user tries to continue. An invalid value, like an 8-digit TIN, is flagged right away.
  • The TIN stays private. It's masked by default, with a button to show it.
  • Signing comes last. The certification step appears only once everything else is valid.
  • Submitting stores the form. Your app receives a receipt with a document_id.

None of this is coded by your team. Taxbit decides each question based on the answers so far.

Under the hood

The questionnaire doesn't contain the tax rules. It asks Taxbit, in four steps.

1. The questionnaire asks Taxbit for the form

It sends what it knows, which at the start can be as little as the form and the user's language:

{
  "questionnaire": "W-9",
  "locale": "en-US"
}

Taxbit replies with the questions to show right now, already worded and translated:

{
  "complete": false,
  "fields": [
    { "key": "account_holder.us_account_type", "ui_type": "radio",
      "text": { "label": "How is this account taxed?" },
      "options": [ /* Individual, LLC, C corporation, … */ ],
      "on_change": ["shape"] }
  ]
}

2. The questionnaire shows the questions

Each field says what kind of control it needs (radio buttons, a dropdown, a text box) and what it says. The questionnaire draws it natively, in your theme.

3. The questionnaire sends answers when they matter

Typing stays on the device. The questionnaire only calls Taxbit when an answer can change which questions appear (marked "on_change": ["shape"]), or when an answer gets a live check, like the TIN. Here the user picks Limited liability company:

{
  "questionnaire": "W-9",
  "locale": "en-US",
  "account_holder": { "us_account_type": "LLC" }
}

Taxbit replies with the updated form, which now includes the LLC question and the "Employer Identification Number" label.

4. The questionnaire submits when Taxbit says it's complete

When every answer is valid and the user has signed, Taxbit's reply includes "complete": true and a finished, signed form. The questionnaire submits it, and your app gets a receipt:

{
  "document_id": "doc_01J8Z3K9QW",
  "document_type": "W-9",
  "status": "ACCEPTED"
}
📘

Why this matters

Because the questions, wording and rules all come from Taxbit on each exchange, a rule change reaches your users the next time they open the form, without an app release or App Store review.

Interested?

If your users complete tax forms inside a native app and you'd like early access, reach out to your Taxbit contact. Early teams work directly with Taxbit's engineering team and help shape the options before release.

To go deeper, read the developer guide.