Business Categorization

Now that you've connected your data sources with Tight's Expense Tracking API, you're ready to start leveraging all of the Expense Tracking features that Tight has to offer, including Business & Tax Categorization.

1. How it works

Through Tight's Plaid or MX integration, your user's transactions are pulled into Tight as soon as Plaid makes them available. All of those transactions are then run through Tight's proprietary algorithms, which leverage the user's business type, accountant best practices, and the behavior of similar businesses within the Tight API's 1.3M+ users. The expense transactions are then categorized in three primary ways:

a) Business Categories: Tight uses categories specific to the user's business, which a non-accountant business owner can understand. For example, an Uber driver's expense might be categorized as "Car Wash".

b) Tax Categories: All expenses are also mapped to a tax category, which an accountant can easily understand. Transactions are also mapped to specific line items on the 1040 Schedule C, 1065, 1120S, and 1120.

c) Personal Categories: Tight also assigns a personal category (e.g. "Pets", "Childcare") to each expense, to handle scenarios where a business owner might accidentally charge a personal expense to a business account.

2. Displaying the user's expenses and allowing them to make edits

You can easily allow your users to view their expenses and make quick edits to categories, including the ability to split across multiple categories (e.g. for an Amazon order), by rendering Tight Embedded's Expense Dashboard.

3. Programmatically getting the user's expenses

If you are building your own user experience or want to perform programmatic processing on a user's expenses, you can retrieve those expenses from the Tight API.

On each expense, you may find the following attributes to be of particular interest:

FieldDescriptionFormat
idId of the expense recordNumeric
typeType of expenseMust be one of the following: "PENDING", "BUSINESS", "NOT_BUSINESS"
dateDate that the expense was incurredyyyy-MM-dd'T'HH:mm:ss.SSSZ
amountTotal value of the expenseNumeric, with 2 decimal places
categoryIdId of the associated business expense categoryNumeric
personalCategoryIdId of the associated personal expense categoryNumeric
confidenceDeduction confidence of the expense transactionMust be one of the following: "LIKELY", "UNLIKELY", "QUESTIONABLE"
vendorNameName of the vendor that the expense was incurred withAny string
vendorIdId of the associated vendorNumeric
businessIdId of the business that this was assigned to; only populated if type == "BUSINESSNumeric
clientIdId of the client that this was assigned to; optional, only populated if type == "BUSINESSNumeric
lastUpdatedDateThe last date/time that this record was modifiedyyyy-MM-dd'T'HH:mm:ss.SSSZ

Additionally, several attributes to help you or your user identify a bank transaction are listed below:

FieldDescriptionFormat
apiInstitutionIdId of the institution that the transaction originated fromAny string
apiAccountNameDisplay name for the user's bank accountAny string
apiAccountNoMask of the user's bank account, often the last 4 digits of the account number2-4 Alphanumeric characters
plaidItemAccountIdId of the bank account that this transaction originated from (within Tight's API)Numeric
apiNameName of the API that this transaction originated fromWill always be "PLAID", unless you are utilizing one of Tight's other direct integrations
apiExpenseIdId of the transaction record in Plaid's APIAny string
bankDescriptionTransaction description (similar to what will show on the user's bank statement)Any string

4. Identifying a transaction's business categorization

On each expense transaction, you will see a categoryId field, which maps to one of Tight's business-specific expense categories. To pull a user's business expense categories, you can make the following GET call. Be sure to include that user's access_token in the headers.

curl \
  --request GET \
  --url https://sandbox.hurdlr.com/rest/v5/expenses/categories?lastUpdatedDate=1970-01-01 \
  --header 'Authorization: Bearer ${access_token}' \
  --header 'Content-Type: application/json' \

The response from GET /expenseCategories contains an array of the user's expense categories:

{
  data: [
  	{
      "id": 1,
      "name": "Accounting / Tax",
      "taxCategory": {
        "id": 11,
        "name": "LEGAL_AND_PROFESSIONAL_SERVICES",
        "displayName": "Legal and Professional Services",
      	"form1040SchedCLineNumber": "17",
      	"form1040SchedCDisplayName": "Legal and Professional Services",
        "form1065LineNumber": "20",
        "form1065DisplayName": "Other deductions (attach statement)",
        "form1120SSLineNumber": "19",
        "form1120SDisplayName": "Other deductions (attach statement)",
        "t2125LineNumber": "8860",
        "t2125DisplayName": "Professional fees (includes legal and accounting fees)",
      },
      "hasChilds": false,
      "parentCategoryId": 70,
      "status": "ACTIVE",
      "lastUpdatedDate": "2021-08-13T22:14:23.000Z"
    }
 ],
 "lastUpdatedDate": "2021-08-27T15:37:40.107Z"
}

On each business expense category, you may find the following attributes to be of particular interest:

FieldDescriptionFormat
idId of the expense category recordNumeric
nameName of the business-specific expense categoryAny string

The name of each expense category is specific to the user's business type, which will make sense to a non-accountant business owner. For example, an Uber Driver will have an expense category of "Car Wash". Of course, the Tight API also takes care of mapping that to the proper tax categories, without the user having to think about that.

5. Taking advantage of Tight's learning abilities

Tight's algorithms get smarter over time, automating more and more of your users' actions. Tight's A.I. suggests expense rules for each specific user, which can be easily fetched:

curl \
  --request GET \
  --url https://sandbox.hurdlr.com/rest/v5/expenses/rules \
  --header 'Authorization: Bearer ${access_token}' \
  --header 'Content-Type: application/json' \

The response from GET /rules contains an array of the user's expense rules:

{
  "data": [
    {
      "id": 1118497,
      "transactionName": "Starbucks",
      "matchType": "NON_EXACT_NAME",
      "autoClassify": "BUSINESS",
      "suggestedStatus": "PENDING",
      "categoryId": "13325613",
      "personalCategoryId": null,
      "vendorId": 237792,
      "businessId": 416080,
      "lastUpdatedDate": "2021-08-31T22:39:18.000Z"
    }
  ],
  "lastUpdatedDate": "2021-10-07T17:45:42.424Z"
}

On each rule, you may find the following attributes to be of particular interest:

FieldDescriptionFormat
idId of the rule recordNumeric
transactionNameName of the transaction to determine whether it matches the ruleAny string
matchTypeType of matching algorithm appliedMust be one of the following: "EXACT_NAME", "NON_EXACT_NAME"
autoClassifyType of auto-classificationMust be one of the following: "OFF", "BUSINESS", "NOT_BUSINESS"
suggestedStatusStatus of the A.I.-based rule suggestionMust be one of the following: "PENDING", "ACCEPTED", "DECLINED", "DELETED"

In order to accept a rule that Tight's algorithms have suggested, simply update the suggestedStatus to "ACCEPTED":

curl \
  --request POST \
  --url https://sandbox.hurdlr.com/rest/v5/expenses/rule \
  --header 'Authorization: Bearer ${access_token}' \
  --header 'Content-Type: application/json' \
  --data '{
    "rule": {
      "id": 1118497,
      "suggestedStatus": "ACCEPTED",
    },
  }'

Now, all of that user's new expense transactions that meet the suggested rule criteria will be automatically classified and accounted for in the user's tax estimates and tax reporting.