# Agentic Accounting
Source: https://docs.tight.com/ai/agentic/agentic-accountant
Enable autonomous AI agents to handle end-to-end accounting workflows
This functionality is actively evolving. Please check back regularly for updated content.
## Continuous bank account reconciliation
Tight automatically pulls account balances on an ongoing basis and validates them against the corresponding General
Ledger balances to detect discrepancies as early as possible. Additionally, once bank statements are available, Tight
programmatically ingests these from the underlying bank integration and parses out the relevant dates, balances, and
individual transactions to automatically perform the monthly reconciliation process per linked bank account. Through
these two types of automated reconciliations, Tight removes the manual labor that is required in legacy accounting
systems to perform monthly bank account reconciliations.
## Agentic book closings
**Tight Agentic Accountant** performs book closings on a recurring basis (monthly, quarterly, and annual) and provides
financial summaries for the closed period. Business owners can review these summaries and subsequently converse with the
agent about their company’s books, including making modifications when needed.
The timing of agentic closings can be configured in the [company's AI settings](https://docs.tight.com/api-reference/agentic-accounting-settings/save-agentic-accountant-settings/api-reference/agentic-accounting-settings/save-agentic-accountant-settings)
## CFO-level trend analysis
**Tight Agentic CFO** is trained to provide CFO-level trend analysis using the business’s historical financial data.
Business owners receive performant real-time replies on interesting trends across *all* of their historical data,
including data imported from QBO, Xero, and Wave, beyond the capabilities of most human beings.
## Anomaly detection
**Tight Agentic Bookkeeper** reviews General Ledger balances ongoing to detect anomalous transactions. **Tight Agentic
Bookkeeper** surfaces these transactions to the end-user along with a proposed modification to clear the anomaly if
necessary. This enables users to keep a close eye on their business without reviewing every single transaction.
## Conversational reasoning
When Tight’s categorization engine is unable to categorize a transaction with sufficient confidence, **Tight Agentic
Bookkeeper** reaches out to the end user with questions about the transaction, e.g., “Did you meet with a client for
this
Starbucks charge?” The end user is able to reason with the agentic accountant via a conversation to categorize and
reconcile the transaction.
# Leveraging 1.3M+ SMBs
Source: https://docs.tight.com/ai/categorization/self-learning-transaction-categorization-overview
AI-powered transaction categorization that learns from 1.3M+ SMBs' worth of data
[Tight's AI-first architecture](/ai/philosophy/ai-native-general-ledger#creating-an-ai-native-architecture) has the benefit of learning from the behaviors of the 1.3M+ SMBs and 3k+ bookkeepers that have used Tight to categorize their transactions.
Given the importance of seeing real bookkeeper categorization behavior, Tight has the distinct advantage of being able to combine the latest in AI/learning technology with (anonymized) data from the 1.3M+ SMBs in the Tight database, all already segmented by business type so that all learnings are properly contextualized.
## New Transaction Ingestion Flow
```mermaid theme={null}
flowchart TD
Start([New Transaction Ingested]) --> ReconciliationEngine
subgraph ReconciliationEngine[**Tight Reconciliation Engine**]
MatchEntity{"Transaction reconciled as
• Bank Transfer
• Bill (A/P) Payment
• Expense
• Invoice (A/R) Payment
• Payout
• Refund
• Revenue
• Tax Payment
"}
MatchEntity -->|Yes|SetReconciled[Set reviewStatus = RECONCILED]
MatchEntity ~~~ ToRules[ ]
end
ToRules ~~~ RuleEngine
MatchEntity -->|No|BizRule
subgraph RuleEngine[**Tight Rules Engine**]
BizRule{Check against
business-level rules}
BizRule -->|Match found|ApplyRule[Apply rule and set reviewStatus based on confidence level]
BizRule -->|No match|CPRule{Check against
Partner-level rules based on business type}
CPRule -->|Match found|ApplyRule
CPRule -->|No match|TightLevelRule{Check against
Tight-level rules based on 1.3M+ SMBs and 3k+ bookkeepers}
TightLevelRule -->|Match found|ApplyRule
end
TightLevelRule -->|No match|Done
ApplyRule --> Done
SetReconciled --> Done
Done([Done])
style MatchEntity fill:#caecf3,color:#000000
style ReconciliationEngine fill:#f8f9f9,color:#000000
style RuleEngine fill:#f8f9f9,color:#000000
style BizRule fill:#caecf3,color:#000000
style CPRule fill:#caecf3,color:#000000
style TightLevelRule fill:#caecf3,color:#000000
style Start fill:#e1f5e1,color:#000000
style Done fill:#bfe6dc,color:#000000
style SetReconciled fill:#d7fce9,color:#000000
style ApplyRule fill:#d7fce9,color:#000000
style ToRules fill:none,stroke:none,color:#000000
```
## Rule Insertion Flow
As Tight adjusts its heuristics to leverage the latest in rapidly evolving AI technologies, it reruns the user/bookkeeper actions taken upon the transactions of 1.3M SMBs in order to retrain the Tight Rules Engine:
```mermaid theme={null}
flowchart TD
Start([Transaction Edited]) --> BusinessLearning
subgraph BusinessLearning[**Business-level Learning**]
BizCheck{Check confidence against conflicting rules for similar transactions within the business}
BizCheck -->|High confidence against conflicting rule| UpdateRule[Update rule to
automate user's edit]
BizCheck -->|No conflicting rule| InsertBizRule[Insert business-level rule
to automate user's edit]
end
BizCheck --> |Low confidence with conflicting rule| QueueForPotentialLearning[Queue for potential
future learning]
InsertBizRule --> PartnerLearning
UpdateRule --> PartnerLearning
subgraph PartnerLearning[**Partner-level Learning**]
PartnerCheck{Check confidence against rules for similar businesses within the given Partner}
PartnerCheck -->|High confidence| InsertPartnerRule[Insert Partner-level rule
to automate edit for all users]
PartnerCheck -->|Low confidence| NoPartnerRule[No Partner-level rule needed]
end
InsertPartnerRule --> TightLearning
NoPartnerRule --> Done
subgraph TightLearning[**Tight-level Learning**]
TightCheck{Check confidence against rules for all Partners within the Tight database}
TightCheck -->|High confidence| InsertTightRule[Insert Tight-level rule
to automate edit for all partners]
TightCheck -->|Low confidence| NoTightRule[No Tight-level rule needed]
end
QueueForPotentialLearning --> Done
InsertTightRule --> Done
NoTightRule --> Done
Done([Learning Complete])
style Start fill:#e1f5e1,color:#000000
style Done fill:#bfe6dc,color:#000000
style BizCheck fill:#caecf3,color:#000000
style PartnerCheck fill:#caecf3,color:#000000
style TightCheck fill:#caecf3,color:#000000
style BusinessLearning fill:#f8f9f9,color:#000000
style PartnerLearning fill:#f8f9f9,color:#000000
style TightLearning fill:#f8f9f9,color:#000000
style UpdateRule fill:#d7fce9,color:#000000
style InsertBizRule fill:#d7fce9,color:#000000
style InsertPartnerRule fill:#d7fce9,color:#000000
style InsertTightRule fill:#d7fce9,color:#000000
style NoPartnerRule fill:#d7fce9,color:#000000
style QueueForPotentialLearning fill:#d7fce9,color:#000000
style NoTightRule fill:#d7fce9,color:#000000
```
The flows above give a high-level overview into how Tight is able to leverage its history to provide the best categorization outcomes. These outcomes get smarter every day.
The specific types of rules that Tight creates are proprietary, evolve regularly, and have been purposefully excluded from the above diagrams.
Any given transaction can be audited via the API and Embeddable UI so that your team or your user can understand why a given transaction was categorized a specific way.
# Bank Transactions
Source: https://docs.tight.com/ai/mcp-tools/bank-transactions-mcp
Query and analyze bank transactions using Model Context Protocol tools
## Overview
Tight Bank Transactions MCP tools enable AI assistants and agents to search, review, and update bank transactions. This allows users to categorize transactions, add notes, and request bookkeeper reviews, all through conversational AI interactions.
With these tools, you can build AI-powered accounting experiences where users ask questions like "Show me all uncategorized transactions from last month" or "Categorize this coffee shop expense as a recruitment expense."
## Available Tools
### Query Bank Transactions
The `query_bank_transactions` tool searches for bank transactions based on multiple criteria. You can filter transactions by amount, date, description, vendor, category, review status, and more.
Search for transactions with a specific amount or within an amount range (e.g., "\$50-\$100")
Filter transactions by specific date or date range (e.g., "last month", "January 2025", "2025-01-01 to 2025-01-31")
Fuzzy search on the bank description field
Fuzzy search on user-added notes attached to transactions
Filter transactions belonging to specific dimension values
Search for transactions associated with specific vendors or customers
Filter transactions by accounting category or account (e.g., "Meals & Entertainment", "Office Supplies")
Search for transactions that are split across multiple categories or amounts
Filter by review status (e.g., "needs review", "reviewed by bookkeeper", "pending bookkeeper review")
Filter by transaction type: Expense, Revenue, Transfer, Tax Payment, Invoice Payment, Bill Payment, etc.
You can combine multiple search criteria to narrow results. For example, search for "uncategorized expenses over \$100 from last week" by combining amount, date, category, and type filters.
### Get Bank Transaction Details
The `get_bank_transaction` tool retrieves detailed information about a specific bank transaction. Use this tool to inspect transaction details before making updates or to discuss categorization decisions with the user.
This tool returns comprehensive transaction data including:
* Transaction amount and date
* Bank description and user-added notes
* Current categorization (vendor, category, dimensionValue)
* Split information if applicable
* Review status and history
* Related invoice or bill payments
* Attachments and receipts
This tool is essential for conversational workflows where users want to discuss a specific transaction with the AI before making changes. The detailed context helps the AI provide informed categorization suggestions.
### Update Bank Transaction
The `update_bank_transaction` tool modifies any field on a bank transaction. This is the primary tool for categorizing expenses, adding notes, splitting transactions, and managing review workflows.
Assign or update the dimension value for tracking transactions across different parts of the business
Set or update the vendor or customer associated with the transaction
Update the accounting category or account for the transaction (e.g., "Travel", "Office Supplies", "Professional Services")
Split a transaction across multiple categories, dimensionValues, or customers. Each split can have its own amount, category, and allocation.
Request review from a bookkeeper or mark a transaction as reviewed
Add or update notes on the transaction for additional context or documentation
## Common Workflows
### Categorizing Transactions Needing Review
One of the most common workflows is identifying transactions that need categorization and applying the appropriate category:
1. **Query** for transactions needing review using `query_bank_transactions` with the `reviewStatus` filter set to "NEEDS\_REVIEW"
2. **Review** each transaction using `get_bank_transaction` to understand the context
3. **Update** the transaction with the appropriate category using `update_bank_transaction`
This workflow helps business owners stay on top of their bookkeeping by ensuring all transactions are properly categorized for tax reporting and financial analysis.
### Splitting Complex Transactions
Some transactions need to be split across multiple categories or business segments:
1. **Get** the full transaction details to understand the total amount
2. **Update** with split information, specifying amounts and categories for each split
3. **Add notes** documenting the reason for the split
Splits are common for transactions like business trips (split between travel, meals, and lodging) or bulk purchases from retailers like Amazon (split by category: office supplies, equipment, etc.).
## Examples
### "What transactions need my review?"
**AI uses:** `query_bank_transactions` with:
* `reviewStatus`: "needs review"
**AI responds:** "You have 8 transactions that need your review. Here are the highlights:
* \$1,245.00 from 'TECH SOLUTIONS INC' on January 10th
* \$687.50 from 'AMAZON.COM' on January 9th
* \$450.00 from 'OFFICE DEPOT' on January 8th
Would you like me to walk through these one by one?"
***
### "Can you recategorize this transaction as Business Meals?"
**AI uses:** `update_bank_transaction` with:
* `category`: "Business Meals"
**AI responds:** "I've recategorized this transaction as Business Meals. The \$67.43 expense from 'OLIVE GARDEN' on January 11th is now properly categorized in your books."
The AI should identify which transaction the user is referring to from context in the conversation. If ambiguous, the AI should use `query_bank_transactions` to find the most recent transaction or ask for clarification.
***
### "What was my most recent transaction from Ace Hardware?"
**AI uses:** `query_bank_transactions` with:
* `vendor`: "Ace Hardware" or `description`: "Ace Hardware"
* Sort by date (most recent first)
* Limit to 1 result
**AI responds:** "Your most recent transaction from Ace Hardware was \$124.87 on January 9th. It's currently categorized as 'Repairs & Maintenance'. The bank description shows 'ACE HARDWARE #2847'. Would you like to see more details or update the categorization?"
***
### "Can you find all transactions similar to the one I just edited?"
**AI uses:** Multiple `query_bank_transactions` calls based on the recently edited transaction's attributes:
* Same vendor
* Similar amount range (±20%)
* Same or similar description pattern
* Within a relevant time window
**AI responds:** "I found 5 transactions similar to the one you just edited (the \$89.00 'SHELL GAS STATION' transaction you categorized as 'Vehicle Expenses'):
1. \$92.50 from 'SHELL GAS STATION' on January 8th - currently uncategorized
2. \$85.00 from 'SHELL GAS STATION' on January 5th - currently uncategorized
3. \$78.45 from 'SHELL GAS STATION' on December 29th - categorized as 'Auto & Travel'
4. \$95.20 from 'CHEVRON' on January 7th - currently uncategorized
5. \$88.00 from 'BP GAS' on January 4th - currently uncategorized
Would you like me to categorize all the uncategorized gas station purchases as 'Vehicle Expenses'?"
# Embedding & Integration
Source: https://docs.tight.com/ai/mcp-tools/embedding-and-integration-mcp
Embed accounting functionality into your platform using the Tight Model Context Protocol (MCP) server
## Overview
Tight Embedding & Integration MCP tools enable AI assistants and agents to interact with the Tight API, embed user
experiences, and search its documentation.
## Available Tools
### Search Tight Documentation
The `search_tight_documentation` tool searches across Tight's full documentation, including API references, integration
guides, and embeddable UI component docs. Use this tool to answer questions, look up parameters, and find working code
examples as you build.
Connect your editor's AI agent (e.g., Claude Code, Cursor, VS Code Copilot) to Tight's MCP server so it can answer Tight-specific questions inline as you write code. See the [MCP Overview](/ai/mcp-tools/mcp-overview) for setup instructions.
# End User Support
Source: https://docs.tight.com/ai/mcp-tools/end-user-support-mcp
Support end-user inquiries in your platform using the Tight Model Context Protocol (MCP) server
## Overview
Tight End User Support MCP tools enable AI assistants and agents to search knowledge base and support content,
contextualized with the user's data.
## Available Tools
### Search Tight End User Support
The `search_tight_end_user_support` tool searches across
[Tight's full knowledge base and support content](/guides/get-started/launch-checklist/ai-support#knowledge-base). Use
this tool to handle user support inquires and to understand how to accomplish product use cases.
### Search Tight Bookkeeper Support
The `search_tight_bookkeeper_support` tool similarly searches across Tight's full knowledge base and support content
with a focus on bookkeeper-facing features, e.g. [Team Management](/guides/bookkeepers/team-management).
## Integrating into existing AI support
Many AI support agents support adding MCP tools via custom connectors, e.g.
[Intercom's Fin](https://www.intercom.com/help/en/articles/11461635-add-mcp-connectors-for-popular-apps-or-custom-mcps).
Adding the Tight MCP `search_tight_end_user_support` tool to your AI support agent will enable it to handle your user's
accounting support inquiries.
# Financial Statements
Source: https://docs.tight.com/ai/mcp-tools/financial-statements-mcp
Access and analyze balance sheets, P&L statements, and cash flow reports through Model Context Protocol
## Overview
Tight Financial Statements MCP tools enable AI assistants and agents to access and analyze comprehensive financial reports. Users can pull real-time financial statements and perform advanced analysis, all through conversational AI interactions.
With these tools, you can build AI-powered financial analysis experiences where users ask questions like "Show me our Q4 P\&L by department" or "How has our cash position changed over the past year?"
## Available Tools
### Generate Profit & Loss
The `generate_profit_and_loss` tool generates a Profit & Loss (P\&L) report with customizable parameters. This report shows revenue, expenses, and net income over a specified period.
Filter the report by dimensions to see performance by category
Specify the start and end dates for the report period (e.g., "2024-01-01 to 2024-12-31", "Q4 2024", "last year")
Organize the report by time period: "Yearly", "Quarterly", "Monthly", or "None"
Choose the format of the report output: "PDF" or "XLS"
The AI can analyze P\&L reports to compare performance across periods and/or [dimensions](/guides/business-owners/dimensions), analyze growth trends, and correlate trends across P\&L line items.
### Generate Balance Sheet
The `generate_balance_sheet` tool generates a Balance Sheet report showing assets, liabilities, and equity at specific points in time.
Specify the start and end dates for the report period
Organize the report by time period: "Yearly", "Quarterly", "Monthly", or "None"
Choose the format of the report output: "PDF" or "XLS"
The AI can analyze Balance Sheets to monitor debt and leverage, track liquidity and cash position, and assess financial stability over time.
### Generate Cash Flow Statement
The `generate_cash_flow_statement` tool generates a Cash Flow Statement showing cash inflows and outflows from operating, investing, and financing activities.
Specify the start and end dates for the report period
Organize the report by time period: "Yearly", "Quarterly", "Monthly", or "None"
Choose the format of the report output: "PDF" or "XLS"
The AI can analyze Cash Flow Statements to identify drivers of cash flow changes, track trends over time, and understand timing or operational factors behind fluctuations.
## Common Workflows
### Analyzing P\&L Performance
AI assistants can perform comprehensive P\&L analysis by pulling reports and analyzing the data:
1. **Compare performance across periods**: Analyze changes in revenue, expenses, and net income between different periods (e.g., month-over-month, year-over-year)
2. **Compare performance across dimensions**: Evaluate revenue, expense, or profit across different dimensions
3. **Analyze growth trends**: Identify upward or downward trends in revenue, expense, or net income over time
4. **Correlate trends across line items**: Examine relationships between different line items or dimensions to understand drivers of performance
This workflow helps business owners understand financial performance trends, identify areas of strength or concern, and make data-driven decisions.
### Monitoring Balance Sheet Health
AI assistants can assess financial stability and risk by analyzing Balance Sheet data:
1. **Debt analysis and leverage monitoring**: Track total liabilities, debt-to-equity ratios, and leverage trends over time to assess financial stability and identify potential risk exposure
2. **Cash position and liquidity tracking**: Analyze short-term assets versus liabilities to understand liquidity health, operating runway, and ability to meet near-term obligations
This workflow helps business owners monitor financial health, assess risk levels, and plan for future capital needs.
### Understanding Cash Flow Drivers
AI assistants can identify what's driving changes in cash position:
1. **Identify drivers of cash flow changes**: Break down changes in operating, investing, and financing cash flows to understand what's driving fluctuations in total cash position
2. **Track cash flow trends over time**: Analyze rolling periods (e.g., trailing twelve months) to identify timing or operational factors behind cash flow swings that may not be evident from other financial reporting
This workflow helps business owners understand cash dynamics, identify potential cash flow issues early, and plan for cash needs.
## Examples
### "Show me our P\&L for Q4 2024"
**AI uses:** `generate_profit_and_loss` with:
* `dateRange`: "Q4 2024" (October 1 - December 31, 2024)
* `grouping`: "Monthly"
* `output`: "PDF"
**AI responds:** "Here's your Profit & Loss statement for Q4 2024, broken down by month:
**Q4 2024 Summary:**
* Total Revenue: \$487,250
* Total Expenses: \$342,180
* Net Income: \$145,070
**Monthly Breakdown:**
* October: \$162,400 revenue, \$114,220 expenses, \$48,180 net income
* November: \$158,900 revenue, \$112,340 expenses, \$46,560 net income
* December: \$165,950 revenue, \$115,620 expenses, \$50,330 net income
Your Q4 performance shows consistent profitability with a 29.8% net margin. Would you like me to compare this to Q3 or analyze specific expense categories?"
***
### "How did our revenue compare to last quarter?"
**AI uses:** `generate_profit_and_loss` with:
* `dateRange`: "Q3 2024" and "Q4 2024"
* `grouping`: "Quarterly"
**AI responds:** "Your revenue increased from Q3 to Q4 2024:
**Q3 2024:** \$452,300
**Q4 2024:** \$487,250
**Change:** +\$34,950 (+7.7%)
This represents solid quarter-over-quarter growth. Breaking down the increase:
* October started strong at \$162,400
* November dipped slightly to \$158,900
* December recovered to \$165,950, your highest month in Q4
The 7.7% growth exceeds typical seasonal patterns. Would you like me to analyze which revenue categories drove this increase?"
***
### "What's our current cash position?"
**AI uses:** `generate_balance_sheet` with:
* `dateRange`: "current date"
* `grouping`: "None"
**AI responds:** "As of January 15, 2025, here's your cash position:
**Cash & Cash Equivalents:** \$1,527,600
**Liquidity Analysis:**
* Current Assets: \$1,598,850
* Current Liabilities: \$456,800
* Current Ratio: 3.5 (healthy - above 2.0 threshold)
* Quick Ratio: 3.2
**Operating Runway:** Based on your average monthly expenses of \~\$114,000, you have approximately 13.4 months of runway with current cash reserves.
Your liquidity position is strong. You have sufficient cash to cover near-term obligations and working capital needs. Would you like me to analyze how your cash position has changed over the past year?"
***
### "Analyze our debt-to-equity ratio trend over the past year"
**AI uses:** `generate_balance_sheet` with:
* `dateRange`: "2024-01-01 to 2024-12-31"
* `grouping`: "Quarterly"
**AI responds:** "Here's your debt-to-equity ratio trend for 2024:
* **Q1 2024:** 0.65 (Total Debt: \$142,000 | Total Equity: \$218,000)
* **Q2 2024:** 0.58 (Total Debt: \$138,500 | Total Equity: \$239,000)
* **Q3 2024:** 0.52 (Total Debt: \$135,200 | Total Equity: \$260,000)
* **Q4 2024:** 0.47 (Total Debt: \$131,800 | Total Equity: \$280,500)
**Key Findings:**
* Your debt-to-equity ratio improved by 28% over the year (0.65 → 0.47)
* Total debt decreased by \$10,200 (7.2% reduction)
* Total equity increased by \$62,500 (28.7% growth)
* Your Q4 ratio of 0.47 indicates low financial leverage and strong equity position
This is a positive trend showing you're reducing reliance on debt while growing equity through retained earnings. Your current ratio is well below the 1.0 threshold that typically signals higher financial risk."
***
### "Why did our cash flow drop last month?"
**AI uses:** `generate_cash_flow_statement` with:
* `dateRange`: "last 2 months"
* `grouping`: "Monthly"
**AI responds:** "Analyzing your cash flow for November and December 2024:
**November 2024:**
* Operating Cash Flow: +\$42,300
* Investing Cash Flow: -\$8,200
* Financing Cash Flow: -\$12,100
* **Net Cash Flow: +\$22,000**
**December 2024:**
* Operating Cash Flow: +\$38,500 (↓ \$3,800)
* Investing Cash Flow: -\$24,600 (↓ \$16,400)
* Financing Cash Flow: -\$12,100 (no change)
* **Net Cash Flow: +\$1,800 (↓ \$20,200)**
**Key Drivers of December Drop:**
1. **Increased Investing Activities (-\$16,400)**: You spent \$24,600 on investing activities in December vs. \$8,200 in November. This appears to be equipment or capital purchases.
2. **Slight Operating Cash Flow Decrease (-\$3,800)**: Operating cash flow dipped 9% due to the timing of receivables collections—you had more outstanding invoices at year-end.
The drop is primarily driven by one-time capital investments, not operational issues. Your operating cash flow remains healthy at \$38,500. Would you like me to review your accounts receivable aging to address the collection timing?"
# Invoicing
Source: https://docs.tight.com/ai/mcp-tools/invoicing-mcp
Create, update and query invoices using Model Context Protocol tools
## Overview
Tight Invoicing MCP tools enable AI assistants and agents to search, review, and manage invoices. Users can find invoices by customer, status, or amount, create new invoices with line items and payment plans, and update existing invoices, all through conversational AI interactions.
With these tools, you can build AI-powered invoicing experiences where users ask questions like "Show me all overdue invoices" or "Create an invoice for my client with a payment plan."
## Available Tools
### Query Invoices
The `query_invoices` tool searches for invoices based on multiple criteria. You can filter by customer, amount, date, invoice number, status, line items, payment plans, outstanding balance, and more.
Search for invoices by specific customer
Search on total invoice amount or within an amount range (e.g., "\$500-\$2000")
Filter invoices by invoice date or date range (e.g., "last quarter", "January 2025", "2025-01-01 to 2025-03-31")
Filter invoices by due date or date range to find upcoming or past due payments
Search by specific invoice number or invoice full invoice name
Filter by invoice status: Draft, Sent, Paid, Overdue, Partially Paid, or Void
Search for invoices containing specific services or expenses in line item descriptions
Filter invoices that have payment plans
Search for invoices with specific outstanding balance amounts or ranges (e.g., "\$100-\$1000")
Fuzzy search for text in line item descriptions or invoice notes
You can combine multiple search criteria to narrow results. For example, search for "overdue invoices over \$1,000 from customer ABC Corp" by combining status, amount, and customer filters.
### Get Invoice Details
The `get_invoice` tool retrieves detailed information about a specific invoice. Use this tool to review invoice details before making updates or to discuss pricing and payment terms with the user.
This tool returns comprehensive invoice data including:
* Customer information and contact details
* Invoice date, due date, and invoice number
* Line items with descriptions, quantities, rates, and amounts
* Service items and reimbursable expense items
* Sales tax calculations per line item
* Installment schedules and dates
* Payment history and current status
* Outstanding balance
* Discounts applied (percentage or fixed amount)
* Invoice notes, terms, and payment instructions
This tool is essential for conversational workflows where users want to discuss a specific invoice with the AI before making changes. The detailed context helps the AI provide informed suggestions about pricing, payment terms, or modifications.
### Save Invoice
The `save_invoice` tool creates new invoices or updates existing ones. This is the primary tool for managing invoices, adding line items, setting up payment plans, applying discounts, and managing invoice status.
Assign or change the invoice customer by name or ID
Add, modify, or remove line items. Each line item includes:
* **description**: Description of the service or product
* **quantity**: Number of units
* **rate**: Price per unit
* **amount**: Total line item amount (quantity × rate)
* **expense** (optional): Reference to an expense for reimbursement
* **salesTaxPercentage** (optional): Sales tax percentage for this line item
Set up or modify payment schedules breaking the total into installments. Each installment includes an amount and date.
Invoice date displayed on the invoice; also used for double-entry accounting purposes
Set or update payment terms and due date for the invoice
Add or edit invoice notes, payment instructions, or terms and conditions
Apply, modify, or remove percentage or fixed amount discounts. Specify either a percentage (e.g., 10%) or a fixed dollar amount (e.g., \$50).
Update invoice status (only for existing invoices): Draft, Sent, Paid, Overdue, Partially Paid, or Void
When creating or updating invoices, ensure you have reviewed the customer information and line item details to ensure accuracy. Incorrect amounts or payment terms can lead to payment delays and customer confusion.
## Common Workflows
### Sending a Quote
Quotes help business owners quickly provide pricing estimates to prospective or existing customers before work begins:
1. **Gather** information about the customer and proposed services or products
2. **Create** a draft invoice using `save_invoice` with customer, line items, and pricing
3. **Share** the quote with the customer for review and approval
This workflow enables business owners to respond quickly to quote requests and formalize pricing discussions.
Quotes are particularly useful for service-based businesses responding to RFPs or providing estimates for project work. Business owners can create multiple quote versions with different pricing scenarios before finalizing.
### Creating Invoices for Completed Work
One of the most common workflows is creating invoices for services rendered or products delivered:
1. **Gather** information about the customer, services provided, and pricing
2. **Create** the invoice using `save_invoice` with customer, line items, date, and due date
3. **Review** the invoice details using `get_invoice` to confirm accuracy before sending
This workflow helps business owners quickly bill clients for completed work while ensuring all details are correct.
### Setting Up Payment Plans
For larger invoices, offering payment plans can improve customer relationships and payment success:
1. **Get** the invoice details to understand the total amount
2. **Update** with installment information using `save_invoice`, specifying installment amounts and dates
3. **Add notes** documenting the payment schedule agreement
Payment plans are common for professional services, large projects, or ongoing retainers where clients prefer to spread payments over time.
## Examples
### "Send a quote to Ruth Smith for \$12k bathroom remodeling. Include a 3k down payment."
**AI uses:** `save_invoice` with:
* `customer`: "Ruth Smith"
* `lineItems`:
* description: "Bathroom Remodeling", quantity: 1, rate: 12000, amount: 12000
* `installments`:
* amount: 3000, date: "2025-02-01" (down payment)
* amount: 9000, date: "2025-03-15" (final payment)
* `date`: today's date
* `notes`: "Quote valid for 30 days. \$3,000 down payment required to begin work."
**AI responds:** "I've created a quote (QUO-1252) for Ruth Smith for bathroom remodeling:
**Total Amount:** \$12,000.00
**Payment Terms:**
* Down payment: \$3,000.00 due February 1, 2025
* Final payment: \$9,000.00 due March 15, 2025
The quote is currently in Draft status. Once Ruth approves, I can update the status to Sent and you can begin work."
***
### "Draft invoice to Joe's Photography for the 1/15 expense with a 20 percent markup and \$1,000 in labor."
**AI uses:** `save_invoice` with:
* `customer`: "Joe's Photography"
* `lineItems`:
* description: "Materials (expense from 1/15)" with the `expenseId` from Bank Transactions
* description: "Labor", quantity: 1, rate: 1000, amount: 1000
* `date`: today's date
**AI responds:** "I've created draft invoice INV-1253 for Joe's Photography:
**Line Items:**
1. Materials (expense from 1/15): \$180.00 (marked up 20% from \$150.00)
2. Labor: \$1,000.00
**Total:** \$1,180.00
The invoice is in Draft status. Would you like to set a due date or add any notes before sending?"
***
### "Add a 10 percent discount to that invoice"
**AI uses:** `save_invoice` with:
* Invoice ID from context (INV-1253)
* `discount`: percentage: 10
**AI responds:** "I've added a 10% discount to INV-1253. Here's the updated summary:
**Subtotal:** \$1,180.00
**Discount (10%):** -\$118.00
**New Total:** \$1,062.00
Would you like me to add a note explaining the discount?"
***
### "Show me all overdue invoices"
**AI uses:** `query_invoices` with:
* `status`: "Overdue"
**AI responds:** "You have 3 overdue invoices totaling \$6,250.00:
1. **INV-1247** - ABC Corp - \$3,200.00 - Due January 5th (6 days overdue)
2. **INV-1239** - XYZ Industries - \$2,100.00 - Due December 28th (14 days overdue)
3. **INV-1235** - Smith Consulting - \$950.00 - Due December 15th (27 days overdue)
Would you like me to help you draft follow-up messages for any of these?"
***
### "Create an invoice for Ruth Smith for \$12,000 split into 3 monthly payments"
**AI uses:** `save_invoice` with:
* `customer`: "Ruth Smith"
* `lineItems`: (gathered from context or user clarification)
* `installments`:
* amount: 4000, date: "2025-02-01"
* amount: 4000, date: "2025-03-01"
* amount: 4000, date: "2025-04-01"
* `date`: today's date
* `notes`: "Payment plan: 3 equal installments of \$4,000.00 due on the 1st of each month"
**AI responds:** "I've created INV-1254 for Ruth Smith with a \$12,000.00 payment plan:
**Payment Schedule:**
* Payment 1: \$4,000.00 due February 1, 2025
* Payment 2: \$4,000.00 due March 1, 2025
* Payment 3: \$4,000.00 due April 1, 2025
The invoice notes include the payment plan terms. What line items should I add to the invoice for the \$12,000.00 total?"
# Model Context Protocol
Source: https://docs.tight.com/ai/mcp-tools/mcp-overview
Integrate Tight accounting capabilities using Tight's Model Context Protocol (MCP) server
The Tight Model Context Protocol (MCP) server provides a set of tools that AI agents can use to interact with the Tight
API. You can use the MCP tools as a developer embedding Tight into your product, as a business owner looking for
financial insights, or as your platform seeking to perform comparative analytics across all businesses on your platform.
## Connect to Tight's MCP Server
### Connect as a bookkeeper or support agent
Configure your AI tool to point at the Tight MCP server using the parameters below. After you finish setup, your tool
walks you through the [OAuth flow](#authenticate-with-oauth) to sign in and grant access.
For Claude Pro, Max, Team, or Enterprise users, add Tight as a custom connector. To learn more, see the Claude
[documentation](https://support.claude.com/en/articles/11175166-get-started-with-custom-connectors-using-remote-mcp).
In the Claude desktop or web app, go to **Settings** > **Connectors** > **Add custom connector** and use the
following parameters:
* **Remote MCP server URL**: `https://mcp.tight.com` for production or `https://mcp.sandbox.tight.com` for sandbox
* **Connection mechanism**: OAuth
For ChatGPT Pro, Plus, Business, Enterprise, or Education users, follow the
[OpenAI documentation](https://platform.openai.com/docs/guides/developer-mode) for custom connectors using the
following parameters:
* **Server URL**: `https://mcp.tight.com` for production or `https://mcp.sandbox.tight.com` for sandbox
* **Connection mechanism**: OAuth
### Connect as a developer
Register the Tight MCP server with your development tool using the configuration below. Once registered, your tool
prompts you through the [OAuth flow](#authenticate-with-oauth) to sign in and grant access.
Execute the following command to register the Tight MCP server. To learn more, see the Claude Code
[documentation](https://docs.anthropic.com/en/docs/claude-code/mcp#configure-mcp-servers).
```bash Production theme={null}
claude mcp add-json tight '{"type":"http","url":"https://mcp.tight.com/"}'
```
```bash Sandbox theme={null}
claude mcp add-json tight '{"type":"http","url":"https://mcp.sandbox.tight.com/"}'
```
Add the following to your `.vscode/mcp.json`. To learn more, see the VS
Code [documentation](https://code.visualstudio.com/docs/copilot/chat/mcp-servers).
```json Production theme={null}
{
"servers": {
"tight": {
"type": "http",
"url": "https://mcp.tight.com"
}
}
}
```
```json Sandbox theme={null}
{
"servers": {
"tight": {
"type": "http",
"url": "https://mcp.sandbox.tight.com"
}
}
}
```
Use the remote server URL `https://mcp.tight.com` for production or `https://mcp.sandbox.tight.com` for sandbox,
with an `accessToken` obtained via the Tight [Authentication Endpoint](/api-reference/authentication).
```json Production theme={null}
{
"mcpServers": {
"tight": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.tight.com",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer ${tight_access_token}"
}
}
}
}
```
```json Sandbox theme={null}
{
"mcpServers": {
"tight": {
"command": "npx",
"args": [
"mcp-remote",
"https://mcp.sandbox.tight.com",
"--header",
"Authorization:${AUTH_HEADER}"
],
"env": {
"AUTH_HEADER": "Bearer ${tight_access_token}"
}
}
}
}
```
### Connect your existing AI chat interface
The Tight MCP server allows you to easily connect your product's existing AI chat interface by accepting the standard
Authorization header on any request.
Simply [generate an access token](/api-reference/authentication) and pass this on all requests to the Tight MCP server.
## Authenticate with OAuth
Once you attempt to connect, you are presented with a standard OAuth flow. Sign in with your email and password to
authenticate.
If you do not yet have a password, select the option to email yourself a link to set one, then return to the login
screen to sign in.
After authenticating, you are asked to grant access. Choose the level of access to grant the connection:
* **Read-only**: The connection can view your data but cannot make changes.
* **Read and write**: The connection can both view your data and make changes on your behalf.
## Tools
Once connected, you can now interact with the Tight API using your AI tool of choice. The Tight MCP server exposes a
variety of [MCP tools](https://modelcontextprotocol.io/specification/2025-06-18/server/tools) grouped by domain area.
Review the specific tools for each below:
* [Bank Transactions](/ai/mcp-tools/bank-transactions-mcp)
* [Embedding & Integration](/ai/mcp-tools/embedding-and-integration-mcp)
* [Financial Statements](/ai/mcp-tools/financial-statements-mcp)
* [Invoicing](/ai/mcp-tools/invoicing-mcp)
# AI-Native GL
Source: https://docs.tight.com/ai/philosophy/ai-native-general-ledger
Leveraging data from over 1.3M SMBs and a fully deterministic General Ledger
## Best of everything AI-native GL (AGL)
A fully deterministic general ledger ensures accuracy and reliability, but traditional ledgers weren't built to
take full advantage of AI. Tight built its AI-native General Ledger to both take advantage of the quick evolution of
LLMs and leverage the accuracy of a fully deterministic ledger.
### What AI can automate
AI helps automate categorization (93% on average), reconciliation, anomaly detection, reporting, and analysis, while the
fully deterministic nature of Tight's GL ensures AI hallucinations don't impact the underlying GL.
### Why a deterministic General Ledger
By nature of their model, LLMs work best with human language-level abstractions, not writing debits and credits
directly into the GL. Tight's API provides these LLM-friendly abstractions, e.g. categorizing a transaction, marking a
bill as paid, refunding an invoice payment, while encapsulating the underlying writes into the GL in a proven, robust
architecture. This API-first design is the *perfect* use case for Agents to fully manage a user's books without needing
to manage low-level general ledger transactions directly.
## Agentic Accounting
Agentic Accountants have arrived, allowing business owners to keep their books on auto-drive while trusting that Agentic
Accountants will reach out with any questions if/when needed. See
Tight's [Agentic Accounting updates](/ai/agentic/agentic-accountant) to stay up to date on its rapid
evolution.
## Creating an AI-native architecture
Tight's most talented (both experienced and AI-native) engineers reenvisioned Tight's APIs and architecture with Agentic
Accountants in mind, yielding Tight's AI-native ledger:
* [v6 API](/api-reference/authentication)
* Proven maturity and edge-case handling from v5
* DB optimized for high-performance floor and ceiling for AI-centric use cases, including burst requests
* Result sets formatted for ease of consumption by LLMs
* [Self-learning transaction categorization and reconciliation](ai/categorization/self-learning-transaction-categorization-overview),
leveraging rules formed by 1.3M SMBs' worth of data
## Building Tight MCPs
The [Tight MCP Server](/ai/mcp-tools/mcp-overview) was designed in parallel with the Tight v6 API itself, naturally
creating a cohesive AI-native ecosystem. That combined with the Tight team's deep knowledge of accounting use-cases,
both for business owners and bookkeepers, translated to a comprehensive set of MCP tools enabling agentic interaction
with the Tight API.
The Tight API's MCP tools are grouped by domain area:
* [Bank Transactions](/ai/mcp-tools/bank-transactions-mcp)
* [Embedding & Integration](/ai/mcp-tools/embedding-and-integration-mcp)
* [Financial Statements](/ai/mcp-tools/financial-statements-mcp)
* [Invoicing](/ai/mcp-tools/invoicing-mcp)
## Next Steps
Integrate Tight's rich accounting knowledge into your LLM-powered product
Enable autonomous AI agents to handle end-to-end accounting workflows
# Chart of Accounts
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/accounting/chart-of-accounts
Manage a business's chart of accounts and GL account structure
## Overview
The Chart of Accounts provides a real-time, hierarchical drill-down balance sheet, allowing business owner-operators and bookkeepers to:
* View their GL Account structure
* Add/edit GL Accounts
* View a real-time balance sheet
* Set beginning balances
## Embedding the Chart of Accounts
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Chart of Accounts:
```javascript theme={null}
Tight.render(containerId, "ChartOfAccounts");
```
# General Ledger
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/accounting/general-ledger
View and manage a business's general ledger entries
## Overview
The General Ledger provides a GL account-specific view into accounting transactions, allowing business owner-operators and bookkeepers to:
* View transactions specific to a given GL account
* See running debits/credits and how each transaction impacts the balance for the given GL account
* Edit transactions
* Download GL data into a spreadsheet
## Embedding the General Ledger
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the General Ledger:
```javascript theme={null}
Tight.render(containerId, "GeneralLedger");
```
# Journal
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/accounting/journal
Create and manage journal entries for a business
## Overview
The Journal displays running debits and credits for all accounting transactions. While business owner-operators don't typically access this view, it allows bookkeepers to:
* Review debits/credits in manner that bookkeepers are used to
* Add manual journal entries, which can be required in extreme edge cases
* View a Trial Balance report
## Embedding the Journal
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Journal:
```javascript theme={null}
Tight.render(containerId, "Journal");
```
# Expense Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/bank-transactions/expense-dashboard
Track and tag expenses, directly in your existing web app
## Overview
The Expense Dashboard allows you to embed fully-featured expense tracking into your existing web app, including:
* Automatic expense tracking, including [expense categorization and self-learning rules](/ai/categorization/self-learning-transaction-categorization-overview)
* Fully encapsulated bank account and credit card linkage, using [Plaid](/integrations/banking/plaid)
* User experience allowing your users to:
* manage bank account connections
* view expense reports (eg. by category, by vendor)
* attach receipts to expenses
* split expenses across categories
## Embedding the Expense Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Expense Dashboard:
```javascript theme={null}
Tight.render(containerId, "ExpenseDashboard");
```
# Income Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/bank-transactions/income-dashboard
The fully-featured experience for viewing and managing income
## Overview
The Income Dashboard is all you need to provide full insight into business income to your users, with a full user
experience allowing your users to:
* Link bank accounts and credit cards
* See how Tight AI categorized transactions
* Review any transactions that Tight AI could not confidently categorize
* Drill into payouts, to understand which invoices, merchant fees, and other line items comprise a payout
* Visualize income over time
* View/filter/search for income
## Embedding the Income Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Income Dashboard:
```javascript theme={null}
Tight.render(containerId, "IncomeDashboard");
```
# Transactions Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/bank-transactions/transactions-dashboard
The fully-featured experience for viewing and managing bank transactions
## Overview
The Transactions Dashboard is all you need to provide full transaction classification to your users, with a full user experience allowing your users to:
* Link bank accounts and credit cards
* See how transactions were segmented between revenue, expenses, refunds, bank transfers, and tax payments
* Drill into payouts, to understand which invoices, merchant fees, and other line items comprise a payout
* Review any transactions that Tight AI could not confidently categorize
* View/filter/search for transactions
## Embedding the Transactions Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Transactions Dashboard:
```javascript theme={null}
Tight.render(containerId, "TransactionsDashboard");
```
# Banks & Integrations
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/banks-and-integrations
Comprehensive standalone management for a user’s financial accounts
## Overview
The Banks & Integrations page gives users a clear and intuitive way to manage all of their financial accounts, including:
* Linking bank accounts through native integrations (e.g. Plaid)
* Creating and maintaining manual accounts
* Managing beginning balances across all account types
* Editing start dates for linked accounts
* Addressing connection or credential issues
* Cleaning up accounts through guided merge tools
## Embedding Banks & Integrations
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Banks & Integrations page:
```javascript theme={null}
Tight.render(containerId, "BanksAndIntegrations");
```
# Bookkeeper Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/bookkeeper-dashboard
Manage the books for all the businesses on your Virtual Bookkeeping platform
## Overview
Tight's Virtual Bookkeeping platform allows you to enable your own virtual bookkeeping business or embedded accounting
features within days, with QuickBooks-like functionality, but with significantly increased efficiency for your
bookkeeping team. Tight’s proven platform is used by thousands of accountants, virtual bookkeepers, tax preparers and
Fintech platforms to efficiently service hundreds of thousands of small business clients.
From the Accountant Dashboard, bookkeepers can easily manage bookkeeping teammates (including granular permissions), add
new clients, perform bank reconciliations, generate/email reports, and securely log into their clients' accounts.
## Embedding the Bookkeeper Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions
on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Bookkeeper Dashboard:
```javascript theme={null}
Tight.render(containerId, "AccountantDashboard");
```
# Financial Overview
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/financial-overview
An intelligent overview of the business owner's monthly financials
## Overview
The Financial Overview is all you need to provide full financials to your users, including:
* Onboarding-related action items like linking bank accounts and credit cards
* Monthly financial summaries
* As-needed action items whenever the business owner's attention is needed (e.g. the purpose of a bank transaction is unknown)
* Access to financial reporting (e.g. Profit & Loss, Balance Sheet, etc.)
## Embedding the Financial Overview
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Financial Overview:
```javascript theme={null}
Tight.render(containerId, "FinancialOverview");
```
# Report Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/financial-statements/report-dashboard
Access and manage all your business's financial reports
## Overview
Tight's Report Dashboard is a full-featured embedded experience (including all drill-down rows) for everything related to reports; all you need to do is add a "Reports" item to your product's navigation.
## Embedding the Report Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Report Dashboard:
```javascript theme={null}
Tight.render(containerId, "ReportDashboard");
```
## Options
Selecting and reordering the list of reports is currently only available in the [v5 Javascript SDK](/v5.0/embeddable-ui/financial-statements/report-dashboard).
It will be available in the v6 Plain JS SDK soon.
Until then, the Report Dashboard displays the full set of reports the business is entitled to, broken into sections.
# Design
Source: https://docs.tight.com/embeddable-ui/plain-js/patterns/design
Tight customizes the Embedded UI to match your product's look and feel
## Get Started
Every Tight Page supports desktop web, mobile web, and all breakpoints in between
Tight will work with you to understand your design needs and ensure the Embedded UI matches your brand. To begin, share
one of the following:
* **Your application**: A login URL and credentials that Tight's design team can use to analyze your branding and
styling
* **Design materials**: Brand guidelines, Figma files, or other design documentation
## Initial Setup
Tight's design team will need 2 to 4 weeks to complete the deep white labeling. Your team can add the Embedded
experience into your product in parallel with the Tight team customizing the look and feel to match your product. Once
the Tight team has completed the custom design implementation, the customized look and feel will automatically be
associated with your Tight API `client_id` and show up in your Embedded experience.
## Iterating Your Styles
You can submit a support request for design changes to Tight, and Tight will iterate the styling to ensure the
accounting functionality is embedded into your product in such a way that your users would never know it wasn't built
in-house.
# Embedding
Source: https://docs.tight.com/embeddable-ui/plain-js/patterns/embedding
Get started with Tight Embeddable UI via the plain Javascript SDK
The Tight Javascript SDK lets you embed Tight pages directly into your web app with no build step and no framework
dependency. Load the script, initialize it with an access token, and render a page into an element you already have in
your DOM.
Every Tight page supports desktop web, mobile web, and all breakpoints in between.
## Get Started
Add `tight.js` to your page with a `
```
Swap in the production URL when you're ready to go live. See [Environments](#environments).
```javascript theme={null}
Tight.init(accessToken);
```
```javascript theme={null}
Tight.render("finance-dashboard", "FinancialOverview");
```
## Loading the SDK
Loading the script creates a single global instance at `window.Tight`. Load it only once per page: a second load logs
an error and has no effect.
For convenience, assign `window.Tight` to a local variable and use that for subsequent calls:
```javascript theme={null}
const Tight = window.Tight;
```
### Environments
The script URL selects which Tight API environment the SDK targets:
| Environment | Script URL |
| - | - |
| Sandbox | `https://cdn.sandbox.tight.com/embedded/latest/tight.js` |
| Production | `https://cdn.prod.tight.com/embedded/latest/tight.js` |
Load the URL for the environment you'd like to target, and use an `accessToken` issued for that same environment. You
can obtain an applicable `accessToken` via the Tight [Authentication Endpoint](/api-reference/authentication).
Examples on this page use the sandbox URL. Swap in the production URL when you're ready to launch.
## Initializing the SDK
Call `init` with an access token before rendering anything. This authenticates the SDK and resets it to a clean state,
removing any existing page and listeners.
```javascript theme={null}
Tight.init(accessToken);
```
| Parameter | Type | Description |
| - | - | - |
| `accessToken` | `string` | A valid access token for the current user. Obtain one via the Tight [Authentication Endpoint](/api-reference/authentication). |
`init` does not render a page by itself. Call `render` afterward to display content.
### Refreshing credentials
Access tokens expire after 3600 seconds. When your token expires or changes, call `auth` instead of `init`. It updates
the token in place without clearing an already-rendered page or your registered listeners.
```javascript theme={null}
Tight.auth(newAccessToken);
```
Calling `init` again to refresh a token tears down the rendered page and every registered listener. Use `auth` for
token rotation and reserve `init` for first-time setup or switching users.
## Rendering a page
Call `render` to display a page inside a container element in your document.
```javascript theme={null}
Tight.render(containerId, page);
```
| Parameter | Type | Description |
| - | - | - |
| `containerId` | `string` | The `id` of an element already present in your DOM. The page renders inside this element. |
| `page` | `string` | The page to display. See [supported page values](#supported-page-values). |
```html theme={null}
```
Calling `render` again with a different `page` value updates the displayed page. Calling it with a different
`containerId` moves the page to that container.
### Supported page values
| Value | Page |
| - | - |
| `FinancialOverview` | [Financial Overview](/embeddable-ui/plain-js/pages/financial-overview) |
| `TransactionsDashboard` | [Transactions Dashboard](/embeddable-ui/plain-js/pages/bank-transactions/transactions-dashboard) |
| `BanksAndIntegrations` | [Banks & Integrations](/embeddable-ui/plain-js/pages/banks-and-integrations) |
| `ExpenseDashboard` | [Expense Dashboard](/embeddable-ui/plain-js/pages/bank-transactions/expense-dashboard) |
| `IncomeDashboard` | [Income Dashboard](/embeddable-ui/plain-js/pages/bank-transactions/income-dashboard) |
| `ReportDashboard` | [Report Dashboard](/embeddable-ui/plain-js/pages/financial-statements/report-dashboard) |
| `GeneralLedger` | [General Ledger](/embeddable-ui/plain-js/pages/accounting/general-ledger) |
| `ChartOfAccounts` | [Chart of Accounts](/embeddable-ui/plain-js/pages/accounting/chart-of-accounts) |
| `Journal` | [Journal](/embeddable-ui/plain-js/pages/accounting/journal) |
## Listening for events
Use `registerListener` to react to actions that happen inside the rendered page, such as a form opening or a workflow
completing. You might route a user back to your own invoicing product, gate functionality behind your own paywall, or
send analytics when a user opens a dashboard tile.
```javascript theme={null}
Tight.registerListener(key, listener, options);
```
| Parameter | Type | Description |
| - | - | - |
| `key` | `string` | The event to subscribe to. See [supported event keys](#supported-event-keys). |
| `listener` | `(payload: unknown) => void` | Callback invoked when the event fires. |
| `options.preventDefault` | `boolean` (optional) | When `true`, suppresses the SDK's default UI behavior for that event while still notifying your listener. Defaults to `false`. |
```javascript theme={null}
Tight.registerListener("invoice", (payload) => {
console.log("Invoice event:", payload);
});
```
To stop listening, call `unregisterListener` with the same key:
```javascript theme={null}
Tight.unregisterListener("invoice");
```
### Supported event keys
| Key | Fires on |
| - | - |
| `plaidLink` | Bank account linking actions (new, reset, relink, unlink, route to bank) |
| `plaidLinkEvent` | Raw bank-linking flow telemetry |
| `plaidLinkError` | Bank-linking failure |
| `gusto` | Gusto payroll connection started |
| `payroll` | Payroll record opened |
| `bITile` | A dashboard tile (cash flow, expense, profit & loss) is opened |
| `conversations` | A conversation/thread is opened |
| `bill` | A bill is opened |
| `invoice` | An invoice form is opened |
| `revenueRecognition` | A revenue recognition record is opened |
| `expenseAmortization` | An expense amortization record is opened |
| `assetDepreciation` | An asset depreciation record is opened |
| `journalEntry` | A journal entry is opened |
| `transactionForm` | Any transaction form is opened or closed (bank or processor) |
| `bankTransactionForm` | A bank transaction form is opened or closed |
| `processorTransactionForm` | A processor transaction form is opened or closed |
| `customer` | A customer record is opened |
Each listener receives a payload describing the result of the action, including whether it succeeded and any associated
data or error details.
## Full example
```html theme={null}
```
# Expense Dashboard
Source: https://docs.tight.com/embeddable-ui/react-native/expense-dashboard
Track and tag expenses, directly in your existing mobile app
## Overview
The React Native Expense Dashboard Component allows you to embed fully-featured expense tracking into your existing React Native mobile app, including:
* Automatic expense tracking, including [expense categorization and self-learning rules](/ai/categorization/self-learning-transaction-categorization-overview)
* Fully encapsulated bank account and credit card linkage, using [Plaid](/integrations/banking/plaid)
* User experience allowing your users to:
* manage bank account connections
* view expense reports (eg. by category, by vendor)
* attach receipts to expenses
* split expenses across categories
## UX
This page is under construction. Please check back later for more content.
## Embedding the Expense Dashboard
To initialize the Tight Embedded experience in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react-native/patterns/embedding).
Below is an example embedding of the Expense Dashboard:
```TSX ExpenseScreen.tsx theme={null}
import { ExpenseDashboard, Tight } from "@tight-embedded/react-native";
function ExpenseScreen({ accessToken }) {
return (
)
}
```
# Mileage Dashboard
Source: https://docs.tight.com/embeddable-ui/react-native/mileage-dashboard
Automatically track mileage, directly in your existing mobile app
The Tight Mileage SDK tracks 1M+ miles per days and over 1B miles-to-date
## Overview
The React Native Mileage Dashboard Component allows you to embed fully-featured [mileage tracking](/guides/business-owners/mileage-tracking) into your existing React Native mobile app, including:
* Auto-start / auto-stop mileage tracking that detects whether the user is driving using advanced telemetrics (GPS, Geofencing, etc.)
* Fully encapsulated permissioning and ability to run in the background, without your team having to learn anything about native iOS/Android permissioning
* User experience allowing your users to:
* View drives/routes/addresses
* Swipe to classify drive purpose (business vs. personal)
* Define favorite locations
* Link their vehicle's bluetooth device
* Location learning (e.g. automatically classifying drives to client locations as business)
* iOS and Android support, including annual updates around new OS releases
## UX
This page is under construction. Please check back later for more content.
## Embedding the Mileage Dashboard
To initialize the Tight Embedded experience in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react-native/patterns/embedding).
Below is an example embedding of the Mileage Dashboard:
```TSX MileageScreen.tsx theme={null}
import { MileageDashboard, Tight } from "@tight-embedded/react-native";
function MileageScreen({ accessToken }) {
return (
)
}
```
# Embedding
Source: https://docs.tight.com/embeddable-ui/react-native/patterns/embedding
Get started with Tight Embeddable UI for React Native
## Get Started
### NPM Configuration
Each Page is shipped in Tight's React Native Component Library, which can be installed as follows:
```bash npm theme={null}
npm install @tight-embedded/react-native@latest
```
Once imported, you'll need to ensure that every Embeddable UI component is rendered in a React Tree
wrapped with a `` component.
```TSX MileageScreen.tsx theme={null}
import { MileageDashboard, Tight } from "@tight-embedded/react-native";
function MileageScreen({ accessToken }) {
return (
)
}
```
Tight recommends adding a single `` component towards the top of your application tree for maintainability.
The `` component's `environment` property can be `"PRODUCTION"` or `"SANDBOX"`, depending on the environment you'd like to target. You can obtain an applicable `accessToken` via the Tight [Authentication Endpoint](/api-reference/authentication).
In addition to installing the Tight React Native Component Library, you must add the following to your `package.json`
```json package.json theme={null}
{
...
"react": "18.2.0",
"react-native": "0.75.5",
"react-redux": "~6.0.0",
"redux": "~4.0.0",
"@react-native-async-storage/async-storage": "~1.22.3",
"@react-native-community/datetimepicker": "~7.6.3",
"@react-native-community/netinfo": "~6.0.6",
"@react-native-cookies/cookies": "6.2.1",
"@react-native-picker/picker": "~2.7.2",
"react-native-device-info": "~8.4.5",
"react-native-gesture-handler": "~2.20.0",
"react-native-reanimated": "~3.18.0",
"react-native-localize": "github:tight-embedded/react-native-localize#v1.4.0-patch-1",
"react-native-safe-area-context": "~4.10.0",
"react-native-screens": "~3.33.0",
"react-native-maps": "~1.13.2",
"rn-fetch-blob": "github:tight-embedded/rn-fetch-blob#v0.11.2-patch-5"
...
}
```
### Babel Configuration
You must also add `react-native-reanimated/plugin` as the last plugin in your `babel.config.js`
```javascript babel.config.js theme={null}
module.exports = {
...
plugins: [
...
"react-native-reanimated/plugin"
],
...
};
```
### iOS Configuration
The Tight SDK supports a minimum iOS deployment version of iOS 17.0. Your app must target an iOS version greater than or equal to this version in order to use the Tight SDK.
#### Podfile Configuration
Add the following dependencies to your `Podfile`:
```ruby Podfile theme={null}
pod 'TightReactNative', :path => '../node_modules/@tight-embedded/react-native'
pod 'RNCAsyncStorage', :path => '../node_modules/@react-native-async-storage/async-storage', :modular_headers => true
pod 'GoogleUtilities', :modular_headers => true
pod 'GoogleMaps', '~> 7.3.0'
pod 'GooglePlaces', '~> 7.3.0'
```
#### Info.plist Configuration
In addition to installing the package with CocoaPods, you must also add the following to your app's `Info.plist` file:
1. The provided Tight API client id
```XML Info.plist theme={null}
TightClientId
fake_client_id
```
2. A Google Maps API key
```XML Info.plist theme={null}
GoogleAPIKey
fake_google_api_key
```
3. The following permission declarations, so that your app can request the necessary permissions from the user when they turn on mileage tracking, while complying with Apple's guidelines:
```XML Info.plist theme={null}
NSLocationAlwaysAndWhenInUseUsageDescription
YOUR_APP_NAME uses Tight to collect and transmit location data, which is used solely for drive detection and mileage tracking.
For automatic drive detection and mileage tracking, please select "Change to Always Allow".
NSLocationAlwaysUsageDescription
YOUR_APP_NAME uses Tight to collect and transmit location data, which is used solely for drive detection and mileage tracking.
For automatic drive detection and mileage tracking, please select "Change to Always Allow".
NSLocationUsageDescription
YOUR_APP_NAME uses Tight to collect and transmit location data, which is used solely for drive detection and mileage tracking.
For automatic drive detection and mileage tracking, please select "Allow While Using App".
NSLocationWhenInUseUsageDescription
YOUR_APP_NAME uses Tight to collect and transmit location data, which is used solely for drive detection and mileage tracking.
For automatic drive detection and mileage tracking, please select "Allow While Using App".
NSMotionUsageDescription
YOUR_APP_NAME uses Tight to collect and transmit motion data, which is used solely for drive detection and mileage tracking.
For automatic drive detection and mileage tracking, please select “Allow”.
UIBackgroundModes
location
```
### Android Configuration
The Tight SDK supports a minimum Android SDK version of 28. Your app must target an Android SDK version greater than or equal to this version in order to use the Tight SDK.
#### Gradle Configuration
Add the following to your `settings.gradle.kts` file:
```kotlin settings.gradle.kts theme={null}
pluginManagement {
repositories {
mavenCentral()
}
}
```
Then, add the following to your `ReactApplication`:
```kotlin MainApplication.kt theme={null}
...
import com.tight.reactnative.Tight
...
class MainApplication : Application(), ReactApplication {
...
override fun onCreate() {
super.onCreate()
Tight.initialize(this);
}
...
}
```
#### Resource Configuration
In addition to the configuration above, you must also add the following to your app's resource files:
1. The provided Tight API client id in `res/values/strings.xml`
```XML strings.xml theme={null}
fake_client_id
```
2. A Google Maps API key in `res/values/strings.xml`
```XML strings.xml theme={null}
fake_google_api_key
```
# Chart of Accounts
Source: https://docs.tight.com/embeddable-ui/react/accounting/chart-of-accounts
Manage a business's chart of accounts and GL account structure
## Overview
The Chart of Accounts provides a real-time, hierarchical drill-down balance sheet, allowing business owner-operators and bookkeepers to:
* View their GL Account structure
* Add/edit GL Accounts
* View a real-time balance sheet
* Set beginning balances
## Embedding the Chart of Accounts
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Chart of Accounts:
```TSX COA.tsx theme={null}
import { ChartOfAccounts, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function COA({ accessToken }) {
return (
)
}
```
# General Ledger
Source: https://docs.tight.com/embeddable-ui/react/accounting/general-ledger
View and manage a business's general ledger entries
## Overview
The General Ledger provides a GL account-specific view into accounting transactions, allowing business owner-operators and bookkeepers to:
* View transactions specific to a given GL account
* See running debits/credits and how each transaction impacts the balance for the given GL account
* Edit transactions
* Download GL data into a spreadsheet
## Embedding the General Ledger
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the General Ledger:
```TSX Ledger.tsx theme={null}
import { GeneralLedger, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function Ledger({ accessToken }) {
return (
)
}
```
## Props
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
The ID for the GL Account to view on the General Ledger
Category filter
Id filter - returns all entities with the following attachments.
List of values to include.
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
Value - returns all records with specified field equal to this value.
Value - returns all records with specified field not equal to this value.
Value - returns all records with specified field greater than to this value.
Value - returns all records with specified field greater than or equal to this value.
Value - returns all records with specified field less than to this value.
Value - returns all records with specified field less than or equal to this value.
Review status filter
List of values to include.
Available options: `RECONCILIATION_DISCREPANCY`, `USER_REVIEW_REQUIRED`, `ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`, `AWAITING_MATCH`, `STAGED`, `RECONCILED`
List of values to exclude.
Available options: `RECONCILIATION_DISCREPANCY`,
`USER_REVIEW_REQUIRED`,
`ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`,
`AWAITING_MATCH`,
`STAGED`,
`RECONCILED`
Type filter
List of values to include.
Available options: `EXPENSE`,
`REVENUE`,
`BANK_TRANSFER`,
`TAX_PAYMENT`,
`INVOICE_PAYMENT`
List of values to exclude.
Available options: `EXPENSE`,
`REVENUE`,
`BANK_TRANSFER`,
`TAX_PAYMENT`,
`INVOICE_PAYMENT`
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the Transactions Dashboard.
# Journal
Source: https://docs.tight.com/embeddable-ui/react/accounting/journal
Create and manage journal entries for a business
## Overview
The Journal displays running debits and credits for all accounting transactions. While business owner-operators don't typically access this view, it allows bookkeepers to:
* Review debits/credits in manner that bookkeepers are used to
* Add manual journal entries, which can be required in extreme edge cases
* View a Trial Balance report
## Embedding the Journal
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Journal:
```TSX JournalDash.tsx theme={null}
import { Journal, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function JournalDash({ accessToken }) {
return (
)
}
```
## Props
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
General ledger account filter
Id filter - returns all entities with the following attachments.
List of values to include.
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
Value - returns all records with specified field equal to this value.
Value - returns all records with specified field not equal to this value.
Value - returns all records with specified field greater than to this value.
Value - returns all records with specified field greater than or equal to this value.
Value - returns all records with specified field less than to this value.
Value - returns all records with specified field less than or equal to this value.
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the Transactions Dashboard.
# Expense Dashboard
Source: https://docs.tight.com/embeddable-ui/react/bank-transactions/expense-dashboard
The fully-featured experience for viewing and managing expenses
## Overview
The Expense Dashboard is all you need to provide full insight into business expenses to your users, allowing your users to:
* Link bank accounts and credit cards
* See how Tight AI categorized transactions
* Review any transactions that Tight AI could not confidently categorize
* Visualize expenses over time
* View/filter/search for expenses
## Embedding the Transactions Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Expense Dashboard:
```TSX TransactionsDashboard.tsx theme={null}
import { ExpenseDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function ExpenseDash({ accessToken }) {
return (
)
}
```
## Props
"}>
An ordered array describing which table columns to display on the dashboard. Duplicate entries will
be ignored.
A column is an object with two fields, `column` and `width`.
`column` is the name of the column. `width` is the desired pixel width of the column, and is optional.
Available options: `date`, `description`, `amount`, `category`, `reviewStatus`, `dimensionValue`
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
Category filter
Id filter - returns all expenses in the given categories.
List of values to include.
Dimension value filter
Id filter - returns all expenses belonging to the given dimension values.
List of values to include.
Value - returns all expenses on the given date.
Value - returns all expenses not on the given date.
Value - returns all expenses after the given date.
Value - returns all expenses on or after the given date.
Value - returns all expenses before the given date.
Value - returns all expenses on or before the given date.
Review status filter
List of values to include.
Available options: `RECONCILIATION_DISCREPANCY`, `USER_REVIEW_REQUIRED`, `ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`, `AWAITING_MATCH`, `STAGED`, `RECONCILED`
List of values to exclude.
Available options: `RECONCILIATION_DISCREPANCY`,
`USER_REVIEW_REQUIRED`,
`ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`,
`AWAITING_MATCH`,
`STAGED`,
`RECONCILED`
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the Transactions Dashboard.
# Income Dashboard
Source: https://docs.tight.com/embeddable-ui/react/bank-transactions/income-dashboard
The fully-featured experience for viewing and managing income
## Overview
The Income Dashboard is all you need to provide full insight into business income to your users, allowing your users to:
* Link bank accounts and credit cards
* See how Tight AI categorized transactions
* Review any transactions that Tight AI could not confidently categorize
* Drill into payouts, to understand which invoices, merchant fees, and other line items comprise a payout
* Visualize income over time
* View/filter/search for income
## Embedding the Transactions Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Income Dashboard:
```TSX IncomeDashboard.tsx theme={null}
import { IncomeDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function IncomeDash({ accessToken }) {
return (
)
}
```
## Props
"}>
An ordered array describing which table columns to display on the dashboard. Duplicate entries will
be ignored.
A column is an object with two fields, `column` and `width`.
`column` is the name of the column. `width` is the desired pixel width of the column, and is optional.
Available options: `date`, `description`, `amount`, `category`, `reviewStatus`, `dimensionValue`
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
Category filter
Id filter - returns all incomes in the given categories.
List of values to include.
Dimension value filter
Id filter - returns all incomes belonging to the given dimension values.
List of values to include.
Value - returns all incomes on the given date.
Value - returns all incomes not on the given date.
Value - returns all incomes after the given date.
Value - returns all incomes on or after the given date.
Value - returns all incomes before the given date.
Value - returns all incomes on or before the given date.
Review status filter
List of values to include.
Available options: `RECONCILIATION_DISCREPANCY`, `USER_REVIEW_REQUIRED`, `ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`, `AWAITING_MATCH`, `STAGED`, `RECONCILED`
List of values to exclude.
Available options: `RECONCILIATION_DISCREPANCY`,
`USER_REVIEW_REQUIRED`,
`ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`,
`AWAITING_MATCH`,
`STAGED`,
`RECONCILED`
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the Transactions Dashboard.
# Transaction Form
Source: https://docs.tight.com/embeddable-ui/react/bank-transactions/transaction-form
Create and edit individual bank transactions
## Overview
Tight's Transaction Form Embedded experience makes it easy for you to direct a user or accountant to a specific transaction for review. This serves as a simple way to have your users or their accountant interact with and update their transactions in the Tight API.
## Embedding the Transaction Form
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Transaction Form:
```TSX Form.tsx theme={null}
import { TransactionForm, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function Form({ accessToken }) {
return (
)
}
```
## Props
The `bankTransaction.id` that belongs to the form you would like to render. The form will automatically render
the correct fields for the bank transaction.
The `onClose` function is called anytime the user closes the form.
This indicates that the `` can safely be removed from the component tree.
The result of a successful form submission. Empty when the `error` argument is non-null.
An object populated with the error details of an unsuccessful form submission. `null` when `data` is not empty.
# Transactions Dashboard
Source: https://docs.tight.com/embeddable-ui/react/bank-transactions/transactions-dashboard
The fully-featured experience for viewing and managing bank transactions
## Overview
The Transactions Dashboard is all you need to provide full transaction classification to your users, with a full user experience allowing your users to:
* Link bank accounts and credit cards
* See how transactions were segmented between revenue, expenses, refunds, bank transfers, and tax payments
* Drill into payouts, to understand which invoices, merchant fees, and other line items comprise a payout
* Review any transactions that Tight AI could not confidently categorize
* View/filter/search for transactions
## Embedding the Transactions Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Transactions Dashboard:
```TSX TransactionsDashboard.tsx theme={null}
import { TransactionsDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function TransactionsDash({ accessToken }) {
return (
)
}
```
## Props
"}>
An ordered array describing which table columns to display on the dashboard. Duplicate entries will
be ignored.
A column is an object with two fields, `column` and `width`.
`column` is the name of the column. `width` is the desired pixel width of the column, and is optional.
Available options: `date`, `description`, `amount`, `category`, `reviewStatus`, `dimensionValue`
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
Category filter
Id filter - returns all transactions in the given categories.
List of values to include.
Dimension value filter
Id filter - returns all transactions belonging to the given dimension values.
List of values to include.
Value - returns all transactions on the given date.
Value - returns all transactions not on the given date.
Value - returns all transactions after the given date.
Value - returns all transactions on or after the given date.
Value - returns all transactions before the given date.
Value - returns all transactions on or before the given date.
Review status filter
List of values to include.
Available options: `RECONCILIATION_DISCREPANCY`, `USER_REVIEW_REQUIRED`, `ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`, `AWAITING_MATCH`, `STAGED`, `RECONCILED`
List of values to exclude.
Available options: `RECONCILIATION_DISCREPANCY`,
`USER_REVIEW_REQUIRED`,
`ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`,
`AWAITING_MATCH`,
`STAGED`,
`RECONCILED`
Type filter
List of values to include.
Available options: `EXPENSE`,
`REVENUE`,
`BANK_TRANSFER`,
`TAX_PAYMENT`,
`INVOICE_PAYMENT`
List of values to exclude.
Available options: `EXPENSE`,
`REVENUE`,
`BANK_TRANSFER`,
`TAX_PAYMENT`,
`INVOICE_PAYMENT`
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the Transactions Dashboard.
# Banks & Integrations
Source: https://docs.tight.com/embeddable-ui/react/banks-and-integrations
All-in-one management page for connecting a user’s financial accounts
## Overview
The Banks & Integrations page gives users an intuitive way to manage all of their connected financial accounts and integrations, including:
* Linking bank accounts through Plaid
* Connecting other financial accounts via Tight's native integrations (e.g. Gusto, Shopify, Stripe)
* Creating and maintaining manual accounts
* Setting start dates and beginning balances
* Addressing connection or credential issues
## Embedding Banks & Integrations
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Banks & Integrations page:
```TSX HomeDashboard.tsx theme={null}
import { BanksAndIntegrations, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function HomeDashboard({ accessToken }) {
return (
)
}
```
## Props
A callback function that is fired whenever a user attempts to open Plaid from the Banks & Integrations page (for
example, when adding a new bank or resolving a connection issue).
You should use this if and only if your application *already* includes Plaid Link, that way you can intercept any user
action in Tight's Embedded UI that would invoke Plaid Link, so that *your* application can render Plaid Link.
Alternatively, if omitted, Tight's Embedded UI handles all Plaid Link invocations on your behalf of your application.
[//]: # "Using this prop will override the global `onPlaidLink` [Event listener](/embeddable-ui/react/reference/events/onPlaidLink)"
[//]: # "within the embedded Banks & Integrations page."
This function will be called with a single custom `EventData` argument with the following schema:
The name of the corresponding `EventType`. Always `"onPlaidLink"` for this event.
A human-readable message explaining the event. This is a convenience for developers consuming the event to understand the purpose of the event firing. This message should not be shown to users.
Whether the default action in the app was prevented. This will always be `true` for `onPlaidLink` events.
A custom data object containing details about the Plaid Link event.
Type of Plaid Link CTA that was pressed by your user. See below for information on how to handle each possible value.
| Plaid Event | Description |
| - | - |
| `NEW` | Open Plaid Link so the the user can link a new financial institution |
| `UPDATE` | Open Plaid Link to Update Mode using the provided `apiAccessToken`. |
| `UNLINK` | Unlink the user's Plaid Integration. |
| `UNLINK_RELINK` | Unlink the user's Plaid Integration, then ask them to link again. |
The `id` of the Integration in Tight's database associated with the relevant institution. This value is
always provided, except for the `plaidEvent` type `"NEW"`.
The access token from the Integration. This value is always provided, except for the `plaidEvent` type `"NEW"`.
The error code associated with the Plaid connection, if applicable.
# Bill Dashboard
Source: https://docs.tight.com/embeddable-ui/react/bills/bill-dashboard
The fully-featured experience for viewing and managing bills (A/P)
## Overview
The Bill Dashboard is all you need to provide full bill pay to your users, with a full user experience allowing your users to:
* Pay bills, including:
* Choosing payment mechanism (e.g. ACH, Credit Card, Check)
* Scheduling future payment dates
* Set recurring payments
* Have bills automatically reconciled against bank deposits
* See payment status of bills
* Generate Aged AP reporting
## Embedding the Bill Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Bill Dashboard:
```TSX BillDashboard.tsx theme={null}
import { BillDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function BillDash({ accessToken }) {
return (
)
}
```
## Props
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
Value - returns all records with specified field equal to this value.
Value - returns all records with specified field not equal to this value.
Value - returns all records with specified field greater than to this value.
Value - returns all records with specified field greater than or equal to this value.
Value - returns all records with specified field less than to this value.
Value - returns all records with specified field less than or equal to this value.
Type filter
List of values to include.
Available options: `DRAFT`,
`OPEN`,
`CLOSED`,
`CANCELED`,
`REFUNDED`
List of values to exclude.
Available options: `DRAFT`,
`OPEN`,
`CLOSED`,
`CANCELED`,
`REFUNDED`
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the Bill Dashboard.
# Business Intelligence
Source: https://docs.tight.com/embeddable-ui/react/business-intelligence
Core business metrics at a glance
## Overview
Tight's Business Intelligence Tiles make it easy for you to provide your users with an easily digestible
overview of their business's key performance indicators. It also serves as a great way to onboard new users, as it
gives them a glimpse of the business intelligence they will receive by simply following a few quick onboarding steps.
## Tiles
### Profit and Loss
The Profit & Loss tile gives the user a quick snapshot of their business's profit after tax. Unlike many P\&Ls, the
final number in this tile subtracts out the business owner's tax obligation, yielding the single most important number
to every business owner.
### Cash Flow
The Cash Flow tile gives the user a quick snapshot of the cash flowing in and out of their business's bank accounts.
These inflows and outflows include all transaction types, including income (including loans/liabilities, funding/equity),
expenses (including assets purchased, owners draw), bank transfers, and tax payments.
### Expenses
The Expense tile gives the user a quick snapshot of their business expense transactions, including the top spending
categories. This tile only includes the actual business expenses (i.e., it excludes capital assets, owner's draw, and
any other money spent that results in an addition to the Balance Sheet).
### Income
The Income tile gives the user a quick snapshot of their business income transactions. This tile only includes the
actual business income (i.e., it excludes bank transfers, loans received, and any other money received that results in an addition to the Balance Sheet).
### Invoices
The Invoice tile gives the user a quick snapshot of the invoices they have sent as well as the money they are still owed for open invoices.
### Taxes
The Tax tile gives the user a quick snapshot of their taxes owed. Tight estimates the federal, state, and self-employed
taxes that the business owner will owe, for all pass-through entity types.
## Embedding the Business Intelligence Tiles
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Business Intelligence tiles:
```TSX BusinessIntelligenceTiles.tsx theme={null}
import { CashFlowTile, ExpenseTile, ProfitAndLossTile, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
const containerStyle = {
display: "flex",
flexWrap: "wrap",
justifyContent: "center",
width: "100%",
};
function BusinessIntelligenceTiles({ accessToken }) {
return (
);
}
```
## Props
Whether or not to show tooltips. Tooltips improve usability by providing quick explanations without cluttering
the interface and help users understand tile data. To display them, pass this prop as `true`.
A callback function invoked when the user presses on the tile. You can leverage this to route the user to the most
relevant location within your app.
Note: By default, if the user has not linked their bank through the Plaid integration clicking a tile will take them
to the Plaid Link UX. Passing a custom `onPress` callback will override this behavior.
"}>
The date range that the tile will show data from.
Available options: `ALL_TIME`, `THIS_MONTH`, `LAST_MONTH`, `LAST_3_MONTHS`, `LAST_12_MONTHS`, `THIS_QUARTER`, `LAST_QUARTER`, `THIS_YEAR`, `LAST_YEAR`
# Tight Dashboard
Source: https://docs.tight.com/embeddable-ui/react/financial-overview
All agentic accounting functionality in one place for the business owner
## Overview
The Tight Dashboard is all you need to provide full financials to your users, including:
* Onboarding-related action items like linking bank accounts and credit cards
* Monthly financial summaries
* As-needed action items whenever the business owner's attention is needed (e.g. the purpose of a bank transaction is unknown)
* Access to financial reporting (e.g. Profit & Loss, Balance Sheet, etc.)
## Embedding the Tight Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Financial Overview:
```TSX HomeDashboard.tsx theme={null}
import { FinancialOverview, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function HomeDashboard({ accessToken }) {
return (
)
}
```
## Props
The time of year for which to show a financial summary, in terms of `month` and `year`. If not provided, the
period defaults to the current month and year, though the user may navigate between months from the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangePeriod` prop to set the new value in the parent component.
The month of the year for the displayed financial period. Must be a number between 0 and 11, where 0 is January
and 11 is December.
The year for the displayed financial period.
A function that is called whenever the user changes the viewed financial period from the dashboard.
This function will only be invoked if the `period` prop is also provided. The callback takes `period` as its single
argument.
The new financial period
The month of the year for the displayed financial period. Must be a number between 0 and 11, where 0 is January
and 11 is December.
The year for the displayed financial period.
# Balance Sheet
Source: https://docs.tight.com/embeddable-ui/react/financial-statements/balance-sheet
View your business's assets, liabilities, and equity at a point in time
## Overview
A Balance Sheet is a financial statement that shows a snapshot of a business's assets, liabilities, and equity at a specific moment in time. The Balance Sheet provides insight into the business’s financial health by showing what the business owns and owes, which helps determine the business's ability to pay its obligations.
This financial statement can be customized to view and compare the account balances at different dates. It can even be drilled down into to see all of the transactions and journal entries contributing to the balance for each specific GL account.
## Embedding the interactive Balance Sheet
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Balance Sheet:
```TSX BalanceSheetReport.tsx theme={null}
import { BalanceSheet, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function BalanceSheetReport({ accessToken }) {
return (
)
}
```
## Props
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
The date range for which to show the report.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeDateRange` prop to set the new value in the parent component.
The beginning of the range, inclusive.
The end of the range, inclusive.
The time period grouping of the report (e.g. for creating a month-over-month report).
Available options: `NONE`, `MONTHLY`, `QUARTERLY`, `YEARLY`
A function that is called whenever the user changes the grouping from the dashboard.
This function will only be invoked if the `grouping` prop is also provided. The callback takes a `grouping` as its single
argument.
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
# Cash Flow Statement
Source: https://docs.tight.com/embeddable-ui/react/financial-statements/cash-flow-statement
Track the flow of cash in and out of your business
## Overview
A Cash Flow Statement (aka CFS, Statement of Cash Flows, or SCF) is a financial statement that provides a detailed overview of a business's cash movement during a specific period. The CFS provides insight into the business's operating, investing, and financing activities. This information helps the business understand their cash on hand, which informs their ability to operate in the short-term and long-term as well as their ability to fund business operations.
Tight provides an indirect CFS, which is divided into 3 sections:
* Operating Activities - This section includes the business's cash flow from core operations, including income generated and expenses paid
* Investing Activities - This section includes the business's cash flow from selling or purchasing assets
* Financing Activities - This section includes the business's cash flow from equity and debt
The bottom of the CFS summarizes the beginning and ending cash and the resulting cash on hand at the end of the reporting period.
## Embedding the interactive Cash Flow Statement
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Cash Flow Statement:
```TSX CashFlow.tsx theme={null}
import { CashFlowStatement, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function CashFlowReport({ accessToken }) {
return (
)
}
```
## Props
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
The date range for which to show the report.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeDateRange` prop to set the new value in the parent component.
The beginning of the range, inclusive.
The end of the range, inclusive.
The time period grouping of the report (e.g. for creating a month-over-month report).
Available options: `NONE`, `MONTHLY`, `QUARTERLY`, `YEARLY`
A function that is called whenever the user changes the grouping from the dashboard.
This function will only be invoked if the `grouping` prop is also provided. The callback takes a `grouping` as its single
argument.
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
# Profit & Loss Report
Source: https://docs.tight.com/embeddable-ui/react/financial-statements/profit-loss-report
View your business's revenue, expenses, and profitability
## Overview
A Profit & Loss (P\&L) Report is a financial statement that summarizes the profitability (or lack thereof) for a business in a specific timeframe. The P\&L provides insight into the business’s financial performance by showing the overall profit or overall loss of the business for the specified timeframe, including where money was earned (income) and where money was spent (expenses).
The P\&L reflects the General Ledger (GL) accounts associated with each tracked transaction and journal entry. This financial statement can be customized to view and compare any of the tracked data. It can even be drilled down into to better understand all of the transactions and journal entries making up the total for each specific GL account within the reporting period.
## Embedding the interactive Profit and Loss Report
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Profit and Loss Report:
```TSX ProfitLoss.tsx theme={null}
import { ProfitAndLoss, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function ProfitLossReport({ accessToken }) {
return (
)
}
```
## Props
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
The date range for which to show the report.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeDateRange` prop to set the new value in the parent component.
The beginning of the range, inclusive.
The end of the range, inclusive.
The time period grouping of the report (e.g. for creating a month-over-month report).
Available options: `NONE`, `MONTHLY`, `QUARTERLY`, `YEARLY`
A function that is called whenever the user changes the grouping from the dashboard.
This function will only be invoked if the `grouping` prop is also provided. The callback takes a `grouping` as its single
argument.
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
# Report Dashboard
Source: https://docs.tight.com/embeddable-ui/react/financial-statements/report-dashboard
Access and manage all your business's financial reports
## Overview
Tight's Report Dashboard is a full-featured embedded experience (including all drill-down rows) for everything related to reports; all you need to do is add a "Reports" item to your product's navigation.
## Embedding the Report Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Report Dashboard:
```TSX Reports.tsx theme={null}
import { ReportDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function Reports({ accessToken }) {
return (
)
}
```
## Props
The set of reports to show on the dashboard.
Available options: `AGED_ACCOUNTS_PAYABLE`, `AGED_ACCOUNTS_RECEIVABLE`, `BALANCE_SHEET`, `CASH_FLOW`, `EXPENSES_BY_CATEGORY`, `EXPENSES_BY_VENDOR`, `PROFIT_AND_LOSS`, `FORM_1040_SCHEDULE_C`, `FORM_1065`, `FORM_1120S`, `FORM_1120`, `T2125`, `TAX_SUMMARY`, `TRIAL_BALANCE`,
If you prefer for the list of reports to not be broken into sections, you can set `showReportSections` to false.
# Trial Balance Report
Source: https://docs.tight.com/embeddable-ui/react/financial-statements/trial-balance-report
Verify the accuracy of your business's accounting records
## Overview
A Trial Balance is a financial statement that shows the closing balance of each General Ledger (GL) account at a specific point in time. This report helps accountants perform a high-level audit of a business's books, ultimately ensuring everything is being tracked and accounted for accurately in the GL.
The Trial Balance displays the beginning balance, net debit or net credit, and ending balance of each GL account for the period. This report is primarily used to help the business owner ensure their debits and credits are accounted for properly in the GL and their books are balanced.
When viewing a Trial Balance, the bookkeeper can drill down into the report to see all of the transactions and journal entries contributing to the debit balance, credit balance, or ending balance for each specific GL account within the reporting period.
## Embedding the interactive Trial Balance
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Trial Balance:
```TSX TrialBalanceReport.tsx theme={null}
import { TrialBalance, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function TrialBalanceReport({ accessToken }) {
return (
)
}
```
## Props
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
The date range for which to show the report.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeDateRange` prop to set the new value in the parent component.
The beginning of the range, inclusive.
The end of the range, inclusive.
The time period grouping of the report (e.g. for creating a month-over-month report).
Available options: `NONE`, `MONTHLY`, `QUARTERLY`, `YEARLY`
A function that is called whenever the user changes the grouping from the dashboard.
This function will only be invoked if the `grouping` prop is also provided. The callback takes a `grouping` as its single
argument.
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
# QuickBooks Online Import
Source: https://docs.tight.com/embeddable-ui/react/imports/quickbooks-online-import
Import accounting data from QuickBooks Online
## Overview
While [independent research shows that 62% of small businesses don't use any accounting software yet](https://www.tight.com/embedded-accounting-smb-vertical-software-report), leaving a major greenfield opportunity for your platform, Tight's customer-partners have also migrated thousands of businesses off of QuickBooks Online using Tight's QBO Import functionality.
The QBO Import functionality allows you to transfer a business’s QBO data into your embedded accounting platform, preserving the business’s historical financial information.
## Embedding the QuickBooks Online Import
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the QuickBooks Online Import:
```TSX QboImport.tsx theme={null}
import { AccountingImport, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function QboImport({ accessToken }) {
return (
)
}
```
# Wave Import
Source: https://docs.tight.com/embeddable-ui/react/imports/wave-import
Import accounting data from Wave
## Overview
While [independent research shows that 62% of small businesses don't use any accounting software yet](https://www.tight.com/embedded-accounting-smb-vertical-software-report), leaving a major greenfield opportunity for your platform, Tight's customer-partners have also migrated thousands of businesses off of QuickBooks Online using Tight's QBO Import functionality.
The Wave Import functionality allows you to transfer a business’s QBO data into your embedded accounting platform, preserving the business’s historical financial information.
## Embedding the Wave Import
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Wave Import:
```TSX WaveImport.tsx theme={null}
import { AccountingImport, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function WaveImport({ accessToken }) {
return (
)
}
```
# Xero Import
Source: https://docs.tight.com/embeddable-ui/react/imports/xero-import
Import accounting data from Xero
## Overview
While [independent research shows that 62% of small businesses don't use any accounting software yet](https://www.tight.com/embedded-accounting-smb-vertical-software-report), leaving a major greenfield opportunity for your platform, Tight's customer-partners have also migrated thousands of businesses off of QuickBooks Online using Tight's QBO Import functionality.
The Xero Import functionality allows you to transfer a business’s QBO data into your embedded accounting platform, preserving the business’s historical financial information.
## Embedding the Xero Import
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Xero Import:
```TSX XeroImport.tsx theme={null}
import { AccountingImport, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function XeroImport({ accessToken }) {
return (
)
}
```
# Income Tax Dashboard
Source: https://docs.tight.com/embeddable-ui/react/income-tax-dashboard
Manage and track the business owner's income tax obligations
## Overview
The Income Tax Dashboard is all you need to provide full income tax functionality to the owner of a pass-through entity. Utilizing the Tight Income Tax API, which has been proven and reached maturity via very rigorous maintenance/update processes in place since the 2017 tax year, as well as painstaking quality assurance processes with a 1% threshold between 3 different sources.
The Tight Tax Calculations API currently supports the United States (50 states + DC) and Canada (all provinces, including GST/HST/PST/QST), but is architected for rapid expansion into other countries as needed.
The Income Tax Dashboard provides a full user experience, allowing your users to:
* Set up their tax profile
* View quarterly income tax estimates
* Generate Form 1040 Schedule C, Form 1065, Form 1120-S, Form 1120, and T2125 tax reports
* Download a full Tax Details report for hand-off to a tax preparer
* Transfer data into a white-labeled DIY tax filing platform, including April and Column Tax
## Embedding the Income Tax Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Income Tax Dashboard:
```TSX IncomeTaxDash.tsx theme={null}
import { IncomeTaxDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function IncomeTaxDash({ accessToken }) {
return (
)
}
```
## Props
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
Used to route your user to a specific filtered view.
The following periods are available:
| Period | View |
| - | - |
| `YTD` | Annual |
| `LAST_YEAR` | Annual |
| `ALL_QUARTERS` | Quarterly |
| `CURRENT_QUARTER` | Quarterly |
| `ALL_QUARTERS_LAST_YEAR` | Quarterly |
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
# Aged Accounts Receivable (A/R) Report
Source: https://docs.tight.com/embeddable-ui/react/invoicing/aged-accounts-receivable
Track and manage your outstanding customer invoices
## Overview
The Aged AR Report shows outstanding invoice totals, grouped on how many days they have been outstanding for, on a per-customer basis. This interactive report provides insight to the business owner-operator regarding how much money they are owed and what cash flow to realistically expect in the near future.
This interactive report can be drilled down into to see all of the individual invoices that are outstanding.
## Embedding the interactive Aged AR Report
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Aged AR Report:
```TSX AgedArReport.tsx theme={null}
import { AgedAccounts, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function AgedArReport({ accessToken }) {
return (
)
}
```
## Props
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
The date range for which to show the report.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeDateRange` prop to set the new value in the parent component.
The beginning of the range, inclusive.
The end of the range, inclusive.
The number of due days for this report
Available options: `ZERO_DAYS_AND_UP`, `THIRTY_ONE_DAYS_AND_UP`, `SIXTY_ONE_DAYS_AND_UP`, `NINETY_DAYS_AND_UP`
A function that is called whenever the user changes the days overdue from the dashboard.
This function will only be invoked if the `daysOverdue` prop is also provided. The callback takes a `daysOverdue` as its single
argument.
A function that is called whenever the user changes the filters from the report.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
# Customer-facing Invoice
Source: https://docs.tight.com/embeddable-ui/react/invoicing/customer-facing-invoice
The invoice view your customers see when they receive an invoice
## Overview
While the [Invoice Dashboard](/embeddable-ui/react/invoicing/invoice-dashboard) provides your users with what they need to create and manage invoices, the Customer-facing Invoice allows your users' customers to view and pay their invoices.
## Embedding the Customer-Facing Invoice
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Customer-Facing Invoice:
```TSX InvoicePaymentScreen.tsx theme={null}
import { CustomerInvoice, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function InvoicePaymentScreen({ accessToken }) {
return (
)
}
```
## Props
The ID of the invoice to display to the customer.
The secret key of the invoice so that only authorized customers may access the payment page.
A function that is called when the user submits a payment. This is useful for triggering real-time notifications or
logging.
# Invoice Dashboard
Source: https://docs.tight.com/embeddable-ui/react/invoicing/invoice-dashboard
The fully-featured experience for viewing and managing invoices (A/R)
## Overview
The Invoice Dashboard is all you need to provide full invoicing to your users, with a full user experience allowing your users to:
* Create invoices with auto-complete line items, including:
* Reimbursement for expenses (including mark-ups)
* Ability to bill for time tracked
* Manual line item creation
* Sales tax line items
* Invoice template customization to match your user's business's branding, including:
* Custom logo upload
* Custom brand colors using color wheel or hex code
* Ability to set business address and sender
* See status of invoices, including when the customer last viewed the invoice
* Generate Aged AR reporting
## Embedding the Invoice Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Invoice Dashboard:
```TSX InvoiceDashboard.tsx theme={null}
import { InvoiceDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function InvoiceDash({ accessToken }) {
return (
)
}
```
## Props
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component. As such, you must also pass the
`onChangeFilters` prop to adjust the filters for user input.
Value - returns all records with specified field equal to this value.
Value - returns all records with specified field not equal to this value.
Value - returns all records with specified field greater than to this value.
Value - returns all records with specified field greater than or equal to this value.
Value - returns all records with specified field less than to this value.
Value - returns all records with specified field less than or equal to this value.
Type filter
List of values to include.
Available options: `DRAFT`,
`OPEN`,
`CLOSED`,
`CANCELED`,
`REFUNDED`
List of values to exclude.
Available options: `DRAFT`,
`OPEN`,
`CLOSED`,
`CANCELED`,
`REFUNDED`
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the Invoice Dashboard.
# Invoice Form
Source: https://docs.tight.com/embeddable-ui/react/invoicing/invoice-form
Create and edit invoices for your business
## Overview
The Invoice Form, which is also included within the [Invoice Dashboard](/embeddable-ui/react/invoicing/invoice-dashboard), is all you need to allow business owner-operators to create quotes and invoices, including:
* Auto-complete line items
* Reimbursement for expenses (including mark-ups)
* Ability to bill for time tracked
* Manual line item creation
* Sales tax line items
## Embedding the Invoice Form
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Invoice Form:
```TSX InvoiceForm.tsx theme={null}
import { InvoiceForm, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function InvForm({ accessToken }) {
return (
)
}
```
## Props
The `invoice.id` that belongs to the form you would like to render.
# Mileage Dashboard
Source: https://docs.tight.com/embeddable-ui/react/mileage-dashboard
Track and manage business mileage for tax deductions
## Overview
The Mileage Dashboard is all you need to provide full mileage tracking to your users, with a full user experience allowing your users to:
* Add drives, with auto-complete start and end addresses, route calculation/visualization, and reverse geocoding
* View drives/routes/addresses
* Classify drive purpose (business vs. personal)
* Define favorite locations
* Assign drives to dimensions
## Embedding the Mileage Dashboard
To initialize the Tight Embedded experience in your React project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/react/patterns/embedding).
Below is an example embedding of the Mileage Dashboard:
```TSX MileageDashboard.tsx theme={null}
import { MileageDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function MileageDash({ accessToken }) {
return (
)
}
```
## Props
The set of filters to apply to the dashboard.
Passing in a value for this prop turns this into a controlled component.
As such, you must also pass the onChangeFilters prop to adjust the filters for user input.
Category filter
Id filter - returns all entities with the following attachments.
List of values to include.
Dimension value filter
Id filter - returns all entities with the following attachments.
List of values to include.
Value - returns all records with specified field equal to this value.
Value - returns all records with specified field not equal to this value.
Value - returns all records with specified field greater than to this value.
Value - returns all records with specified field greater than or equal to this value.
Value - returns all records with specified field less than to this value.
Value - returns all records with specified field less than or equal to this value.
Review status filter
List of values to include.
Available options: `RECONCILIATION_DISCREPANCY`, `USER_REVIEW_REQUIRED`, `ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`, `AWAITING_MATCH`, `STAGED`, `RECONCILED`
List of values to exclude.
Available options: `RECONCILIATION_DISCREPANCY`,
`USER_REVIEW_REQUIRED`,
`ACCOUNTANT_REVIEW_REQUIRED`,
`PARTNER_REVIEW_REQUIRED`,
`AWAITING_MATCH`,
`STAGED`,
`RECONCILED`
The type of drive to filter by
List of values to include.
Available options: `BUSINESS`,
`PERSONAL`,
List of values to exclude.
Available options: `BUSINESS`,
`PERSONAL`,
A function that is called whenever the user changes the filters from the dashboard.
This function will only be invoked if the `filters` prop is also provided. The callback takes `filters` as its single
argument.
The number of transactions to show on a single page of the dashboard.
# Design
Source: https://docs.tight.com/embeddable-ui/react/patterns/design
Customize the Embedded UI to match your branding
## Get Started
Tight will work with you to understand your design needs and ensure the Embedded UI matches your brand. To begin, share one of the following:
* **Your application**: A login URL and credentials that Tight's design team can use to analyze your branding and styling
* **Design materials**: Brand guidelines, Figma files, or other design documentation
Every Tight React Page supports desktop web, mobile web, and all breakpoints in between
## Initial Setup
Tight's design team will create an initial CSS file tailored to your brand. Once delivered, import it into your application:
```typescript theme={null}
import "@tight-embedded/react/index.css";
import "path/to/yourDesign.css";
```
Import order matters in CSS. Your custom CSS file must be imported **after** the Tight CSS file to ensure your overrides take effect.
## Customizing Your Styles
You can submit a support request for design changes to Tight or make changes yourself using the methods below:
### Design Tokens
Tight uses design tokens to control styles throughout its system, making it easy for you to customize the look and feel
of components by changing just a few variables. As your entry point for customization, you can override the following
tokens:
```css theme={null}
:where(:root, :host) {
/* Brand Colors - Primary */
--Tight-colors-brand-primary
/* Brand Colors - Secondary (subdued color, to complement your primary color) */
--Tight-colors-brand-secondary
/* Brand Colors - Action (buttons, links, interactive elements) */
--Tight-colors-brand-action
/* Brand Colors - Success */
--Tight-colors-brand-success
/* Brand Colors - Warning */
--Tight-colors-brand-warning
/* Brand Colors - Danger */
--Tight-colors-brand-danger
/* Surface Colors - Backgrounds and foregrounds */
--Tight-colors-surface-background
--Tight-colors-surface-foreground
/* Font Colors */
--Tight-colors-typography-base
--Tight-colors-typography-base-weak
}
```
For more granular customization options, see the [full design token reference](/embeddable-ui/react/reference/design-tokens).
### CSS Classes
If you need more granularity than provided by the design tokens, you can directly override CSS classes on specific elements. All Tight component
classes are prefixed with `Tight-` and can be customized in your CSS file:
```css theme={null}
.Tight-tile {
box-shadow: none;
}
```
**Inspecting elements**: Use your browser's developer tools to inspect elements and identify their class names. Only
override classes that start with `Tight-`. Overwriting any other classes is not supported, as they may change
in the future, and Tight does not guarantee backward compatibility.
If an element that you want to modify does not have a class, submit a support request for Tight to add it.
# Embedding
Source: https://docs.tight.com/embeddable-ui/react/patterns/embedding
Get started with Tight Embeddable UI for React
## Get Started
Every Tight React Page supports desktop web, mobile web, and all breakpoints in between
Each Page is shipped in Tight's React Component Library, which can be installed as follows:
```bash npm theme={null}
npm install @tight-embedded/react@latest
```
```bash pnpm theme={null}
pnpm add @tight-embedded/react@latest
```
Once imported, you'll need to ensure that every Embeddable UI component is rendered in a React Tree
wrapped with a `` component.
This is all you need to get going:
```TSX HomeDashboard.tsx theme={null}
import { FinancialOverviewDashboard, Tight } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function HomeDashboard({ accessToken }) {
return (
)
}
```
The ESLint rule `no-unresolved` might warn that `@tight-embedded/react/index.css` does not exist.
Disable the lint rule on the import line, or import from `@tight-embedded/react/dist/index.css` directly. Please note that the
direct path might change in future versions.
Tight recommends adding a single `` component towards the top of your application tree for maintainability.
The `` component's `environment` property can be `"PRODUCTION"` or `"SANDBOX"`, depending on the environment you'd like to target. You can obtain an applicable `accessToken` via the Tight [Authentication Endpoint](/api-reference/authentication).
## Embed with AI (MCP)
The Tight Model Context Protocol (MCP) server provides tools that AI agents can use to embed end-to-end accounting utilizing Tight's documentation.
See the [Build with AI (MCP) guide](/guides/launch-paths/build-with-ai) for instructions and examples.
# CSS Patterns
Source: https://docs.tight.com/embeddable-ui/react/reference/css-patterns
Follow best practices for advanced customization of the Embedded UI
Tight uses specialized CSS patterns in certain components to ensure consistent behavior. When customizing these
components beyond what design tokens provide, you'll need to match these patterns to maintain the intended
functionality. This reference documents these patterns and explains how to work with them effectively.
## Hover Styles
Tight uses a CSS selector for the hover pseudo-class that ensures consistent behavior across touch-based devices.
**Recommended approach:** Modify the `hover` [design tokens](/embeddable-ui/react/reference/design-tokens#surface-colors) to customize hover styles. This is the simplest and most maintainable way to adjust hover colors and states.
**If design tokens aren't sufficient:** You may override the hover pseudo-class on a specific class directly for more granular control. Use the following selector pattern to ensure your rule takes precedence over the default:
```css theme={null}
@media (hover: hover) and (pointer: fine) {
&:hover {
/* Your hover styles here */
}
}
```
This ensures hover styles only apply on devices that support hovering, preventing issues on touch-based devices where interactions could otherwise trigger unintended hover states.
# Design Tokens
Source: https://docs.tight.com/embeddable-ui/react/reference/design-tokens
Customize the Embedded UI to match your branding
Tight's design tokens are CSS custom properties that control the visual appearance of Tight's embedded UI components.
By overriding these tokens in your application's CSS, you can customize typography, colors, spacing, and other design
elements to match your brand identity.
Please refer to the [Design reference](/embeddable-ui/react/patterns/design) for information on how to get started with
Design Tokens.
## How to Use Design Tokens
To customize design tokens, define them in your CSS file before initializing Tight components:
```css theme={null}
:where(:root, :host) {
--Tight-colors-brand-primary: #5FDD9C;
--Tight-fonts-body: 'Inter', sans-serif;
--Tight-radii-md: 8px;
}
```
All design tokens are optional. Any token not explicitly set will use Tight's default values.
## Font Tokens
Tight provides many tokens that you can use to customize fonts throughout Tight's components. Tight categorizes text into four main categories:
* **Body** - For blocks of text, user input, main page content
* **Label** - Denoting purpose, information, or an atomic reason
* **Heading** - Explains purpose of content before reading further
* **Metric** - For numbers in graphs, financial statements, etc.
### Font Family
Controls the typeface used for text.
**Global**
Controls the typeface for all text globally.
```css theme={null}
--Tight-fonts-base
```
**Text Type Specific**
Specify the typeface for different text categories. All text defaults to the font family of the base token unless overwritten.
```css theme={null}
--Tight-fonts-body
--Tight-fonts-label
--Tight-fonts-heading
--Tight-fonts-metric
```
If you'd like to use the default fonts from Tight you'll need to include the following additional CSS imports:
```TSX theme={null}
import "@tight-embedded/react/duplet.css";
import "@tight-embedded/react/inter.css";
```
### Font Size
Controls text size across the application. You can override global size scales or target specific text categories.
**Global Scale**
Use these to establish consistent sizing across all components:
```css theme={null}
--Tight-fontSizes-sm
--Tight-fontSizes-md
--Tight-fontSizes-lg
--Tight-fontSizes-xl
```
**Text Type Specific**
Fine-tune sizes for individual text categories:
```css theme={null}
--Tight-fontSizes-title
--Tight-fontSizes-body
--Tight-fontSizes-label
--Tight-fontSizes-label-strong
--Tight-fontSizes-label-sub
--Tight-fontSizes-label-strongSub
--Tight-fontSizes-heading
--Tight-fontSizes-metric-sm
--Tight-fontSizes-metric-md
--Tight-fontSizes-metric-lg
--Tight-fontSizes-metric-xl
```
### Font Weight
Controls text weight (boldness) throughout the application.
**Global Scale**
```css theme={null}
--Tight-fontWeights-sm
--Tight-fontWeights-md
--Tight-fontWeights-lg
```
**Text Type Specific**
```css theme={null}
--Tight-fontWeights-body
--Tight-fontWeights-label
--Tight-fontWeights-label-strong
--Tight-fontWeights-label-sub
--Tight-fontWeights-label-strongSub
--Tight-fontWeights-heading
--Tight-fontWeights-title
--Tight-fontWeights-metric-sm
--Tight-fontWeights-metric-md
--Tight-fontWeights-metric-lg
--Tight-fontWeights-metric-xl
```
## Layout Tokens
### Border Radius
Controls the corner rounding of UI elements like cards, buttons, and inputs.
```css theme={null}
--Tight-radii-sm
--Tight-radii-md
--Tight-radii-lg
```
### Border Width
Controls the thickness of borders on UI elements.
```css theme={null}
--Tight-borderWidths-sm
--Tight-borderWidths-md
--Tight-borderWidths-lg
--Tight-borderWidths-xl
```
## Color Tokens
Color tokens control the color palette throughout Tight's UI. They're organized into semantic categories to ensure consistent visual communication.
### Brand Colors
Define your core brand identity with primary, secondary, action, etc. colors. Each color includes intensity variants (`weak`, `strong`, `stronger`, `strongest`) for creating visual hierarchy.
```css theme={null}
--Tight-colors-brand-primary-weak
--Tight-colors-brand-primary
--Tight-colors-brand-primary-strong
--Tight-colors-brand-secondary-weak
--Tight-colors-brand-secondary
--Tight-colors-brand-secondary-strong
--Tight-colors-brand-action-weak
--Tight-colors-brand-action
--Tight-colors-brand-action-strong
--Tight-colors-brand-action-stronger
--Tight-colors-brand-action-strongest
--Tight-colors-brand-success-weak
--Tight-colors-brand-success
--Tight-colors-brand-success-strong
--Tight-colors-brand-warning-weak
--Tight-colors-brand-warning
--Tight-colors-brand-warning-strong
--Tight-colors-brand-danger-weak
--Tight-colors-brand-danger
--Tight-colors-brand-danger-strong
```
### Surface Colors
Surface colors define backgrounds and containers for UI elements.
**Base Surfaces**
```css theme={null}
--Tight-colors-surface-background
--Tight-colors-surface-background-hover
--Tight-colors-surface-foreground
--Tight-colors-surface-foreground-hover
--Tight-colors-surface-foreground-disabled
--Tight-colors-surface-elevated
--Tight-colors-surface-elevated-hover
```
**Intent Surfaces**
Applied to interactive elements like buttons to communicate their purpose and state.
```css theme={null}
--Tight-colors-surface-intent-primary
--Tight-colors-surface-intent-primary-hover
--Tight-colors-surface-intent-primary-active
--Tight-colors-surface-intent-primary-disabled
--Tight-colors-surface-intent-secondary
--Tight-colors-surface-intent-secondary-hover
--Tight-colors-surface-intent-secondary-active
--Tight-colors-surface-intent-secondary-disabled
--Tight-colors-surface-intent-action
--Tight-colors-surface-intent-action-hover
--Tight-colors-surface-intent-action-active
--Tight-colors-surface-intent-action-disabled
--Tight-colors-surface-intent-action-discrete
--Tight-colors-surface-intent-action-discrete-hover
--Tight-colors-surface-intent-action-discrete-active
--Tight-colors-surface-intent-success
--Tight-colors-surface-intent-success-hover
--Tight-colors-surface-intent-success-active
--Tight-colors-surface-intent-success-disabled
--Tight-colors-surface-intent-warning
--Tight-colors-surface-intent-warning-hover
--Tight-colors-surface-intent-warning-active
--Tight-colors-surface-intent-warning-disabled
--Tight-colors-surface-intent-danger
--Tight-colors-surface-intent-danger-hover
--Tight-colors-surface-intent-danger-active
--Tight-colors-surface-intent-danger-disabled
```
### Typography Colors
Controls text colors across all components.
**Base Colors**
```css theme={null}
--Tight-colors-typography-base
--Tight-colors-typography-base-weak
--Tight-colors-typography-contrast
--Tight-colors-typography-contrast-weak
```
**Text Type Specific**
```css theme={null}
--Tight-colors-typography-body
--Tight-colors-typography-label
--Tight-colors-typography-label-sub
--Tight-colors-typography-label-strong
--Tight-colors-typography-label-strongSub
--Tight-colors-typography-heading
--Tight-colors-typography-metric-sm
--Tight-colors-typography-metric-md
--Tight-colors-typography-metric-lg
--Tight-colors-typography-metric-xl
```
**Accent Colors**
Used for highlighting special states like successes, warnings, and errors.
```css theme={null}
--Tight-colors-typography-accent-success
--Tight-colors-typography-accent-warning
--Tight-colors-typography-accent-danger
```
**Intent Colors**
Applied to interactive elements like buttons to communicate their purpose and state.
```css theme={null}
--Tight-colors-typography-intent-primary
--Tight-colors-typography-intent-primary-hover
--Tight-colors-typography-intent-primary-active
--Tight-colors-typography-intent-secondary
--Tight-colors-typography-intent-secondary-hover
--Tight-colors-typography-intent-secondary-active
--Tight-colors-typography-intent-action
--Tight-colors-typography-intent-action-hover
--Tight-colors-typography-intent-action-active
--Tight-colors-typography-intent-success
--Tight-colors-typography-intent-success-hover
--Tight-colors-typography-intent-success-active
--Tight-colors-typography-intent-warning
--Tight-colors-typography-intent-warning-hover
--Tight-colors-typography-intent-warning-active
--Tight-colors-typography-intent-danger
--Tight-colors-typography-intent-danger-hover
--Tight-colors-typography-intent-danger-active
```
### Icon Colors
Controls icon colors throughout the application. These tokens inherit their values from the typography color tokens unless overwritten.
**Base Colors**
```css theme={null}
--Tight-colors-icon-base
--Tight-colors-icon-base-weak
--Tight-colors-icon-contrast
--Tight-colors-icon-contrast-weak
```
**Accent Colors**
```css theme={null}
--Tight-colors-icon-accent-success
--Tight-colors-icon-accent-warning
--Tight-colors-icon-accent-danger
```
**Intent Colors**
Applied to interactive elements like buttons to communicate their purpose and state.
```css theme={null}
--Tight-colors-icon-intent-primary
--Tight-colors-icon-intent-primary-hover
--Tight-colors-icon-intent-primary-active
--Tight-colors-icon-intent-secondary
--Tight-colors-icon-intent-secondary-hover
--Tight-colors-icon-intent-secondary-active
--Tight-colors-icon-intent-action
--Tight-colors-icon-intent-action-hover
--Tight-colors-icon-intent-action-active
--Tight-colors-icon-intent-success
--Tight-colors-icon-intent-success-hover
--Tight-colors-icon-intent-success-active
--Tight-colors-icon-intent-warning
--Tight-colors-icon-intent-warning-hover
--Tight-colors-icon-intent-warning-active
--Tight-colors-icon-intent-danger
--Tight-colors-icon-intent-danger-hover
--Tight-colors-icon-intent-danger-active
```
### Border Colors
Controls border colors across the application.
**Base Layout Borders**
```css theme={null}
--Tight-colors-border-layout-weak
--Tight-colors-border-layout
--Tight-colors-border-layout-strong
```
**Intent Borders**
Applied to interactive elements like buttons to communicate their purpose and state.
```css theme={null}
--Tight-colors-border-intent-primary-hover
--Tight-colors-border-intent-primary
--Tight-colors-border-intent-primary-active
--Tight-colors-border-intent-primary-disabled
--Tight-colors-border-intent-secondary-hover
--Tight-colors-border-intent-secondary
--Tight-colors-border-intent-secondary-active
--Tight-colors-border-intent-secondary-disabled
--Tight-colors-border-intent-danger-hover
--Tight-colors-border-intent-danger
--Tight-colors-border-intent-danger-active
--Tight-colors-border-intent-danger-disabled
--Tight-colors-border-intent-warning-hover
--Tight-colors-border-intent-warning
--Tight-colors-border-intent-warning-active
--Tight-colors-border-intent-warning-disabled
--Tight-colors-border-intent-success-hover
--Tight-colors-border-intent-success
--Tight-colors-border-intent-success-active
--Tight-colors-border-intent-success-disabled
--Tight-colors-border-intent-action-hover
--Tight-colors-border-intent-action
--Tight-colors-border-intent-action-active
--Tight-colors-border-intent-action-disabled
```
### Money Colors
Specialized colors for displaying financial data in reports and graphs.
```css theme={null}
--Tight-colors-money
--Tight-colors-money-positive
--Tight-colors-money-positive-weak
--Tight-colors-money-negative
--Tight-colors-money-negative-weak
```
## Animation Tokens
Controls animation timing for transitions and appearance effects.
```css theme={null}
--Tight-animations-appear-instant
--Tight-animations-appear-delay
```
## Shadow Tokens
Controls drop shadows for elevated UI elements like modals, popovers, and cards.
```css theme={null}
--Tight-shadows-box-shadow
```
# Event Listeners
Source: https://docs.tight.com/embeddable-ui/react/reference/event-listeners
Observe and intercept actions taken inside the Tight Embeddable UI
## Overview
Event listeners are used to observe and intercept actions taken inside the Embeddable UI. You might, for example,
react to a user linking a bank account, or take over the library's built-in behavior entirely.
Listeners are shared across all instances of the Embeddable UI. Registrations across different components share the
same state, and the last registration for a given key wins, so prefer a single registration site per event key to
avoid conflicts.
The available events are listed below under [Reference](#reference).
## Use Cases
Event listeners open up a wide range of possibilities for tailoring the Embeddable UI to your platform. The examples
below illustrate some common patterns.
### Invoice Routing
If your platform has its own invoicing, event listeners let you route users back to your invoices from within the
Embeddable UI. For example, a vertical SaaS platform issues invoices through its own product, and the Tight
[Transactions Dashboard](/embeddable-ui/react/bank-transactions/transactions-dashboard) shows a payout that includes three of those invoices. When the user clicks on one of those
invoices, you can intercept the click and route the user to the corresponding invoice in your platform instead.
### Paywall Enforcement
Event listeners also let you gate specific functionality behind your own pricing tiers. For example, a horizontal SaaS
platform wants to offer Tax Estimates only on a paid plan. When a user clicks into tax-related functionality,
the platform intercepts the routing and shows its own paywall screen instead of the built-in tax experience.
## Setting Listeners
Listeners are accessed via the `useEmbeddedEventListeners` hook. Keep in mind that this must be used within a ``
component. Listener declaration is done either by passing initial listeners to the hook, or by using the `setListeners`
function returned by it. This function accepts a subset of all possible listeners, and will merge any input into your
already defined listeners. This means that both this:
```TypeScript theme={null}
import { useEmbeddedEventListeners } from "@tight-embedded/react";
// ...
const [listeners, setListeners] = useEmbeddedEventListeners({
plaidLink: {
listener: (event) => {
if (event.result === "SUCCESS") {
console.log("Bank linked:", event.type);
}
},
},
});
```
and this:
```TypeScript theme={null}
import { useEmbeddedEventListeners } from "@tight-embedded/react";
// ...
const [listeners, setListeners] = useEmbeddedEventListeners();
setListeners({
plaidLink: {
listener: (event) => {
if (event.result === "SUCCESS") {
console.log("Bank linked:", event.type);
}
},
},
});
```
are valid methods of defining the same set of listeners.
The initial listeners passed to `useEmbeddedEventListeners` are only applied once, on mount. Re-renders do not
re-apply them. To update a listener after mount, use `setListeners`.
### Updating Listeners
Since `setListeners` accepts a subset of listeners, you're able to update your listeners at any time after mount. The
code below adds a `gusto` listener without affecting any previously registered keys.
```TypeScript theme={null}
setListeners({
gusto: { listener: handleGusto, preventDefault: true },
});
```
Note that listener merging is a *shallow merge* - input is only merged at the top level.
### Removing Listeners
If you want to remove a listener, pass `null` for its key. Unrelated keys are preserved.
```TypeScript theme={null}
setListeners({ gusto: null });
```
### Preventing Default Behavior
Each listener is registered as an `EventRegistration`, which pairs your callback with an optional `preventDefault`
flag. When `preventDefault` is `true`, the library's built-in behavior for that event is suppressed (for example, the
Plaid modal will not open; the transaction drawer will not open). When `false` or omitted, both your listener and the
default behavior run.
For example, to open a bank's website in a custom in-app browser instead of a new tab, suppress the default behavior
and handle the navigation yourself:
```TypeScript theme={null}
setListeners({
plaidLink: {
preventDefault: true,
listener: (event) => {
if (event.type === "PLAID_LINK_ROUTE_TO_BANK" && event.result === "SUCCESS") {
openInAppBrowser(event.data.bankUrl);
}
},
},
});
```
### Handling Events
Every event is a discriminated union with a `result` field:
```TypeScript theme={null}
type TightEvent =
| { type: T; result: "SUCCESS"; data: D; error: null }
| { type: T; result: "FAILURE"; data: null; error: E }
```
Always branch on `event.result` before reading `data` or `error`.
```TypeScript theme={null}
listener: (event) => {
if (event.result === "SUCCESS") {
// event.data is typed
} else {
// event.error is typed
}
}
```
## Reference
`useEmbeddedEventListeners` returns a `[listeners, setListeners]` tuple:
A snapshot of all currently registered listeners.
A function to merge new registrations into the existing state. Each key accepts an `EventRegistration`, or `null`
to remove that listener.
The callback fired when the event occurs.
Whether or not the library's built-in default behavior for this event should be suppressed. When `false`
or omitted, both your listener and the default behavior run.
### Events
Each row below is a registration key you can pass to `useEmbeddedEventListeners`. The **Event types** column lists the `event.type` values a single registration may receive, and the data and error shapes are the payloads on `SUCCESS` and `FAILURE` results respectively.
| Registration key | Description | Event types, data, and error shapes |
| - | - | - |
| `plaidLink` | Fires at the start of each bank-linking action; a single registration handles all lifecycle types. `preventDefault: true` prevents the Plaid modal from opening, letting you manage the flow yourself. | Types: `PLAID_LINK_NEW`, `PLAID_LINK_RESET`, `PLAID_LINK_RELINK`, `PLAID_LINK_UNLINK`, `PLAID_LINK_ROUTE_TO_BANK`. Data on `SUCCESS`: `{ plaidAccessToken: string } \| null` (reset/relink/unlink), `{ bankUrl: string }` (route to bank), or `null` (new). Error on `FAILURE`: `{ errorCode: string }`. |
| `plaidLinkEvent` | Fires for every event emitted by the Plaid SDK during the link flow. Useful for analytics. | Type: `PLAID_LINK_EVENT`. Data on `SUCCESS`: `{ eventName: string; metadata: unknown }`. |
| `plaidLinkError` | Fires when the Plaid flow encounters an error or the user exits with an error. | Type: `PLAID_LINK_FAILURE`. Error on `FAILURE`: `{ displayMessage: string; errorCode: string; errorMessage: string }`. |
| `gusto` | Fires when the user taps "Connect Gusto" in the Banks & Integrations section. `preventDefault: true` suppresses the built-in Gusto OAuth flow so you can initiate OAuth from your own backend. | Type: `GUSTO_NEW`. Data on `SUCCESS`: `null`. |
| `conversations` | Fires when the user opens or starts a conversation. `preventDefault: true` suppresses the library's conversation drawer. | Type: `OPEN_CONVERSATION`. Data on `SUCCESS`: `ConversationGetDto` (existing conversation), `{ defaultValues: MessageFormValues }` (new conversation with pre-filled text), or `null` (blank new conversation). |
| `transactionForm` | Fires when a transaction form opens or closes; delineates between transactions from processor (ie. Stripe, Square, etc.) and non-processor sources. `preventDefault: true` on open prevents the library's transaction drawer from opening, letting you render your own UI. | Types: `OPEN_BANK_TRANSACTION_FORM`, `CLOSE_BANK_TRANSACTION_FORM`, `OPEN_PROCESSOR_TRANSACTION_FORM`, `CLOSE_PROCESSOR_TRANSACTION_FORM`. Data on `SUCCESS`: `BankTransaction` (editing), `null` (creating), or `BankTransaction \| null` (close). Error on `FAILURE`: `Record`. |
| `bankTransactionForm` | Fires when a transaction form for a bank transaction (ie. Plaid, Unit, etc) opens or closes. Use this instead of `transactionForm` when you want to handle bank transactions separately from processor transactions. `preventDefault: true` on open prevents the library's transaction drawer from opening, letting you render your own UI. | Types: `OPEN_BANK_TRANSACTION_FORM`, `CLOSE_BANK_TRANSACTION_FORM`. Data on `SUCCESS`: `BankTransaction` (editing), `null` (creating), or `BankTransaction \| null` (close). Error on `FAILURE`: `Record`. |
| `processorTransactionForm` | Fires when a transaction form for a processor transaction (ie. Stripe, Square, etc.) opens or closes. Use this instead of `transactionForm` when you want to handle processor transactions separately from bank transactions. `preventDefault: true` on open prevents the library's transaction drawer from opening, letting you render your own UI. | Types: `OPEN_PROCESSOR_TRANSACTION_FORM`, `CLOSE_PROCESSOR_TRANSACTION_FORM`. Data on `SUCCESS`: `BankTransaction` (editing), `null` (creating), or `BankTransaction \| null` (close). Error on `FAILURE`: `Record`. |
| `bITile` | Financial dashboard tiles. Fires when a dashboard tile mounts. Useful for tracking which tiles are visible. `preventDefault` has no effect on tile events. | Types: `CASH_FLOW_TILE`, `EXPENSE_TILE`, `PROFIT_AND_LOSS_TILE`. Result: `SUCCESS` when the corresponding tile mounts. |
| `bill` | Bill drawer. Fires when the user opens a bill. | Type: `OPEN_BILL`. Data on `SUCCESS`: `BillGetDto`. Error on `FAILURE`: `Record`. |
| `customer` | Customer selector/form. Fires when the user opens the customer selector or form. | Type: `OPEN_CUSTOMER`. Data on `SUCCESS`: `CustomerGetDto` (existing customer) or `null` (new customer). |
| `invoice` | Invoice form. Fires when the user opens an existing invoice. `preventDefault: true` prevents the library's invoice form from opening, letting you render your own UI. | Type: `OPEN_INVOICE_FORM`. Data on `SUCCESS`: `InvoiceGetDto`. Error on `FAILURE`: `Record`. |
| `payroll` | Payroll record. Fires when the user opens a payroll record. | Type: `OPEN_PAYROLL`. Data on `SUCCESS`: `{ data: PayrollGetDto }`. |
| `taxDashboardZeroStateCTA` | Fires when the user clicks the zero-state call to action on the Tax Dashboard. | Type: `TAX_DASH_CTA`. Data on `SUCCESS`: `null`. |
| `taxProfileCTA` | Fires when the user clicks the tax profile call to action on the Tax Dashboard or Financial Overview. | Type: `TAX_PROFILE_CTA`. Data on `SUCCESS`: `null`. |
| `taxFilingCTA` | Fires when the user clicks a tax filing call to action on the Tax Dashboard. | Type: `TAX_FILING_CTA`. Data on `SUCCESS`: `{ action: "CONTINUE" \| "VIEW" \| null }`. |
| `learnMore` | Fires when the user clicks a "Learn more" link within the import flows. | Types: `IMPORT_CSV_LEARN_MORE`, `IMPORT_RULES_LEARN_MORE`, `SCRIPT_BLOCKER_LEARN_MORE`, `IMPORT_XERO_LEARN_MORE`. Data on `SUCCESS`: `null`. |
| `paymentProcessorTutorial` | Fires when the user opens the payment processor tutorial from the Invoice Dashboard or Financial Overview. | Type: `PAYMENT_PROCESSOR_TUTORIAL`. Data on `SUCCESS`: `null`. |
| `paymentProcessing` | Fires for payment processing actions, such as refunding an invoice from the Invoice Dashboard or setting up payment processing. | Types: `REFUND_INVOICE`, `SETUP_PAYMENT_PROCESSING`. Data on `SUCCESS`: `{ invoiceId: string }` (refund) or `null` (setup). |
| `renderClientInvoice` | Fires when a client pays an invoice from the client-facing invoice view. | Type: `PAY_INVOICE`. Data on `SUCCESS`: `{ invoiceId: string; invoiceName: string; invoiceBalance: number }`. |
| `incomeDashCTA` | Fires when the user clicks the send invoice call to action on the Income Dashboard. | Type: `SEND_INVOICE`. Data on `SUCCESS`: `null`. |
| `accountantUserAction` | Fires when an accountant takes an action on a user. | Type: `ACCOUNTANT_USER_ACTION`. Data on `SUCCESS`: `{ value: string; userId: string }`. |
| `accountant` | Fires when members or teammates are added, updated, removed, or restored. | Types: `ADD_MEMBERS`, `UPDATE_MEMBERS`, `REMOVE_MEMBERS`, `RESTORE_MEMBERS`, `ADD_TEAMMATE`, `UPDATE_TEAMMATE`, `REMOVE_TEAMMATE`, `RESTORE_TEAMMATE`. Data on `SUCCESS`: `{ users: Array<{ id: string; userId: string; email?: string }> }` (member types), `{ teammate: object }` (add/update teammate), or `{ id: string; userId: string }` (remove/restore teammate). |
| `import` | Fires when an import flow completes. | Types: `IMPORT_EXPENSE_RULES_COMPLETED`, `IMPORT_QBO_COMPLETED`, `IMPORT_XERO_COMPLETED`, `IMPORT_BENCH_COMPLETED`, `IMPORT_WAVE_COMPLETED`. Data on `SUCCESS`: `null`. |
### TypeScript
All types are exported from `@tight-embedded/react`:
```TypeScript theme={null}
import type {
TightEvent,
TightEventListener,
TightEvents,
EventRegistration,
PlaidLinkEvent,
UseEmbeddedEventListenersResult,
} from "@tight-embedded/react";
```
# Options
Source: https://docs.tight.com/embeddable-ui/react/reference/options
Customize your user's experience
## Overview
Options are used to customize the user's experience beyond just branding. You might, for example, customize the page
size limit to match the rest of your application.
Options are shared across all instances of the Embeddable UI.
Some of these options will be applied globally, and some will only affect a subset of the app.
The global options are listed below. You can see which options are available for each Page or Component
under the relevant reference.
## Setting Options
Options are accessed via the `useOptions` hook. Keep in mind that this must be used within a `` component.
Option declaration is done using the `setOptions` function returned by `useOptions`.
This function accepts a [`Partial`](https://www.typescriptlang.org/docs/handbook/utility-types.html#partialtype) of all
possible options, and will merge any input into your already defined options. This means that both this:
```TypeScript theme={null}
import { useOptions } from "@tight-embedded/react";
// ...
const { options, setOptions } = useOptions({
transactionsDashboard: { limit: 50 },
dataVisualizationColors: ["#F00", "#0F0", "#00F"],
});
```
and this:
```TypeScript theme={null}
import { useOptions } from "@tight-embedded/react";
// ...
const { options, setOptions } = useOptions();
setOptions({ transactionsDashboard: { limit: 50 }});
setOptions({ dataVisualizationColors: ["#F00", "#0F0", "#00F"] });
```
are valid method of defining the same set of options.
### Updating Options
Since `setOptions` accepts a `Partial`, you're able to update a subset of your options. The code below updates the `limit`
on the Transactions Dashboard from 50 to 100 after a second, as an example.
```TypeScript theme={null}
setOptions({ transactionsDashboard: { limit: 50 } })
setTimeout(() => {
setOptions({ transactionsDashboard: { limit: 100 } })
}, 1000)
```
Note that option merging is a *shallow merge* - input is only merged at the top level.
```TypeScript theme={null}
setOptions({
transactionsDashboard: { limit: 50 },
dataVisualizationColors: ["#F00", "#0F0", "#00F"],
})
// This will remove your previously set limit!
setOptions({ transactionsDashboard: {} })
```
### Replacing Options
If you want to update your options to be *exactly* what you've passed as input to `setOptions`, you can pass the
`replace` parameter as `true`.
```TypeScript theme={null}
setOptions({
transactionsDashboard: { limit: 50 },
dataVisualizationColors: ["#F00", "#0F0", "#00F"],
})
setOptions({ transactionsDashboard: { limit: 100 } }, true)
```
The above example will result in an options state like this:
```TypeScript theme={null}
{ transactionsDashboard: { limit: 100 } }
```
Note that option merging is a *shallow merge* - input is only merged at the top level.
## Reference
The options to update the Embeddable UI state
The options for the [Transactions Dashboard](/embeddable-ui/react/bank-transactions/transactions-dashboard).
"}>
An ordered array describing which table columns to display on the dashboard. Duplicate entries will
be ignored.
A column is an object with two fields, `column` and `width`.
`column` is the name of the column. `width` is the desired pixel width of the column, and is optional.
Available options: `date`, `description`, `amount`, `category`, `reviewStatus`, `dimensionValue`
The number of transactions to show on a single page of the Transactions Dashboard.
An array of colors (represented as a `string` in hexadecimal format) that define the color palette for
various graphs and diagrams across the Embeddabl e UI. This is only used for metrics that don't
already have color associations, such as the colors for each category on the Expense Tile.
The options for the Banks & Integrations related functionality.
An array of integration identifiers that determines which integrations are displayed as linkable integrations. If not provided, all supported integrations are shown by default. If a user
already has an integration linked that is not included in this list, it will still be shown to the user.
Supported integration identifiers: `UNIT`, `STRIPE`, `GUSTO`, `SHOPIFY`, `SQUARE`, `RUTTER`,
`UBER`, `MOOV`, `QUALPAY`, `MANUAL_ENTRY`, `PARTNER_IMPLEMENTATION`, `QBO`, `XERO`, `FRESHBOOKS`.
Whether or not the provided options should fully replace the currently set options. Disables option merging.
# Tight Embeddable UI
Source: https://docs.tight.com/embeddable-ui/tight-embeddable-ui
Embed modern, flexible, and performance-optimized accounting components
You can simply link this doc to your orchestration agent to embed Tight's UI into your platform overnight.
## Flexible embed options
Connect Tight's MCP Server to your dev workflow to embed overnight
Embed fully-responsive components into your React app
Embed mobile-first features like mileage tracking using React Native
Explore the Tight Embedded UX in the Playground
Launch without development via a simple DNS configuration
Explore the Tight Embedded UX in the Playground
## Modern design philosophy
Tight's embeddable components are designed to be customized to fit into *your* platform such that your users would never know they were created by a third party. There are a few different approaches to nailing your UI design:
1. Tight can do the white labelling design and implementation for you (see some [example white-labellings of popular SaaS platforms](/embeddable-ui/tight-embeddable-ui#custom-white-labellings) below). Simply send Tight's design team your Figma design system or send Tight a demo account login to your platform.
2. Or, you can utilize [Tight's innovative design token system](/embeddable-ui/react/reference/design-tokens) to override via CSS
## Custom white-labellings
# Audit Trail
Source: https://docs.tight.com/guides/bookkeepers/audit-trail
Enterprise audit trail functionality ensuring robust change management
## Overview
Tight's Audit Trail automatically tracks *every* modification to *every* entity, creating an immutable record of who
changed what, when, and through which channel. This audit trail is kept up to date without any development work required
from your team.
The audit trail captures changes at the field level across all entity types: bank transactions, invoices, manual journal
entries, general ledger accounts, and more. Each revision includes the editor's identity, timestamp, and source of the
change.
## Importance of an Audit Trail
### Building confidence
For platforms serving business owners, audit trail functionality is a necessity. The ability to answer "Who changed this
and when?" is fundamental to building trust with business owners who demand financial accountability. Business owners
expect the ability to roll back changes and revert to an earlier revision of any transaction or entity, similar to what
users see in Google Docs and other popular tools. Tight tracks changes at the field level, not just the entity level,
and allows easy rollbacks.
### Preparing for audits
For platforms serving enterprises, maintaining data integrity and accountability is paramount during investigations
or audits.
### Checks and Balances
In professional bookkeeping workflows, multiple stakeholders interact with the same financial data. Business owners
create invoices, bookkeepers adjust transactions, and accountants perform closings. Tight's audit trail creates
natural accountability by making every action visible and attributable to a specific person.
## Use Cases
### Transaction auditing
Review the complete history of a specific transaction to understand how it evolved. On any given transaction, a business
owner may want to look at the categorization history, application of rules, matching to other entities, and any
bookkeeper edits. Additionally, if the business owner doesn't agree with a bookkeeper edit, or vice versa, they might
decide to restore an earlier version of the given transaction. Learn how
to [audit an entity](/api-reference/audit-trail#audit-an-entity).
### Company auditing
Bookkeepers commonly need to review all changes made to a company's books within a specific time period, pulling up the
past 30 days to see which transactions were recategorized, which invoices were edited, and which manual journal entries
were created. The [full audit trail](/api-reference/audit-trail#review-the-full-audit-trail) provides this complete
picture of accounting activity without requiring checking each transaction individually.
### Bookkeeper auditing
For bookkeeping firms managing multiple clients or platforms with assisted bookkeeping services, you can
[audit a specific editor](/api-reference/audit-trail#audit-a-specific-editor) to see changes made by a particular
bookkeeper across all their client companies. This cross-company view provides valuable insights into bookkeeper
activity and quality.
# Monthly/Annual Closings
Source: https://docs.tight.com/guides/bookkeepers/closings-and-monthly-reconciliations
Deliver closings accurately and efficiently via contextual collaboration
## Overview
As the [core system for managing your bookkeeping client companies](/guides/bookkeepers/companies), Tight's Bookkeeping
platform is
specifically designed to minimize the resources required to perform closings (aka reconciliations) and deliver monthly
financial summaries, including optimizing the formerly painstaking process of gathering necessary information from
the business owners.
## Use Cases
### Input from the business owner
Obtaining time-sensitive information from business owners is often a bottleneck for bookkeepers to perform closings.
When additional context is needed to classify or reconcile transactions, Tight enables bookkeepers to start
conversations directly on specific bank transactions. Business owners are notified via SMS, email, or your platform’s
notification system, and can respond from the [Financial Overview](/embeddable-ui/react/financial-overview)
with explanations or attachments. This contextual, transaction-level collaboration minimizes follow-ups and keeps
closings moving without requiring bookkeepers to leave their daily workflow.
### Monthly Closings
#### Ongoing reconciliation
While many accounting platforms still
require [legacy manual bank reconciliation processes](/guides/bookkeepers/closings-and-monthly-reconciliations#legacy-bank-reconciliations),
Tight embraces the new era of ongoing reconciliation. Tight automatically pulls bank account balances on an ongoing
basis and validates against corresponding General Ledger balances to detect discrepancies. When discrepancies are
detected, Tight automatically flags the affected bank account so the bookkeeper can address issues as they arise. In
most cases, where discrepancies do not arise, the bookkeeper is no longer required to do any manual labor.
This approach allows bookkeepers to maintain accurate books throughout the month instead of back-loading
reconciliation work at month's end. At the end of the month, Tight automatically ingests bank statements and creates
a monthly closing for each bank account. If the General Ledger balance matches the statement balance, the monthly
closing is automatically reconciled, minimizing manual effort for the bookkeeper.
#### Legacy bank reconciliations
For bookkeepers that prefer going through the popularized legacy reconciliation method of going through transactions line
by line, Tight's Bank Reconciliation UX requires zero learning curve for bookkeepers familiar with legacy accounting
platforms like QBO or Xero. Tight enhances this experience by automatically pulling bank statements via its banking
integrations where possible. When not possible, bookkeepers can upload bank statements for a given period and then move
forward validating that the transactions in that period match those in the bank statement.
#### Delivering the monthly summary
Once all bank accounts are reconciled for the month, bookkeepers can easily deliver a monthly financial summary for
business owner review. Business owners access the summary from the
[Financial Overview](/embeddable-ui/react/financial-overview), where they can review finalized
financials in a read-only experience.
Business owners can open a conversation directly on the monthly summary, enabling business owners to ask questions or
discuss the books with their bookkeeper in a single, contextual workflow.
### Annual Closings
At the end of the year, Tight automatically creates an annual closing entry to close out the prior year's Profit & Loss
activity and prepare the books for the new fiscal year. Once a year is closed, books can be locked to prevent any
further changes. Bookkeepers, provided they have the
correct [permissions](/guides/bookkeepers/team-management#set-permissions), are able to reopen closed years to make
adjustments as needed.
# Company Management
Source: https://docs.tight.com/guides/bookkeepers/companies
Onboard, migrate, manage, and perform bulk actions for/across your bookkeeping client companies
## Overview
Tight's Bookkeeping platform can be used to run the core of your bookkeeping operation, making it easy for you to manage
all of your clients (Companies), without having to dedicate resources to build a back-end dashboard for your bookkeepers
to provide service through.
## Use Cases
### Onboard client companies
#### Provision companies
You can invite your clients and configure their company directly from Tight's bookkeeping platform. When creating the
company, you select their Business Type, which determines their transaction categories and default rules, their Entity
Type which impacts their tax forms and tax estimates, and lastly their Chart of Accounts template. These selections
allow you to cater to each of your individual client's needs by customizing the system's behavior based on their
specific use cases.
You can [provision companies directly via API](/api-reference/company-management/create-a-company) if you prefer to
manage onboarding from your own platform.
Newly provisioned companies will receive an email with a link to directly access their new
[Financial Overview](/embeddable-ui/react/financial-overview).
#### Migrate from QuickBooks Online
62% of small businesses use nothing or spreadsheets to track their accounting, representing a massive opportunity for
you to onboard companies onto *your* accounting platform. For the remaining 38% of small businesses that use accounting
software already, they will be prompted to connect their existing Quickbooks Online (or Xero, Wave or Bench) account to
automatically sync their existing accounting data for a seamless transition.
#### Link bank accounts
Once their legacy accounting platform is connected (if applicable), your clients will also be prompted to link their
bank accounts,
credit cards, and any other
of [the many native integrations that Tight supports out of the box](/integrations/native-integrations).
### Review necessary transactions
Now that your clients have connected all of their data sources, all of their transactions will be automatically
categorized and reconciled by
[Tight's self-learning categorization algorithms](/ai/categorization/self-learning-transaction-categorization-overview).
The few transactions that Tight is not able to automatically reconcile will be automatically flagged to you in
the [Accountant Bank Transactions Dashboard](/embeddable-ui/react/accountant/transactions-dashboard) where you can
review them in bulk across all of your clients or filtered down to similar companies based on Business Type or their
specific Chart of Accounts template.
In the same vein as reviewing transactions across similar companies, Tight's bookkeeping platform
provides a [reconciliation dashboard](/embeddable-ui/react/accountant/reconciliation-dashboard) where you can review
and create [monthly and annual reconciliations](/guides/bookkeepers/closings-and-monthly-reconciliations) across
companies. Tight automatically pulls the bank statements from the underlying institutions when they are available and
gets the reconciliation started so that you don't need to wait for your clients to provide statements.
### Monitor bank connection health
In addition to flagging the transactions that require your attention, Tight also automatically pulls bank account
balances and flags these when there are discrepancies with the balances in the General Ledger. This on-going status
check allows you to front-load your reconciliation work when needed instead of waiting for the end-of-month closing
process. As part of this experience, Tight provides cross-cutting health-checks across all bank connections in the Tight
system, giving you a centralized place to review bank connection issues. Whether there's an outage at a given bank or a
specific client simply needs to relink their bank, Tight's Bookkeeping platform enables you to proactively identify
issues and address them with your clients.
# Team Management
Source: https://docs.tight.com/guides/bookkeepers/team-management
Administrate your bookkeeping team with checks and balances
## Overview
Tight's Bookkeeping platform can be used to run the core of your bookkeeping operation, making it easy for you to manage
your team of bookkeepers, without having to dedicate resources to build a back-end dashboard to manage the bookkeepers
and their permissions.
## Use Cases
### Onboard bookkeepers
Tight allows you to scale your bookkeeping team quickly without building custom user management infrastructure.
Bookkeepers in Tight, provided they have the correct [permissions](#set-permissions), are able to onboard other
bookkeepers directly from Tight's bookkeeper dashboard. Once added, new bookkeepers will receive an email providing
access to their new bookkeeping platform.
You can [provision bookkeepers directly via API](/api-reference/bookkeepers/save-bookkeepers) if you prefer to
manage access from your own internal platform.
### Set permissions
As your bookkeeping team grows, you will need to ensure bookkeepers only access the functionality their role requires to
prevent unauthorized changes. Bookkeepers in Tight have one of the following four roles:
1. Support: read-only access to all companies
2. Bookkeeper: read and write access to all companies
3. Accountant: same as Bookkeeper plus the ability to lock/unlock books
4. Admin: same as Accountant plus the ability to manage teammates
### Audit a bookkeeper
Performing quality checks and validating changes to books is essential to any bookkeeping operation.
Tight’s [Audit Trail](/guides/bookkeepers/audit-trail) allows you
to [audit a specific bookkeeper](/api-reference/audit-trail#audit-a-specific-editor) to see all changes made by that
bookkeeper across all their client companies. This cross-company view provides valuable insights into bookkeeper
activity and quality.
# Bank Transactions
Source: https://docs.tight.com/guides/business-owners/bank-transactions
Over 40M dollars & 100k unique transactions tracked per day using Tight
## Overview
Business owners have a varying amount of accounting knowledge, and even those with accounting skills don't
have time to look at a long list of transactions. Tight's proven, holistic transaction experience is built around the
core principle of being **easy to use for business owners**, as highlighted by the following characteristics:
1. Tight highlights only the small subset of transactions that actually require the business owner's attention.
2. All transaction categories are specific to the owner's business type.
3. The ["Invisible" double-entry General Ledger](/guides/business-owners/general-ledger) is kept behind-the-scenes.
4. Business owners still receive the robust financial statements only possible with complex double-entry accounting.
5. Tight's [categorization engine](/ai/categorization/self-learning-transaction-categorization-overview) learns from
user actions and automatically reconciles transactions across all of the business owner's data sources (e.g. invoices
and payroll runs), eliminating work that is otherwise manual and ongoing for your users.
Bookkeepers also receive their own separate UX, allowing Tight to provide an easy-to-use experience to business owners
*as well as* a more advanced experience for bookkeepers, including manual journal entry creation and Bank Reconciliation
UXes that ease their transition from popular legacy accounting platforms.
## Use Cases
### Expense Tracking
While collecting money (e.g. invoicing) is typically the first step in a business owner's accounting journey, the second
step is tracking expenses, *prior* to looking for a full-blown accounting system.
#### Automatic categorization
Tight's [AI-powered categorization](/ai/categorization/self-learning-transaction-categorization-overview) automatically
categorizes all transactions, leveraging each user's [business type](/api-reference/templates/get-business-types) to
provide categorizations specific to the user's business. For example, a flooring business may have a category for "Job
Site Measurement Tools", while a creator business may have a category for "Content Props". The engine continues to learn
from the behaviors of the 1.3M+ SMBs and 3k+ bookkeepers that have used Tight to categorize their transactions.
#### Decommingling for self-employed
The vast majority of self-employed individuals commingle their business and personal finances. Tight's in-house tax
calculation engine takes into account best practices for the given business type to predict which expenses are likely to
be deductible.
For example, an Uber driver's car wash expense is classified as a "Car Wash" (business expense), but the same
transaction is treated as personal for a graphic designer.
Bank accounts and credit cards can be specified as business or personal accounts, informing whether the
decommingling UX is applicable.
#### Expense Reporting
Simply embed the [Expense Dashboard](/embeddable-ui/plain-js/pages/bank-transactions/expense-dashboard) to provide your
users with a complete expense tracking experience. By simply linking bank accounts through your
preferred [banking integration](/integrations/banking), they'll receive
robust [expense reporting](/guides/business-owners/financial-statements#expense-reports) while only needing to review a
small subset of transactions that Tight flags for their review.
### Invisible double-entry accounting
Every bank transaction automatically generates double entries in Tight's General Ledger, allowing the business owner to
graduate to full accounting functionality if and when they need it.
This behind-the-scenes General Ledger enables your users to access
accurate [financial statements](/guides/business-owners/financial-statements), [tax estimates](/embeddable-ui/react/income-tax-dashboard),
and [business intelligence](/embeddable-ui/react/financial-overview) by simply linking their bank accounts.
All updates to transactions automatically update the GL and [Audit Trail](/guides/bookkeepers/audit-trail).
Tight fully supports and automates the accrual basis, cash basis, and modified cash basis methodologies.
### Automated reconciliation
As a user's business gets more and more complex, the amount of complexity in "reconciling" their books increases. Tight
automatically matches and reconciles transactions, eliminating manual reconciliation work for your users. For example,
Tight automatically
reconciles [payments and payouts to invoices](/guides/business-owners/invoicing#automatic-payment/payout-reconciliation), [payroll runs to their withdrawals](/guides/business-owners/payroll#automatic-payroll/withdrawal-reconciliation), [payments to bills](/guides/business-owners/bills#automatic-bill-payment-reconciliation),
bank transfer deposits to withdrawals, and income/expense refunds to their originating transactions.
This automatic reconciliation ensures that every bank transaction is properly accounted for without any manual user
input. Complex transactions like payment processor payouts are automatically nested to show the underlying invoices,
fees, and net amounts in a clear, organized view, demystifying what is otherwise an arduous, manual reconciliation
process.
# Bills (A/P)
Source: https://docs.tight.com/guides/business-owners/bills
Track bills and automatically reconcile bill payments
## Overview
Tight's bill payment experience makes it easy for you to provide your users with a full-featured bill management
experience, enabling them to create, review, and pay their bills directly in your platform.
Tight automatically reconciles bills, payments, and the associated (and often batched) bank withdrawals, while
maintaining the full double-entry General Ledger under the hood. That results in your users receiving real-time
accounting on all of their payable activity without any manual reconciliation.
By leveraging Tight's [native payment processor integrations](/integrations/payment-processing), you can enable your
users to pay their bills directly in your platform.
When using any of Tight's native payment processor integrations, you own the relationship between your end users
and the provider, including any associated economic benefits.
For platforms that already offer a full bill pay experience, a [custom integration](/integrations/custom-integrations)
with Tight enables all of the above functionality without altering your existing user flows.
## Use cases
### Adding bills to your platform
If your platform doesn't already offer bill management, you can embed the [Bill Dashboard](/embeddable-ui/react/bills/bill-dashboard) to add full-featured bill management into your
platform. Your users can create bills, manage vendors, process/track payments and fees, and have all the accounting automatically handled in the background.
### Adding payment processing
If you already have bill management in your product but want to add payment processing capabilities,
Tight's [native payment processor integrations](/integrations/payment-processing) enable you to add this functionality
without building any UI yourself. Your users can pay bills via ACH, wire transfer, or credit card, and Tight will
automatically:
* Match payments to bills
* Track payment processing fees as expenses
* Reconcile the payments against bank withdrawals
* Update accounting entries in real-time
### Automatic bill payment reconciliation
If your platform already offers both bill management and payment processing but lacks automated accounting
capabilities, you can sync your bill and payment data directly to the Tight API to enable automatic bill payment
reconciliation.
#### Bill Payment Example
Here's a concrete example of what Tight automates:
1. The business owner receives 4 bills from 4 vendors for \$300 each (\$1,200 total).
2. The business owner processes payment for all 4 bills via ACH. The payment processor charges \$2 per transaction (\$8
in total fees).
3. The bank account shows a total withdrawal of \$1,208 (\$1,200 in vendor payments plus \$8 in processing fees).
4. The Tight API automatically matches the 4 bills with the bank withdrawal, creates expenses for the payment processing
fees, and reconciles the total amount to the bank withdrawal. Furthermore, the Tight Embedded experience nests these
transaction line items neatly under a single withdrawal row, giving the business owner complete visibility into their
bill payments and fees without manual reconciliation work.
# Bookkeeping
Source: https://docs.tight.com/guides/business-owners/bookkeeping
Trusted by over 3k bookkeepers, Tight's Bookkeeper UX is the OS powering modern virtual bookkeeping
## Overview
Tight's Virtual Bookkeeping platform can be used to run the core of your bookkeeping operation, making it easy for you to offer your own Virtual Bookkeeping service, without having to dedicate resources to build:
* A seamlessly integrated back-end dashboard for your bookkeepers to provide service through
* A custom branded client-facing interface for:
* Onboarding
* Viewing reporting and metrics
* Answering questions from the bookkeeper
## Use cases
### Your team's operating system
* Bookkeeping team management, including permissioning
* Tasks, including pending monthly/annual closings and reconciliations
* Communication workflow with business owners, including:
* Streamlined onboarding interactions, including accounting migrations and smart bank linkage
* Ability to mark transactions as needing business owner review
* Transaction-level conversations
* Ability to perform operations across all businesses on your platform
* Ability to augment platform-level transaction rules
### Provide human-assisted bookkeeping without hiring humans
Through the many virtual bookkeeping operations using Tight as its OS, Tight
offers [human-assisted bookkeeping](/guides/solutions/dfy) to platforms that would like to offer this service without
hiring bookkeepers of their own.
# Data Lakes
Source: https://docs.tight.com/guides/business-owners/data-lakes
Enable your data scientists to work in the tools and format they love
## Overview
If your platform has built a bespoke analytics/reporting solution or envisions various proprietary use cases for large
analytical/accounting data, Tight's Data Lakes product is a natural add-on.
Of course, Tight allows you to access all the data that is available for your users in the API. But, Tight takes this
concept several levels further by periodically uploading raw data to your own data lake buckets, in the format your team
desires. By pushing that data into the warehouse of your preference, Tight eliminates the need for your data team to
build direct connections to the Tight API, allowing your team to work in the data stack that they are used to.
## Use cases
### Loan decisioning
For platforms offering lending products, Tight's Data Lakes provide the comprehensive financial data needed for
sophisticated underwriting and risk assessment. By automatically syncing transaction history, bank balances, invoice
data, and categorized expenses to your data warehouse, your credit team can build robust models without requiring manual
data uploads from applicants.
Your data scientists can work directly in tools like Snowflake, BigQuery, or your preferred analytics platform to
analyze cash flow patterns, revenue trends, expense ratios, and business health indicators. This eliminates the friction
of API calls for large datasets and enables complex joins with your existing customer data, application information, and
third-party data sources.
The result is faster loan decisions with better risk assessment. Your team can instantly evaluate an applicant's revenue
consistency, expense management, and overall financial trajectory, all from data that's already flowing into your
warehouse in a format your team knows how to work with.
### User/product analytics
Understanding how your users engage with accounting features is critical for product optimization, but pulling this data
through API calls doesn't scale for analytics workloads. Tight's [Lifecycle Event](/guides/business-owners/lifecycle-event-dictionary) uploads
to [Amplitude](/integrations/analytics/amplitude), [Mixpanel](/integrations/analytics/mixpanel),
or [Intercom](/integrations/customer-service/intercom) provide automatic event tracking for all user actions within
Tight's embedded experiences.
Every transaction categorization, invoice creation, bank connection, report generation, and dashboard view is captured
as structured event data. Your product team can analyze activation funnels, feature adoption, and user retention
patterns without building instrumentation infrastructure. Which features drive engagement? Where do users get stuck
during onboarding? How does accounting feature usage correlate with overall platform retention?
For platforms with bespoke analytics needs, full Data Lake uploads provide the raw material for custom analysis. Join
accounting activity data with your proprietary user data to understand financial behaviors across segments, build
predictive models for churn, or identify expansion opportunities based on accounting sophistication.
## Data types
Tight will upload data related to the following elements of Tight API/SDK information and interactions on daily, weekly,
or monthly intervals:
### Bank linkage
A [Parquet file](https://parquet.apache.org/) containing information on all linked bank accounts. The columns include
the bulk of data available in the [/banks/accounts endpoint](/v5.0/api-reference/banks/get-bank-accounts), including `userId`,
`apiInstitutionId`, `apiAccountNo`, `apiAccountType`, `createdDate`, `lastExpenseSyncedDate`, `lastRevenueSyncedDate`,
`apiCurrentBalance`, and more. Each file contains all the records that were updated since the last data upload.
### Invoices
A [Parquet file](https://parquet.apache.org/) containing information on all invoices. The columns include the bulk of
data available in the [/invoices endpoint](/reference/getinvoices), including `userId`, `date`, `totalAmount`,
`dueDate`, `sentDate`, `lastViewedDate`, `status`, and more. Each file contains all the records that were updated since
the last data upload.
### Lifecycle Events
A folder of [Parquet files](https://parquet.apache.org/), one per event category, containing information on actions each
user has taken, which is often useful for optimizing user experiences/funnels. The columns include `userId`, `date`,
`event`, and event-specific metadata. The full list of events being tracked is available in
the [Lifecycle Event Dictionary](/guides/business-owners/lifecycle-event-dictionary).
### Transactions
A [Parquet file](https://parquet.apache.org/) containing information on all transactions. The columns include the bulk
of data available in the [/transactions endpoint](/v5.0/api-reference/banks/get-transactions), including `userId`,
`apiInstitutionId`, `apiAccountNo`, `date`, `amount`, `bankDescription`, `categoryName`, and more. Each file contains
all the records that were updated since the last data upload.
## Integrations
Tight currently supports native integrations for full Data Lake uploads to:
* [Amazon S3](/integrations/analytics/amazon-s3)
* [Google Cloud Storage](/integrations/analytics/google-cloud-storage)
* [Snowflake](/integrations/analytics/snowflake)
Additionally, Tight natively supports Lifecycle Event uploads to:
* [Amplitude](/integrations/analytics/amplitude)
* [Intercom](/integrations/customer-service/intercom)
* [Mixpanel](/integrations/analytics/mixpanel)
# Dimensions
Source: https://docs.tight.com/guides/business-owners/dimensions
Track profitability across multiple dimensions
## Overview
Many businesses need to track profitability across multiple dimensions beyond just account categories, e.g. by location,
job code, product line, project, or department. Tight's dimensions functionality is a major improvement on class
tracking functionality offered by legacy accounting providers, enabling multi-dimensional reporting without requiring
your users to maintain complex account structures.
Your platform can define the dimensions (including hierarchies) made available to the businesses on your platform, and
the businesses can define the values against those dimensions. Your users can assign dimensions to transactions,
invoices,
and expenses, then generate Profit & Loss reports segmented by dimension to understand which locations, products, or
projects are most profitable. This is particularly valuable for platforms serving multi-location businesses,
project-based services, or any vertical where profitability analysis by segment drives business decisions.
The dimension tracking integrates seamlessly with Tight's accounting engine, so businesses get accurate profitability
reporting by segment while maintaining a clean, simple Chart of Accounts structure.
## Use Cases
### Platform defines dimensions
Your platform defines the dimensions that businesses on your platform can use to label their transactions. These labels
serve as the framework for multi-dimensional reporting (e.g., Region, Location, Department). By standardizing these
dimensions at the platform level, you create vertical-specific tracking capabilities that align with your users'
business models.
For example, a construction platform might define labels like "Project," "Phase," and "Job Type," while a retail
platform might define "Location," "Product Category," and "Sales Channel." Once you define these labels through
the [dimensions API](/api-reference/templates/save-dimensions), all businesses on your platform can
populate their own specific values under each label dimension.
This approach gives you control over the reporting structure while giving your users flexibility in how they apply it.
Dimensions can be hierarchical, allowing for nested categorization (e.g., Region → Location → Department).
The Tight API lets you define which labels are required, enforcing consistency across your platform's data
### Businesses set dimension values
Once you've defined the dimensions at the platform level, individual businesses populate those labels with
their own specific values. These business-level dimension values represent the actual categories each business uses for
tracking against a given dimension (e.g., under "Location": "NYC Office," "SF Office," "Remote"; under "Department": "
Sales," "Marketing," "
Operations").
Your platform may already track these segments, in which case you can simply have your system push them to
the [dimensions API](/api-reference/dimensions/save-dimension-values). Once created, these segments can be
assigned to transactions, invoices, expenses, bills, and mileage entries. When your users generate financial reports,
they can filter and/or group by any dimension to see profitability broken down by those dimensions, all without
creating separate accounts for each segment.
This gives each business complete flexibility to organize their financial data according to their unique structure,
while your platform maintains consistent reporting capabilities across all businesses.
## Examples
### Toast: Locations, Revenue Centers
Toast is a restaurant management platform that helps food and beverage businesses run operations like ordering,
payments, and reporting from a single system. Toast tracks operations across Locations (the physical restaurant),
Revenue Centers (sub-location groupings like dine-in, bar, patio, or online ordering), Service Periods (breakfast,
lunch, dinner), Order Channels (in-person, delivery platforms, kiosk), and Employees. Together, these dimensions let
restaurant operators understand which parts of their business - which location, which revenue stream, which daypart -
are driving performance.
With Tight embedded into Toast, Toast operators could slice financial reporting across any combination of these
dimensions, e.g., comparing net profit by Revenue Center within a Location, or rolling up P\&L by Service Period across
all
locations. Because Tight would mirror Toast's native dimension structure, operators could get accurate financial
reporting by segment without maintaining a separate Chart of Accounts for each one.
#### Toast Platform Setup
Toast defines the following dimensions at the platform-level:
* **Dimension 1:** Location
* **Dimension 2:** Revenue Center
#### Restaurant Configuration
Toast pushes the existing business configuration from its system into the Tight API. For example, a restaurant group
with 4 locations across two cities creates specific dimension values:
* **Dimension 1:** Location
* **Dimension 1 Values:**
* Georgetown DC
* Dupont Circle DC
* Back Bay Boston
* South End Boston
* Mission SF
* SoMa SF
* **Dimension 2**: Revenue Center
* **Dimension 2 Values**:
* Dine-In
* Bar
* Online Ordering
* Catering
#### Transaction Tagging
When transactions are ingested, e.g. food costs, beverage purchases, delivery commissions, staff
wages, users can tag each to a Location and/or Revenue Center.
Tight learns these behaviors
and [creates rules to automate these tagging behaviors](/ai/categorization/self-learning-transaction-categorization-overview#rule-insertion-flow)
#### Restaurant Reporting Outcome
The owner can generate P\&L reports to understand performance:
* Group by Location to compare total profitability across all locations
* Group by Revenue Center to see whether Dine-In or Online Ordering drives better margins
* Filter by both Location and Revenue Center to isolate specific operations (e.g., just Bar revenue at Dupont Circle DC)
### ServiceTitan: BUs, Trades, Divisions
ServiceTitan is a trades management platform that helps home and commercial service businesses run operations like
scheduling, dispatching, invoicing, and reporting from a single system. ServiceTitan tracks operations across Business
Units (the primary organizational unit, e.g. "HVAC Service" or "Plumbing Install"), Trades (the type of trade, e.g.
HVAC, Plumbing, Electrical), Divisions (the type of work within a trade, e.g. Install, Service, Maintenance), Zones (
geographic service areas within a Business Unit), and Job Types (e.g. Service, Estimate, Warranty). Together, these
dimensions let trades businesses understand which parts of their operation - which trade, which division, which service
area - are driving performance.
With Tight embedded into ServiceTitan, ServiceTitan operators could slice financial reporting across any combination of
these dimensions, e.g., comparing net profit by Division within a Business Unit, or rolling up P\&L by Trade across all
zones. Because Tight would mirror ServiceTitan's native dimension structure, operators could get accurate financial
reporting by segment without maintaining a separate Chart of Accounts for each one.
#### ServiceTitan Platform Setup
ServiceTitan defines the following dimensions at the platform level:
* **Dimension 1:** Business Unit
* **Dimension 2:** Trade
* **Dimension 3:** Division
#### Trades Business Configuration
ServiceTitan pushes the existing business configuration from its system into the Tight API. For example, a multi-trade
contractor operating across two regions creates specific dimension values:
* **Dimension 1:** Business Unit
* **Dimension 1 Values:**
* HVAC Install Residential
* HVAC Service Residential
* HVAC Maintenance Residential
* Plumbing Install Residential
* Plumbing Service Residential
* Electrical Service Residential
* **Dimension 2:** Trade
* **Dimension 2 Values:**
* HVAC
* Plumbing
* Electrical
* **Dimension 3:** Division
* **Dimension 3 Values:**
* Install
* Service
* Maintenance
#### Transaction Tagging
When transactions are ingested, e.g. labor costs, material purchases, subcontractor invoices, equipment rentals, users
can tag each to a Business Unit, which is associated with a specific Trade and Division.
Tight learns these behaviors
and [creates rules to automate these tagging behaviors](/ai/categorization/self-learning-transaction-categorization-overview#rule-insertion-flow)
#### Trades Reporting Outcome
The owner can generate P\&L reports to understand performance:
* Group by Business Unit to compare total profitability across all departments
* Group by Trade to see whether HVAC or Plumbing drives better margins
* Filter by both Trade and Division to isolate specific operations (e.g., just HVAC Install profitability)
### Procore: Cost Codes, Cost Types
Procore is a construction management platform that helps general contractors, owners, and specialty contractors run
operations like project management, budgeting, procurement, and reporting from a single system. Procore tracks
operations across Cost Codes (the specific type of work being performed, aligned by default to the CSI MasterFormat,
e.g. Concrete, Framing, Electrical), Cost Types (the nature of the spend, e.g. Labor, Materials, Equipment,
Subcontracts), Sub Jobs (subdivisions of a project, e.g. a building within a campus or a phase of work), and
Portfolio-level dimensions including Project Type (e.g. Ground-Up, Renovation), Department, Office, and Program (a
grouping of related projects). Together, these dimensions let construction businesses understand which parts of their
operation - which project, which cost category, which office - are driving performance.
With Tight embedded into Procore, Procore operators could slice financial reporting across any combination of these
dimensions, e.g., comparing net profit by Cost Type within a Cost Code, or rolling up P\&L by Office across all active
projects. Because Tight would mirror Procore's native dimension structure, operators could get accurate financial
reporting by segment without maintaining a separate Chart of Accounts for each one.
#### Procore Platform Setup
Procore defines the following dimensions at the platform level:
* **Dimension 1:** Cost Code
* **Dimension 2:** Cost Type
* **Dimension 3:** Sub Job
#### GC Configuration
Procore pushes the existing business configuration from its system into the Tight API. For example, a general contractor
working on a large mixed-use development creates specific dimension values:
* **Dimension 1:** Cost Code
* **Dimension 1 Values:**
* 03-000 Concrete
* 06-000 Framing & Rough Carpentry
* 16-000 Electrical
* 22-000 Plumbing
* 09-000 Finishes
* **Dimension 2:** Cost Type
* **Dimension 2 Values:**
* Labor
* Materials
* Equipment
* Subcontracts
* **Dimension 3:** Sub Job
* **Dimension 3 Values:**
* Building A
* Building B
* Site Work
* Common Areas
#### Transaction Tagging
When transactions are ingested, e.g. subcontractor invoices, material purchases, equipment rentals, labor timecards,
users can tag each to a Cost Code and Cost Type, with Sub Job added when phase- or building-level detail is needed.
Tight learns these behaviors
and [creates rules to automate these tagging behaviors](/ai/categorization/self-learning-transaction-categorization-overview#rule-insertion-flow)
#### GC Reporting Outcome
The owner can generate P\&L reports to understand performance:
* Group by Cost Code to compare spend across all work types on a project
* Group by Cost Type to see whether Labor or Subcontracts are the dominant cost driver
* Filter by both Cost Code and Sub Job to isolate specific operations (e.g., just Electrical costs for Building A)
# Financial Statements
Source: https://docs.tight.com/guides/business-owners/financial-statements
Unlock robust financial reporting for your user base
## Overview
Whether or not you are leveraging one of [Tight's native integrations](/integrations/native-integrations), Tight
automatically keeps a double-entry [General Ledger](/embeddable-ui/react/accounting/general-ledger) behind the scenes for all of your users. While
your users may never want to look at a GL or [Chart of Accounts](/embeddable-ui/react/accounting/chart-of-accounts), the beauty of the
behind-the-scenes GL is that they get all the financial reporting that they could ever need, *without* the burden of
having to manage a General Ledger or understand bookkeeping.
## Interactive Drill-Downs
Every number on every financial report is clickable and drillable. When your users click on any line item, whether
it is "Services Income" for a specific month on the P\&L or all "Accounts Receivable" on the Balance Sheet, they
instantly see the underlying transactions that compose that figure.
This transparency builds trust in the numbers and enables self-service exploration. Business owners can answer their own
questions without needing to contact support or their bookkeeper. For bookkeepers working in your platform, these
drill-downs provide the audit trail needed for professional accounting work.
## Core Financial Statements
### [Balance Sheet](/embeddable-ui/react/financial-statements/balance-sheet)
### [Cash Flow Statement](/embeddable-ui/react/financial-statements/cash-flow-statement)
### [Profit & Loss (Income) Statement](/embeddable-ui/react/financial-statements/profit-loss-report)
### [Trial Balance](/embeddable-ui/react/financial-statements/trial-balance-report)
### Expense Reports
### Additional Reports
Tight provides [dozens of specialized reports](/embeddable-ui/plain-js/pages/financial-statements/report-dashboard)
beyond the core financial statements. These operational reports help your users make data-driven decisions without
leaving your platform:
**Common operational reports include:**
* Expenses by Vendor, Revenue by Customer
* Aged Accounts Receivable and Payable
* Transaction Detail exports for custom analysis
* Tax filing reports (Form 1040 Schedule C, Form 1065, Form 1120-S, Form 1120, and T2125)
**Customization capabilities:**
Every report supports filtering by date range, dimension, account type, and custom fields. Users can save custom report
configurations for recurring analysis. For platform-specific reporting needs, Tight's reporting engine can be extended
with custom report templates.
Direct API access to any and all accounting data is also available for building fully custom reports or integrations.
## Use cases
### Real-time Business Insights
All Tight financial reports update in real-time as transactions flow through the system; your users get instant
visibility into current financial performance. The real-time nature reduces support burden (users see accurate data
immediately) and enables your platform to become
the single source of truth for financial decision-making.
If desired, you can consume report data via JSON API to build custom visualizations like runway calculators, KPI
dashboards, or vertical-specific metrics.
### Dimensions
Tight's financial reports fully support [dimensions](/guides/business-owners/dimensions), enabling
multi-dimensional profitability analysis. Users can segment any financial report by location, product line, project, or
department to understand which parts of their business drive performance.
### AI CFO
Tight's [Financial Statements MCP tools](/ai/mcp-tools/financial-statements-mcp) enable AI assistants to access and
analyze financial reports through natural language. Your users can ask questions like "Show me our Q4 P\&L by department"
or "How has our cash position changed over the past year?" and get instant, accurate analysis powered by Tight's
real-time financial data.
# General Ledger
Source: https://docs.tight.com/guides/business-owners/general-ledger
Mature accounting functionality trusted by 3k+ bookkeepers
## Overview
As your user's data flows into Tight, Tight's behind-the-scenes double-entry accounting is enabled in the background.
Every expense, invoice, tax payment, bank transfer, bill, etc. has the proper accrual basis, cash basis, and modified
cash basis accounting transactions tracked in the background.
Unlike most accounting software products available today, the behind-the-scenes nature of this double-entry
accounting means that you can provide your users with all the robustness they need, without requiring your users to
understand accounting.
And, if you have power users (or bookkeepers) who want to get into the granularity
of [General Ledger (GL)](/embeddable-ui/react/accounting/general-ledger) transactions, including creating manual journal
entries, they can absolutely do so.
## What the General Ledger enables
### Financial Reporting
The double-entry General Ledger that Tight maintains automatically enables
comprehensive [financial reporting](/guides/business-owners/financial-statements) without requiring your users to
understand accounting mechanics. Every transaction that flows through your platform, whether it's an invoice,
bank transaction, bill, or payroll run, automatically updates the appropriate GL accounts in real-time.
This means your users get instant access
to [Profit & Loss statements](/embeddable-ui/react/financial-statements/profit-loss-report),
[Balance Sheets](/embeddable-ui/react/financial-statements/balance-sheet),
[Cash Flow Statements](/embeddable-ui/react/financial-statements/cash-flow-statement), and
[Trial Balance reports](/embeddable-ui/react/financial-statements/trial-balance-report) without manual bookkeeping work.
Bookkeepers and accountants working within your platform can drill down from any report line item directly into the
underlying transactions and journal entries, providing the audit trail and transparency needed for professional
accounting work.
### Automated reconciliation
Tight's accounting engine automatically handles the complex reconciliation scenarios that typically require manual
bookkeeping intervention. When a payment processor (
e.g. [Adyen](/integrations/payment-processing/adyen), [Stripe](/integrations/payment-processing/stripe)) payout hits a
business's bank account, Tight automatically matches it to the underlying invoices, merchant fees, and payment
processing charges without any manual matching required. See how this works in practice
with [automatic payment/payout reconciliation](/guides/business-owners/invoicing#automatic-paymentpayout-reconciliation).
The same automation applies
to [matching bill payments](/guides/business-owners/bills#adding-automatic-bill/withdrawal-reconciliation-to-your-existing-bill-pay),
bank transfers between
accounts, [payroll withdrawals](/guides/business-owners/payroll#automatic-payrollwithdrawal-reconciliation), and other
multi-leg transactions that traditionally create reconciliation headaches. Your users see clean, reconciled books
without needing to understand the accounting mechanics happening in the background.
### Dimension Tracking
Many businesses need to track profitability across multiple dimensions beyond just account categories, e.g. by location,
product line, project, or department. Tight's [dimensions](/guides/business-owners/dimensions) functionality
enables this multi-dimensional reporting without requiring your users to maintain complex account structures.
Your platform can define the dimension values and hierarchies made available to the business on your platform, and the
businesses can define the values against those dimensions. Your users can assign dimensions to transactions, invoices, and
expenses, then generate Profit & Loss reports segmented by dimension to understand which locations, products, or projects
are most profitable. This is particularly valuable for platforms serving multi-location businesses, project-based
services, or any vertical where profitability analysis by segment drives business decisions.
The dimension tracking integrates seamlessly with Tight's accounting engine, so businesses get accurate profitability
reporting by dimension while maintaining a clean, simple [Chart of Accounts](/guides/get-started/accounting-migrations/default-chart-of-accounts) structure.
## Use cases
### Augment Your Platform
If you already have invoicing, expense tracking, or bill pay built into your product, Tight's accounting engine can back
your existing features with proper double-entry bookkeeping. Push your existing transaction data to the Tight API, and
Tight automatically maintains the general ledger, enabling financial reporting and reconciliation capabilities you'd
otherwise need to build from scratch.
This approach lets you add complementary features selectively; see below for some example features you can add to your
platform with Tight:
1. [Expense Tracking](/guides/business-owners/bank-transactions#expense-tracking)
2. [Automatic Mileage Tracking](/guides/business-owners/mileage-tracking#automatic-mileage-tracking)
3. [Financial Statements](/guides/business-owners/financial-statements)
4. [Invoicing](/guides/business-owners/invoicing#adding-invoicing-to-your-platform)
5. [Bill Pay](/guides/business-owners/bills#adding-bills-into-your-platform)
### Turnkey Accounting Solution
The [Financial Overview](/embeddable-ui/react/financial-overview) provides a complete accounting platform
embedded directly in your product. Your users see a simplified, action-oriented view that surfaces only what requires
their attention — uncategorized transactions, unpaid invoices, upcoming tax deadlines — without overwhelming them with
accounting complexity.
Everything is included: bank connections, expense categorization, invoicing, financial statements, income tax estimates,
and reconciliation. Your users get professional-grade accounting functionality without needing to understand debits,
credits, or journal entries.
#### Advanced Accounting Controls
For bookkeepers and sophisticated business owners who need deeper control, embed individual accounting pages alongside
the dashboard. These users can access the [Chart of Accounts](/embeddable-ui/react/accounting/chart-of-accounts) to
customize account structures, the [General Ledger](/embeddable-ui/react/accounting/general-ledger) to review
transaction-level detail, and the [Journal](/embeddable-ui/react/accounting/journal) to create manual journal entries
for depreciation, amortization, or complex adjustments. This gives power users the granular control they expect while
keeping the experience simple for everyone else.
# Invoicing (A/R)
Source: https://docs.tight.com/guides/business-owners/invoicing
Over 20k invoices processed per month
## Overview
If Invoicing is not your product team's core competency, let Tight's proven invoicing platform handle the heavy lifting.
If you already have proven invoicing in your product, a [custom integration](/integrations/custom-integrations) with
Tight enables:
* Full double-entry accounting (accrual and cash basis)
* The ability to rapidly add a [payment processor of your choosing](/integrations/payment-processing) without building
any UI
* Automatic [payment/payout reconciliation](/integrations/payment-processing/adyen#automated-reconciliation) against
bank deposits
When using one of Tight's native payment processor integrations, you own the relationship between your end users
and the provider, including any associated economic benefits.
## Use cases
### Adding invoicing to your platform
If you don't already offer invoicing, you can embed Tight's complete invoicing experience directly into your platform.
Your users can create invoices, send them to clients, accept payments, and have all the accounting automatically handled
in the background.
Embed the [Invoice Dashboard](/embeddable-ui/react/invoicing/invoice-dashboard) to add full-featured invoicing to your
platform. Your users get a complete invoicing workflow, including branding customization, invoice creation, client management, payment tracking,
and automatic accounting, all within your product experience.
Once integrated with a payment processor (Stripe, Adyen, etc.), invoices include payment buttons that your users'
clients can use to pay directly. The [Customer-Facing Invoice](/embeddable-ui/react/invoicing/customer-facing-invoice)
component provides a polished payment experience that matches your end user's brand while Tight handles the payment
processing and accounting automatically.
### Adding payment processing to your existing invoicing
If you already have invoicing in your product but want to add payment processing capabilities,
Tight's [native payment processor integrations](/integrations/payment-processing) enable you to add this functionality
without building any UI yourself.
Integrate with payment processors
like [Stripe](/integrations/payment-processing/stripe), [Adyen](/integrations/payment-processing/adyen), or others, and
Tight handles the payment acceptance, fee tracking, and payout reconciliation automatically. Your users can accept
credit card or ACH payments on their invoices, and Tight will automatically:
* Match payments to invoices
* Track merchant fees as expenses
* Reconcile the payments against payouts
* Update accounting entries in real-time
This approach is ideal if you've already invested in invoicing infrastructure and want to add payment processing and
automatic reconciliation without rebuilding your invoicing experience.
### Automatic payment/payout reconciliation
If your platform already offers both invoicing and payment processing but lacks sophisticated accounting capabilities,
you can sync your invoice and payment data directly to the Tight API to enable automatic payment and payout
reconciliation.
Regardless of which approach you choose, embedding Tight's invoicing, integrating with Tight's payment processors, or
feeding your existing invoice and payment data directly to the Tight API, the automatic reconciliation works the same
way. Tight matches payments to invoices, tracks fees, reconciles payouts against bank deposits, and updates the general
ledger automatically, with zero user input required.
#### Invoice Payout Example
Here's a concrete example of what Tight automates:
1. The business owner sends out 4 \$1,000 invoices to 4 clients.
2. Those 4 invoices are paid via 4 separate credit card payments via Stripe. Stripe charges \$25 in merchant fees for
each of the 4 invoices.
3. The user receives a payout from Stripe for \$3,890 (\$4,000 minus \$100 in merchant fees and minus a \$10
contribution to Stripe Climate), also seen as a \$3,890 deposit into their checking account.
4. The Tight API automatically matches the 4 invoices with the one payout, creates expenses for the various merchant
fees, and reconciles the net amount to the bank deposit. Furthermore, the Tight Embedded experience nests these
transaction line items neatly under a single payout row, giving the business owner complete visibility into their
invoice payments and fees without manual reconciliation work.
Tight's automatic reconciliation works across all supported payment processors, including Stripe, Adyen, and others.
The same seamless experience applies regardless of which payment processor your users choose.
# Migrations & Imports
Source: https://docs.tight.com/guides/business-owners/migrations-and-imports
Thousands of businesses migrated from QBO, Xero, Wave, and Bench
## Overview
While [independent research shows that 62% of small businesses don't use any accounting software yet](https://www.tight.com/embedded-accounting-smb-vertical-software-report),
leaving a major greenfield opportunity for your platform, Tight has successfully completed thousands of migrations
from legacy accounting platforms, including QuickBooks Online, Xero, Wave, and Bench.
This proven import functionality allows you to transfer a business's accounting data into your embedded accounting
platform,
preserving the business's historical financial information while ensuring data integrity throughout the migration
process.
Tight makes this easy for the business owner or the bookkeeper, allowing fully automated multiyear imports from several
legacy accounting providers, including:
* QuickBooks Online (QBO)
* Xero
* Wave
* Bench
The import process automatically maps and cleans up the business's Chart of Accounts, showing the changes made along the
way and allowing changes to be made in the process. The import process takes anywhere from 5 seconds to 3 minutes,
depending on how many years of data the user is migrating.
## Bulk migrations
When moving an entire user base from a legacy accounting platform onto Tight, it is much more efficient to import your
users' data programmatically. You can kick off the import to Tight with a single API request. The Tight API will alert
you via a Lifecycle Event Webhook as soon as the import is completed, at which point the Tight API makes the comparative
verification reports available via API.
# Mileage Tracking
Source: https://docs.tight.com/guides/business-owners/mileage-tracking
Over 1 million miles a day tracked using Tight
## Overview
Small business owners/operators (and their employees) who spend any amount of time driving for their business have
found that tracking mileage is both important and unbearable. The benefits of tracking mileage, both in order to
maximize tax deductions as well as for employee reimbursements, are immense, but the requirement to document each drive
is very cumbersome.
Tight provides multiple mechanisms for automatically tracking your users' mileage, removing the need for them to keep a
manual mileage log, and adding a daily use case to your product.
With over 1 billion miles tracked to date and 1 million miles tracked per day, Tight's mileage tracking is robust,
mature, and proven. And, it's all automatically tied into Tight tax estimates and Tight tax reporting.
## Use cases
### Business owner/operators
Business owners can reduce their taxable income by tracking and reporting the mileage they drove for business purposes;
this is commonly known as the mileage tax deduction. For example, real estate agents can generally deduct mileage driven
while taking buyer clients to see homes for sale; general contractors can generally deduct the mileage driven when going
to the client's site. This type of business mileage, when reported correctly, can lower the tax liability for the
business.
### Employee reimbursement
Some employers reimburse their employees for work-related mileage driven in their personal vehicle. For example, an
individual employed by a consulting firm (i.e. a consultant) might drive their personal vehicle to visit a client, and
the employer may offer reimbursement for that mileage driven. In order for the consultant to easily track that mileage
and submit it to their employer, the consultant likely uses an automated mileage tracker. Additionally, proper
documentation allows the firm itself to deduct the expenses associated with that mileage reimbursement.
## Tracking methods
### Automatic mileage tracking
Automatic mileage tracking is best for users whose daily driving is predominantly for business purposes. Tight's mobile
mileage tracking SDK automatically detects when the user is driving, without requiring input from the user.
If your product stores addresses (e.g. job sites, client locations, properties under supervision, etc.), you can
programmatically push those into Tight so that any drives containing one of these locations are automatically marked as
business drives.
The route they drove (including start and end addresses), distance driven, and deduction/reimbursement amount are
tracked without the user needing to remember to do anything. They simply need to enable automatic mileage tracking once
inside your mobile app. Simply implement the Tight iOS mileage tracking SDK, Android mileage tracking SDK,
and/or [React Native mileage tracking component](/embeddable-ui/react-native/mileage-dashboard) once, and rest assured
that annual OS updates (including permissioning and device-specific changes) will be taken care of for you.
### Semi-automatic mileage tracking
Semi-automatic mileage tracking is best for users whose daily driving is an even mix of business and personal driving.
Tight's mobile mileage tracking SDK allows your user to press a start (and stop) button to track specific drives.
The route they drove (including start and end addresses), distance driven, and deduction/reimbursement amount are
tracked at the touch of a button, without the user needing to input anything other than pressing start and stop.
### Manual mileage tracking
Manual mileage tracking is best for users who rarely drive for business purposes.
Tight's [web-based mileage tracking dashboard](/embeddable-ui/react/mileage-dashboard) allows your users to input the
start and end address of a business drive, at which point the route is back-calculated, along with the distance driven,
and deduction/reimbursement amount. The user can input any additional notes and/or assign the drive to a specific
client, for powerful client-specific reporting and/or for reimbursement from the client.
# Canadian Support
Source: https://docs.tight.com/guides/business-owners/multi-currency/canadian-accounting
Full native support for Canadian nuances, including input tax credit, provincial tax estimates, and more
## Overview
One size fits none when it comes to accounting, and that's why Tight has built native support for Canadian businesses.
Whether your user base resides solely in Canada or you're looking at adding Canadian support to your future roadmap
without dedicating development resources, Tight has you covered.
## Use cases
### Tax Estimates
Canadian users have to pay quarterly installments to the CRA, and Tight's [Tax Calculations API](/api-reference/tax-estimates/get-tax-estimates) makes it easy for you to provide your users with the income tax estimates needed to pay those installments.
Your users' [tax profiles](/api-reference/tax-profile/save-tax-profile) are formatted specifically for providing accurate Canadian estimates, including the following Canada-specific fields:
| Field | Description | Format |
| :- | :- | :- |
| federalFilingStatus | The [marital status](https://www.canada.ca/en/revenue-agency/services/tax/individuals/topics/about-your-tax-return/tax-return/completing-a-tax-return/personal-address-information/marital-status.html) of the user | Must be one of the following: "SINGLE", "MARRIED" |
| taxState | Two-letter province abbreviation | String |
| annualW2Income | Estimate of the user's annual wage total (aka T4 Income), before any tax withholdings | Numeric, with 2 decimal places |
| spouseIncome | Estimate of the user's spouse's annual wage total (aka T4 Income), before any tax withholdings | Numeric, with 2 decimal places |
| numDependents | Number of dependents | Numeric |
| dependentIncome | Estimate of the user's dependents' income | Numeric, with 2 decimal places |
| vehicleBusinessPercent | The user's estimated percentage of driving that was for business purposes (measured in km) | Numeric, with 2 decimal places |
| autoSalesTax | Whether the user wants the Tight API to automatically calculate sales tax, based on the province that each expense originated in. This is useful for calculating the input tax credit, which will be applied against any sales tax owed on business income. | Boolean |
Additionally, the [tax estimates](/api-reference/tax-estimates/get-tax-estimates) themselves are returned with different attributes that are specific to how taxes are calculated in Canada. The response from GET /estimates contains a Canada-specific JSON object, with a vast amount of useful tax information as follows:
```json theme={null}
{
"country": "CAN",
"state": "QC",
"year": 2022,
"t4Income": 100000.00,
"t4FederalMarginalTaxRate": 20.50,
"t4StateMarginalTaxRate": 25.75,
"spouseIncome": 0.00,
"dependentIncome": 0.00,
"cppContributionAmount": 0.00,
"cppDeductionAmount": 0.00,
"qppContributionAmount": 1589.57,
"qppDeductionAmount": 794.79,
"businessIncome": 29346.73,
"expenses": 7336.68,
"deductibleNonMileageExpenses": 7336.68,
"deductibleVehicleExpenses": 0.00,
"adjustedGrossIncome": 22010.05,
"taxableNetIncome": 22010.05,
"overallTax": 10988.22,
"overallTaxSavings": 3796.73,
"overallTaxUnpaid": 0.00,
"federalTaxUnpaid": 0.00,
"stateTaxUnpaid": 0.00,
"annualPaymentDueDate": "2023-06-15 00:00:00.000",
"afterTaxIncome": 11021.83,
"federalTax": {
"taxableIncome": 22010.05,
"marginalTaxRate": 26.0000,
"taxCredit": 0.00,
"taxAmountWithoutTaxCredit": 5701.05,
"preCreditEffectiveTaxRate": 25.90,
"effectiveTaxRateBeforeWithholding": 25.90,
"taxBeforeWithholding": 5701.05,
"withholdingAppliedToTax": 0.00,
"taxAmount": 5701.05,
"effectiveTaxRate": 25.90
},
"stateTax": {
"taxableIncome": 22010.05,
"marginalTaxRate": 25.7500,
"taxCredit": 158.96,
"taxAmountWithoutTaxCredit": 5446.13,
"preCreditEffectiveTaxRate": 24.74,
"effectiveTaxRateBeforeWithholding": 24.02,
"taxBeforeWithholding": 5287.17,
"withholdingAppliedToTax": 0.00,
"taxAmount": 5287.17,
"effectiveTaxRate": 24.02
},
"salesTax": {
"revenueSalesTax": 0.00,
"expenseSalesTax": 0.00,
"netSalesTax": 0.00
},
"quarterlyEstimates": {
"q1": {
"dueDate": "2022-03-15 00:00:00.000",
"federalTax": {
"taxOwed": 1425.26,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 1425.26
},
"stateTax": {
"taxOwed": 1321.79,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 1321.79
}
},
"q2": {
"dueDate": "2022-06-15 00:00:00.000",
"federalTax": {
"taxOwed": 950.36,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 950.36
},
"stateTax": {
"taxOwed": 881.37,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 881.37
}
},
"q3": {
"dueDate": "2022-09-15 00:00:00.000",
"federalTax": {
"taxOwed": 1425.26,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 1425.26
},
"stateTax": {
"taxOwed": 1321.79,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 1321.79
}
},
"q4": {
"dueDate": "2022-12-15 00:00:00.000",
"federalTax": {
"taxOwed": 1900.17,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 1900.17
},
"stateTax": {
"taxOwed": 1762.22,
"taxPaid": 0.00,
"paymentsAllocatedFromPast": 0.00,
"paymentsRolledOverToFuture": false,
"paymentsBalance": 1762.22
}
}
}
}
```
The art of building great FinTech apps includes figuring out how to display complex financial data in a way that a given user base can easily digest it. Tight has iterated its tax UX through its own apps, with over 30 versions displayed to 700k+ users. Our team is willing and excited to share our proven UX learnings with you, fast forwarding you through your iteration process and ensuring that your first tax UX is a solid one. Reach out to our API team at [api@hurdlr.com](mailto:api@hurdlr.com), and our team will advise you on which attributes to display and how to do so clearly/concisely.
### Tax reporting
The [T2125](/api-reference/reports/t2125) is generally the most complex portion of any Canadian self-employed individual's tax filing, but Tight makes generating this form a breeze. A T2125 has to be filed for *each* sole proprietorship (line of business) that the user has participated in. Take a look at our [Canada Tax Reporting docs](/v5.0/products/taxes/tax-reporting/t2125-canada) to learn how to easily generate this tax report for each of your users' businesses.
### Accounting
[Tight's "Invisible" Double-Entry Accounting](/guides/business-owners/general-ledger) is enabled in the background, tracking the proper accrual basis transactions in each user's General Ledger. It's up to you whether you want to display this to your users.
Notably, for Canadian users, the [Chart of Accounts](/embeddable-ui/react/accounting/chart-of-accounts) includes an asset account for "Sales Tax Credit" as well as a liability account for "Sales Tax Payable". These accounts are used to store the sales tax paid on expenses as well as the sales tax owed on income, respectively. Tracking these values allows Tight's tax estimates to include the [input tax credits](https://www.canada.ca/en/revenue-agency/services/tax/businesses/topics/gst-hst-businesses/complete-file-input-tax-credit.html) that the CRA extends to businesses.
And, if you use the `autoSalesTax` flag when setting up the user's [tax profile](/guides/business-owners/multi-currency/canadian-accounting#tax-estimates), that tracking will occur automatically.
# EU Support
Source: https://docs.tight.com/guides/business-owners/multi-currency/european-union-accounting
Full native support for LatAm nuances
This page is under construction. Please check back later for more content.
# LatAm Support
Source: https://docs.tight.com/guides/business-owners/multi-currency/latin-america-accounting
Full native support for LatAm nuances
This page is under construction. Please check back later for more content.
# UK Support
Source: https://docs.tight.com/guides/business-owners/multi-currency/uk-accounting
Full native support for UK nuances
This page is under construction. Please check back later for more content.
# Payroll
Source: https://docs.tight.com/guides/business-owners/payroll
Add Payroll and Accounting to turn your platform into a one-stop shop
## Overview
Accounting for companies running payroll, including businesses of one, can be tricky. Tight's [native payroll
integrations](/integrations/payroll/) make this process easy, with zero user input required.
Tight supports Accrual Basis, Cash Basis, and Modified Cash Basis accounting methods. Many cash basis businesses
choose to use Modified Cash Basis when enabling payroll for the first time.
## Use cases
### Integrating your users existing payroll system
Many of your users already run payroll through established providers. With Tight's native integrations, they can connect
their existing payroll accounts to your platform and immediately benefit from automatic accounting without switching
providers or changing their payroll workflow.
Your users connect their existing payroll providers via one of Tight's native integrations (e.g.,
[Gusto](/integrations/payroll/gusto) retail). Once connected, payroll runs are automatically synced to Tight as
they occur, accounting transactions are created in real-time in the user's General Ledger, and bank withdrawals are
automatically reconciled when they clear. Your users continue running payroll exactly as they do today, and Tight
handles all the accounting complexity in the background.
### Automatic payroll/withdrawal reconciliation
Regardless of which approach you choose, connecting existing payroll systems, embedding payroll into your platform, or
feeding payroll data directly to the Tight API, the automatic reconciliation works the same way. Tight creates the proper
accounting entries for each payroll run and automatically reconciles bank withdrawals when they clear, with zero user
input required.
That reconciliation process, when done manually, can be very complex, as a single payroll run typically includes at
least three bank withdrawals, all of which need to be mapped to different accounts. With the Tight API, this
reconciliation happens automatically, without user input.
#### Monthly Payroll Run Example
Here's a concrete example of what Tight automates:
1. The owner of an S-Corp has two employees and a contractor. They run their monthly payroll:
* Owner salary: \$6,000
* Two employees: \$4,000 each (\$8,000 total)
* One contractor: \$1,000
* Company payroll taxes: \$2,000 per W-2 worker (\$6,000 total for owner + 2 employees)
* Employee payroll tax withholding: \$1,000 per W-2 worker (\$3,000 total)
* Health insurance: \$400 per person (\$1,200 total for owner + 2 employees)
* Company 401k contributions: \$200 per person (\$600 total for owner + 2 employees)
* Employee 401k contributions: \$300 per person (\$900 total for owner + 2 employees)
2. The payroll provider processes four separate bank withdrawals:
* \$12,000 for Employee Net Pay (\$15,000 gross wages minus \$3,000 in tax withholdings)
* \$9,000 for Payroll Taxes (\$6,000 company portion + \$3,000 withheld from employees)
* \$1,200 to CareFirst for health insurance
* \$1,500 to Guideline for 401k (\$600 company contributions + \$900 employee contributions)
3. The Tight API automatically matches these 4 bank withdrawals with the payroll run and performs the following
accounting splits:
* **\$12,000 net salary withdrawal** → Split into \$5,000 owner net pay, \$6,000 staff net pay, and \$1,000
contractor payments
* **\$9,000 payroll tax withdrawal** → Split into \$6,000 for company payroll taxes (expense), \$1,000 added back to
owner gross wages, and \$2,000 added back to staff gross wages (since these amounts were withheld from their
paychecks)
* **\$1,200 health insurance withdrawal** → Split into \$400 for owner benefits (expense) and \$800 for employee
benefits (expense)
* **\$1,500 retirement withdrawal** → Split into \$600 for company 401k contributions (expense) and \$900 for
employee 401k contributions (treated as additional wages from the company's accounting perspective)
4. Furthermore, the Tight Embedded experience nests these transaction line items neatly under the payroll run, giving
the business owner complete visibility into their payroll costs without manual reconciliation work.
Tight follows best practices with its default payroll accounting; however, you can customize
your [platform's custom Chart of Accounts (CoA)](/guides/get-started/accounting-migrations/default-chart-of-accounts) to
configure the above splits with however much (or little) granularity as your users desire to see in their Financial
Statements.
### Embedding payroll into your platform
If you don't already, you can offer payroll directly within your platform with Embedded Payroll. Tight integrates
seamlessly with these providers. Your users can run payroll entirely within your product experience, and
Tight automatically handles all the accounting behind the scenes.
Tight supports three embedded payroll providers:
* [Check](/integrations/payroll/check)
* [Gusto Embedded](/integrations/payroll/gusto#gusto-embedded-payroll)
* [Salsa](/integrations/payroll/salsa)
Once you integrate with an embedded payroll provider and configure it with Tight, your users run payroll directly in
your platform, and Tight receives payroll data in real-time, automatically creates accounting entries, and reconciles
bank withdrawals when they clear. This approach gives you complete control over the payroll UX while Tight handles the
complex accounting automatically, and your users get a seamless, unified experience all within your product.
If you haven't embedded payroll yet, an [expert from the Tight team](https://www.tight.com/#get-started) can
introduce you to embedded payroll providers and help you evaluate the best option for your platform.
# Taxes
Source: https://docs.tight.com/guides/business-owners/taxes
Provide tax estimates for the business owner of the passthrough entity
## Overview
Tight's Tax Calculations makes it easy for you to provide your users with income tax estimates, with support for many
different income streams, expenses, and tax profiles. The Tight Income Tax API has been proven and reached maturity via
very rigorous maintenance and update processes in place since the 2017 tax year, as well as painstaking quality
assurance processes with a 1% threshold between 3 different sources. The Tight Tax Calculations API currently supports
the United States (50 states + DC) and Canada (all provinces, including GST/HST/PST/QST), but is architected for rapid
expansion into other countries as needed.
## Use cases
The Tight API automatically keeps a General Ledger behind the scenes for all of your users. While your users may never
want to look at a GL or Chart of Accounts, the beauty of the behind-the-scenes GL is that they get all the tax reporting
that they could ever need, without the burden of having to manage a General Ledger or understand bookkeeping.
As the user's business (and financial complexity) grows, the necessary reporting will always be available for them in
real time. For example, if your user is a sole proprietor that normally files a Schedule C, then they decide to become
an LLC necessitating a Form 1065, you will only need to alter one parameter via the Tight API to get them the new tax
report that they need.
### Annual/quarterly tax estimates
Embed the [Income Tax Dashboard](/embeddable-ui/react/income-tax-dashboard) to provide your users with comprehensive tax
estimation functionality directly within your platform. The dashboard gives business owners real-time visibility into
their quarterly and annual tax obligations, including federal and state income taxes, self-employment taxes (if applicable), and
estimated quarterly payments.
#### Multiple income streams
Tight Tax Estimates makes it easy for you to provide your users with income tax estimates, based on their many different incomes streams, including:
* Self-employed (1099) income, with separate P\&Ls and Schedule Cs for each stream
* Business (K-1) income, from pass-through entities like LLCs, LLPs, and S Corporations
* Investment income, including short-term capital gains, long-term capital gains, qualified dividends, etc.
* Ordinary W-2 income
Business owners can view quarterly estimates, understand their effective tax rates, and plan for tax payments without leaving your platform.
#### Tax profile
Your users can set up their tax profile, and Tight automatically calculates their tax obligations in real-time as transactions flow through their accounts. Tight can handle very complex tax profiles, including granularity into:
* Filing Status
* State (or Province)
* Business income (from a passthrough entity)
* W2 income
* Tip income
* Overtime income
* Itemized personal expenses
* Federal & State withholding
* Wage expenses
* Investment and other income types
* Federal Dependents (and other dependents including special circumstances for children older than 17)
* State Dependents (and other dependents including special circumstances for children older than 17)
* Alternative Minimum Tax (AMT) adjustments
* Spousal data
To decrease your user's time-to-value, initial user onboarding features a very simple tax profile form (filing status, entity type, etc.)
### Tax form generation
Business owners can generate pre-filled tax forms directly from
the [Income Tax Dashboard](/embeddable-ui/react/income-tax-dashboard), or you can generate them programmatically via the
Tight API.
**Via Embedded UI:**
When you embed the [Income Tax Dashboard](/embeddable-ui/react/income-tax-dashboard), your users can generate tax forms
specific to their entity with ease. The dashboard provides complete tax forms as PDFs for filing or record-keeping and
Tax Details report for hand-off to a tax preparer or accountant.
**Via API:**
For programmatic generation, use the Tight API to generate tax forms on demand:
* [Schedule C](/api-reference/reports/schedule-c) - Sole proprietorships
* [Form 1065](/api-reference/reports/form-1065) - Partnerships and multi-member LLCs
* [Form 1120-S](/api-reference/reports/form-1120-s) - S-Corporations
* [Form 1120](/api-reference/reports/form-1120) - C-Corporations
* [T2125](/api-reference/reports/t2125) - Canadian businesses
### Tax professional hand-off
The vast majority of business owners, especially those with formed entities (e.g. LLCs), opt to have their taxes done
for them by a human. Tight makes the business owner's interaction with their tax preparer very quick, as
Tight's [Income Tax Dashboard](/embeddable-ui/react/income-tax-dashboard) allows the user to generate a Tax Details (for
tax filing) report that tax preparers love, allowing seamless import into the tax professional software that tax
preparers typically use behind the scenes. The business owner can simply enter their tax preparer's email address and
have the Tax Details report sent directly to the tax preparer.
Tight's Tax Details (for tax filing) report format has been honed for many years, such that tax preparers *love*
the report. They often thank the business owner for the level of organization.
### DIY filing
Some business owners, especially self-employed individuals who don't necessarily view themselves as a business, prefer
a low-cost DIY tax filing option. For users who want to file their own taxes, Tight integrates with white-labeled DIY tax
filing platforms like [April](/integrations/tax/april), seamlessly transferring their financial data from Tight directly
into the tax filing platform, where their tax return is pre-filled with all necessary information from the Tight General
Ledger. Once the data is transferred, business owners can review their pre-filled return, make any necessary
adjustments (e.g. for items not tracked in their accounting system, like their personal mortgage), and file
electronically.
# Chart of Accounts
Source: https://docs.tight.com/guides/get-started/accounting-migrations/default-chart-of-accounts
Create and iterate the default Chart of Accounts for each of your platform's key user segments
1. Tight delivers a pre‑configured Chart of Accounts (CoA) template tailored to your user base.
2. Your team can then review and make direct edits to the template.
3. You can also create multiple CoA templates for different business segments.
4. Once revised, Tight accounting experts will review the template(s) and provide best practice feedback to ensure the template allows the businesses on your platform to smoothly migrate off of their legacy accounting platform.
5. Tight [applies the CoA template to your platform account](/api-reference/templates/save-chart-of-accounts-template) so that it will be applied to any new companies you create in the Tight API.
Business owners and/or their accountants can modify a given business's Chart of Accounts at any time. The default template(s) are meant to be a highly-tailored starting point for each of the business segments your platform supports.
# Introduction
Source: https://docs.tight.com/guides/get-started/introduction-to-tight-accounting-api
Welcome to Tight AI-native Embedded Accounting
## Quickstart
Validate market demand with Tight Ready-to-Launch Accounting
Embed accounting with Tight's proven white-labeled experience
Leverage AI to quickly embed accounting into your platform
Explore the Tight Embedded End-to-End UX in the Playground
## Agentic Accounting
Tight's AI-native General Ledger (AGL) is now able to automate categorization, reconciliation, anomaly detection, reporting,
and analysis by leveraging LLM-based [Agentic Accountants](/ai/agentic/agentic-accountant).
Having served 1.3M businesses to date, Tight [AI-native Embedded Accounting](/ai/philosophy/ai-native-general-ledger) allows
platforms like yours to provide businesses with the power of real-time financials and reconciliation as well as the
accuracy and reliability of a fully deterministic ledger.
## Use cases
### Augment Your Platform
If you already have invoicing, expense tracking, or bill pay built into your product, Tight's accounting engine can back
your existing features with proper double-entry bookkeeping. Push your existing transaction data to the Tight API, and
Tight automatically maintains the general ledger, enabling financial reporting and reconciliation capabilities you'd
otherwise need to build from scratch.
This approach lets you add complementary features selectively; see below for some example features you can add to your
platform with Tight:
1. [Expense Tracking](/guides/business-owners/bank-transactions#expense-tracking)
2. [Automatic Mileage Tracking](/guides/business-owners/mileage-tracking#automatic-mileage-tracking)
3. [Financial Statements](/guides/business-owners/financial-statements)
4. [Invoicing](/guides/business-owners/invoicing#adding-invoicing-to-your-platform)
5. [Bill Pay](/guides/business-owners/bills#adding-bills-into-your-platform)
### Turnkey Accounting Solution
The [Tight Dashboard](/embeddable-ui/react/financial-overview) provides a complete accounting platform
embedded directly in your product. Your users see a simplified, action-oriented view that surfaces only what requires
their attention — uncategorized transactions, unpaid invoices, upcoming tax deadlines — without overwhelming them with
accounting complexity.
Everything is included: bank connections, expense categorization, invoicing, financial statements, income tax estimates,
and reconciliation. Your users get professional-grade accounting functionality without needing to understand debits,
credits, or journal entries.
### Advanced Accounting Controls
For bookkeepers and sophisticated business owners who need deeper control, embed individual accounting pages alongside
the dashboard. These users can access the [Chart of Accounts](/embeddable-ui/react/accounting/chart-of-accounts) to
customize account structures, the [General Ledger](/embeddable-ui/react/accounting/general-ledger) to review
transaction-level detail, and the [Journal](/embeddable-ui/react/accounting/journal) to create manual journal entries
for depreciation, amortization, or complex adjustments. This gives power users the granular control they expect while
keeping the experience simple for everyone else.
## What Tight enables
### Financial Reporting
The double-entry General Ledger that Tight maintains automatically enables
comprehensive [financial reporting](/guides/business-owners/financial-statements) without requiring your users to
understand accounting mechanics. Every transaction that flows through your platform, whether it's an invoice,
bank transaction, bill, or payroll run, automatically updates the appropriate GL accounts in real-time.
This means your users get instant access
to [Profit & Loss statements](/guides/business-owners/financial-statements#profit-&-loss-income-statement), [Balance Sheets](/guides/business-owners/financial-statements#balance-sheet), [Cash Flow Statements](/guides/business-owners/financial-statements#cash-flow-statement),
and [Trial Balance reports](/guides/business-owners/financial-statements) without manual
bookkeeping work.
Bookkeepers and accountants working within your platform can drill down from any report line item directly into the
underlying transactions and journal entries, providing the audit trail and transparency needed for professional
accounting work.
### Automated reconciliation
Tight's accounting engine automatically handles the complex reconciliation scenarios that typically require manual
bookkeeping intervention. When a payment processor (
e.g. [Adyen](/integrations/payment-processing/adyen), [Stripe](/integrations/payment-processing/stripe)) payout hits a
business's bank account, Tight automatically matches it to the underlying invoices, merchant fees, and payment
processing charges without any manual matching required. See how this works in practice
with [automatic payment/payout reconciliation](/guides/business-owners/invoicing#automatic-paymentpayout-reconciliation).
The same automation applies
to [matching bill payments](/guides/business-owners/bills#adding-automatic-bill/withdrawal-reconciliation-to-your-existing-bill-pay),
bank transfers between
accounts, [payroll withdrawals](/guides/business-owners/payroll#automatic-payrollwithdrawal-reconciliation), and other
multi-leg transactions that traditionally create reconciliation headaches. Your users see clean, reconciled books
without needing to understand the accounting mechanics happening in the background.
### Dimensions
Many businesses need to track profitability across multiple dimensions beyond just account categories, e.g. by location,
product line, project, or department. Tight's [dimensions](/guides/business-owners/dimensions) functionality
enables this multi-dimensional reporting without requiring your users to maintain complex account structures.
Your platform can define the dimensions and hierarchies made available to the business on your platform, and the
businesses can define the values against those dimensions. Your users can assign dimensions to transactions, invoices, and
expenses, then generate Profit & Loss reports segmented by dimension to understand which locations, products, or projects
are most profitable. This is particularly valuable for platforms serving multi-location businesses, project-based
services, or any vertical where profitability analysis by segment drives business decisions.
The dimension tracking integrates seamlessly with Tight's accounting engine, so businesses get accurate profitability
reporting by segment while maintaining a clean, simple Chart of Accounts structure.
# AI-based Support
Source: https://docs.tight.com/guides/get-started/launch-checklist/ai-support
Leverage Tight's comprehensive knowledge base to train your support agents
## Overview
AI chat support helps your team accurately and efficiently answer complex customer questions around your embedded
accounting product, without requiring your support team to have accounting expertise.
Tight has seen \~80% of inquiries can be covered by AI chat when trained properly, and importantly, Tight will customize
its proven content to match your platform's implementation *and* train your AI agent such that it covers the majority of
inquiries.
In addition to AI-based support, Tight's Customer Success team will schedule training sessions with your support staff
to enable them to support advanced accounting use cases.
## Knowledge Base
Tight customizes its comprehensive knowledge base, honed with and proven across 1.3 million businesses, with screenshots
and content specific to your platform, and then uploads the Markdown content directly into your AI agent's
knowledge base. Markdown ensures compatibility with AI support agents as well as easy formatting and readability.
This content includes detailed user guides, troubleshooting steps, and answers to common customer questions.
Tight's Customer Success team can train your Intercom Fin or Zendesk AI Agent for you
## MCP Tools for user-specific AI support
If you have an in-house chat support agent that is able to leverage MCP Tools (
e.g., [Fin by Intercom](https://www.intercom.com/help/en/articles/11461635-add-mcp-connectors-for-popular-apps-or-custom-mcps)),
then Tight's [MCP Server](/ai/mcp-tools/end-user-support-mcp) can be integrated so that your support agent has direct
access to the specific user's data, allowing personalized support.
## Support Staff Training
Tight's Customer Success team schedules training sessions with your support staff to get them up to speed on supporting
accounting use cases.
Your support staff's leadership will have direct access to Tight's Customer Success team, allowing your team to maintain
its brand voice while having the comfort of direct access to experts in the Tight Embeddable UI.
When using [Tight human-assisted done-for-you (DFY) books](/guides/solutions/dfy), Tight's Bookkeeping team
provides support directly to your users via the Tight Bookkeeping Dashboard.
# Launch
Source: https://docs.tight.com/guides/get-started/launch-checklist/launch
Launch your new platform
Once Tight Embedded Accounting up and running in your product, you're ready to launch with your users. Tight's Customer
Success team provides the following services immediately prior to every customer-partner's launch:
## AI Support (and Staff) Training
[Tight's Customer Success trains your AI and your team.](/guides/get-started/launch-checklist/ai-support)
## Quality Assurance
For your benefit, Tight's QA team tests your sandbox implementation prior to your go-live date. Once you provide Tight
with credentials to your sandbox or staging environment, Tight's experienced QA team will verify your implementation of
the Tight API as well as provide UX feedback.
## Production Access to Tight
Once the QA process is complete, you should:
1. Request Production keys to the Tight API
2. Update the Tight API URL from `https://sandbox.tight.com` to `https://prod.tight.com`
## Production Access to Integrations
An important part of launching your product is getting production environment access to
the [various native integrations](/integrations/native-integrations) (
e.g., [Plaid](/integrations/banking/plaid), [Unit](/integrations/banking/unit), [Stripe](/integrations/payment-processing/stripe))
that your product utilizes. Given the sensitive nature of the data being processed, these providers often require
security questionnaires prior to granting production access. The Tight API team, which is SOC 2 Type 2 compliant, is
experienced with these approval processes and will be ready to support you through this process.
## Email Branding
To ensure your new accounting product's emails match with the rest of your brand's design language, Tight offers the
ability
for [report and invoicing emails to go out from your domain](/guides/get-started/launch-checklist/email-branding#domain-smtp-configuration)
and with [customizable design templates](/guides/get-started/launch-checklist/email-branding#email-design-customization)
that align with your brand.
# User Activation
Source: https://docs.tight.com/guides/get-started/launch-checklist/user-activation
Track and maximize user activation funnels
Immediately after [launching embedded accounting](/guides/get-started/launch-checklist/launch), your product team will
want to track key user activation funnels and optimize against those funnels. If you'd like to set user activation on
auto-drive, you can enable [Tight's Twilio integration](/integrations/customer-service/twilio), which use smart SMS
messages to handle all onboarding and activation lifecycle messaging.
## Activating through timely notifications
With detailed user-level events, Tight gives you the tools to send the right notification at the right time, ensuring
you are helping your users activate as successfully as possible.
### Defining the channel
#### SMS
While many of Tight's customer-partners already have already established notification channels with their userbase (e.g.
SMS, push notifications, in-app chat, email), customer-partners often find less friction by simply allowing [Tight's
Agentic Accountant to text the business owner](/integrations/customer-service/twilio) the same way a human would
whenever a quick action is needed.
#### Push Notifications
If you already send out push notifications, you can simply subscribe
to [Tight's lifecycle webhooks](/api-reference/webhooks#lifecycle-webhooks), and then use those webhooks to trigger push
notifications to your users. Additionally, if you utilize Intercom for in-app chat and/or push notifications, you can
leverage [Tight's Intercom integration](/integrations/customer-service/intercom).
#### Email
If you already send out emails, you can simply subscribe
to [Tight's lifecycle webhooks](/api-reference/webhooks#lifecycle-webhooks), and then use those webhooks to trigger
emails. Alternatively, [Tight can send out lifecycle emails on your behalf](/guides/get-started/launch-checklist/email-branding).
### Triggering the right notifications
The following events are proven to drive initial user activation:
#### Linking banks or credit cards
Event: `bankLinked`
Notification timing: User registered >2 days ago and `bankLinked` not triggered
Messaging: Link your card to automate your expense tracking
Follow-up actions: `transactionCreated`, `transactionEdited`, `transactionRuleSuggested`
#### Setting up invoicing
Event: `invoiceSetupCompleted`
Notification timing: User registered >5 days ago and `invoiceSetupCompleted` not triggered
Messaging: Customize your invoices and get paid faster
Follow-up actions: `invoicePaymentProcessingSetupCompleted`, `invoiceDrafted`, `invoiceSent`
## Tracking user activation funnels
### Defining key user activation funnels
There are many different ways to define funnels depending on the goals of your product. Two of the most common examples
are described below:
#### Expense Tracking Funnel
| Funnel Step | Event | Description |
| :- | :- | :- |
| 1 | `companyCreated` | User registered |
| 2 | `bankLinked` | User linked their bank or credit card for automated transaction categorization |
| 3 | `transactionsProcessed` | Transactions have been processed from an integration such as Plaid, Unit, or CSV Import |
| 4 | `transactionRuleSuggested` | Tight system suggests a rule for automatic expense categorization to the user |
| 5 | `transactionRuleAccepted` | User accepted an automated expense rule, indicating that they have customized/personalized the app to their needs. User is then rewarded and retained by automatic expense categorization. |
#### Invoicing Funnel
| Funnel Step | Event | Description |
| :- | :- | :- |
| 1 | `companyCreated` | User registered |
| 2 | `invoiceSetupCompleted` | User added their company branding, logo, address, etc., to customize their invoice template |
| 3 | `invoicePaymentProcessingSetupCompleted` | User is now able to accept credit card and ACH payments |
| 4 | `invoiceSent` | User sent an invoice to their client |
| 5 | `invoicePaid` | User received payment from their client for an invoice (and is very likely retained) |
Tight's GTM team is glad to help you define the activation funnels that are most critical to your product.
### Tracking user-driven events
In order to receive the important user-driven events for tracking and optimizing user activation, you will want to
subscribe to events via one or more of the following methods:
a. [Intercom integration](/integrations/customer-service/intercom): if your team utilizes Intercom for user support and
messaging
b. [Mixpanel integration](/integrations/analytics/mixpanel): if your team utilizes Mixpanel for tracking aggregate user
behavior
c. [Lifecycle webhooks](/api-reference/webhooks#lifecycle-webhooks): if your team has custom-built user messaging and
behavior tracking flows
d. [Data Lakes](/guides/business-owners/data-lakes#integrations): if your team has custom-built flows and wants to get
user behavior data into your data scientists' hands without involving developers
# Custom authentication
Source: https://docs.tight.com/guides/get-started/user-provisioning/use-custom-authentication
Create Tight accounts with a few lines of code
If your platform rolls its own authentication mechanism, utilize the Tight API to provision user accounts and retrieve access tokens.
## Create a company
When a business opts into your new Bookkeeping product, [create their company in Tight](/api-reference/company-management/create-a-company).
The creation of the company accepts a `userId` for the business owner from your system, so there is no need to store any Tight identifiers in your platform.
## Get an access token
Using the `userId` used to create the user's company along with your client credentials, make a simple request to retrieve an access token:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/auth/token \
-u client_id:client_secret \
-d userId=your_userId
```
The Tight API will respond with your granted access token:
```json theme={null}
{
"access_token": "",
"token_type": "Bearer",
"expires_in": 3600
}
```
This token can be used to [embed Tight UI](/embeddable-ui/react/patterns/embedding) or to directly [hit the Tight API](/api-reference/authentication#using-the-access-token).
# Identity provider
Source: https://docs.tight.com/guides/get-started/user-provisioning/use-existing-identity-provider
Configure SSO for embedded accounting with zero developer effort
If your platform uses a popular identity provider, like Auth0, AWS Cognito, Okta, or Stytch, then you can authenticate
your users to Tight Embedded Accounting by following the steps below (no developer required).
## Securely sharing your JWKS path
Simply use
the [Configure Identity Provider API](/api-reference/identity-provider-configuration/configure-identity-provider) to
specify your Identity Provider and Issuer URI.
## Configure business-specific attributes
Tight will use the standard user claims (attributes) included by your identity provider, like `email`, `name`, etc.
Additionally, you can set up the following optional company-specific attributes in your identity provider:
| Claim | Description |
| - | - |
| `companyName` | Name of the user's company |
| `entityType` | The type of the entity (SOLE\_PROPRIETORSHIP, LLP, LLC, S\_CORP, C\_CORP) |
| `companyId` | Id of the company in your DB |
| `address` | Address of the company |
## Get a JWT access token
### Ready-to-Launch
If you are using Ready-to-Launch accounting, then you simply need
to [route your user to the Ready-to-Launch app](/guides/launch-paths/ready-to-launch#route-your-user-to-the-ready-to-launch-app).
The RTL app will take care of the authenication using your identity provider.
### Embedding Tight
If you are embedding accounting into your existing UX, then you can obtain a JWT from your identity provider, and
simply [pass that JWT into the front-end components as the access token](/guides/launch-paths/embed-in-your-ux#front-end-development-1-day).
# Custom Integrations
Source: https://docs.tight.com/guides/integrations/custom-integrations
Allow Tight to ingest granular data already stored in your platform
If you're interested in Tight Custom Integrations, please see [Tight Custom Integrations](/integrations/custom-integrations).
# Native Integrations
Source: https://docs.tight.com/guides/integrations/native-integrations
Leverage the Tight API’s wide range of seamless integrations
If you're interested in Tight Native Integrations, please see [Tight Native Integrations](/integrations/native-integrations).
# Build with AI (MCP)
Source: https://docs.tight.com/guides/launch-paths/build-with-ai
Leverage AI to quickly embed accounting
Whether you're tight on development resources or have a dedicated software development team, Tight allows you to embed end-to-end accounting in no time by leveraging the latest in AI technology.
Your product leader(s) may already be familiar with the Model Context Protocol (MCP), but even if they aren't, Tight is a great first use case for modern AI tooling in your organization.
New to AI or interested in learning best practices? Tight's AI-native engineering team (which makes up 80% of the Tight team as a whole) is ready and excited to walk you through the AI tooling it uses in-house.
You can use large language models (LLMs) to embed Tight. Tight provides tooling and best practice guidance for using LLMs.
## Tight Model Context Protocol (MCP) Server
The Tight Model Context Protocol (MCP) server provides tools that AI agents can use to embed end-to-end accounting utilizing Tight's documentation.
See the [Model Context Protocol documentation](/ai/mcp-tools/embedding-and-integration-mcp) to connect your AI Agents or IDE of choice to the Tight MCP server.
Once connected, AI agents will automatically leverage Tight's documentation to quickly add accounting functionality to your product. See below for an example with Claude Code.
## Example: Adding Accounting to Existing Product
**Prompt:** "Add a navigation item called "Accounting" that routes to Tight's Financial Overview"
**AI (Claude) response:**
> ⏺ Perfect! I've successfully added an "Accounting" navigation item that routes to Tight's Financial Overview. Here's what I implemented:
>
> Changes Made:
>
> 1. Created TightFinancialOverview\.jsx - A new component that embeds Tight's Financial Overview, providing:
> 1. Monthly financial summaries
> 2. Onboarding action items (linking bank accounts, etc.)
> 3. Transaction review notifications
> 4. Access to financial reporting (P\&L, Balance Sheet, etc.)
> 2. Updated App.jsx (App.jsx:3, App.jsx:13, App.jsx:77-90):
> 1. Updated navigation bar to add "Accounting" that routes to TightFinancialOverview\.jsx
>
> How It Works:
>
> 1. The "Accounting" button navigates to the Financial Overview, utilizing the Tight `access_token` in state.
# Embed in your UX (5 days)
Source: https://docs.tight.com/guides/launch-paths/embed-in-your-ux
Integrate accounting features natively into your existing product
This launch path outlines the typical path to launching embedded accounting in your existing product.
This approach is best for organizations that prioritize accounting on their product roadmap. This implementation path scales for platforms supporting hundreds of thousands of businesses.
If your platform is more interested in proving accounting demand with less than 1000 businesses, your product team will likely instead prefer [Tight Ready-to-Launch Accounting](/guides/launch-paths/ready-to-launch).
## Configure your SSO/authentication mechanism (1 day)
1. Use your existing identity provider (e.g. Auth0, AWS Cognito, Okta, or Stytch) by following Tight's [user provisioning with existing identity provider](/guides/get-started/user-provisioning/use-existing-identity-provider) instructions.
2. Or, use custom code to [provision Tight user accounts using the Tight API](/guides/get-started/user-provisioning/use-custom-authentication).
## Design (2 days)
1. Decide where to place the "Bookkeeping" navigation item inside your UX
2. [Preview and customize the branding/styling](/embeddable-ui/react/patterns/design) on the Business Owner Dashboard
3. Receive your tailored theme from Tight for front-end developer use (see below)
## Front-end Development (1 day)
1. Add "Bookkeeping" navigation item to your existing product
2. When your user clicks the "Bookkeeping" navigation item, [get an access token](/api-reference/authentication) and [render the embedded end-to-end UX](/embeddable-ui/react/patterns/embedding)
## Configure additional data integrations (post-launch)
Tight has many data integrations, including [native integrations](/integrations/native-integrations) with popular financial platforms (e.g. Plaid, Stripe, Adyen) as well as [custom integrations](/integrations/custom-integrations) to ingest granular data already stored in your platform (e.g. invoices and line items stored in a Vertical SaaS platform, dimension hierarchies like cost centers, regions, locations, departments, etc.). The Tight team will create a custom implementation plan for your specific platform to ensure any financial data stored in your platform flows into your new accounting product. For example, the invoices tracked in your system are automatically reconciled with the bank deposits flowing into Tight.
# Ready-to-Launch (24h)
Source: https://docs.tight.com/guides/launch-paths/ready-to-launch
Launch Bookkeeping in 24 hours with zero developer effort
Follow the two simple administrative steps below to authenticate your users and launch full-featured accounting on your domain (e.g. accounting.mySaaSplatform.com).
This approach is best for fast-moving organizations that want to get to market quickly (up to 1000 businesses) and start collecting GTM/acquisition data to further build the case for an embedded accounting roadmap.
Typically, after your GTM team gets 1000+ businesses on Tight Ready-to-Launch Accounting, your product team will likely opt to augment your core product by [fully embedding accounting user experiences](/guides/launch-paths/embed-in-your-ux) into it.
## Configure your SSO/authentication mechanism
### Use your existing identity provider (zero developer effort)
If you use Auth0, AWS Cognito, Okta, or Stytch, this is the authentication mechanism you should use.
You can configure your existing identity provider's JWKS path, by following Tight's [user provisioning with existing identity provider](/guides/get-started/user-provisioning/use-existing-identity-provider) instructions.
### Or, provision users with custom code (one developer day)
If you're not using an existing identity provider of if you simply prefer a custom integration, you can [provision Tight user accounts using the Tight API](/guides/get-started/user-provisioning/use-custom-authentication).
## Route your user to the Ready-to-Launch app
If you are using an existing identity provider, contact the Tight team for the URL that you should redirect your user to.
If you are using custom code to authenticate your user with the [create company endpoint](/api-reference/company-management/create-a-company), the response on this endpoint contains the `readyToLaunchUrl` that you can simply redirect your user to.
## Configure your custom domain
By default, the Ready-to-Launch website URL is hosted on tight.com (e.g. `https://mySaaSplatform.prod.rtl.tight.com`). If you would like to change it to your own custom domain (e.g. `https://bookkeeping.mySaaSplatform.com`), you can do so by following the steps below:
1. Specify your Custom Bookkeeping domain (e.g. [https://bookkeeping.mySaaSplatform.com](https://bookkeeping.mySaaSplatform.com))
2. Specify your existing login page URL (e.g. [https://app.mySaaSplatform.com/login](https://app.mySaaSplatform.com/login))
3. Create CNAME Record on your DNS provider
1. Go to your DNS provider’s website (e.g. [GoDaddy](https://ie.godaddy.com/help/add-a-cname-record-19236) or [Cloudflare](https://www.cloudflare.com/dns/)).
2. Go to the "DNS" section
3. Add a CNAME record for your Bookkeeping custom domain:
1. Give the CNAME a "Name" value based on the first part of your custom domain, e.g. if your custom domain is `bookkeeping.mySaaSplatform.com`, use `bookkeeping`.
2. Give the CNAME a "Data" value based on Tight's default RTL URL for your platform (e.g. `mySaaSplatform.prod.rtl.tight.com`)
4. Add a CNAME record for your new bookkeeping SSL certificate:
1. Give the CNAME a "Name" value provided to you by your Tight CSM
2. Give the CNAME a "Data" value provided to you by your Tight CSM
# Human-assisted DFY Books
Source: https://docs.tight.com/guides/solutions/dfy
Quickly launch done-for-you bookkeeping by following this step-by-step plan
This implementation plan outlines the typical path to launching human-assisted bookkeeping in your product. Each section
is titled after the role/job function that would typically complete the underlying steps:
## Planning/administrative (1 day)
1. [Curate your default Chart of Accounts template](/guides/get-started/accounting-migrations/default-chart-of-accounts)
2. [Configure your bank linkage integration](/integrations/banking/plaid)
3. [Configure your automated email domain](/guides/get-started/white-labeled-experience/email-domain)
## Design (1 day)
1. Decide where to place the "Bookkeeping" navigation item inside your UX
2. [Preview and customize the](/embeddable-ui/react/patterns/design) Business Owner Dashboard
3. Receive your tailored theme from Tight for front-end developer use (see below)
## Development (2 days total)
### Back-end (1 day)
1. When a business opts into your new Bookkeeping
product, [create their company in Tight](/api-reference/company-management/create-a-company)
2. If you are using Tight's Ready-to-Launch product, the API response contains the `readyToLaunchUrl` that you can
simply return to your front-end and redirect your user to
3. If you're not using Ready-to-Launch, create an endpoint
to [get a short-lived UI access token](/api-reference/authentication) (no need to store in DB)
If you use Auth0, AWS Cognito, Okta, or Stytch, you can skip the above back-end development steps
by [using your existing identity provider](/guides/get-started/user-provisioning/use-existing-identity-provider).
### Front-end (1 day)
1. Add "Bookkeeping" navigation item to your existing product
2. When your user clicks the "Bookkeeping" navigation item:
1. Get an access token from your back-end (see above)
2. Redirect your user to the Ready-to-Launch page
3. Or, [Embed](/embeddable-ui/react/patterns/embedding)
the [Financial Overview](/embeddable-ui/react/financial-overview) using the access token and theme
This dashboard presents the owner-operator with only the info that they need to see, such as transactions
the bookkeeper needs input on.
It additionally includes a sub-navigation menu for power users to access
granular functionality, such as the full transactions dashboard, mileage tracking, income taxes, etc.
If your product already has a well-defined navigation structure, you can disable the sub-navigation inside the
Business Owner Dashboard and utilize your own navigation.
## GTM
1. Roll out your Bookkeeping Product in a phased approach
1. 10 users: work directly with users to onboard them and get feedback
2. 100 users: test automated onboarding flows (e.g. UI-based onboarding call scheduling), Tight-led CoA iteration
based on transactional data, and build confidence in bookkeeping operations
3. 1000 users: Vertical-specific learnings/efficiencies generated for Tight algorithms and bookkeepers
2. [Provide top-tier Support](/guides/get-started/launch-checklist/ai-support)
3. Productization/pricing strategy
[//]: # "## Post-launch Future Roadmap"
[//]: #
[//]: # "1. Invoicing integration"
[//]: # "2. [Payment Processing integration](/integrations/payment-processing/stripe)"
[//]: # "3. [Payroll integration](/integrations/payroll/gusto)"
# AI-assisted DIY Books
Source: https://docs.tight.com/guides/solutions/diy
Launch a full accounting software solution for your business owners to manage their books with AI assistance
This implementation plan outlines the typical path to launching AI-assisted accounting in your product. Each section is
titled after the role/job function that would typically complete the underlying steps:
## Planning/administrative (1 day)
1. [Curate your default Chart of Accounts template](/guides/get-started/accounting-migrations/default-chart-of-accounts)
2. [Configure your bank linkage integration](/integrations/banking/plaid)
3. [Configure your automated email domain](/guides/get-started/white-labeled-experience/email-domain)
## Design (1 day)
1. Decide where to place the "Accounting" navigation item inside your UX
2. [Preview and customize the Business Owner Dashboard](/embeddable-ui/react/patterns/design)
3. Receive your tailored theme from Tight for front-end developer use (see below)
## Development (2 days total)
### Back-end (1 day)
1. When a business opts into your new Bookkeeping
product, [create their company in Tight](/api-reference/company-management/create-a-company)
2. If you are using Tight's Ready-to-Launch product, the API response contains the `readyToLaunchUrl` that you can
simply return to your front-end and redirect your user to
3. If you're not using Ready-to-Launch, create an endpoint
to [get a short-lived UI access token](/api-reference/authentication) (no need to store in DB)
If you use Auth0, AWS Cognito, Okta, or Stytch, you can skip the above back-end development steps
by [using your existing identity provider](/guides/get-started/user-provisioning/use-existing-identity-provider).
### Front-end (1 day)
1. Add "Accounting" navigation item to your existing product
2. When your user clicks the "Bookkeeping" navigation item:
1. Get an access token from your back-end (see above)
2. Redirect your user to the Ready-to-Launch page
3. Or, [Embed](/embeddable-ui/react/patterns/embedding)
the [Financial Overview](/embeddable-ui/react/financial-overview) using the access token and theme
This dashboard presents the owner-operator with only the info that they need to see, such as transactions
requiring review, easy access to financial reports, etc.
It additionally includes a sub-navigation menu
for power users to access granular functionality, such as the full transactions dashboard, mileage tracking,
income taxes, etc.
If your product already has a well-defined navigation structure, you can disable the
sub-navigation inside the Business Owner Dashboard and utilize your own navigation.
## GTM
1. Roll out your Accounting Product in a phased approach
1. 10 users: work directly with users to onboard them and get feedback
2. 100 users: test automated onboarding flows (e.g. UI-based onboarding call scheduling), Tight-led CoA iteration
based on transactional data, build confidence in accounting operations
3. 1000 users: Vertical-specific learnings/efficiencies generated for Tight algorithms and bookkeepers
2. [Provide top-tier Support](/guides/get-started/launch-checklist/ai-support)
3. Productization/pricing strategy
[//]: # "## Post-launch Future Roadmap"
[//]: #
[//]: # "1. Invoicing integration"
[//]: # "2. [Payment Processing integration](/integrations/payment-processing/stripe)"
[//]: # "3. [Payroll integration](/integrations/payroll/gusto)"
# Audit Trail
Source: https://docs.tight.com/api-reference/audit-trail
Audit changes to entities in the Tight API
## Overview
The Tight API stores every modification to every entity along with details about each revision, e.g. the date and time, the editor, and the source of the change.
An individual entity can be audited to see all revisions to that entity or the entry audit trail can be retrieved to view a chronological log of every action and the entities affected.
## Audit an entity
All top-level entities in the Tight API support pulling their Audit Trail. This can be fetched via a URL of the form `/v6/auditTrail/{id}`.
For example to audit a bank transaction, use the following request:
```bash theme={null}
curl -X GET 'https://sandbox.tight.com/v6/auditTrail/btn_936723' \
-H 'Authorization: Bearer '
```
This will return a list of revisions for the specified bank transaction:
```json theme={null}
{
"result": "SUCCESS",
"data": [{
"company": {
"id": "fake_companyId"
},
"editor": {
"userId": "fake_userId",
"email": "user@tight.com"
},
"action": "Transactions edited by user@tight.com",
"datetime": "2025-06-17T14:24:32.926Z",
"revision": {
"id": "btn_936723",
"category": {
"id": "cat_354231"
}
}
}],
"error": []
}
```
For large audit trails, utilize pagination to retrieve all changes. See the [pagination documentation](/api-reference/pagination) for more information.
## Review the full Audit Trail
The Tight API supports pulling the full audit trail for any company, providing all changes to all entities belonging to that company in a chronological order:
```bash theme={null}
curl -X POST 'https://sandbox.tight.com/v6/auditTrail/query' \
-H 'Authorization: Bearer '
```
This will return all audit trail entries:
```json theme={null}
{
"result": "SUCCESS",
"data": [{
"company": {
"id": "fake_companyId"
},
"editor": {
"userId": "fake_userId",
"email": "user@tight.com"
},
"action": "Transactions edited by user@tight.com",
"datetime": "2025-06-17T14:24:32.926Z",
"revisions": [{
"id": "btn_936723",
"category": {
"id": "cat_354231"
}
},
{
"id": "btn_936724",
"category": {
"id": "cat_354231"
}
}]
}],
"error": []
}
```
The entries returned in the above audit trail are determined by the `access_token` used. See the [Authentication docs](/api-reference/authentication#authentication-scenarios) for more info.
## Editors
When modifications are made to an entity in the Tight API, the `access_token` used to make those edits determines the `editor` on the associated audit trail entry.
If a `userId` was used to generate the `access_token`, edits made using that access token will reflect that user on the audit trail. If a `userId` was not used, i.e. Partner-level authentication is being used to access the Tight API, the audit trail will reflect your platform's name as the editor on the audit trail.
## Audit a specific editor
The full Audit Trail can be filtered to a specific editor to audit changes made by a specific user, e.g. a bookkeeper
across all companies:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/auditTrail/query \
-H 'Authorization: Bearer ' \
-D '{
"filter": {
"editor": {
"userId": {
"equal": "fake_bookkeeper_userId"
}
}
}
}'
```
This will return all Audit Trail entries caused by Bookkeeper `fake_bookkeeper_userId`.
# Audit an entity
Source: https://docs.tight.com/api-reference/audit-trail/audit-an-entity
https://dev.tight.com/v3/api-docs get /v6/auditTrail/{entityId}
Retrieve the Audit Trail for an entity in the Tight API
# Query audit trail
Source: https://docs.tight.com/api-reference/audit-trail/query-audit-trail
https://dev.tight.com/v3/api-docs post /v6/auditTrail/query
Query audit trail entries for the authenticated user
# Generate one-time link
Source: https://docs.tight.com/api-reference/auth/generate-one-time-link
https://dev.tight.com/v3/api-docs post /v6/auth/oneTimeLink
Generate a one-time authentication link. The link's shape depends on the caller's token type: a partner-level token must provide userId; an accountant-level token may optionally provide companyId to generate a link that acts as that company's owner; a business-owner token generates a link for its own company.
# Authentication
Source: https://docs.tight.com/api-reference/authentication
Obtain and use bearer tokens with the Tight API
## Get Started
The Tight API uses access tokens to authenticate requests. To get started, simply exchange your client credentials and a `userId` for an access token:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/auth/token \
-u client_id:client_secret \
-d userId=your_userId
```
The Tight API will respond with your granted access token:
```json theme={null}
{
"access_token": "",
"token_type": "Bearer",
"expires_in": 3600
}
```
This token can be used anywhere in the Tight API to access this user's data.
## Partner-level Authentication
The `userId` in the above request is optional. You can omit it to request a token that can access data across *all* of your users:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/auth/token \
-u client_id:client_secret
```
See the [POST /token reference](/api-reference/oauth/token) for more information.
## Bookkeeper Authentication
Passing the `userId` of a bookkeeper returns a token that can access every company that bookkeeper is permitted to work on. To scope a bookkeeper's token to a single company, add the `apiCompanyId` parameter alongside the bookkeeper's `userId`:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/auth/token \
-u client_id:client_secret \
-d userId=bookkeeper_userId \
-d apiCompanyId=company_userId
```
The resulting token acts as that bookkeeper working on behalf of the specified company, so requests return only that company's data and changes are audited to the bookkeeper. This is the recommended approach when a bookkeeper on your platform performs operations for one company at a time, rather than reusing a partner-level token.
`apiCompanyId` requires `userId` to be the ID of a bookkeeper who can access the given company.
## Token Scopes
You can pass an optional `scope` field when requesting a token from `POST /v6/auth/token` to limit what the token can do:
* `read` gives read-only access
* `write` gives read and write access
* If omitted, `scope` defaults to `write`
For example, to request a read-only token:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/auth/token \
-u client_id:client_secret \
-d userId=your_userId \
-d scope=read
```
## Using the Access Token
Include the returned token in the `Authorization` header of any request to the Tight API:
```bash theme={null}
curl --location --request POST 'https://sandbox.tight.com/v6/banks/transactions' \
-H 'Authorization: Bearer '
```
The above request retrieves bank transactions available to the provided `access_token`.
## Authentication Scenarios
How the token was generated impacts what data the above request will return. For example, when using a token generated for a specific business owner (via their `userId`), the request will return bank transactions belonging to that user's company.
The following table outlines what data is accessible based on the `userId` provided:
| Authentication Type | Data Accessible |
| - | - |
| Business owner | Only that company |
| Bookkeeper | All companies the bookkeeper can access |
| Bookkeeper scoped to a company | Only that company |
| None (Partner-level) | All companies |
How the token was generated impacts how the Tight API audits changes to entities modified using that token. See the [Audit Trail docs](/api-reference/audit-trail#editors) for more info.
## Token Renewal
Instead of tracking token expiration, generate a new token for each user session.
Tight Embedded Components automatically refresh tokens for you.
# Delete bank account
Source: https://docs.tight.com/api-reference/bank-accounts/delete-bank-account
https://dev.tight.com/v3/api-docs delete /v6/banks/accounts/{id}
Delete a bank account for the given id
# Get bank account
Source: https://docs.tight.com/api-reference/bank-accounts/get-bank-account
https://dev.tight.com/v3/api-docs get /v6/banks/accounts/{id}
Get a bank account for the given id
# Query bank accounts
Source: https://docs.tight.com/api-reference/bank-accounts/query-bank-accounts
https://dev.tight.com/v3/api-docs post /v6/banks/accounts/query
Query bank accounts for the authenticated user
# Save bank accounts
Source: https://docs.tight.com/api-reference/bank-accounts/save-bank-accounts
https://dev.tight.com/v3/api-docs post /v6/banks/accounts
Save new (or update existing) bank accounts
# Delete bank reconciliation
Source: https://docs.tight.com/api-reference/bank-reconciliations/delete-bank-reconciliation
https://dev.tight.com/v3/api-docs delete /v6/banks/reconciliations/{id}
Delete a bank reconciliation for the given id
# Get bank reconciliation
Source: https://docs.tight.com/api-reference/bank-reconciliations/get-bank-reconciliation
https://dev.tight.com/v3/api-docs get /v6/banks/reconciliations/{id}
Get a bank reconciliation for the given id
# Query reconciliations
Source: https://docs.tight.com/api-reference/bank-reconciliations/query-reconciliations
https://dev.tight.com/v3/api-docs post /v6/banks/reconciliations/query
Query reconciliations for the authenticated user
# Save reconciliations
Source: https://docs.tight.com/api-reference/bank-reconciliations/save-reconciliations
https://dev.tight.com/v3/api-docs post /v6/banks/reconciliations
Save new (or update existing) reconciliations
# Delete bank statement
Source: https://docs.tight.com/api-reference/bank-statements/delete-bank-statement
https://dev.tight.com/v3/api-docs delete /v6/banks/statements/{id}
Delete a bank statement for the given id
# Get bank statement
Source: https://docs.tight.com/api-reference/bank-statements/get-bank-statement
https://dev.tight.com/v3/api-docs get /v6/banks/statements/{id}
Get a bank statement for the given id
# Query bank statements
Source: https://docs.tight.com/api-reference/bank-statements/query-bank-statements
https://dev.tight.com/v3/api-docs post /v6/banks/statements/query
Query bank statements for the authenticated user
# Save bank statements
Source: https://docs.tight.com/api-reference/bank-statements/save-bank-statements
https://dev.tight.com/v3/api-docs post /v6/banks/statements
Save new (or update existing) bank statements
# Delete bookkeeper
Source: https://docs.tight.com/api-reference/bookkeepers/delete-bookkeeper
https://dev.tight.com/v3/api-docs delete /v6/bookkeepers/{id}
Delete an bookkeeper for the given id
# Get bookkeeper
Source: https://docs.tight.com/api-reference/bookkeepers/get-bookkeeper
https://dev.tight.com/v3/api-docs get /v6/bookkeepers/{id}
Get an bookkeeper for the given id
# Invite bookkeeper
Source: https://docs.tight.com/api-reference/bookkeepers/invite-bookkeeper
https://dev.tight.com/v3/api-docs post /v6/bookkeepers/invite
Send an email invitation to an accountant for the authenticated user
# Query bookkeepers
Source: https://docs.tight.com/api-reference/bookkeepers/query-bookkeepers
https://dev.tight.com/v3/api-docs post /v6/bookkeepers/query
Query bookkeepers for the authenticated user
# Save bookkeepers
Source: https://docs.tight.com/api-reference/bookkeepers/save-bookkeepers
https://dev.tight.com/v3/api-docs post /v6/bookkeepers
Save new (or update existing) bookkeepers
# Get closing
Source: https://docs.tight.com/api-reference/closing/get-closing
https://dev.tight.com/v3/api-docs get /v6/closing
Get the authenticated user's closing configuration
# Save closing
Source: https://docs.tight.com/api-reference/closing/save-closing
https://dev.tight.com/v3/api-docs post /v6/closing
Save the authenticated user's closing configuration
# Create a company
Source: https://docs.tight.com/api-reference/company-management/create-a-company
https://dev.tight.com/v3/api-docs post /v6/company
Create a company in the Tight API
# Delete company
Source: https://docs.tight.com/api-reference/company-management/delete-company
https://dev.tight.com/v3/api-docs delete /v6/company/{id}
Delete a company for the given id
# Get a company
Source: https://docs.tight.com/api-reference/company-management/get-a-company
https://dev.tight.com/v3/api-docs get /v6/company/{id}
Get a company in the Tight API for the given id
# Query companies
Source: https://docs.tight.com/api-reference/company-management/query-companies
https://dev.tight.com/v3/api-docs post /v6/company/query
Query companies for the authenticated user
# Get conversation
Source: https://docs.tight.com/api-reference/conversations/get-conversation
https://dev.tight.com/v3/api-docs get /v6/conversations/{id}
Get a conversation for the given id
# Get conversation messages
Source: https://docs.tight.com/api-reference/conversations/get-conversation-messages
https://dev.tight.com/v3/api-docs get /v6/conversations/{id}/messages
Get messages for the given conversation
# Query conversations
Source: https://docs.tight.com/api-reference/conversations/query-conversations
https://dev.tight.com/v3/api-docs post /v6/conversations/query
Query conversations for the authenticated user
# Save conversations
Source: https://docs.tight.com/api-reference/conversations/save-conversations
https://dev.tight.com/v3/api-docs post /v6/conversations
Save a new (or update an existing) set of conversations
# Custom Data
Source: https://docs.tight.com/api-reference/custom-data
Augment Tight API entities with freeform custom data
## Get Started
All Tight API entities have a `customData` parameter. Use this parameter to attach freeform JSON data to Tight API entities.
Custom data can be used to add additional, structured information on an entity. For example, you can add an internal identifier to a Bank Transaction or specialized tax info on a user's General Ledger accounts:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/banks/transactions \
-H 'Authorization: Bearer ' \
-D '[{
"id": "btn_936723",
"customData": {
"internal_key": "some_internal_key",
"some_other_field": 23434
}
}]'
```
`customData` can support up to 50 fields and up to 2000 characters of freeform JSON data
Once added, this bank transaction's `customData` will be included anywhere else the transaction can be fetched from the Tight API. For example, the response to the following request includes the `customData` set on this bank transaction:
```bash theme={null}
curl -X GET 'https://sandbox.tight.com/v6/banks/transactions/btn_936723' \
-H 'Authorization: Bearer '
```
```json theme={null}
{
"result": "SUCCESS",
"data": {
"id": "btn_936723",
"type": "REVENUE",
"amount": 15399,
"customData": {
"internal_key": "some_internal_key",
"some_other_field": 23434
}
/* remainder of the properties on this bank transaction */
},
"error": []
}
```
The `customData` object now appears in the response, you can leverage this functionality to enhance integrations, reporting, or internal workflows.
## Update custom data
When you update an entity, `customData` is **merged per key** into the existing value, rather than replacing
it. Each top-level key in the request is handled on its own:
| Key in the request | Result |
| - | - |
| Omitted | The existing value for that key is kept |
| Present with a value | The value is set, replacing any existing value for that key |
| Present with `null` | The key is removed |
To clear all custom data on the entity, send `"customData": null`. Omitting `customData` from the request leaves
it unchanged.
The merge is one level deep. Arrays and nested objects are treated as a single value and are **replaced whole**,
never merged into.
You can't store a literal `null` as a value, because `null` means "delete this key". If you need to represent an
empty value, use a different sentinel, such as an empty string or `false`.
### Examples
Each example below starts from the existing `customData` shown under **Before**, then sends the `customData` shown
under **Request** in an update, such as this bank transaction update:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/banks/transactions \
-H 'Authorization: Bearer ' \
-D '[{
"id": "btn_936723",
"customData": { "some_other_field": 50000 }
}]'
```
```json Before theme={null}
{ "internal_key": "some_internal_key" }
```
```json Request theme={null}
{ "region": "northeast" }
```
```json After theme={null}
{ "internal_key": "some_internal_key", "region": "northeast" }
```
```json Before theme={null}
{ "internal_key": "some_internal_key", "some_other_field": 23434 }
```
```json Request theme={null}
{ "some_other_field": 50000 }
```
```json After theme={null}
{ "internal_key": "some_internal_key", "some_other_field": 50000 }
```
```json Before theme={null}
{ "internal_key": "some_internal_key", "some_other_field": 23434 }
```
```json Request theme={null}
{ "some_other_field": null }
```
```json After theme={null}
{ "internal_key": "some_internal_key" }
```
```json Before theme={null}
{ "internal_key": "some_internal_key", "prefs": { "email": true, "sms": false } }
```
```json Request theme={null}
{ "prefs": { "sms": true } }
```
```json After theme={null}
{ "internal_key": "some_internal_key", "prefs": { "sms": true } }
```
The whole `prefs` object is replaced, so `email` is dropped. To keep it, send the full object:
`{ "prefs": { "email": true, "sms": true } }`. Arrays behave the same way.
```json Before theme={null}
{ "internal_key": "some_internal_key", "some_other_field": 23434 }
```
```json Request theme={null}
null
```
Send `"customData": null` in the request body, rather than an object.
```json After theme={null}
null
```
## Filter on custom data
Coming soon
# Delete customer
Source: https://docs.tight.com/api-reference/customers/delete-customer
https://dev.tight.com/v3/api-docs delete /v6/customers/{id}
Delete a customer for the given id
# Get customer
Source: https://docs.tight.com/api-reference/customers/get-customer
https://dev.tight.com/v3/api-docs get /v6/customers/{id}
Get a customer for the given id
# Query customers
Source: https://docs.tight.com/api-reference/customers/query-customers
https://dev.tight.com/v3/api-docs post /v6/customers/query
Query customers for the authenticated user
# Save customers
Source: https://docs.tight.com/api-reference/customers/save-customers
https://dev.tight.com/v3/api-docs post /v6/customers
Save new (or update existing) customers
# Delete dimension value
Source: https://docs.tight.com/api-reference/dimensions/delete-dimension-value
https://dev.tight.com/v3/api-docs delete /v6/dimensions/values/{id}
Delete a dimension value. Cannot delete dimension values with children or associated bank transactions.
# Query dimension values
Source: https://docs.tight.com/api-reference/dimensions/query-dimension-values
https://dev.tight.com/v3/api-docs post /v6/dimensions/values/query
These contain the dimension values that your user tracks against. For example, if you defined a dimension of "Location", your user could define their dimension values as "NA Branch", "Asia Branch", "EU Branch".
# Save dimension values
Source: https://docs.tight.com/api-reference/dimensions/save-dimension-values
https://dev.tight.com/v3/api-docs post /v6/dimensions/values
Save a new (or update an existing) set of dimension values
# Delete employee
Source: https://docs.tight.com/api-reference/employee-management/delete-employee
https://dev.tight.com/v3/api-docs delete /v6/employees/{id}
Delete an employee for the given id
# Get employee
Source: https://docs.tight.com/api-reference/employee-management/get-employee
https://dev.tight.com/v3/api-docs get /v6/employees/{id}
Get an employee for the given id
# Query employees
Source: https://docs.tight.com/api-reference/employee-management/query-employees
https://dev.tight.com/v3/api-docs post /v6/employees/query
Query employees for the authenticated partner, optionally filtered to a single company
# Save employees
Source: https://docs.tight.com/api-reference/employee-management/save-employees
https://dev.tight.com/v3/api-docs post /v6/employees
Save new (or update existing) employees
# Errors
Source: https://docs.tight.com/api-reference/errors
Handle errors in the Tight API
## Overview
The Tight API employs conventional HTTP response codes to indicate the success or failure of an API request. See the table below for a summary of status codes the Tight API uses:
### HTTP Status Codes
| | | |
| - | - | - |
| 200 | OK | Everything worked as expected. |
| 207 | Multi-status | Partial success, some aspects of the request failed. |
| 400 | Bad Request | The request was unacceptable, often due to validation error. |
| 401 | Unauthorized | The `access_token` provided is invalid. |
| 403 | Forbidden | The `access_token` doesn't have permissions to perform the request. |
| 404 | Not Found | The requested resource doesn't exist. |
| 409 | Conflict | The request hit constraints due to concurrent requests. Please try again. |
| 429 | Too Many Requests | The rate limit was hit, see [Rate Limits](/api-reference/rate-limiting) for more details. |
| 500, 503, 504 | Server Errors | Something went wrong on Tight's end. (These are rare.) |
## Error Responses
In addition to the HTTP response codes, the Tight API has a unified `error` schema on all error responses.
The type of the error. Safe for programmatic use.
Available options: `UNKNOWN_ERROR`, `EXPIRED_TOKEN`, `INVALID_TOKEN`, `BAD_REQUEST`, `JSON_ERROR`, `DUPLICATE`, `REQUIRED`, `INVALID_VALUE`, `NOT_MODIFIABLE`, `INVALID_FORMAT`, `CONFLICT`
A human-readable message providing more details about the error.
If the error is parameter-specific, the parameter related to the error. This can be used to display a message near the correct form field.
## Validations
All operations in the Tight API include an array of `error` objects so that the API consumer receives all possible errors with a given request.
For example, if attempting to save a bank transaction without its amount and with an invalid bank account, the following error response would be returned:
```json theme={null}
{
"result": "FAILURE",
"data": null,
"error": [
{
"type": "REQUIRED",
"message": "Amount is required",
"param": "amount"
},
{
"type": "INVALID_VALUE",
"message": "The bank account provided is not valid",
"param": "bankAccountId"
}
]
}
```
The Tight API is designed to provide user-facing error messages and field-level validation out of the box. As an additional best practice, log and monitor errors for troubleshooting and analytics.
## Retrying and Escalating
For server errors (`500`, `503`, `504`), retry the request with exponential backoff. If errors persist, escalate to the Tight API team. For rate limiting errors (`429`), see the [Rate Limits documentation](/api-reference/rate-limiting) for guidance on handling retries and backoff.
# Query GL accounts
Source: https://docs.tight.com/api-reference/gl-accounts/query-gl-accounts
https://dev.tight.com/v3/api-docs post /v6/accounting/glAccounts/query
Query GL accounts for the authenticated user
# Delete reaction
Source: https://docs.tight.com/api-reference/messages/delete-reaction
https://dev.tight.com/v3/api-docs delete /v6/messages/{id}/reactions/{emojiCode}
Delete a reaction from the given message
# Get message
Source: https://docs.tight.com/api-reference/messages/get-message
https://dev.tight.com/v3/api-docs get /v6/messages/{id}
Get message for the given id
# Save messages
Source: https://docs.tight.com/api-reference/messages/save-messages
https://dev.tight.com/v3/api-docs post /v6/messages
Save a new set of messages
# Save reaction
Source: https://docs.tight.com/api-reference/messages/save-reaction
https://dev.tight.com/v3/api-docs post /v6/messages/{id}/reactions/{emojiCode}
Save a new reaction to the given message.
# Introspect Access Token
Source: https://docs.tight.com/api-reference/oauth/introspect
openapi-oauth.yaml POST /v6/auth/introspect
Inspect an access token to verify its validity and retrieve its metadata
# Revoke Access Token
Source: https://docs.tight.com/api-reference/oauth/revoke
openapi-oauth.yaml POST /v6/auth/revoke
Revoke an access token or refresh token, rendering it immediately invalid
# Request Access Token
Source: https://docs.tight.com/api-reference/oauth/token
openapi-oauth.yaml POST /v6/auth/token
Exchange client credentials for a bearer access token
# Pagination
Source: https://docs.tight.com/api-reference/pagination
Page efficiently through Tight API resources
## Get Started
All top-level Tight API resources support pulling data in bulk by utilizing cursor-based pagination.
To get started, simply specify the `limit`, which is the number of items to return on that page:
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/banks/transactions/query \
-H 'Authorization: Bearer ' \
-D '{
"limit": 100
}'
```
The response will contain an array of items up to your specified `limit` in `data` and a `cursor` object:
```json theme={null}
{
"result": "SUCCESS",
"data": [/* list of bank transactions */],
"error": [],
"cursor": {
"after": "eyJBRlRFUiI6ImJ0bl8xNjkifQ==",
"before": "eyJCRUZPUkUiOiJidG5fMTg2MTAifQ=="
}
}
```
## Paginate Forward or Backward
Use the `cursor.after` value to fetch the next page, or `cursor.before` to fetch the previous page. Include the appropriate cursor value in your next request.
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/banks/transactions/query \
-H 'Authorization: Bearer ' \
-D '{
"limit": 100,
"cursor": "eyJCRUZPUkUiOiJidG5fMTg2MTAifQ=="
}'
```
If the response contains `cursor.after: null`, you have reached the last page. If `cursor.before: null`, you are on the first page.
## Sort and Jump to a Specific Page
To sort results, add a `sorts` parameter. To jump to a specific spot, use the `start` property within `sorts`.
```bash theme={null}
curl -X POST https://sandbox.tight.com/v6/banks/transactions/query \
-H 'Authorization: Bearer ' \
-D '{
"limit": 100,
"sort": [{
"orderBy": "description",
"direction": "ASC",
"start": "B"
}],
}'
```
Cursor-based pagination is ideal for building user experiences where users can page forward, page backward, sort, and jump to specific pages from any page.
# Rate Limits
Source: https://docs.tight.com/api-reference/rate-limiting
Learn about API rate limits and how to work with them
## Overview
The Tight API uses a number of safeguards against bursts of incoming traffic to help maximize its stability. If you send many requests in quick succession, you might see error responses with status code `429`.
If you consistently exceed rate limits, your access may be temporarily blocked or degraded. Always monitor your usage and handle rate limiting gracefully to avoid service interruptions.
The limit is **1000 requests over a five minute window**, scoped to a Tight API `access_token`.
## Handling limits gracefully
A basic technique for integrations to gracefully handle limiting is to watch for `429` status codes and build in a retry mechanism. The retry mechanism should follow an exponential backoff schedule to reduce request volume when necessary.
Here is an example of exponential backoff in JavaScript:
```javascript theme={null}
async function fetchWithBackoff(url, options, maxRetries = 5) {
let retries = 0;
let delay = 1000; // Start with 1 second
while (retries < maxRetries) {
const response = await fetch(url, options);
if (response.status !== 429) {
return response;
}
await new Promise(res => setTimeout(res, delay));
delay *= 2; // Exponential backoff
retries++;
}
throw new Error('Max retries exceeded due to rate limiting.');
}
```
If your integration automatically retries with exponential backoff after receiving a 429, you are handling rate limits gracefully.
* Monitor the rate limit headers to proactively adjust your request volume.
* Log all 429 responses for later analysis and troubleshooting.
* Design your integration to queue or batch requests when possible to avoid bursts.
# Delete summary
Source: https://docs.tight.com/api-reference/summaries/delete-summary
https://dev.tight.com/v3/api-docs delete /v6/summaries/{id}
Delete a summary for the given id
# Get summary
Source: https://docs.tight.com/api-reference/summaries/get-summary
https://dev.tight.com/v3/api-docs get /v6/summaries/{id}
Get a summary for the given id
# Query summaries
Source: https://docs.tight.com/api-reference/summaries/query-summaries
https://dev.tight.com/v3/api-docs post /v6/summaries/query
Query summaries for the authenticated user
# Save summaries
Source: https://docs.tight.com/api-reference/summaries/save-summaries
https://dev.tight.com/v3/api-docs post /v6/summaries
Save new (or update existing) summaries
# Delete task
Source: https://docs.tight.com/api-reference/tasks/delete-task
https://dev.tight.com/v3/api-docs delete /v6/tasks/{id}
Delete (dismiss) a task for the given id. Only dismissable tasks can be deleted.
# Get task
Source: https://docs.tight.com/api-reference/tasks/get-task
https://dev.tight.com/v3/api-docs get /v6/tasks/{id}
Get a task for the given id
# Query tasks
Source: https://docs.tight.com/api-reference/tasks/query-tasks
https://dev.tight.com/v3/api-docs post /v6/tasks/query
Query tasks for the authenticated user with pagination and filtering support
# Webhooks
Source: https://docs.tight.com/api-reference/webhooks
Subscribe to and handle webhooks from the Tight API
## Get Started
The Tight API uses webhooks to communicate changes to entities and for notable lifecycle events, e.g. an invoice being
paid. To get started, simply reach out to your Tight API contact and provide the following info:
1. Your Tight API `client_id`
2. Webhook URL(s) for the Sandbox environment
3. Webhook URL(s) for the Production environment
Tight sends webhooks from the following IP addresses:
* 3.221.92.254
* 34.200.77.221
## Entity update webhooks
Any time an entity is updated in the Tight API, whether by a user or a third-party integration, the Tight API sends an
`ENTITY_UPDATE` webhook to communicate that change. These webhooks contain a JSON body with the full detail of the
entity that was updated:
```json theme={null}
{
"editor": {
"userId": "fake_userId"
},
"company": {
"id": "co_1234",
"apiCompanyId": "id_1234"
},
"type": "ENTITY_UPDATE",
"url": "/v6/banks/transactions/btn_936723",
"data": {
"id:": "btn_936723",
"type": "REVENUE",
"amount": 15399
/* remainder of the bank transaction's properties */
}
}
```
The entity in the `data` field is at least as up-to-date as the event that triggered the webhook. To get the latest
version of the entity at any time, use the `url` field.
## Lifecycle webhooks
The Tight API's `LIFECYCLE` webhooks provide real-time lifecycle event data, useful for performing analytics, notifying
users of pertinent events, and ultimately optimizing activation & retention. The webhooks contain a JSON body with data
relevant to the event:
```json theme={null}
{
"editor": {
"userId": "fake_userId"
},
"company": {
"id": "co_1234"
},
"type": "LIFECYCLE",
"event": "bankAccountCreated",
"datetime": "2025-04-01T11:31:04.1Z",
"eventData": {
"entityId": "fake_id",
"apiName": "PLAID",
"type": "DEPOSITORY"
}
}
```
Refer to the [Lifecycle Event Dictionary](/guides/business-owners/lifecycle-event-dictionary) for the full list of lifecycle events.
Lifecycle Events can be used in varying ways depending on your
product's use case. For example, if your product manages corporate/employee spend, it may benefit your user experience
to make the `transactionCreated` event trigger a push notification prompting the user to add a receipt image. The
`eventData` included with the `transactionCreated` event contains the information necessary to route the user to the
exact transaction that requires a receipt.
## Webhook verification
Tight signs every webhook, so that you have the option to verify the webhooks you receive. This helps you protect
against a bad actor flooding your server with fake webhooks.
**Verifying Webhooks**
Tight follows the [JSON Web Token (JWT) standard](https://jwt.io/introduction) and includes its JWTs in the
`Tight-Verification` HTTP header of the webhook.
To verify a Tight JWT, follow these steps:
Extract the `Tight-Verification` HTTP header from the Tight webhook
Select [a JWT library](https://jwt.io/libraries) of your choice
Pass in HMAC-SHA256 as the signing algorithm to your selected JWT library and then use the library to verify the value of the `Tight-Verification` header against your `webhook_secret`
```javascript theme={null}
import 'dotenv/config';
import express from "express";
import { jwtVerify } from "jose";
const app = express();
// Your webhook_secret
const webhook_secret = process.env.SECRET;
app.post("/webhook", express.raw({type: "application/json"}), async (req, res) => {
const jwt = req.get('Tight-Verification');
let payload;
try {
// Verify the JWT using the HMAC-SHA256 signing algorithm
const jwtVerifyResult = await jwtVerify(jwt, webhook_secret, {algorithms: ["HS256"]});
payload = jwtVerifyResult.payload;
} catch (err) {
return res.status(400).send(`JWT failed to verify: ${err.message}`);
}
});
```
If your library does not automatically decode the JWT, Base64Url decode the JWT payload and deserialize it into a JSON object.
Ensure that the webhook is not expired. Verify that the difference between the `iat` field of the payload and the current `NumericDate` timestamp is within your tolerance. Tight recommends a default tolerance of 5 minutes.
```javascript theme={null}
app.post("/webhook", express.raw({type: "application/json"}), async (req, res) => {
// Validate the iat, i.e. make sure the webhook has not expired
// Tight recommends a default tolerance of five minutes
const TIME_TOLERANCE = (60 * 5);
let timestamp = payload.iat;
const now = Math.floor(Date.now() / 1000);
if (now - timestamp >= TIME_TOLERANCE) {
return res.status(400).send("Webhook expired")
}
});
```
Ensure that the webhook was not modified by anyone other than Tight. Verify that the `request_body_sha256` field of the payload is equal to the SHA-256 hash of the webhook's request body.
```javascript theme={null}
import { timingSafeEqual } from "node:crypto";
const { subtle } = globalThis.crypto;
app.post("/webhook", express.raw({type: "application/json"}), async (req, res) => {
// Validate the webhook body hash
const enc = new TextEncoder();
const bodyDigest = await subtle.digest("SHA-256", req.body);
const webhookHash = enc.encode(btoa(String.fromCharCode(...new Uint8Array(bodyDigest))));
const claimHash = enc.encode(payload.request_body_sha256 as string);
if (!timingSafeEqual(webhookHash, claimHash)) {
return res.status(400).send("Webhook payload modified")
}
// Verification succeeded
// You can process the webhook here or call the next handler in your request-response cycle
res.send("Webhook verification succeeded");
});
```
If all verification steps succeed, you can be confident the webhook came from Tight and is safe to process.
# Complete Business Owner UX
Source: https://docs.tight.com/embeddable-ui/app/business-owners
The entire business owner experience, with a near-zero implementation time
If you're interested in launching embedded accounting in 24 hours with zero developer effort, please see [Tight Ready-to-Launch Accounting](/guides/launch-paths/ready-to-launch).
`` is an all-in-one component that delivers the complete Tight embedded experience: every page, with built-in navigation.
Use it when you want the full experience as a drop-in solution.
Looking to embed individual pages instead? See [Embedding](/embeddable-ui/react/patterns/embedding).
## Installation
`TightApp` ships in Tight's React Component Library:
```bash npm theme={null}
npm install @tight-embedded/react@latest
```
```bash pnpm theme={null}
pnpm add @tight-embedded/react@latest
```
## Usage
Unlike individual page components, `TightApp` does not require the `` provider. Pass your `accessToken` and target `environment` directly:
```TSX AccountingApp.tsx theme={null}
import { TightApp } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function AccountingApp({ accessToken }) {
return (
)
}
```
You can obtain an applicable `accessToken` via the Tight [Authentication Endpoint](/api-reference/authentication).
The ESLint rule `no-unresolved` might warn that `@tight-embedded/react/index.css` does not exist.
Disable the lint rule on the import line, or import from `@tight-embedded/react/dist/index.css` directly. Please note that the
direct path might change in future versions.
## Props
Bearer token used to authenticate API requests. Get one from the Tight [Authentication Endpoint](/api-reference/authentication).
Selects the Tight API environment. Use `"SANDBOX"` for development and testing.
The page that opens on initial render. Defaults to the Financial Overview. An object that contains the `page` field.
Available options: `FinancialOverview`, `TransactionsDashboard`, `BanksAndIntegrations`, `ExpenseDashboard`, `IncomeDashboard`, `ReportDashboard`, `GeneralLedger`, `ChartOfAccounts`
## Set the initial page
By default, `TightApp` opens on the Financial Overview. Use `initialNav` to open a different page on first render:
```TSX AccountingApp.tsx theme={null}
import { TightApp } from "@tight-embedded/react";
import "@tight-embedded/react/index.css";
function AccountingApp({ accessToken }) {
return (
)
}
```
# QuickBooks Online Import
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/imports/quickbooks-online-import
Import accounting data from QuickBooks Online
## Overview
While [independent research shows that 62% of small businesses don't use any accounting software yet](https://www.tight.com/embedded-accounting-smb-vertical-software-report), leaving a major greenfield opportunity for your platform, Tight's customer-partners have also migrated thousands of businesses off of QuickBooks Online using Tight's QBO Import functionality.
The QBO Import functionality allows you to transfer a business’s QBO data into your embedded accounting platform, preserving the business’s historical financial information.
## Embedding the QuickBooks Online Import
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the QuickBooks Online Import:
```javascript theme={null}
Tight.render(containerId, "ImportQBO");
```
# Wave Import
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/imports/wave-import
Import accounting data from Wave
## Overview
While [independent research shows that 62% of small businesses don't use any accounting software yet](https://www.tight.com/embedded-accounting-smb-vertical-software-report), leaving a major greenfield opportunity for your platform, Tight's customer-partners have also migrated hundreds of businesses off of Wave using Tight's Wave Import functionality.
The Wave Import functionality allows you to transfer a business’s Wave data into your embedded accounting platform, preserving the business’s historical financial information.
## Embedding the Wave Import
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Wave Import:
```javascript theme={null}
Tight.render(containerId, "ImportWave");
```
# Xero Import
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/imports/xero-import
Import accounting data from Xero
## Overview
While [independent research shows that 62% of small businesses don't use any accounting software yet](https://www.tight.com/embedded-accounting-smb-vertical-software-report), leaving a major greenfield opportunity for your platform, Tight's customer-partners have also migrated thousands of businesses off of Xero using Tight's Xero Import functionality.
The Xero Import functionality allows you to transfer a business’s Xero data into your embedded accounting platform, preserving the business’s historical financial information.
## Embedding the Xero Import
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Xero Import:
```javascript theme={null}
Tight.render(containerId, "ImportXero");
```
# Income Tax Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/income-tax-dashboard
Manage and track the business owner's income tax obligations
## Overview
The Income Tax Dashboard is all you need to provide full income tax functionality to the owner of a pass-through entity.
Utilizing the Tight Income Tax API, which has been proven and reached maturity via very rigorous maintenance/update
processes in place since the 2017 tax year, as well as painstaking quality assurance processes with a 1% threshold
between 3 different sources.
The Tight Tax Calculations API currently supports the United States (50 states + DC) and Canada (all provinces,
including GST/HST/PST/QST), but is architected for rapid expansion into other countries as needed.
The Income Tax Dashboard provides a full user experience, allowing your users to:
* Set up their tax profile
* View quarterly income tax estimates
* Generate Form 1040 Schedule C, Form 1065, Form 1120-S, Form 1120, and T2125 tax reports
* Download a full Tax Details report for hand-off to a tax preparer
* Transfer data into a white-labeled DIY tax filing platform, including April and Column Tax
## Embedding the Income Tax Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions
on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Income Tax Dashboard:
```javascript theme={null}
Tight.render(containerId, "IncomeTaxDashboard");
```
# Invoice Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/invoicing/invoice-dashboard
The fully-featured experience for viewing and managing invoices (A/R)
## Overview
The Invoice Dashboard is all you need to provide full invoicing to your users, with a full user experience allowing your users to:
* Create invoices with auto-complete line items, including:
* Reimbursement for expenses (including mark-ups)
* Ability to bill for time tracked
* Manual line item creation
* Sales tax line items
* Invoice template customization to match your user's business's branding, including:
* Custom logo upload
* Custom brand colors using color wheel or hex code
* Ability to set business address and sender
* See status of invoices, including when the customer last viewed the invoice
* Generate Aged AR reporting
## Embedding the Invoice Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Invoice Dashboard:
```javascript theme={null}
Tight.render(containerId, "InvoiceDashboard");
```
# Mileage Dashboard
Source: https://docs.tight.com/embeddable-ui/plain-js/pages/mileage-dashboard
Track and manage business mileage for tax deductions
## Overview
The Mileage Dashboard is all you need to provide full mileage tracking to your users, with a full user experience allowing your users to:
* Add drives, with auto-complete start and end addresses, route calculation/visualization, and reverse geocoding
* View drives/routes/addresses
* Classify drive purpose (business vs. personal)
* Define favorite locations
* Assign drives to dimensions
## Embedding the Mileage Dashboard
To initialize the Tight Embedded experience using plain Javascript in your project, follow the instructions on [Embedding Tight's white-labeled UI](/embeddable-ui/plain-js/patterns/embedding).
Below is an example JS embedding of the Mileage Dashboard:
```javascript theme={null}
Tight.render(containerId, "MileageDashboard");
```
# Amazon S3
Source: https://docs.tight.com/integrations/analytics/amazon-s3
Push accounting and analytics data directly to your Amazon S3 buckets
## Overview
Tight integrates directly with Amazon S3 to periodically upload raw accounting data to your own S3 buckets. By pushing data into your S3 infrastructure, Tight eliminates the need for your data team to build direct connections to the Tight API, allowing your team to work in the data stack they're already using.
Data is exported in [Parquet file](https://parquet.apache.org/) format on daily, weekly, or monthly intervals, including bank linkage data, invoices, lifecycle events, and transactions. Learn more about available data types and use cases in the [Data Lakes guide](/guides/business-owners/data-lakes).
## Create an Amazon S3 Bucket
If you haven't done so already, create an [AWS account](https://aws.amazon.com/) and [set up an S3 bucket](https://docs.aws.amazon.com/AmazonS3/latest/userguide/create-bucket-overview.html) where Tight will upload your data. You can name this bucket anything you'd like; "tight-api-data" is used for the examples shown below.
Make note of the AWS Region that you selected, as you'll need to share this with Tight.
## Configure IAM Policy for Programmatic Access
Next, [create an IAM policy](https://aws.amazon.com/blogs/security/writing-iam-policies-how-to-grant-access-to-an-amazon-s3-bucket/) to grant programmatic access to your S3 bucket.
In the AWS IAM Console, navigate to Policies and click "Create policy". Select the JSON option and paste the following policy:
```json theme={null}
{
"Version": "2012-10-17",
"Statement": [
{
"Effect": "Allow",
"Action": [
"s3:ListBucket"
],
"Resource": [
"arn:aws:s3:::tight-api-data"
]
},
{
"Effect": "Allow",
"Action": [
"s3:PutObject",
"s3:GetObject",
"s3:DeleteObject"
],
"Resource": [
"arn:aws:s3:::tight-api-data/*"
]
}
]
}
```
Replace `tight-api-data` with your actual bucket name in both Resource ARNs.
Click "Next: Tags" (or "Next: Review" depending on your AWS console version):
On the review step, provide a descriptive name like "tight-api-data-access" and click "Create policy":
## Create IAM User
[Create an IAM user](https://docs.aws.amazon.com/IAM/latest/UserGuide/id_users_create.html#id_users_create_console) that will be used by Tight to access your S3 bucket.
In the AWS IAM Console, navigate to Users and click "Add user". Provide a descriptive username like "tight-api-data-user":
On the permissions step, select "Attach existing policies directly" and search for the policy you created (e.g., "tight-api-data-access"):
Click through the remaining steps:
On the final review, click "Create user":
After the user is created, you'll see the option to "Download .csv" containing the access credentials. Download this file securely:
For enhanced security, create a dedicated IAM user specifically for Tight with permissions limited only to the target S3 bucket.
## Securely Share Access with Tight
Contact Tight directly at [api@tight.com](mailto:api@tight.com) for instructions on how to securely share:
* The IAM credentials CSV file you downloaded
* Your S3 bucket name
* The AWS region where your bucket is located
Once configured, Tight will automatically begin uploading data files to your S3 bucket based on your preferred schedule (daily, weekly, or monthly). Files are organized in a consistent directory structure within your bucket, making it easy to integrate with your existing data pipelines and analytics tools.
# Google Cloud Storage
Source: https://docs.tight.com/integrations/analytics/google-cloud-storage
Push accounting data directly to your Google Cloud Storage buckets
## Overview
Tight integrates directly with Google Cloud Storage to periodically upload raw accounting data to your own GCS buckets. By pushing data into your GCS infrastructure, Tight eliminates the need for your data team to build direct connections to the Tight API, allowing your team to work in the data stack they're already using.
Data is exported in [Parquet file](https://parquet.apache.org/) format on daily, weekly, or monthly intervals, including bank linkage data, invoices, lifecycle events, and transactions. Learn more about available data types and use cases in the [Data Lakes guide](/guides/business-owners/data-lakes).
## Create a Service Account
First, [create a service account](https://cloud.google.com/docs/authentication/production#create_service_account) to grant programmatic access to the Google Cloud Storage bucket.
In the Google Cloud Console, navigate to IAM & Admin → Service Accounts and click "Create Service Account". Provide a descriptive name like "tight-api-data-access" and description:
After entering the service account details, click "Copy to clipboard" below the email address that was created. Save this email address for later steps. Then click "CREATE AND CONTINUE" followed by "DONE".
Keep the service account email address handy - you'll need it in later steps to grant bucket permissions.
## Create a Google Cloud Storage Bucket
Next, [create a Google Cloud Storage bucket](https://cloud.google.com/storage/docs/creating-buckets#create_a_new_bucket) where Tight will store your data. We recommend naming this bucket "tight-api-data":
For "Choose where to store your data" and "Choose a default storage class for your data", you can use the default values.
For "Choose how to control access to objects", select "Enforce public access prevention on this bucket" and "Access Control: Fine-grained":
For "Choose how to protect object data", select "None" unless your compliance requirements dictate otherwise. Be aware that data protection options will increase your storage costs.
Click "CREATE" to finish creating the bucket.
## Grant Service Account Access to Bucket
Once the bucket is created, you'll be taken to the Bucket Details screen. Click on the "PERMISSIONS" tab and then click "ADD":
In the "New Principals" field, paste the service account email address you copied earlier, and set the role to "Storage Object Admin":
Click "SAVE" to grant the service account access to your bucket.
## Create Service Account HMAC Key
Next, [create a service account HMAC key](https://cloud.google.com/storage/docs/authentication/managing-hmackeys#create) for authentication.
From the Cloud Storage screen, click on "Settings", then select the ["Interoperability" tab](https://console.cloud.google.com/storage/settings;tab=interoperability):
Click "CREATE A KEY FOR A SERVICE ACCOUNT", paste the service account email address, and select the row for that account:
Click "CREATE KEY" to generate the HMAC key. You'll see a screen displaying both the Access Key and Secret. Copy both values and save them securely:
Store the Access Key and Secret securely - you won't be able to view the Secret again after this screen.
## Securely Share Access with Tight
Contact Tight directly at [api@tight.com](mailto:api@tight.com) for instructions on how to securely share:
* Your GCS bucket name
* The HMAC Access Key
* The HMAC Secret
Once configured, Tight will automatically begin uploading data files to your GCS bucket based on your preferred schedule (daily, weekly, or monthly). Files are organized in a consistent directory structure within your bucket, making it easy to integrate with your existing data pipelines and analytics tools.
# Mixpanel
Source: https://docs.tight.com/integrations/analytics/mixpanel
Analyze analytics data from Tight directly in Mixpanel
## Overview
Tight integrates directly with Mixpanel so that [actions that your users take inside Tight's embeddable user interface](/guides/business-owners/lifecycle-event-dictionary)
(or via your home-built interface on top of the Tight API) will be tracked
using [Mixpanel events](https://developer.mixpanel.com/reference/track-event). This allows you to leverage your existing
Mixpanel implementation for product analytics or add a new Mixpanel integration so that you can iterate your product
more successfully.
## Create a Mixpanel Project
If you haven't done so already, you should create a [Mixpanel account](https://mixpanel.com/register/).
## Securely sharing your Mixpanel Project Token
Once your project is created, navigate to Project Settings from your Mixpanel project dashboard. From there, copy the
Project Token and use the [Configure Mixpanel API](/api-reference/integrations/configure-mixpanel) to securely share
your Project Token.
## Identify users (optional)
If you are identifying your user with Mixpanel using something different than the `userId` that you use
to [create companies in the Tight API](/api-reference/company-management/create-a-company), then you will need
to [provide the identifier used in Mixpanel for that user](/api-reference/integration-management/link-mixpanel).
# Snowflake
Source: https://docs.tight.com/integrations/analytics/snowflake
Push accounting data directly to your Snowflake data warehouse
## Overview
Tight integrates directly with Snowflake to periodically upload raw accounting data to your own Snowflake data warehouse. By pushing data into your Snowflake infrastructure, Tight eliminates the need for your data team to build direct connections to the Tight API, allowing your team to work in the data stack they're already using.
Data is exported in [Parquet file](https://parquet.apache.org/) format on daily, weekly, or monthly intervals, including bank linkage data, invoices, lifecycle events, and transactions. Learn more about available data types and use cases in the [Data Lakes guide](/guides/business-owners/data-lakes).
## Create a Snowflake Managed Stage
If you haven't done so already, create a [Snowflake account](https://www.snowflake.com/) and [create a Snowflake Managed Stage](https://docs.snowflake.com/en/developer-guide/snowflake-cli/stages/manage-stages) where Tight will upload your data. You can name this stage anything you'd like; "TIGHT\_DATALAKE\_UPLOADS" is used for the examples shown below.
Make note of the database name and stage name, as you'll need to share these with Tight.
## Create Key Pair Authentication Keys
Next, [generate key pair authentication keys](https://docs.snowflake.com/en/user-guide/key-pair-auth) for secure authentication to your Snowflake account.
From the command prompt, execute the following commands:
```bash theme={null}
openssl genrsa 2048 | openssl pkcs8 -topk8 -inform PEM -out rsa_key.p8 -nocrypt
```
```bash theme={null}
openssl rsa -in rsa_key.p8 -pubout -out rsa_key.pub
```
Save both `rsa_key.p8` and `rsa_key.pub` files securely for use in later steps.
Store the private key (`rsa_key.p8`) securely. You'll need to share this with Tight to enable data uploads.
## Create an Upload Role
Create a dedicated role for Tight to use when uploading data to your Snowflake warehouse. For example, name it `TIGHT_UPLOADER_ROLE`:
## Grant Role Permissions
Grant the necessary permissions to the `TIGHT_UPLOADER_ROLE`:
**Grant USAGE to Database:**
**Grant USAGE to the PUBLIC Schema:**
**Grant READ/WRITE to the Stage:**
Grant read and write permissions to the stage you created (e.g., `TIGHT_DATALAKE_UPLOADS`):
## Create a Service User
Create a service user using Snowflake SQL. Service users with RSA authentication cannot be created through the Snowflake UI, so you'll need to execute SQL commands.
Using the public key from `rsa_key.pub` that you generated earlier, execute the following SQL statement:
```sql theme={null}
CREATE OR REPLACE USER TIGHT_UPLOADER_USER
TYPE = SERVICE
RSA_PUBLIC_KEY = '-----BEGIN PUBLIC KEY-----
MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEA0chQEeQSKX3I+Y5VD3M+
kyPEbFDTgmEqxgerz3hIihUGV+iWWoHdeUYFCORfK1p/Sa3e3u79h1+hI4e9lsWU
8xLUCUlcfImbu7EbZ5oNYlhRi5nFhkqN4YlylbUghlsmJv7GK4L68i9M/WUoG9RR
yvHghltIMpwbQfRZ4wYG5Dc2sl7ZbCe8qn7VGrSzWWcex3WK9K8kbBJkK86H8X7u
L1QgY+a//s32HuBmbfV8+x4kC3oSrFhPDFJX5kJI33UPqRNyuhSZOuJMMNhXX8bh
PAKY4ExZVotEKX+p8hZ0La5N7TT+Ma08Zp9WR5YGuG2XPK+9dE2Yg9Luauc+R4hj
wwIDAQAB
-----END PUBLIC KEY-----'
DEFAULT_ROLE = 'TIGHT_UPLOADER_ROLE'
DEFAULT_WAREHOUSE = 'COMPUTE_WH'
COMMENT = 'Tight service account for uploading to stage';
```
Replace the example RSA public key with your actual public key.
Replace the example RSA public key with the contents of your `rsa_key.pub` file, including the BEGIN and END markers.
## Grant Role to Service User
Grant the `TIGHT_UPLOADER_ROLE` to your `TIGHT_UPLOADER_USER`:
## Securely Share Access with Tight
Contact Tight directly at [api@tight.com](mailto:api@tight.com) for instructions on how to securely share:
* Snowflake account identifier (e.g., GSX\*\*\*-\*\*\*\*)
* Database name
* Schema name (typically PUBLIC)
* Stage name (e.g., TIGHT\_DATALAKE\_UPLOADS)
* Service user name (e.g., TIGHT\_UPLOADER\_USER)
* RSA private key file (`rsa_key.p8`)
Once configured, Tight will automatically begin uploading data files to your Snowflake stage based on your preferred schedule (daily, weekly, or monthly). Files are organized in a consistent directory structure within your stage, making it easy to integrate with your existing data pipelines and analytics tools.
# Finicity
Source: https://docs.tight.com/integrations/banking/finicity
Sync transaction data directly from Finicity
## Overview
Through Tight's Finicity integration, your users' transactions are pushed into Tight immediately after Finicity has
cleansed them. 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.
## Push transactions into the Tight API
Once you have received your cleansed transactions from Finicity, you
can forward the transaction data directly to [Tight's Finicity Transactions API](/api-reference/integration-management/finicity-transactions).
# MX
Source: https://docs.tight.com/integrations/banking/mx
Sync transaction data directly from MX
## Overview
Through Tight's MX integration, your users' transactions are pushed into Tight immediately after MX has
cleansed them. 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.
## Push transactions into the Tight API
Once you have received your cleansed transactions from MX, you
can forward the transaction data directly to [Tight's MX Transactions API](/api-reference/integration-management/mx-transactions).
# Plaid
Source: https://docs.tight.com/integrations/banking/plaid
Enable your users to sync and manage their bank connections
## Overview
Instead of having to build your own architecture to manage Plaid linkage and transactions, you can leverage Tight's
proven architecture to communicate directly with Plaid on your behalf. Once configured, Tight's Plaid integration
provides:
* A seamless UX for your users to connect and manage their bank connections
* Intuitive UX to walk your users through fixing connection issues on their own
* Webhook handling to process newly available transactions in real-time
* Automatic transaction categorization, with full double-entry accounting
## Create a Plaid Team
If you haven't done so already, Tight can introduce you to Plaid to get your team registered quickly. Once you have
access to the Plaid Dashboard, be sure to
enable [Account Select](https://plaid.com/docs/link/customization/#account-select) so that your users can select which
bank accounts to link to their accounting platform.
## Securely sharing your Plaid keys
In your Plaid Dashboard, to view your API keys, click on Team Settings -> Keys. Use
the [Configure Plaid API](/api-reference/integrations/configure-plaid) to securely share your keys.
Once complete, the Tight Embedded UI will automatically allow your users to link their bank accounts and start syncing
bank transactions.
## Connect your user's Plaid accounts
There are three primary ways to connect your users' Plaid accounts to their company in Tight:
1. Embedding Tight's [Financial Overview](/embeddable-ui/react/financial-overview), which includes all onboarding tasks, including Plaid linkage
2. Embed Tight's [Banks & Integrations](/embeddable-ui/react/banks-and-integrations) page, which includes Plaid linkage as well as any other native integrations you choose to enable
3. Or, if you already handle Plaid linkage in your UX, you can [programmatically link the user's Plaid accounts](/api-reference/integration-management/link-plaid)
## Go Live in Production
Before allowing users to link accounts in production:
1. [Request Production access](https://dashboard.plaid.com/overview/production), then complete your
[application profile](https://dashboard.plaid.com/settings/company/app-branding),
[company profile](https://dashboard.plaid.com/settings/company/profile), and
[security questionnaire](https://dashboard.plaid.com/settings/company/compliance?tab=dataSecurity). Some financial
institutions require this information for OAuth connections. See Plaid's
[Launch in Production checklist](https://plaid.com/docs/launch-checklist/) for the complete set of launch
recommendations.
2. Open the [Data Transparency Link Customization](https://dashboard.plaid.com/link/data-transparency-v5). For each
Link customization your app uses, select one to three use case descriptions that accurately explain how your app
uses financial data, then publish the changes. For example, apps that use Tight for bookkeeping and tax features
can select **Do business accounting and tax preparation**.
If Data Transparency Messaging is enabled but a Link customization has no published use case, Plaid rejects
production Link requests with the `INVALID_LINK_CUSTOMIZATION` error.
### Get access to bank statements \[Optional]
Before enabling [Plaid Statements](https://plaid.com/docs/statements/) in production, submit a
[Plaid support ticket](https://dashboard.plaid.com/support/new) and explicitly request direct access for Chase. Wait
for Plaid to confirm access before enabling Statements for your production users.
# Unit
Source: https://docs.tight.com/integrations/banking/unit
Sync your users' banking data to their accounting platform in real time
## Overview
[Tight partners with Unit](https://www.unit.co/docs/guides/partnerships/tight/) to automatically sync your users'
banking data directly into their books.
## Securely sharing your Unit partner token
Email your contact at Unit to request that they
grant [Partner Token](https://guides.unit.co/partnerships/partner-tokens/#overview) access to Tight. Unit will then
securely give Tight partner token access to your Unit bank accounts for the `accounts` and `transactions` scopes.
## Unit webhooks (real-time updates)
By subscribing the Tight API to receive webhooks on your Unit dashboard, Tight will be able to pull in updates to your
users' transactions in real-time.
To do so, in your Unit Dashboard, click on Developer -> Webhooks.
Next, click on "Create", which will open up the "Create new webhook" form. Fill in the fields as shown in the screenshot
below:
Use
the [Configure Unit API](/api-reference/integrations/configure-unit) to securely share your keys.
## Connect your user's Unit customer
To associate a Unit customer with your user's company in Tight, simply hit
the [Link Unit API](/api-reference/integration-management/link-unit)
# Fundbox
Source: https://docs.tight.com/integrations/capital/fundbox
Offer capital at opportune moments, backed by real-time accounting data
This page is under construction. Please check back later for more content.
# Parafin
Source: https://docs.tight.com/integrations/capital/parafin
Offer capital at opportune moments, backed by real-time accounting data
This page is under construction. Please check back later for more content.
# Pipe
Source: https://docs.tight.com/integrations/capital/pipe
Offer capital at opportune moments, backed by real-time accounting data
This page is under construction. Please check back later for more content.
# Stripe Capital
Source: https://docs.tight.com/integrations/capital/stripe-capital
Offer capital at opportune moments, backed by real-time accounting data
This page is under construction. Please check back later for more content.
# Rutter
Source: https://docs.tight.com/integrations/commerce/rutter
Automate the reconciliation between commerce platform payouts and their itemized transactions with Tight via Rutter's unified API
## Overview
Instead of building separate integrations with dozens of commerce platforms in-house, Tight communicates with multiple
commerce platforms through [Rutter](https://www.rutter.com/), a unified commerce API. Rutter connects to platforms like
Shopify, Amazon, WooCommerce, BigCommerce, and many others, enabling you to provide your customers with seamless
commerce integrations while getting automatic invoice, payment, and payout reconciliation on their books.
With Rutter, you own the relationship between your customer and their commerce platforms, while Tight handles the
complexity of automated reconciliation across all their sales channels.
## Automated Reconciliation
Commerce platforms deposit money directly into your users' bank accounts on a regular cadence. When utilizing one of the Tight
Bank Transactions integrations, e.g. [Plaid](/integrations/banking/plaid), the bank deposit to the user's bank account
will also be ingested by the Tight API as part of that integration's bank feed. Importantly, Tight's algorithms automate
the reconciliation between that bank deposit and the itemized transactions within the commerce platform, saving your
users time that would have otherwise been spent manually reconciling these transactions in legacy accounting systems.
### Multi-Platform Order Payout Example
1. The business owner processes orders across multiple platforms through Rutter-connected channels (e.g., Shopify online
store, Amazon marketplace, WooCommerce site).
2. These orders are automatically synced into Tight as invoices through Rutter's unified API.
3. Customers pay for their orders via various payment methods. Each platform deducts processing fees and marketplace
fees from payments.
4. Each platform groups payments into periodic payouts according to their individual schedules.
5. The user receives separate payouts from each platform (e.g., \$3,850 from Shopify, \$2,100 from Amazon), also seen as
deposits into their checking account.
6. The Tight API automatically matches the synced invoices with the corresponding payouts across platforms, creates
expenses for all processing fees and marketplace commissions, and reconciles the net amounts. Additionally, the Tight
Embedded experience nests these transaction line items neatly under their respective payout rows.
## Supported Commerce Platforms
Through Rutter's unified API, Tight supports automatic reconciliation for:
* **Shopify** - Online store orders, payments, and payouts
* **Amazon** - Marketplace orders, settlements, and fees
* **WooCommerce** - WordPress-based e-commerce transactions
* **BigCommerce** - Multi-channel commerce orders
* **Squarespace** - Website commerce transactions
* **Square** - Point-of-sale and online orders
* **Etsy** - Marketplace sales and payments
* **eBay** - Auction and fixed-price listings
* And many more platforms supported by Rutter
## Create a Rutter Account
If you haven't already, sign up for a [Rutter](https://dashboard.rutter.com/signup) developer account. Once created,
you'll have access to the Rutter dashboard where you can configure your integration settings.
### Setup Rutter OAuth
Tight's Rutter integration utilizes OAuth 2.0 to read your users' commerce data across multiple platforms. Navigate to your
Rutter dashboard to configure OAuth.
#### Step 1: Enable Production Access
Request Production access for your account from Rutter [here](https://dashboard.rutterapi.com/request-access).
#### Step 2: Enable Commerce Platforms
In your Rutter dashboard, navigate to the Platforms section and enable the commerce platforms you want to support for
your users. Some platforms may require you to create a developer account with that platform and provide platform-specific
credentials.
Rutter provides detailed setup guides for each platform in their [documentation](https://docs.rutter.com/supported-platforms).
#### Step 3: Connect Tight Webhook URLs (Real-Time Updates)
By subscribing the Tight API to receive webhooks from Rutter, Tight will be able to pull in updates to your users'
commerce data in real-time as they occur across all connected platforms.
To configure webhooks, navigate to the Webhook Configuration section in your Rutter dashboard and add
`https://webhook.sandbox.tight.com/rutter` as your webhook URL.
#### Step 4: Production Setup
Once you are ready to go live in the Production environment, update your Rutter dashboard settings with the following
production URLs:
* **Webhook URL**: `https://webhook.prod.tight.com/rutter`
Ensure your production Rutter account has the same platform enablements and webhook configurations as your sandbox
environment.
## Securely share your Rutter keys
Navigate to the API Keys section in your Rutter dashboard to note down your "Client ID" and "Client Secret" keys, which you'll need to provide to
Tight.
Note that the `client_id` remains the same between Production and Sandbox mode, but the `client_secret` keys are separate between modes. You can toggle between the two modes via the dropdown on the top left of the Rutter Dashboard.
Once you've collected your Client ID and Client Secret from the Rutter dashboard, use the Tight API
to [configure your Rutter integration](/api-reference/integrations/configure-rutter) for both Production and Sandbox environments.
The configuration will securely store your Rutter credentials and enable the integration for your users.
## Connect your user's commerce accounts
There are two primary ways to connect your users' commerce platform accounts to their company in Tight via Rutter:
1. Tight's Embedded UI provides UX from which users can kick off the Rutter connection flow, e.g. when onboarding
in the [Transaction Dashboard](/embeddable-ui/react/bank-transactions/transactions-dashboard). Users can select which
commerce platform they want to connect from the available options.
2. Programmatically [link the user's Rutter connection](/api-reference/integration-management/link-rutter) to Tight using a `public_token` value obtained from [Rutter's Connections API](https://docs.rutter.com/rest/2023-03-14/connections#create-a-connection).
# Shopify
Source: https://docs.tight.com/integrations/commerce/shopify
Automate the reconciliation between Shopify payouts and their itemized transactions with Tight
## Overview
Instead of building an integration with Shopify in-house, Tight communicates directly with Shopify on your behalf using
your [Shopify Partner](https://www.shopify.com/partners) account. This enables you to own the relationship between your
customer and Shopify while getting automatic order, payment, and payout reconciliation on the user's books.
## Automated Reconciliation
Shopify deposits money directly into your users' bank accounts on a regular cadence. When utilizing one of the Tight Bank
Transactions integrations, e.g. [Plaid](/integrations/banking/plaid), the bank deposit to the user's bank account will
also be ingested by the Tight API as part of that integration's bank feed. Importantly, Tight's algorithms automate the
reconciliation between that bank deposit and the itemized transactions within Shopify, saving your users time that would
have otherwise been spent manually reconciling these transactions in legacy accounting systems.
### Order Payout Example
1. The business owner processes 4 orders of \$1000 each through their Shopify store (e.g., online orders, point-of-sale
transactions, mobile app sales).
2. These 4 Shopify orders are automatically synced into Tight as invoices.
3. Customers pay for their orders via 4 separate credit card payments. Shopify Payments deducts processing fees from
each payment (2.9% + \$0.30 per transaction = \$29.30 per payment for merchants on the Basic plan).
4. Shopify groups these payments (now \$970.70 each after fees) into a single payout based on the merchant's payout
schedule.
5. The user receives a payout from Shopify for \$3882.80 (\$4000 minus \$117.20 in processing fees), also seen as a
\$3882.80 deposit into their checking account.
6. The Tight API automatically matches the 4 synced invoices with the one payout, and creates expenses for the
processing fees deducted from each payment. Additionally, the Tight Embedded experience nests these transaction line
items neatly under a single payout row.
## Create a Shopify App
If you haven't already, sign up for a [Shopify Partner](https://www.shopify.com/partners) account. Once created, you
can create a new Shopify app from the Partner Dashboard.
### Setup Shopify App
Tight's Shopify integration utilizes OAuth 2.0 to read your users' store data. Once your Shopify app is created, configure the following settings.
#### Step 1: Configure App Access Scopes
Your app will need access to the following scopes to enable Tight's integration:
* `read_all_orders` - To sync order data
* `read_products` - To access product information
* `read_shopify_payments_payouts` - To retrieve payout data
* `read_customers` - To access customer information associated with orders
#### Step 2: Configure Redirects
For the OAuth redirect URLs, add `https://redirect.sandbox.tight.com/integrations/shopify` and
`https://redirect.prod.tight.com/integrations/shopify` since Shopify does not have separate sandbox and production
environments.
#### Step 3: Note Your Credentials
From the developer dashboard settings, note down your Client ID and Client Secret which you'll need to provide to Tight.
## Securely share your Shopify credentials
Once you've collected your Client ID and Client Secret from the Shopify Partner Dashboard, use the Tight API
to [configure your Shopify integration](/api-reference/integrations/configure-shopify).
## Connect your users' Shopify stores
There are three primary ways to connect your users' Shopify stores to their company in Tight:
1. For partners including commerce platform linkage from their own UX, use
the [Start Shopify Flow API](/api-reference/integration-management/start-shopify-flow) which wraps the entire OAuth
2.0 flow such that you simply need to redirect your user to a single URL.
2. Tight's Embedded UI also provides UX from which users can kick off the Shopify connection flow, e.g. when onboarding
in the [Transaction Dashboard](/embeddable-ui/react/bank-transactions/transactions-dashboard)
3. For partners with existing Shopify
integrations, [programmatically link the user's Shopify store](/api-reference/integration-management/link-shopify)
# Square
Source: https://docs.tight.com/integrations/commerce/square
Automate the reconciliation between Square payouts and their itemized transactions with Tight
## Overview
Instead of building an integration with Square in-house, Tight communicates directly with Square on your behalf using
your [Square Developer](https://developer.squareup.com/us/en) account. This enables you to own the relationship between
your customer and Square, while getting automatic invoice, payment, and payout reconciliation on the user's books.
## Automated Reconciliation
Square deposits money directly into your users' bank accounts on a regular cadence. When utilizing one of the Tight Bank
Transactions integrations, e.g. [Plaid](/integrations/banking/plaid), the bank deposit to the user's bank account will
also be ingested by the Tight API as part of that integration's bank feed. Importantly, Tight's algorithms automate the
reconciliation between that bank deposit and the itemized transactions within Square, saving your users time that would
have otherwise been spent manually reconciling these transactions in legacy accounting systems.
### Order Payout Example
1. The business owner processes 4 orders of \$1000 each through Square (e.g., point-of-sale transactions, online orders,
invoices).
2. These 4 Square orders are automatically synced into Tight as invoices.
3. Customers pay for their orders via 4 separate credit card payments. Square deducts processing fees from each payment
(2.9% + \$0.30 per transaction = \$29.30 per payment).
4. Square groups these payments (now \$970.70 each after fees) into a single payout.
5. The user receives a payout from Square for \$3882.80 (\$4000 minus \$117.20 in processing fees), also seen as a
\$3882.80
deposit into their checking account.
6. The Tight API automatically matches the 4 synced invoices with the one payout, and creates expenses for the
processing
fees deducted from each payment. Additionally, the Tight Embedded experience nests these transaction line items
neatly
under a single payout row.
## Create a Square Application
If you haven't already, sign up for a [Square Developer](https://developer.squareup.com/us/en) account. Once created,
add a new Square application from the developer console.
### Setup Square OAuth
Tight's Square integration utilizes OAuth 2.0 to read your users' seller data. Once your Square application is
created, navigate to the OAuth menu item from the navigation bar.
#### Step 1: Configure Redirects
For the OAuth redirect URLs, add `https://redirect.sandbox.tight.com/integrations/square`.
While there, please note down the "Application ID" and the "Application Secret."
#### Step 2: Connect Tight Webhook URLs (Real-Time Updates)
By subscribing the Tight API to receive webhooks on your Square dashboard, Tight will be able to pull in updates to your
users' commerce data in real-time.
To do so, click on "Webhooks" then "Add subscription" which will open a new webhook form. Provide a name and specify
the notification URL as `https://webhook.sandbox.tight.com/square`. Be sure to enable all Customers, Invoices, Orders,
Payments, Payouts, Refunds, and Vendors events.
#### Step 3: Production Setup
Once you are ready to go live in the "Production" environment, toggle to Production and add the following OAuth redirect
URL: `https://redirect.prod.tight.com/integrations/square`. Additionally, configure a webhook subscription for
`https://webhook.prod.tight.com/square` with the same set of events.
## Securely share your Square keys
The last field that is needed is a "Secret key", which you can find on
the [API keys](https://dashboard.square.com/test/apikeys) page. Under the "Standard keys" section, you will see a "
Secret key" row. You should note down the `token` field for the Secret key.
Once collected, use the Tight API to [configure your Square integration](/api-reference/integrations/configure-square).
## Connect your user's Square accounts
There are three primary ways to connect your users' Square accounts to their company in Tight:
1. For partners including commerce platform linkage from their own UX, use
the [Start Square Flow API](/api-reference/integration-management/start-square-flow) which wraps the entire OAuth 2.0
flow such that you simply need to redirect your user to a single URL.
2. Tight's Embedded UI also provides UX from which users can kick off the Square connection flow, e.g. when onboarding
in the [Transaction Dashboard](/embeddable-ui/react/bank-transactions/transactions-dashboard)
3. For partners with existing Square
integrations, [programmatically link the user's Square account](/api-reference/integration-management/link-square)
# Custom Integrations
Source: https://docs.tight.com/integrations/custom-integrations
Allow Tight to ingest granular data already stored in your platform
Tight enables custom integrations to ingest granular data already stored in your platform (e.g. invoices and line items
stored in a vertical SaaS platform, dimension hierarchies like cost centers, regions, locations, departments, etc.).
The Tight team will create a custom implementation plan for your specific platform to ensure any financial data stored
in your platform flows into your new accounting product. For example, the invoices tracked in your system are
automatically reconciled with the bank deposits flowing into Tight.
# Front
Source: https://docs.tight.com/integrations/customer-service/front
Streamline communication between business owners and bookkeepers
## Overview
Instead of building a customer support integration in-house, Tight integrates directly
with [Front](https://front.com/teams/customer-support) to facilitate transaction-level communication between bookkeepers
and business owners. This enables contextual collaboration where bookkeepers can ask questions about specific
transactions without copying data or switching between workspaces.
Through this native integration, bookkeepers can select transactions within Tight's embeddable UI and prefill messages
with transaction details. Tight automatically forwards these messages to Front and routes responses back to the
appropriate bookkeeper. Business owners communicate via their preferred method (email), without knowing Front is being
used behind the scenes.
## Getting started
If you haven't already done so, you should [create a Front account](https://front.com/#get-started) for your
company/app.
## Create a Communication Channel
After you have created your Front account, you will need to create a Channel from
your [Front settings](https://app.frontapp.com/settings/). A Channel represents the method through which your
bookkeepers will communicate to your users, all via a single point of contact from your users’ perspective. For example,
your users might receive emails from `bookkeepers@bookkeepingCo.com`, even though multiple bookkeepers are communicating
through that same Channel. During Channel creation, Front will also walk you through how to set up an Inbox, which is
how Front will group conversations with your clients.
## Create Front API Token
Navigate to the "API Tokens" tab of
your [Front developer settings](https://app.frontapp.com/settings/developers/tokens). You can then create a token with a
name like "Tight Token", and ensure that you pick the "Shared Resources" scope. You should note down the `API Token`
field after creation.
## Securely share your Front credentials
Once you have collected your API Token and Channel name, use
the [Configure Front API](/api-reference/integrations/configure-front) to securely share your Front credentials with
Tight.
# Intercom
Source: https://docs.tight.com/integrations/customer-service/intercom
Provide customer support, engage customers through lifecycle messaging, and track useful analytics
## Overview
Tight integrates directly with Intercom so that actions that your users take inside Tight's embeddable user interface (or via your home-built interface on top of the Tight API) will be tracked using [Intercom events](https://developers.intercom.com/docs/references/rest-api/api.intercom.io/Events/event/). This allows you to leverage your existing Intercom integration or add a new Intercom integration so that you can:
* Provide targeted customer support based on user actions in Tight
* Trigger lifecycle messaging campaigns based on accounting activity
* Track product analytics and user engagement
* Build custom workflows and automations in Intercom
## Create an Intercom Workspace
If you haven't done so already, you should create an [Intercom account](https://www.intercom.com/signup) and set up a workspace for your application.
## Securely sharing your Intercom App ID
Copy the App ID and use the [Configure Intercom API](/api-reference/integrations/configure-intercom) to securely share your App ID with Tight.
## Identify users (optional)
If you are identifying your users in Intercom using something different than the `userId` that you use to [create companies in the Tight API](/api-reference/company-management/create-a-company), then you will need to [provide the identifier used in Intercom for that user](/api-reference/integration-management/link-intercom).
This ensures that events from Tight are properly attributed to the correct user profile in Intercom.
# Twilio
Source: https://docs.tight.com/integrations/customer-service/twilio
Enable Agentic Accountants to efficiently manage the books via quick text messages to business owners
## Overview
Tight integrates with Twilio to send RCS and SMS messages to business owners as needed, to ensure efficient onboarding, activation, and book maintenance.
### Onboarding & Activation
* Link bank account
* If migrating, link legacy accounting platform (e.g. QuickBooks Online, Xero, Wave)
### Book Maintenance
* Ask questions on ambiguous transactions (e.g. Zelle Deposits, Checks with no description, etc.)
* Monthly financial summary delivery
* Bank connection issues requiring action
* Other configurable accounting milestones
## Integrating Twilio
### Create a Twilio Account
If you don't have one already, [sign up for a Twilio account](https://www.twilio.com/try-twilio).
### Get a Phone Number
You need a Twilio phone number that Tight will use to send SMS messages to your business owners.
1. From the [Twilio Console](https://console.twilio.com), go to **Phone Numbers** > **Manage** > **Buy a number**
2. Filter by **SMS** capability and select a number
3. Purchase the number and copy it in [E.164 format](https://www.twilio.com/docs/glossary/what-e164) (e.g.,
`+12025551234`)
### Retrieve Your Credentials
From the [Twilio Console Dashboard](https://console.twilio.com):
1. Copy your **Account SID** (begins with `AC`)
2. Reveal and copy your **Auth Token**
### Share Your Credentials with Tight
Use the [Configure Twilio API](/api-reference/integrations/configure-twilio) to securely share your Account SID, Auth
Token, and phone number (or Messaging Service SID) with Tight.
# Native Integrations
Source: https://docs.tight.com/integrations/native-integrations
Leverage the Tight API’s wide range of seamless integrations
## Zero dev effort
All of Tight's integrations are native integrations such that your company will not need to pull or push any data from
the integration provider.
For example, if you want to integrate bank transactions (via [Plaid](/integrations/banking/plaid)), you can simply
provision a Plaid developer account and grant Tight partner-level access to that account, and Tight takes care of the
rest; no infrastructure for your team to build around pulling/storing/refreshing tokens and handling error scenarios.
If you want to integrate tax filings (via [April](/integrations/tax/april)), you can simply provision a Column
Tax developer account and grant Tight partner-level access to that account, and Tight takes care of the rest; no need
for your team to aggregate all the user's transactions and push them into Column Tax's API directly.
## Own the relationships with your providers
The Tight API serves as the general ledger and glue for all of the accounting data that your users accumulate. All the
relationships (and any associated economics) with integration partners like Plaid, Column Tax, Stripe, etc. are owned by
your company, giving you the same flexibility you would get if working with those integrations directly, but without any
of the development/integration overhead.
## One-stop shop
By enabling the integrations that make sense for your user base, you enable your platform to become the true one-stop
shop that every business owner is after.
If you don't see an integration that you're looking for, don't hesitate to reach out to the Tight team at [api@tight.com](mailto:api@tight.com). Tight is architected to support infinite integrations and is always adding new integrations based on customer-partner demand.
# Adyen
Source: https://docs.tight.com/integrations/payment-processing/adyen
Automate the reconciliation between Adyen payouts and their itemized transactions with Tight
## Overview
Instead of building an integration with Adyen in-house, Tight communicates directly with Adyen on your behalf using
your [Adyen platform](https://www.adyen.com/platform-payments) account. This enables you to own the relationship between
your customer and Adyen, including any associated economic benefits, while getting a seamless invoicing user experience with
automatic payout reconciliation on the user's books.
## Automated Reconciliation
Adyen deposits money directly into your users' bank accounts on a regular cadence. When utilizing one of the Tight Bank
Transactions integrations, e.g. [Plaid](/integrations/banking/plaid), this deposit will also be ingested by the Tight
API as part of that integration. Importantly, Tight's integration with Adyen operates at the platform level, allowing
Tight to reconcile the Balance Platform fees alongside the associated payments and ultimately the payouts to the
end-user's bank accounts and the transaction data from Plaid, saving your users time that would have otherwise been
spent manually reconciling these transactions in legacy accounting systems.
See the [**Invoice Payout Example**](/guides/business-owners/invoicing#invoice-payout-example) to understand the level
of complexity that Tight automates.
## Become an Adyen Platform
If you haven't already done so, you should [create an Adyen account](https://www.adyen.com/signup) for your
company/app.
# Moov
Source: https://docs.tight.com/integrations/payment-processing/moov
Enable your users to collect invoice payments via credit card through Moov
## Overview
Instead of building an integration with Moov in-house, Tight communicates directly with Moov on your behalf using
your [Moov facilitator](https://moov.io/) account. This enables you to own the relationship between your customer and
Moov, including any associated economic benefits, while getting a seamless invoicing user experience with automatic
payment reconciliation on the user's books.
## Automated Reconciliation
Moov processes credit card payments for invoices sent by your users. When utilizing one of the Tight Bank Transactions
integrations, e.g. [Plaid](/integrations/banking/plaid), the bank deposit to the user's bank account will also be
ingested by the Tight API as part of that integration's bank feed. Importantly, Tight's algorithms automate the
reconciliation between that bank deposit and the itemized transactions within Moov, saving your users time that would
have otherwise been spent manually reconciling these transactions in legacy accounting systems.
See the [**Invoice Payout Example**](/guides/business-owners/invoicing#invoice-payout-example) to understand the level
of complexity that Tight automates.
## Create a Moov Account
If you haven't done so already, Tight can introduce you to Moov to get your team registered quickly. Alternatively, you
can [create a Moov account](https://dashboard.moov.io/signup) directly for your company/app.
## Setup Moov Integration
When you first access your Moov account dashboard, the header will display "Viewing test account", indicating you're
in [Moov's Test mode](https://docs.moov.io/guides/set-up-your-account/test-mode/). Complete the following setup steps in
Test mode first.
### Step 1: Create API Keys
1. Navigate to Developers > API Keys from the left-hand navigation pane
2. Click the "New API key" button on the top right
3. In the "Name" field, add a descriptive name
4. Under "Domains", add your application's domains
5. Click "Create API key"
6. Note down the "Public key" and "Secret key" shown, as they will only be displayed once
### Step 2: Configure Webhooks
Webhooks enable Tight to receive real-time updates about payment events from Moov.
1. Navigate to Developers > Webhooks from the left-hand navigation pane
2. Click the "New webhook" button on the top right
3. Configure the webhook:
* **Endpoint URL (Sandbox)**: `https://webhook.sandbox.tight.com/moov`
* **Endpoint URL (Production)**: `https://webhook.prod.tight.com/moov`
* **Description**: "Webhook for Tight API"
* **Events to send**: Select "All events"
4. Click "Create webhook"
### Step 3: Get Facilitator Account ID
1. Navigate to Settings > Business details from the left-hand navigation pane
2. Note down the "Account ID" displayed - this is your Moov facilitator account ID
## Configure Fee Schedule
As the facilitator of payments between your users (merchants) and their clients, you can monetize your payment flows by
collecting fees. Your fee structure should be finalized with your Moov point-of-contact. If you need an introduction to
a Moov representative, contact Tight support.
Your fee schedule consists of:
* **Moov's base fee** - Fixed fee per payment charged by Moov
* **Your base fee** - Additional fixed fee per payment (optional)
* **Moov's percentage fee** - Percentage of payment amount charged by Moov
* **Your percentage fee** - Additional percentage of payment amount (optional)
Your users will only see the total base fee (Moov's + yours) and total percentage fee (Moov's + yours) when processing payments.
## Securely Share Your Moov Credentials
Once you have collected all the required information, use
the [Configure Moov API](/api-reference/integrations/configure-moov) to securely share your Moov credentials with Tight:
* Moov facilitator Account ID
* Public key and Secret key from API Keys
* Complete fee schedule (base fees and percentage fees)
# Qualpay
Source: https://docs.tight.com/integrations/payment-processing/qualpay
Enable your users to collect invoice payments via credit card and ACH through Qualpay
## Overview
Instead of building an integration with Qualpay in-house, Tight communicates directly with Qualpay on your behalf using
your [Qualpay partner](https://www.qualpay.com/payments) account. This enables you to own the relationship between your
customer and Qualpay, including any associated economic benefits, while getting a seamless invoicing user experience
with automatic payment reconciliation on the user's books.
## Automated Reconciliation
Qualpay processes credit card and ACH payments for invoices sent by your users. When utilizing one of the Tight Bank
Transactions integrations, e.g. [Plaid](/integrations/banking/plaid), the bank deposit to the user's bank account will
also be ingested by the Tight API as part of that integration's bank feed. Importantly, Tight's algorithms automate the
reconciliation between that bank deposit and the itemized transactions within Qualpay, saving your users time that would
have otherwise been spent manually reconciling these transactions in legacy accounting systems.
See the [**Invoice Payout Example**](/guides/business-owners/invoicing#invoice-payout-example) to understand the level
of complexity that Tight automates.
## Create a Qualpay Account
If you haven't done so already, Tight can introduce you to Qualpay to get your team registered quickly. Alternatively,
you can [create a Qualpay sandbox account](https://app-test.qualpay.com/login/signup) directly for your company/app.
## Setup Qualpay Integration
Start by setting up your Qualpay integration in the sandbox environment. Once you have access to your Qualpay partner
account, complete the following setup steps.
### Step 1: Create API Profile
1. Click on the "Administration" tab in the left navigation
2. Navigate to [APIs & Security](https://app-test.qualpay.com/partner/admin/security)
3. Click the "New API Profile" button on the top right
4. Name the profile (e.g., "Tight API Profile")
5. Note down the "Security Key" displayed - it will only be shown once
6. Note down the "Integrator ID" displayed
Save both your Security Key and Integrator ID securely - the Security Key cannot be retrieved after initial creation.
### Step 2: Configure Webhooks (Real-Time Updates)
If Qualpay offers webhook functionality for real-time payment updates, configure webhooks to point to:
* **Sandbox**: `https://webhook.sandbox.tight.com/qualpay`
* **Production**: `https://webhook.prod.tight.com/qualpay`
Webhooks enable Tight to receive real-time updates about payment events from Qualpay.
## Securely Share Your Qualpay Credentials
Once you have collected your Security Key and Integrator ID, use
the [Configure Qualpay API](/api-reference/integrations/configure-qualpay) to securely share your Qualpay credentials
with Tight.
# Stripe
Source: https://docs.tight.com/integrations/payment-processing/stripe
Automate the reconciliation between Stripe payouts and their itemized transactions with Tight
## Overview
Instead of building an integration with Stripe in-house, Tight communicates directly with Stripe on your behalf using
your [Stripe platform](https://stripe.com/docs/connect) account. This enables you to own the relationship between your
customer and Stripe, including any associated economic benefits, while getting a seamless invoicing user experience with
automatic payout reconciliation on the user's books.
## Automated Reconciliation
Stripe deposits money directly into your users' bank accounts on a regular cadence. When utilizing one of the Tight Bank
Transactions integrations, e.g. [Plaid](/integrations/banking/plaid), the bank deposit to the user's bank account will
also be ingested by the Tight API as part of that integration's bank feed. Importantly, Tight's algorithms automate the
reconciliation between that bank deposit and the itemized transactions within Stripe, saving your users time that would
have otherwise been spent manually reconciling these transactions in legacy accounting systems.
See the [**Invoice Payout Example**](/guides/business-owners/invoicing#invoice-payout-example) to understand the level
of complexity that Tight automates.
## Become a Stripe Platform
If you haven't already done so, you should [create a Stripe account](https://dashboard.stripe.com/register) for your
company/app. Once you have created a Stripe account, some admin-only confirmation is required:
### Enable Stripe Connect
Stripe Connect is what allows your app to facilitate payments so that your customers can accept invoice payments from
their clients.
#### Step 1: Create Stripe Account
After you have created your Stripe account,
you will want to enable Stripe Connect by clicking the "Get Started" button on
the [Connect tab of your Stripe dashboard](https://dashboard.stripe.com/test/connect/accounts/overview) and following
the steps.
Once you have activated Stripe Connect, you should navigate to the Connect settings screen, where you will be prompted
to
enter company-specific info, including your brand colors.
#### Step 2: Enable OAuth
Once completed, on the top right of the header, you can click "Test mode", to toggle into the sandbox environment. Next,
you should navigate to the [Connect Settings screen](https://dashboard.stripe.com/settings/connect). From there, click
into "Onboarding options", then to the "OAuth" tab. Toggle on the "Enable OAuth" option.
#### Step 3: Configure Redirects
Next, under "Redirects", you should add `https://redirect.sandbox.hurdlr.com/integrations/stripe`.
Please note down the "Test client ID".
#### Step 4: Production Setup
Once you are ready to go live in the "Production" environment, on the top right of the header, you can disable the "Test
mode" toggle, and repeat the above steps. Under "Redirects", you should add
`https://redirect.prod.hurdlr.com/integrations/stripe`.
### Connect Tight Webhook URLs to Stripe (Real-Time Updates)
By subscribing the Tight API to receive webhooks on your Stripe dashboard, Tight will be able to pull in updates to your
users' invoice updates in real-time.
To do so, in your Stripe Dashboard, click on Developer -> Webhooks.
Then, click into "Add endpoint". Under the "Select events" section, be sure to select all the "Charge", "Payment
Intent", and "Payout" events, then click "Continue".
Finally, you will add your Tight Webhook URL for the Sandbox environment or your Webhook URL for the Production
environment, and finish by clicking "Create destination".
For Test mode, add `https://webhook.sandbox.hurdlr.com/stripe`.
For Live mode, add `https://webhook.prod.hurdlr.com/stripe`.
## Securely share your Stripe keys
The last field that is needed is a "Secret key", which you can find on
the [API keys](https://dashboard.stripe.com/test/apikeys) page. Under the "Standard keys" section, you will see a "
Secret key" row. You should note down the `token` field for the Secret key.
Once collected, use the Tight API to [configure your Stripe integration](/api-reference/integrations/configure-stripe).
## Connect your user's Stripe accounts
There are three primary ways to connect your users' Stripe accounts to their company in Tight:
1. For partners including Payment Processing linkage from their own UX, use
the [Start Stripe Flow API](/api-reference/integration-management/start-stripe-flow) which wraps the entire OAuth 2.0
flow such that you simply need to redirect your user to a single URL
2. Tight's Embedded UI also provides UX from which users can kick off the Stripe connection flow, e.g. when onboarding
in the [Invoice Dashboard](/embeddable-ui/react/invoicing/invoice-dashboard)
3. For partners with existing Stripe
integrations, [programmatically link the user's Stripe account](/api-reference/integration-management/link-stripe)
# Check
Source: https://docs.tight.com/integrations/payroll/check
Simplify the complex accounting that payroll necessitates with Tight
## Overview
Tight communicates directly with Check to automatically account for payroll directly in your users' books, including
automatically reconciling bank withdrawals against the payroll entries in real-time.
## Automated Reconciliation
In addition to a seamless UX, you and your users can rest assured knowing that the complex accounting that payroll
necessitates is automatically taken care of. When your user runs a payroll, the necessary accounting transactions are
automatically created in the user's General Ledger. Furthermore, when the bank withdrawals come in several days later,
the Tight API will automatically reconcile those with the payroll run, keeping the user's General Ledger and balance
sheets in sync, without any manual labor required from your user.
That reconciliation process, when done manually, can be very complex, as a single Check payroll run and the subsequent
withdrawal need to be split over many different accounts. With the Tight API, this reconciliation happens
automatically, without user input.
See the [**Monthly Payroll Run Example**](/guides/business-owners/payroll#monthly-payroll-run-example) to understand the
level of complexity that Tight automates.
## Get Started
### Configure Check Integration
If you haven't already done so, you should create a developer account with Check at [checkhq.com](https://checkhq.com/).
Once you're logged into Check's Dashboard, navigate to the API Keys section to access your credentials.
### Securely share your Check keys
You should then copy your `Key ID`, this can be programmatically provided to
the [Configure Check API](/api-reference/integrations/configure-check).
For production deployment, repeat these steps using Check's Live mode toggle.
# Gusto
Source: https://docs.tight.com/integrations/payroll/gusto
Simplify the complex accounting that payroll necessitates with Tight
## Overview
Tight communicates directly with Gusto to automatically account for payroll directly in your users' books, including
automatically reconciling bank withdrawals against the payroll entries in real-time. The integration works for those
integrating with [Gusto Embedded Payroll](https://embedded.gusto.com/) and for end-users that
use [Gusto](https://gusto.com/) directly.
## Automated Reconciliation
In addition to a seamless UX, you and your users can rest assured knowing that the complex accounting that payroll
necessitates is automatically taken care of. When your user runs a payroll, the necessary accounting transactions are
automatically created in the user's General Ledger. Furthermore, when the bank withdrawals come in several days later,
the Tight API will automatically reconcile those with the payroll run, keeping the user's General Ledger and balance
sheets in sync, without any manual labor required from your user.
That reconciliation process, when done manually, can be very complex, as a single Gusto payroll run typically includes
at
least three bank withdrawals, all of which need to be mapped to different accounts. With the Tight API, this
reconciliation happens automatically, without user input.
See the [**Monthly Payroll Run Example**](/guides/business-owners/payroll#monthly-payroll-run-example) to understand the
level of complexity that Tight automates.
## Gusto (Retail) Payroll
### Configure Gusto Retail App
If you haven't already done so, you should [create a developer account with Gusto](https://dev.gusto.com/).
Once you're logged into Gusto's developer portal, you'll want
to [create an Organization](https://dev.gusto.com/organizations), which should be named after your *company*.
Once you have created your Organization, you will need to [create an Application](https://dev.gusto.com/applications),
which should be named after your *product*. First, you should create a product for the "demo" stage. When you create the
product, you will be prompted to enter a `Redirect URI`, which you should enter as
`https://redirect.sandbox.tight.com/integrations/gusto`:
Once you are done creating the Application, you will see the ability to copy your application's `Client ID` and
`Secret`:
Once you are ready to go live in the "Production" environment, you will first need to submit a
[production application](https://docs.gusto.com/app-integrations/docs/security-review). Once approved, you can repeat
the above steps on the "Production" version of your application, and then use
`https://redirect.prod.tight.com/integrations/gusto` as the `Redirect URI`.
### Securely share your Gusto keys
You should then copy both the `Client ID` and `Secret` fields, these can be programmatically provided to
the [Configure Gusto API](/api-reference/integrations/configure-gusto).
### Connect your user's Gusto Retail accounts
1. For partners including Payroll connection from their own UX, use
the [Start Gusto Flow API](/api-reference/integration-management/start-gusto-retail-flow) which wraps the entire OAuth
2.0 flow such that you simply need to redirect your user to a single URL.
2. Tight's Embedded UI also provides UX from which users can kick off the Gusto connection flow, e.g.
from the Payroll Dashboard
## Gusto Embedded Payroll
If your platform wants to embed payroll directly into your product, then Gusto Embedded Payroll may be a better solution
than Gusto's retail payroll product.
### Enable Gusto Embedded Connection
If you haven't embedded Gusto Embedded Payroll already,
an [expert from the Tight team](https://www.tight.com/#get-started) can introduce you to Gusto Embedded to get your team
registered quickly.
### Connect your user's Gusto Embedded Companies
To link your users' Gusto companies to those in Tight, simply hit
the [link Gusto API](/api-reference/integration-management/link-gusto).
# Salsa
Source: https://docs.tight.com/integrations/payroll/salsa
Simplify the complex accounting that payroll necessitates with Tight
## Overview
Tight communicates directly with Salsa to automatically account for payroll directly in your users' books, including
automatically reconciling bank withdrawals against the payroll entries in real-time. Salsa Express enables rapid payroll
deployment through embeddable UI components and straightforward APIs, allowing platforms to launch payroll within days.
## Automated Reconciliation
In addition to a seamless UX, you and your users can rest assured knowing that the complex accounting that payroll
necessitates is automatically taken care of. When your user runs a payroll, the necessary accounting transactions are
automatically created in the user's General Ledger. Furthermore, when the bank withdrawals come in several days later,
the Tight API will automatically reconcile those with the payroll run, keeping the user's General Ledger and balance
sheets in sync, without any manual labor required from your user.
That reconciliation process, when done manually, can be very complex, as a single Salsa payroll run typically includes at
least three bank withdrawals, all of which need to be mapped to different accounts. With the Tight API, this
reconciliation happens automatically, without user input.
See the [**Monthly Payroll Run Example**](/guides/business-owners/payroll#monthly-payroll-run-example) to understand the
level of complexity that Tight automates.
## Get Started
### Configure Salsa Integration
If you haven't already done so, you should create a developer account with Salsa at [salsa.dev](https://salsa.dev/).
Once you're logged into Salsa's developer portal, you can access your API credentials for both sandbox and production
environments.
### Securely share your Salsa keys
You should then copy your API credentials, these can be programmatically provided to
the [Configure Salsa API](/api-reference/integrations/configure-salsa).
For production deployment, repeat these steps using Salsa's production environment credentials.
# April
Source: https://docs.tight.com/integrations/tax/april
Enable your users to file their taxes in your platform
## Overview
Tight communicates directly with April to enable seamless tax filing directly within your platform. All financial data
flowing through the Tight API is automatically assembled into the formats needed for business owners to quickly and
easily file their taxes. Through this native integration with [April](https://www.getapril.com/), your users can access
a co-branded tax filing experience (Your Company + April) without any developer effort on your team's end.
## Automated Tax Data Assembly
In addition to a seamless UX, you and your users can rest assured knowing that complex tax preparation is automatically
taken care of. All data flowing through the Tight API (e.g. Plaid/bank transactions, Stripe invoicing/payment data,
etc.) is automatically categorized and assembled into the format needed to be ingested by April. That data is then
automatically sent to April, removing all integration work from your development team's workload.
## Getting Started
### Create an April developer account
If you haven't done so already, Tight can introduce you to April to get your team registered quickly. Alternatively, you can reach out directly to [sales@getapril.com](mailto:sales@getapril.com) to create a developer account.
### Securely share your April keys
Once April has created a developer account for you, your API credentials can be programmatically provided to
the [Configure April API](/api-reference/integrations/configure-april).
## Displaying the Tax Filing UX
You can quickly and easily
use [Tight's Income Tax Dashboard](/embeddable-ui/react/income-tax-dashboard), which includes all the
necessary UI for getting tax estimates and entering the DIY tax filing flow. This approach gets your product up and
running in minutes.
## Going Live in Production
The Tight API team will coordinate with the April team in order to perform QA testing, obtain access to production keys,
and ultimately go live in production.
# Column Tax
Source: https://docs.tight.com/integrations/tax/column-tax
Enable your users to file their taxes in your platform
## Overview
Tight communicates directly with Column Tax to enable seamless tax filing directly within your platform. All financial
data flowing through the Tight API is automatically assembled into the formats needed for business owners to quickly and
easily file their taxes. Through this native integration with [Column Tax](https://www.columntax.com/), your users can
access a co-branded tax filing experience (Your Company + Column Tax) without any developer effort on your team's end.
## Automated Tax Data Assembly
In addition to a seamless UX, you and your users can rest assured knowing that complex tax preparation is automatically
taken care of. All data flowing through the Tight API (e.g. Plaid/bank transactions, Stripe invoicing/payment data,
etc.) is automatically categorized and assembled into the format needed to be ingested by Column Tax. That data is then
automatically sent to Column Tax, removing all integration work from your development team's workload.
## Getting Started
### Create a Column Tax developer account
If you haven't done so already, Tight can introduce you to Column Tax to get your team registered quickly. Alternatively, you can reach out directly to [Column Tax](https://www.columntax.com/contact) to create a developer account and discuss partnership opportunities.
### Securely share your Column Tax keys
Once Column Tax has created a developer account for you, your API credentials can be programmatically provided to
the [Configure Column Tax API](/api-reference/integrations/configure-column-tax).
## Displaying the Tax Filing UX
You can quickly and easily use [Tight's Income Tax Dashboard](/embeddable-ui/react/income-tax-dashboard), which includes
all the necessary UI for getting tax estimates and entering the DIY tax filing flow. This approach gets your product up
and running in minutes.
## Going Live in Production
The Tight API team will coordinate with the Column Tax team in order to perform QA testing, obtain access to production
keys, and ultimately go live in production.
# Delete file
Source: https://docs.tight.com/api-reference/files/delete-file
https://dev.tight.com/v3/api-docs delete /v6/files/{id}
Delete a file for the given id
# Get file
Source: https://docs.tight.com/api-reference/files/get-file
https://dev.tight.com/v3/api-docs get /v6/files/{id}
Get a file for the given id
# Query files
Source: https://docs.tight.com/api-reference/files/query-files
https://dev.tight.com/v3/api-docs post /v6/files/query
Query files for the authenticated user
# Save files
Source: https://docs.tight.com/api-reference/files/save-files
https://dev.tight.com/v3/api-docs post /v6/files
Save new (or update existing) files
# Upload file
Source: https://docs.tight.com/api-reference/files/upload-file
https://dev.tight.com/v3/api-docs post /v6/files/upload
Upload a new file
# Upload file for entity
Source: https://docs.tight.com/api-reference/files/upload-file-for-entity
https://dev.tight.com/v3/api-docs post /v6/files/upload/{entityId}
Upload a file and associate it with an existing entity
# Delete GL account
Source: https://docs.tight.com/api-reference/gl-accounts/delete-gl-account
https://dev.tight.com/v3/api-docs delete /v6/accounting/glAccounts/{id}
Delete a GL account for the given id
# Get GL account
Source: https://docs.tight.com/api-reference/gl-accounts/get-gl-account
https://dev.tight.com/v3/api-docs get /v6/accounting/glAccounts/{id}
Get a GL account for the given id
# Save GL accounts
Source: https://docs.tight.com/api-reference/gl-accounts/save-gl-accounts
https://dev.tight.com/v3/api-docs post /v6/accounting/glAccounts
Save new (or update existing) GL accounts
# Query GL entries
Source: https://docs.tight.com/api-reference/gl-entries/query-gl-entries
https://dev.tight.com/v3/api-docs post /v6/accounting/glAccounts/{id}/generalLedger
Query GL entries for the authenticated user
# Delete integration
Source: https://docs.tight.com/api-reference/integration-management/delete-integration
https://dev.tight.com/v3/api-docs delete /v6/integrations/{id}
Delete an integration for the given id
# Finicity Transactions
Source: https://docs.tight.com/api-reference/integration-management/finicity-transactions
https://dev.tight.com/v3/api-docs post /v6/imports/finicity/transactions
Push new transactions directly from Finicity into the Tight API
# Get integration
Source: https://docs.tight.com/api-reference/integration-management/get-integration
https://dev.tight.com/v3/api-docs get /v6/integrations/{id}
Get an integration for the given id
# Link Adyen
Source: https://docs.tight.com/api-reference/integration-management/link-adyen
https://dev.tight.com/v3/api-docs post /v6/integrations/adyen/connection
Link a new (or update an existing) Adyen Connection
# Link April
Source: https://docs.tight.com/api-reference/integration-management/link-april
https://dev.tight.com/v3/api-docs post /v6/integrations/april/connection
Link a new (or update an existing) April Connection
# Link Check
Source: https://docs.tight.com/api-reference/integration-management/link-check
https://dev.tight.com/v3/api-docs post /v6/integrations/check/connection
Link a new (or update an existing) Check Connection
# Link ColumnTax
Source: https://docs.tight.com/api-reference/integration-management/link-columntax
https://dev.tight.com/v3/api-docs post /v6/integrations/columnTax/connection
Link a new (or update an existing) ColumnTax Connection
# Link Front
Source: https://docs.tight.com/api-reference/integration-management/link-front
https://dev.tight.com/v3/api-docs post /v6/integrations/front/connection
Link a new (or update an existing) Front Connection
# Link Gusto
Source: https://docs.tight.com/api-reference/integration-management/link-gusto
https://dev.tight.com/v3/api-docs post /v6/integrations/gusto/connection
Link a new (or update an existing) Gusto Connection
# Link Intercom
Source: https://docs.tight.com/api-reference/integration-management/link-intercom
https://dev.tight.com/v3/api-docs post /v6/integrations/intercom/connection
Link a new (or update an existing) Intercom Connection
# Link Mixpanel
Source: https://docs.tight.com/api-reference/integration-management/link-mixpanel
https://dev.tight.com/v3/api-docs post /v6/integrations/mixpanel/connection
Link a new (or update an existing) Mixpanel Connection
# Link Moov
Source: https://docs.tight.com/api-reference/integration-management/link-moov
https://dev.tight.com/v3/api-docs post /v6/integrations/moov/connection
Link a new (or update an existing) Moov Connection
# Link Plaid
Source: https://docs.tight.com/api-reference/integration-management/link-plaid
https://dev.tight.com/v3/api-docs post /v6/integrations/plaid/connection
Link a new (or update an existing) Plaid Connection
# Link Qualpay
Source: https://docs.tight.com/api-reference/integration-management/link-qualpay
https://dev.tight.com/v3/api-docs post /v6/integrations/qualpay/connection
Link a new (or update an existing) Qualpay Connection
# Link QuickBooks Online
Source: https://docs.tight.com/api-reference/integration-management/link-quickbooks-online
https://dev.tight.com/v3/api-docs post /v6/integrations/qbo/connection
Link a new (or update an existing) QuickBooks Online Connection
# Link Rutter
Source: https://docs.tight.com/api-reference/integration-management/link-rutter
https://dev.tight.com/v3/api-docs post /v6/integrations/rutter/connection
Link a new (or update an existing) Rutter Connection
# Link Salsa
Source: https://docs.tight.com/api-reference/integration-management/link-salsa
https://dev.tight.com/v3/api-docs post /v6/integrations/salsa/connection
Link a new (or update an existing) Salsa Connection
# Link Shopify
Source: https://docs.tight.com/api-reference/integration-management/link-shopify
https://dev.tight.com/v3/api-docs post /v6/integrations/shopify/connection
Link a new (or update an existing) Shopify Connection
# Link Square
Source: https://docs.tight.com/api-reference/integration-management/link-square
https://dev.tight.com/v3/api-docs post /v6/integrations/square/connection
Link a new (or update an existing) Square Connection
# Link Stripe
Source: https://docs.tight.com/api-reference/integration-management/link-stripe
https://dev.tight.com/v3/api-docs post /v6/integrations/stripe/connection
Link a new (or update an existing) Stripe Connection
# Link Unit
Source: https://docs.tight.com/api-reference/integration-management/link-unit
https://dev.tight.com/v3/api-docs post /v6/integrations/unit/connection
Link a new (or update an existing) Unit Connection
# Link Wave
Source: https://docs.tight.com/api-reference/integration-management/link-wave
https://dev.tight.com/v3/api-docs post /v6/integrations/wave/connection
Link a new (or update an existing) Wave Connection
# Link Xero
Source: https://docs.tight.com/api-reference/integration-management/link-xero
https://dev.tight.com/v3/api-docs post /v6/integrations/xero/connection
Link a new (or update an existing) Xero Connection
# MX Transactions
Source: https://docs.tight.com/api-reference/integration-management/mx-transactions
https://dev.tight.com/v3/api-docs post /v6/imports/mx/transactions
Push new transactions directly from MX Platform API into the Tight API
# Query Integrations
Source: https://docs.tight.com/api-reference/integration-management/query-integrations
https://dev.tight.com/v3/api-docs post /v6/integrations/query
Query integrations with pagination support
# Refresh integration
Source: https://docs.tight.com/api-reference/integration-management/refresh-integration
https://dev.tight.com/v3/api-docs post /v6/integrations/{id}/refresh
Refresh an integration for the given id
# Save integration
Source: https://docs.tight.com/api-reference/integration-management/save-integration
https://dev.tight.com/v3/api-docs post /v6/integrations/{id}
Save (or update an existing) integration
# Start Gusto Retail Flow
Source: https://docs.tight.com/api-reference/integration-management/start-gusto-retail-flow
https://dev.tight.com/v3/api-docs post /v6/integrations/gusto/authFlow
Start OAuth flow for Gusto
# Start QuickBooks Online Flow
Source: https://docs.tight.com/api-reference/integration-management/start-quickbooks-online-flow
https://dev.tight.com/v3/api-docs post /v6/integrations/qbo/authFlow
Initiate OAuth flow for QuickBooks Online
# Start Shopify Flow
Source: https://docs.tight.com/api-reference/integration-management/start-shopify-flow
https://dev.tight.com/v3/api-docs post /v6/integrations/shopify/authFlow
Start OAuth flow for Shopify
# Start Square Flow
Source: https://docs.tight.com/api-reference/integration-management/start-square-flow
https://dev.tight.com/v3/api-docs post /v6/integrations/square/authFlow
Start OAuth flow for Square
# Start Stripe Flow
Source: https://docs.tight.com/api-reference/integration-management/start-stripe-flow
https://dev.tight.com/v3/api-docs post /v6/integrations/stripe/authFlow
Initiate OAuth flow for Stripe
# Start Wave Flow
Source: https://docs.tight.com/api-reference/integration-management/start-wave-flow
https://dev.tight.com/v3/api-docs post /v6/integrations/wave/authFlow
Initiate OAuth flow for Wave
# Start Xero Flow
Source: https://docs.tight.com/api-reference/integration-management/start-xero-flow
https://dev.tight.com/v3/api-docs post /v6/integrations/xero/authFlow
Initiate OAuth flow for Xero
# Query journal entries
Source: https://docs.tight.com/api-reference/journal/query-journal-entries
https://dev.tight.com/v3/api-docs post /v6/reports/journal/query
Query the chronological list of journal entries with their debit/credit transactions for the authenticated user's company
# Delete car
Source: https://docs.tight.com/api-reference/mileage-cars/delete-car
https://dev.tight.com/v3/api-docs delete /v6/mileage/cars/{id}
Delete a car for the given id
# Get car
Source: https://docs.tight.com/api-reference/mileage-cars/get-car
https://dev.tight.com/v3/api-docs get /v6/mileage/cars/{id}
Get a car for the given id
# Query cars
Source: https://docs.tight.com/api-reference/mileage-cars/query-cars
https://dev.tight.com/v3/api-docs post /v6/mileage/cars/query
Query cars for the authenticated user
# Save cars
Source: https://docs.tight.com/api-reference/mileage-cars/save-cars
https://dev.tight.com/v3/api-docs post /v6/mileage/cars
Save new (or update existing) cars
# Delete location
Source: https://docs.tight.com/api-reference/mileage-locations/delete-location
https://dev.tight.com/v3/api-docs delete /v6/mileage/locations/{id}
Delete a favorite location for the given id
# Get location
Source: https://docs.tight.com/api-reference/mileage-locations/get-location
https://dev.tight.com/v3/api-docs get /v6/mileage/locations/{id}
Get a favorite location for the given id
# Query locations
Source: https://docs.tight.com/api-reference/mileage-locations/query-locations
https://dev.tight.com/v3/api-docs post /v6/mileage/locations/query
Query favorite locations for the authenticated user
# Save locations
Source: https://docs.tight.com/api-reference/mileage-locations/save-locations
https://dev.tight.com/v3/api-docs post /v6/mileage/locations
Save new (or update existing) favorite locations
# Delete route
Source: https://docs.tight.com/api-reference/mileage-routes/delete-route
https://dev.tight.com/v3/api-docs delete /v6/mileage/{mileageId}/route
Delete a route for the given mileage
# Get route
Source: https://docs.tight.com/api-reference/mileage-routes/get-route
https://dev.tight.com/v3/api-docs get /v6/mileage/{mileageId}/route
Get a route for the given mileage
# Save route
Source: https://docs.tight.com/api-reference/mileage-routes/save-route
https://dev.tight.com/v3/api-docs post /v6/mileage/{mileageId}/route
Save a route for the given mileage
# Get mileage setup
Source: https://docs.tight.com/api-reference/mileage-setup/get-mileage-setup
https://dev.tight.com/v3/api-docs get /v6/mileage/setup
Get the mileage setup for the authenticated user
# Save mileage setup
Source: https://docs.tight.com/api-reference/mileage-setup/save-mileage-setup
https://dev.tight.com/v3/api-docs post /v6/mileage/setup
Save (or update) the mileage setup for the authenticated user
# Delete mileage
Source: https://docs.tight.com/api-reference/mileage/delete-mileage
https://dev.tight.com/v3/api-docs delete /v6/mileage/{id}
Delete a mileage record for the given id
# Get mileage
Source: https://docs.tight.com/api-reference/mileage/get-mileage
https://dev.tight.com/v3/api-docs get /v6/mileage/{id}
Get a mileage record for the given id
# Query mileage
Source: https://docs.tight.com/api-reference/mileage/query-mileage
https://dev.tight.com/v3/api-docs post /v6/mileage/query
Query mileage records for the authenticated user
# Query mileage categories
Source: https://docs.tight.com/api-reference/mileage/query-mileage-categories
https://dev.tight.com/v3/api-docs post /v6/mileage/categories/query
Query mileage categories for the authenticated user
# Save mileage
Source: https://docs.tight.com/api-reference/mileage/save-mileage
https://dev.tight.com/v3/api-docs post /v6/mileage
Save new (or update existing) mileage records
# Get notification settings
Source: https://docs.tight.com/api-reference/notification-settings/get-notification-settings
https://dev.tight.com/v3/api-docs get /v6/notifications/settings
Get the authenticated user's notification preferences
# Save notification settings
Source: https://docs.tight.com/api-reference/notification-settings/save-notification-settings
https://dev.tight.com/v3/api-docs post /v6/notifications/settings
Save the authenticated user's notification preferences
# Aged Accounts Payable
Source: https://docs.tight.com/api-reference/reports/aged-accounts-payable
https://dev.tight.com/v3/api-docs post /v6/reports/agedAccountsPayable
Generate an Aged Accounts Payable Report
# Aged Accounts Receivable
Source: https://docs.tight.com/api-reference/reports/aged-accounts-receivable
https://dev.tight.com/v3/api-docs post /v6/reports/agedAccountsReceivable
Generate an Aged Accounts Receivable Report
# Balance Sheet
Source: https://docs.tight.com/api-reference/reports/balance-sheet
https://dev.tight.com/v3/api-docs post /v6/reports/balanceSheet
Generate a Balance Sheet
# Cash Flow Statement
Source: https://docs.tight.com/api-reference/reports/cash-flow-statement
https://dev.tight.com/v3/api-docs post /v6/reports/cashFlowStatement
Generate a Cash Flow Statement
# Chart of Accounts
Source: https://docs.tight.com/api-reference/reports/chart-of-accounts
https://dev.tight.com/v3/api-docs post /v6/reports/chartOfAccounts
Generate a Chart of Accounts Report
# Expense Report
Source: https://docs.tight.com/api-reference/reports/expense-report
https://dev.tight.com/v3/api-docs post /v6/reports/expenses
Generate an Expense Report
# Form 1065
Source: https://docs.tight.com/api-reference/reports/form-1065
https://dev.tight.com/v3/api-docs post /v6/reports/form1065
Generate a Form 1065 tax form
# Form 1120
Source: https://docs.tight.com/api-reference/reports/form-1120
https://dev.tight.com/v3/api-docs post /v6/reports/form1120
Generate a Form 1120 tax form
# Form 1120-S
Source: https://docs.tight.com/api-reference/reports/form-1120-s
https://dev.tight.com/v3/api-docs post /v6/reports/form1120S
Generate a Form 1120-S tax form
# Profit and Loss
Source: https://docs.tight.com/api-reference/reports/profit-and-loss
https://dev.tight.com/v3/api-docs post /v6/reports/profitAndLoss
Generate a Profit and Loss Statement
# Revenue Report
Source: https://docs.tight.com/api-reference/reports/revenue-report
https://dev.tight.com/v3/api-docs post /v6/reports/revenue
Generate a Revenue Report
# Schedule C
Source: https://docs.tight.com/api-reference/reports/schedule-c
https://dev.tight.com/v3/api-docs post /v6/reports/scheduleC
Generate a Schedule C tax form
# Schedule E
Source: https://docs.tight.com/api-reference/reports/schedule-e
https://dev.tight.com/v3/api-docs post /v6/reports/scheduleE
Generate a Schedule E tax form
# T2125
Source: https://docs.tight.com/api-reference/reports/t2125
https://dev.tight.com/v3/api-docs post /v6/reports/t2125
Generate a T2125 tax form
# Trial Balance
Source: https://docs.tight.com/api-reference/reports/trial-balance
https://dev.tight.com/v3/api-docs post /v6/reports/trialBalance
Generate a Trial Balance Report
# Get tax estimates
Source: https://docs.tight.com/api-reference/tax-estimates/get-tax-estimates
https://dev.tight.com/v3/api-docs post /v6/taxes/taxEstimates
Get a summary of a user's tax obligations; also useful for displaying a real-time P&L
# Get tax profile
Source: https://docs.tight.com/api-reference/tax-profile/get-tax-profile
https://dev.tight.com/v3/api-docs get /v6/taxes/setup
Get the authenticated user's tax profile configuration
# Save tax profile
Source: https://docs.tight.com/api-reference/tax-profile/save-tax-profile
https://dev.tight.com/v3/api-docs post /v6/taxes/setup
Save the authenticated user's tax profile configuration
# Delete time
Source: https://docs.tight.com/api-reference/time-tracking--times/delete-time
https://dev.tight.com/v3/api-docs delete /v6/timeTracking/times/{id}
Delete a time tracking entry for the given id
# Get time
Source: https://docs.tight.com/api-reference/time-tracking--times/get-time
https://dev.tight.com/v3/api-docs get /v6/timeTracking/times/{id}
Get a time tracking entry for the given id
# Query times
Source: https://docs.tight.com/api-reference/time-tracking--times/query-times
https://dev.tight.com/v3/api-docs post /v6/timeTracking/times/query
Query time tracking entries for the authenticated user
# Save times
Source: https://docs.tight.com/api-reference/time-tracking--times/save-times
https://dev.tight.com/v3/api-docs post /v6/timeTracking/times
Save new (or update existing) time tracking entries
# Get task
Source: https://docs.tight.com/api-reference/time-tracking-tasks/get-task
https://dev.tight.com/v3/api-docs get /v6/timeTracking/tasks/{id}
Get a time tracking task for the given id
# Query tasks
Source: https://docs.tight.com/api-reference/time-tracking-tasks/query-tasks
https://dev.tight.com/v3/api-docs post /v6/timeTracking/tasks/query
Query time tracking tasks for the authenticated user
# Save tasks
Source: https://docs.tight.com/api-reference/time-tracking-tasks/save-tasks
https://dev.tight.com/v3/api-docs post /v6/timeTracking/tasks
Save new (or update existing) time tracking tasks
# Delete vendor
Source: https://docs.tight.com/api-reference/vendors/delete-vendor
https://dev.tight.com/v3/api-docs delete /v6/vendors/{id}
Delete a vendor for the given id
# Get vendor
Source: https://docs.tight.com/api-reference/vendors/get-vendor
https://dev.tight.com/v3/api-docs get /v6/vendors/{id}
Get a vendor for the given id
# Query vendors
Source: https://docs.tight.com/api-reference/vendors/query-vendors
https://dev.tight.com/v3/api-docs post /v6/vendors/query
Query vendors for the authenticated user
# Save vendors
Source: https://docs.tight.com/api-reference/vendors/save-vendors
https://dev.tight.com/v3/api-docs post /v6/vendors
Save new (or update existing) vendors
# Get Agentic Accountant Settings
Source: https://docs.tight.com/api-reference/agentic-accounting-settings/get-agentic-accountant-settings
https://dev.tight.com/v3/api-docs get /v6/templates/agent/settings
Get the partner's agentic accounting configuration
# Save Agentic Accountant Settings
Source: https://docs.tight.com/api-reference/agentic-accounting-settings/save-agentic-accountant-settings
https://dev.tight.com/v3/api-docs post /v6/templates/agent/settings
Save the partner's agentic accounting configuration
# Delete transaction
Source: https://docs.tight.com/api-reference/bank-transactions/delete-transaction
https://dev.tight.com/v3/api-docs delete /v6/banks/transactions/{id}
Delete an existing transaction
# Get transaction
Source: https://docs.tight.com/api-reference/bank-transactions/get-transaction
https://dev.tight.com/v3/api-docs get /v6/banks/transactions/{id}
Get a transaction for the given id
# Query transaction summary
Source: https://docs.tight.com/api-reference/bank-transactions/query-transaction-summary
https://dev.tight.com/v3/api-docs post /v6/banks/transactions/query/summary
Query transaction summary for the authenticated user
# Query transactions
Source: https://docs.tight.com/api-reference/bank-transactions/query-transactions
https://dev.tight.com/v3/api-docs post /v6/banks/transactions/query
Query transactions for the authenticated user
# Save transactions
Source: https://docs.tight.com/api-reference/bank-transactions/save-transactions
https://dev.tight.com/v3/api-docs post /v6/banks/transactions
Save a new (or update an existing) set of transactions
# Delete bill
Source: https://docs.tight.com/api-reference/bills/delete-bill
https://dev.tight.com/v3/api-docs delete /v6/bills/{id}
Delete a bill for the given id
# Get bill
Source: https://docs.tight.com/api-reference/bills/get-bill
https://dev.tight.com/v3/api-docs get /v6/bills/{id}
Get a bill for the given id
# Query bills
Source: https://docs.tight.com/api-reference/bills/query-bills
https://dev.tight.com/v3/api-docs post /v6/bills/query
Query bills for the authenticated user
# Save bills
Source: https://docs.tight.com/api-reference/bills/save-bills
https://dev.tight.com/v3/api-docs post /v6/bills
Save new (or update existing) bills
# Get categories
Source: https://docs.tight.com/api-reference/categories/get-categories
https://dev.tight.com/v3/api-docs get /v6/categories
Get all categories for the authenticated user, grouped by type
# Get category
Source: https://docs.tight.com/api-reference/categories/get-category
https://dev.tight.com/v3/api-docs get /v6/categories/{id}
Get a category for the given id
# List global GL accounts
Source: https://docs.tight.com/api-reference/global/list-global-gl-accounts
https://dev.tight.com/v3/api-docs get /v6/global/glAccounts
Returns the static list of all Global GL accounts.
# Configure identity provider
Source: https://docs.tight.com/api-reference/identity-provider-configuration/configure-identity-provider
https://dev.tight.com/v3/api-docs post /v6/config/integrations/identityProvider
Configure the identity provider integration for the partner
# Configure Adyen
Source: https://docs.tight.com/api-reference/integrations/configure-adyen
https://dev.tight.com/v3/api-docs post /v6/config/integrations/adyen
Configure Adyen integration credentials
# Configure April
Source: https://docs.tight.com/api-reference/integrations/configure-april
https://dev.tight.com/v3/api-docs post /v6/config/integrations/april
Configure April integration credentials
# Configure Check
Source: https://docs.tight.com/api-reference/integrations/configure-check
https://dev.tight.com/v3/api-docs post /v6/config/integrations/check
Configure Check integration credentials
# Configure Column Tax
Source: https://docs.tight.com/api-reference/integrations/configure-column-tax
https://dev.tight.com/v3/api-docs post /v6/config/integrations/columnTax
Configure Column Tax integration credentials
# Configure Front
Source: https://docs.tight.com/api-reference/integrations/configure-front
https://dev.tight.com/v3/api-docs post /v6/config/integrations/front
Configure Front integration credentials
# Configure Gusto
Source: https://docs.tight.com/api-reference/integrations/configure-gusto
https://dev.tight.com/v3/api-docs post /v6/config/integrations/gusto
Configure Gusto integration credentials
# Configure Intercom
Source: https://docs.tight.com/api-reference/integrations/configure-intercom
https://dev.tight.com/v3/api-docs post /v6/config/integrations/intercom
Configure Intercom integration credentials
# Configure Mixpanel
Source: https://docs.tight.com/api-reference/integrations/configure-mixpanel
https://dev.tight.com/v3/api-docs post /v6/config/integrations/mixpanel
Configure Mixpanel integration credentials
# Configure Moov
Source: https://docs.tight.com/api-reference/integrations/configure-moov
https://dev.tight.com/v3/api-docs post /v6/config/integrations/moov
Configure Moov integration credentials
# Configure Plaid
Source: https://docs.tight.com/api-reference/integrations/configure-plaid
https://dev.tight.com/v3/api-docs post /v6/config/integrations/plaid
Configure Plaid integration credentials
# Configure Qualpay
Source: https://docs.tight.com/api-reference/integrations/configure-qualpay
https://dev.tight.com/v3/api-docs post /v6/config/integrations/qualpay
Configure Qualpay integration credentials
# Configure Rutter
Source: https://docs.tight.com/api-reference/integrations/configure-rutter
https://dev.tight.com/v3/api-docs post /v6/config/integrations/rutter
Configure Rutter integration credentials
# Configure Salsa
Source: https://docs.tight.com/api-reference/integrations/configure-salsa
https://dev.tight.com/v3/api-docs post /v6/config/integrations/salsa
Configure Salsa integration credentials
# Configure Shopify
Source: https://docs.tight.com/api-reference/integrations/configure-shopify
https://dev.tight.com/v3/api-docs post /v6/config/integrations/shopify
Configure Shopify integration credentials
# Configure Square
Source: https://docs.tight.com/api-reference/integrations/configure-square
https://dev.tight.com/v3/api-docs post /v6/config/integrations/square
Configure Square integration credentials
# Configure Stripe
Source: https://docs.tight.com/api-reference/integrations/configure-stripe
https://dev.tight.com/v3/api-docs post /v6/config/integrations/stripe
Configure Stripe integration credentials
# Configure Twilio
Source: https://docs.tight.com/api-reference/integrations/configure-twilio
https://dev.tight.com/v3/api-docs post /v6/config/integrations/twilio
Configure Twilio integration credentials
# Configure Unit
Source: https://docs.tight.com/api-reference/integrations/configure-unit
https://dev.tight.com/v3/api-docs post /v6/config/integrations/unit
Configure Unit integration credentials
# Delete invoice
Source: https://docs.tight.com/api-reference/invoicing--invoices/delete-invoice
https://dev.tight.com/v3/api-docs delete /v6/invoicing/invoices/{id}
Delete an invoice for the given id
# Get invoice
Source: https://docs.tight.com/api-reference/invoicing--invoices/get-invoice
https://dev.tight.com/v3/api-docs get /v6/invoicing/invoices/{id}
Get an invoice for the given id
# Query invoices
Source: https://docs.tight.com/api-reference/invoicing--invoices/query-invoices
https://dev.tight.com/v3/api-docs post /v6/invoicing/invoices/query
Query invoices for the authenticated user
# Refund invoice
Source: https://docs.tight.com/api-reference/invoicing--invoices/refund-invoice
https://dev.tight.com/v3/api-docs post /v6/invoicing/invoices/{id}/refund
Refund an invoice for the given id
# Save invoices
Source: https://docs.tight.com/api-reference/invoicing--invoices/save-invoices
https://dev.tight.com/v3/api-docs post /v6/invoicing/invoices
Save new (or update existing) invoices
# Send invoice
Source: https://docs.tight.com/api-reference/invoicing--invoices/send-invoice
https://dev.tight.com/v3/api-docs post /v6/invoicing/invoices/{id}/send
Send an invoice, quote, or reminder for the given id
# Delete invoice item template
Source: https://docs.tight.com/api-reference/invoicing--item-templates/delete-invoice-item-template
https://dev.tight.com/v3/api-docs delete /v6/invoicing/itemTemplates/{id}
Delete an invoice item template for the given id
# Get invoice item template
Source: https://docs.tight.com/api-reference/invoicing--item-templates/get-invoice-item-template
https://dev.tight.com/v3/api-docs get /v6/invoicing/itemTemplates/{id}
Get an invoice item template for the given id
# Query invoice item templates
Source: https://docs.tight.com/api-reference/invoicing--item-templates/query-invoice-item-templates
https://dev.tight.com/v3/api-docs post /v6/invoicing/itemTemplates/query
Query invoice item templates for the authenticated user
# Save invoice item templates
Source: https://docs.tight.com/api-reference/invoicing--item-templates/save-invoice-item-templates
https://dev.tight.com/v3/api-docs post /v6/invoicing/itemTemplates
Save new (or update existing) invoice item templates
# Get invoicing setup
Source: https://docs.tight.com/api-reference/invoicing--setup/get-invoicing-setup
https://dev.tight.com/v3/api-docs get /v6/invoicing/setup
Get invoicing setup configuration for the authenticated user
# Save invoicing setup
Source: https://docs.tight.com/api-reference/invoicing--setup/save-invoicing-setup
https://dev.tight.com/v3/api-docs post /v6/invoicing/setup
Save invoicing setup configuration for the authenticated user
# Delete manual journal entry
Source: https://docs.tight.com/api-reference/manual-journal-entries/delete-manual-journal-entry
https://dev.tight.com/v3/api-docs delete /v6/accounting/manualJournalEntries/{id}
Delete a manual journal entry for the given id
# Get manual journal entry
Source: https://docs.tight.com/api-reference/manual-journal-entries/get-manual-journal-entry
https://dev.tight.com/v3/api-docs get /v6/accounting/manualJournalEntries/{id}
Get a manual journal entry for the given id
# Query manual journal entries
Source: https://docs.tight.com/api-reference/manual-journal-entries/query-manual-journal-entries
https://dev.tight.com/v3/api-docs post /v6/accounting/manualJournalEntries/query
Query manual journal entries for the authenticated user
# Save manual journal entries
Source: https://docs.tight.com/api-reference/manual-journal-entries/save-manual-journal-entries
https://dev.tight.com/v3/api-docs post /v6/accounting/manualJournalEntries
Save new (or update existing) manual journal entries
# Delete payment
Source: https://docs.tight.com/api-reference/payments/delete-payment
https://dev.tight.com/v3/api-docs delete /v6/payments/{id}
Delete a payment for the given id
# Get payment
Source: https://docs.tight.com/api-reference/payments/get-payment
https://dev.tight.com/v3/api-docs get /v6/payments/{id}
Get a payment for the given id
# Query payments
Source: https://docs.tight.com/api-reference/payments/query-payments
https://dev.tight.com/v3/api-docs post /v6/payments/query
Query payments for the authenticated user
# Save payments
Source: https://docs.tight.com/api-reference/payments/save-payments
https://dev.tight.com/v3/api-docs post /v6/payments
Save new (or update existing) payments
# Delete payroll
Source: https://docs.tight.com/api-reference/payroll/delete-payroll
https://dev.tight.com/v3/api-docs delete /v6/payroll/{id}
Delete a payroll entry for the given id
# Get payroll
Source: https://docs.tight.com/api-reference/payroll/get-payroll
https://dev.tight.com/v3/api-docs get /v6/payroll/{id}
Get a payroll entry for the given id
# Query payroll
Source: https://docs.tight.com/api-reference/payroll/query-payroll
https://dev.tight.com/v3/api-docs post /v6/payroll/query
Query payroll for the authenticated user
# Save payroll
Source: https://docs.tight.com/api-reference/payroll/save-payroll
https://dev.tight.com/v3/api-docs post /v6/payroll
Save new (or update existing) payroll
# Delete business type
Source: https://docs.tight.com/api-reference/templates/delete-business-type
https://dev.tight.com/v3/api-docs delete /v6/templates/businessTypes/{id}
Delete a business type
# Delete dimension
Source: https://docs.tight.com/api-reference/templates/delete-dimension
https://dev.tight.com/v3/api-docs delete /v6/templates/dimensions/{id}
Delete a dimension. Cannot delete dimensions with associated dimension values or children.
# Delete template rule
Source: https://docs.tight.com/api-reference/templates/delete-template-rule
https://dev.tight.com/v3/api-docs delete /v6/templates/rules/{id}
Delete a template rule for the given id
# Get business types
Source: https://docs.tight.com/api-reference/templates/get-business-types
https://dev.tight.com/v3/api-docs get /v6/templates/businessTypes
These are used to configure the various segments of your user base. Expense categories, chart of accounts, rules, and future learning algorithms smartly take your business types into account.
# Get chart of accounts templates
Source: https://docs.tight.com/api-reference/templates/get-chart-of-accounts-templates
https://dev.tight.com/v3/api-docs get /v6/templates/chartOfAccounts
These are used to configure the default chart of accounts for the various segments of your user base.
# Get template rule
Source: https://docs.tight.com/api-reference/templates/get-template-rule
https://dev.tight.com/v3/api-docs get /v6/templates/rules/{id}
Get a template rule for the given id
# Query dimensions
Source: https://docs.tight.com/api-reference/templates/query-dimensions
https://dev.tight.com/v3/api-docs post /v6/templates/dimensions/query
Query dimensions for the authenticated user. Use these to configure any dimensions that your users need to track against. These are what your users will see and can assign transactions to (e.g., Location, Job, Department, etc.). Dimensions can be hierarchical (e.g., Region -> Location -> Building).
# Query template rules
Source: https://docs.tight.com/api-reference/templates/query-template-rules
https://dev.tight.com/v3/api-docs post /v6/templates/rules/query
Query template rules for the authenticated user
# Save business types
Source: https://docs.tight.com/api-reference/templates/save-business-types
https://dev.tight.com/v3/api-docs post /v6/templates/businessTypes
Save a new (or update an existing) set of business types
# Save chart of accounts template
Source: https://docs.tight.com/api-reference/templates/save-chart-of-accounts-template
https://dev.tight.com/v3/api-docs post /v6/templates/chartOfAccounts
Save a new (or update an existing) chart of accounts template
# Save Chart of Accounts template mappings
Source: https://docs.tight.com/api-reference/templates/save-chart-of-accounts-template-mappings
https://dev.tight.com/v3/api-docs post /v6/templates/chartOfAccounts/{templateId}/mapping
Map GlobalGlAccounts to template GL accounts for transaction categorization.
# Save dimensions
Source: https://docs.tight.com/api-reference/templates/save-dimensions
https://dev.tight.com/v3/api-docs post /v6/templates/dimensions
Save a new (or update an existing) set of dimensions
# Save template rules
Source: https://docs.tight.com/api-reference/templates/save-template-rules
https://dev.tight.com/v3/api-docs post /v6/templates/rules
Save new (or update existing) template rules
# Delete task
Source: https://docs.tight.com/api-reference/time-tracking-tasks/delete-task
https://dev.tight.com/v3/api-docs delete /v6/timeTracking/tasks/{id}
Delete a time tracking task for the given id
# Delete transaction rule
Source: https://docs.tight.com/api-reference/transaction-rules/delete-transaction-rule
https://dev.tight.com/v3/api-docs delete /v6/banks/transactions/rules/{id}
Delete a transaction rule for the given id
# Get transaction rule
Source: https://docs.tight.com/api-reference/transaction-rules/get-transaction-rule
https://dev.tight.com/v3/api-docs get /v6/banks/transactions/rules/{id}
Get a transaction rule for the given id
# Query transaction rules
Source: https://docs.tight.com/api-reference/transaction-rules/query-transaction-rules
https://dev.tight.com/v3/api-docs post /v6/banks/transactions/rules/query
Query transaction rules for the authenticated user
# Save transaction rules
Source: https://docs.tight.com/api-reference/transaction-rules/save-transaction-rules
https://dev.tight.com/v3/api-docs post /v6/banks/transactions/rules
Save new (or update existing) transaction rules
# Playground
Source: https://docs.tight.com/playground
Explore the Tight Embedded End-to-End UX in the Playground
# Releases
Source: https://docs.tight.com/roadmap/releases
## **New Features & Enhancements**
### Agents & MCP
* Agents can now tailor a business's chart of accounts via MCP by adding and editing its
[General Ledger accounts](/api-reference/gl-accounts/save-gl-accounts).
## **Existing v5 Features Upgraded to v6**
### Bank Transactions
* Searching or filtering [bank transactions](/api-reference/bank-transactions/query-transactions) now returns a split
transaction when any of its line items match.
### Embedded UI
* You can now restyle the empty-state call-to-action buttons in the v6 embedded UI with new
[design tokens](/embeddable-ui/react/reference/design-tokens).
## **Fixes**
### Bank Transactions
* Users can now pick accounts imported from another accounting platform, such as QuickBooks Online, when merging
duplicates into a linked account in [Banks & Integrations](/embeddable-ui/react/banks-and-integrations).
* [Bank statements](/api-reference/bank-statements/query-bank-statements) now download soon after Plaid finishes
refreshing them, rather than waiting behind a backlog of transaction updates.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* Agents can now create and manage [payroll](/api-reference/payroll/query-payroll) entries via MCP.
## **Existing v5 Features Upgraded to v6**
### Payroll
* When a [bank transaction](/api-reference/bank-transactions/query-transactions) is linked to a payroll, expanding
the payroll now returns the individual line items the transaction is linked to.
### Bank Transactions
* Tax payments now appear as an expense category in the
[transaction form](/embeddable-ui/react/bank-transactions/transaction-form), instead of a separate type.
## **Fixes**
### Reports
* Drilling from Net Income on the [Cash Flow Statement](/embeddable-ui/react/financial-statements/cash-flow-statement)
into the [Profit & Loss report](/embeddable-ui/react/financial-statements/profit-loss-report) now carries the
report's customer and dimension filters and grouping.
* A [Balance Sheet](/api-reference/reports/balance-sheet) now exports to CSV successfully when an account's balance
is above \$21 million.
### Integrations
* QuickBooks: [imports](/embeddable-ui/react/imports/quickbooks-online-import) now record bill payments made by
credit card as bill payments rather than manual journal entries.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* Agents can now create and manage [categorization rules](/api-reference/transaction-rules/save-transaction-rules)
via MCP, including [partner-level template rules](/api-reference/templates/save-template-rules) that apply across
every company you manage.
## **Existing v5 Features Upgraded to v6**
### Payroll
* Payroll is now available in v6, with [save](/api-reference/payroll/save-payroll),
[query](/api-reference/payroll/query-payroll), and [get](/api-reference/payroll/get-payroll) operations covering a
payroll and its line items, such as net pay, employer tax, and employee benefit.
### Journal
* The [`Journal`](/embeddable-ui/react/accounting/journal) component is now available in the v6 embedded UI, where end
users can review journal entries with their debits and credits.
* An edit to one occurrence of a recurring
[manual journal entry](/api-reference/manual-journal-entries/save-manual-journal-entries) can now be applied to
every later occurrence at once with the new `SINGLE_RECURRENCE_AND_ALL_FUTURE` update type.
### General Ledger
* [General Ledger entries](/api-reference/gl-entries/query-gl-entries) can now be filtered by customer, with the
beginning and running balances recalculated for the filtered set.
### Bank Transactions
* A [payment](/api-reference/payments/query-payments) or
[bank transaction](/api-reference/bank-transactions/query-transactions) query can now expand its linked invoice
with the `apiSourceId` you assigned, so you can match it to your own invoice record without a second lookup.
### Embedded UI
* The [`FinancialOverview`](/embeddable-ui/react/financial-overview) dashboard now opens on the previous month by
default rather than the current one.
## **Fixes**
### Reports
* Specifying `accountingMethod: ACCRUAL` on a [Balance Sheet](/api-reference/reports/balance-sheet) report request
now returns the correct value for Current Income.
* Drilling from a report into the [General Ledger](/embeddable-ui/react/accounting/general-ledger) now carries the
report's dimension and customer filters, and returning by breadcrumb restores the report as it was left.
### Bank Transactions
* A money-in [bank transaction](/api-reference/bank-transactions/query-transactions) categorized to a `SUSPENSE`
General Ledger account now returns a `type` of `REVENUE` instead of `EXPENSE`.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* Agents can now read and write[ manual journal entries](/api-reference/manual-journal-entries/save-manual-journal-entries) via MCP.
* New MCP tooling for building and managing [chart of accounts templates](/api-reference/templates/save-chart-of-accounts-template).
* The new `generate_one_time_link` MCP tool returns a single-use login link, so an agent can drop a user straight into
your [Ready-to-Launch](/guides/launch-paths/ready-to-launch) experience.
### Authentication
* Partners using [Ready-to-Launch](/guides/launch-paths/ready-to-launch) can now generate
[one-time login links](/api-reference/auth/generate-one-time-link) for any of their users, including bookkeepers
accessing a specific business directly.
## **Existing v5 Features Upgraded to v6**
### Bank Reconciliation
* [Bank account queries](/api-reference/bank-accounts/query-bank-accounts) now return each account's reconciliation
state, including the end date of the most recent completed reconciliation.
### Journal
* [Journal entries](/api-reference/journal/query-journal-entries) now include a `typeDisplayName` alongside the raw
`type`.
## **Fixes**
### Bank Transactions
* [Saving a transaction](/api-reference/bank-transactions/save-transactions) now rejects an `originalCurrency` for
which no exchange rate is published, such as `MRU` or `MGA`, with a validation error on that field.
* Creating a [payment](/api-reference/payments/save-payments) with an `apiSourceId` already used on the same bank
account is now rejected as a duplicate.
* Choosing "Bank transfer" on a transaction in the embedded
[transaction form](/embeddable-ui/react/bank-transactions/transaction-form) now returns the matching transactions to
link against, including transfers already recorded on another account regardless of date.
### General Ledger
* Opening a payment-processor entry in the
[`GeneralLedger`](/embeddable-ui/react/accounting/general-ledger) component now fires
`OPEN_PROCESSOR_TRANSACTION_FORM` carrying the payment record, so a listener typed only to a bank transaction needs
to widen to accept both shapes.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* New MCP tools for [Bank Statements](/api-reference/bank-statements/query-bank-statements).
### Embedded UI
* Addition of new [design tokens](/embeddable-ui/react/reference/design-tokens) for improved customizability on the
navigation panel, menu controls, and expense and income overviews.
### Bank Transactions
* Incoming bank transactions now automatically match to processor transactions created through the API, not only
to processor payouts Tight ingested as part of its [payment processor integrations](/integrations/payment-processing/stripe).
## **Existing v5 Features Upgraded to v6**
### Embedded UI
* Transaction form events can now be received through dedicated `bankTransactionForm` and `processorTransactionForm`
listeners.
### Chart of Accounts
* The [Chart of Accounts](/embeddable-ui/react/accounting/chart-of-accounts) component is now available in the v6
embedded UI, where end users can manage accounts and drill into the General Ledger from an individual account.
### Journal
* The journal is now available in v6 through `POST /v6/reports/journal/query`, returning every journal entry in date
order with its debit and credit lines.
* [Manual journal entries](/api-reference/manual-journal-entries/save-manual-journal-entries) are now live in v6.
### Reports
* [Profit & Loss](/api-reference/reports/profit-and-loss), [Balance Sheet](/api-reference/reports/balance-sheet), and
[Cash Flow Statement](/api-reference/reports/cash-flow-statement) exports/emails are now available in the v6 embedded UI.
* The [Trial Balance report](/embeddable-ui/react/financial-statements/trial-balance-report) is now available in the v6
[`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component.
### General Ledger
* The [`GeneralLedger`](/embeddable-ui/react/accounting/general-ledger) component is now available in v6. Use it to search
ledger entries and recategorize transactions inline.
* Select any amount in the Balance Sheet and Cash Flow Statement report to drill down to the
[`GeneralLedger`](/embeddable-ui/react/accounting/general-ledger) component, filtered to the account and date range of
the selected amount.
## **Fixes**
### Companies
* [Company queries](/api-reference/company-management/query-companies) now return a `status` of `ACTIVE` or `INACTIVE`
on every company.
### Bank Transactions
* Saving a transaction as `TRANSFER_IN` or `TRANSFER_OUT` while removing all of its line items now succeeds instead of
failing with "Bank Transfers cannot have children".
* Updating or deleting a payment nested under a parent bank transaction no longer clears its `bankTransaction` link.
* [Saving a split transaction](/api-reference/bank-transactions/save-transactions) now requires every child to be
itemized by the same fields, so mixing children with and without a `customerId` or `dimensionValueIds` is rejected.
* The bank transaction form in the embedded UI now includes an editable Review Status field.
* [Deleting a payment](/api-reference/payments/delete-payment), or changing its amount or status, is now rejected when
that payment is matched to a bank transaction.
### Reports
* Suspense account balances, such as "Ask My Client", now appear under Other Expenses on the v6
[Profit & Loss](/api-reference/reports/profit-and-loss) report and reduce net income, matching v5.
### Embedded UI
* Selecting a status other than Active on the transaction, income, and expense dashboards now filters the list, and
Active appears as a visible default filter chip rather than being applied invisibly.
* Opening a transaction from a General Ledger row now fires `OPEN_BANK_TRANSACTION_FORM` with the full transaction in
`data` instead of `null`.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* New MCP tools for creating mileage and related entities, dimension values, time tracking, tax profile, transactions in
bulk, invoices, and payments.
### Integrations
* Integration credential configuration is now live in v6: save credentials for
[Plaid](/api-reference/integrations/configure-plaid), [Stripe](/api-reference/integrations/configure-stripe), and
seven other providers directly through the API.
* Plaid: a new `statementsEnabled` flag on [Plaid credentials](/api-reference/integrations/configure-plaid) turns on
bank statement syncing; the Statements product must first be enabled for your `client_id` in the Plaid Dashboard.
* Plaid: Added ability to automatically estimate beginning balances on all synced accounts. Reach out to the Tight team
to enable this feature.
## **Existing v5 Features Upgraded to v6**
### General Ledger
* The [query](/api-reference/gl-accounts/query-gl-accounts) and [save](/api-reference/gl-accounts/save-gl-accounts)
General Ledger account endpoints are now live in v6, so you can list a company's accounts and create, update, or
deactivate them.
* The [General Ledger entries query](/api-reference/gl-entries/query-gl-entries) accepts a new
`includeBeginningBalance` flag to request a beginning balance for non-balance-sheet accounts; balance sheet accounts
include one automatically.
## **Fixes**
### Bank Transactions
* Inserting a transaction line item with an `apiItemId` that already exists in the company now returns a validation
error instead of a generic exception.
* Line items on a split transaction can now be assigned personal (`EQUITY`-type) General Ledger accounts, which were
previously rejected as transfer accounts.
* Updating a payment transaction that came no longer clears its `apiProcessorPayoutId`; the transaction stays linked to
its payout.
### Vendors
* Syncing bank transactions no longer creates duplicate vendors when a matching vendor already exists, even one that is
inactive or was removed; the existing vendor is reused and is reactivated when tagged to an expense transaction.
### Integrations
* Adyen: outgoing internal transfers on an Adyen balance platform account are now recorded as expense transactions.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* The [`query_bank_transactions`](https://docs.tight.com/ai/mcp-tools/bank-transactions-mcp#query-bank-transactions)
MCP tool now supports cursor pagination and an `lastUpdatedDatetime` filter, and `update_bank_transaction` now enables
manually matching transfers and refunds.
### Conversations
* [Conversations](/api-reference/conversations/save-conversations) now support a `DRAFT` `resolutionStatus`; messages
added to a draft conversation are not visible to the business owner until the conversation is finalized.
### General Ledger
* The [General Ledger entries query](/api-reference/gl-entries/query-gl-entries) now accepts a `dimensionValues`
filter, with running balances computed within the filtered set.
### Embedded UI
* Transaction form events are now delivered through a single `transactionForm` listener in
`useEmbeddedEventListeners`.
* Dimension filter and group-by controls on the Profit & Loss report in the
[`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component are now enabled for all
partners.
* Keyboard navigation is improved across [embedded components](/embeddable-ui/tight-embeddable-ui): transactions
dashboard rows can be focused with Tab and opened with Enter or Space, and form fields, including the vendor and
customer selectors, are now reachable with Tab.
## **Existing v5 Features Upgraded to v6**
### Embedded UI
* The [Balance Sheet](/api-reference/reports/balance-sheet) and
[Cash Flow Statement](/api-reference/reports/cash-flow-statement) reports are now available in the
[`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component alongside Profit & Loss.
### General Ledger
* [General Ledger entries](/api-reference/gl-entries/query-gl-entries) now return the full General Ledger account
object on each entry and an `entity.secondaryDisplayName` that contains a secondary description of a transaction: for
bank transaction: the bank account, for invoices: the customer, for bills: the vendor.
## **Fixes**
### Bank Transactions
* Unsplitting a transaction (removing all of its child line items) no longer leaves it reported as a split parent
transaction.
* Instant or manual payouts from a connected payment processor now match to the corresponding bank transaction and
categorize automatically, instead of remaining unmatched.
### Vendors
* Saving a vendor that conflicts with an existing vendor now returns a `409` error suggesting merging duplicate
vendors, instead of a generic concurrent-request message.
### Integrations
* QuickBooks: migrations now import beginning balances for accounts nested at any depth in the balance sheet;
accounts more than five levels deep were previously skipped.
* Unit: bank accounts reopened on Unit's side are now reactivated automatically during sync, accounts closed in Unit
are marked removed, and accounts a user manually deactivated stay inactive.
* Plaid: [integrations](/api-reference/integration-management/query-integrations) now include an
`additionalConsentRequired` flag indicating when a bank connection needs re-consent to keep syncing, and embedded
components show a "Relink for Statements" badge that launches the Plaid re-consent flow, matching v5.
* Adyen: bank payouts are always recorded as withdrawal transactions on the user's Adyen account even when a matching
bank transaction is not in the system
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* The `update_bank_transaction` [MCP tool](https://docs.tight.com/ai/mcp-tools/bank-transactions-mcp#update-bank-transaction)
can now split a transaction into child line items, and `query_bank_transactions` output distinguishes parent rows
from child rows.
## **Existing v5 Features Upgraded to v6**
### General Ledger
* The [General Ledger entries query](/api-reference/gl-entries/query-gl-entries) now supports a free-text `search`
across an entry's description, date, and amount, returns a `type` for each entry (such as `EXPENSE`, `REVENUE`,
`TRANSFER_IN`, or `JOURNAL_ENTRY`), and includes a `beginningBalance` for balance sheet accounts.
### Bank Statements
* The v6 [bank statements query API](/api-reference/bank-statements/query-bank-statements) is now live, returning
uploaded bank statements with their `status`, a download `url`, and the statement `period`, filterable by bank
account.
### Embedded UI
* [Embedded components](/embeddable-ui/tight-embeddable-ui) now emit events for actions such as linking a bank through
Plaid or opening a form, which your application can handle through the new `useEmbeddedEventListeners` hook, with an
optional `preventDefault` flag to suppress the component's built-in behavior.
* Saving, updating, or deleting a record now gives clearer feedback; a toast notification confirms success or surfaces
an error when it completes.
## **Fixes**
### Bank Transactions
* Searching transactions by text containing characters outside the Latin-1 set no longer fails the request.
### Companies
* [Creating or updating a company](/api-reference/company-management/create-a-company) now validates the nested
`address`, including phone number format; addresses that previously passed without validation may now be rejected.
* Retrieving a company no longer returns an error when there is more than one user associated with the company.
### Webhooks
* Outgoing [webhook](/api-reference/webhooks) payloads larger than 4,500 characters are no longer truncated; the full
payload is now delivered.
### Embedded UI
* Fixed an issue in Chrome where opening a conversation attached to a transaction would move off the screen.
### Integrations
* Stripe: a charge that is also recorded as a Plaid bank transaction no longer fails to reconcile when the bank
transaction is processed before the charge; the charge is matched to the existing transaction instead of creating a
duplicate.
* QuickBooks: chart of accounts imports now handle account names containing commas, deeply nested sub-accounts, and
accounts identified by number.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* The MCP server now includes tools for querying and saving vendors and customers.
### Companies
* The [bank transaction query](/api-reference/bank-transactions/query-transactions) and summary endpoints now accept a
`company` filter to return transactions for a specific set of companies (up to five) in accountant and partner
sessions.
### Embedded UI
* Transaction review status names have been updated to be more clear, and relevant to the user's role. Business owners
and bookkeepers each see statuses relevant to their workflows.
## **Existing v5 Features Upgraded to v6**
### Reports
* All report API responses now return monetary amounts as integer cents (for example, `5000` rather than `50.00`);
margin percentages remain decimal values.
* Reports now support a `NONE` date grouping that returns a single total for the full reporting period without breaking
it out by month or quarter.
### Embedded UI
* The [`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component is now available in the
v6 React component library. It includes the new v6 Profit & Loss report, with placeholders for forthcoming v6 reports.
### Bank Accounts
* The [bank accounts query](/api-reference/bank-accounts/query-bank-accounts) endpoint now accepts an `apiName` filter
to return only accounts from a specific source, such as `PLAID` or `MANUAL_ENTRY`.
### Bank Transactions
* [Saving a bank transaction](/api-reference/bank-transactions/save-transactions) now enforces additional validations:
the assigned General Ledger account must be a leaf account (an account with no sub-accounts), line items cannot use a
bank-transfer account, and any referenced vendor must be active.
### General Ledger
* Querying [General Ledger entries](/api-reference/gl-entries/query-gl-entries) is now live in v6, returning each
entry's account, debit and credit amounts, and a running balance, with date-range, account, and accounting-method
(accrual or cash) filters.
### Integrations
* Payabli: Payabli invoice payments and refunds now sync automatically.
* Plaid: synced accounts are now matched by their exact account ID before falling back to the persistent account ID,
reducing cases where transactions were linked to the wrong bank account.
* QuickBooks: CSV imports now recognize a `Description` column header, and imports no longer fail when an invoice has no
associated payment.
## **Fixes**
### Embedded UI
* Payment processor accounts (such as Stripe) no longer appear on the bank account card on transaction dashboards; they
remain available under Banks & Integrations.
* The sender column in the conversations list now populates correctly.
* Over- and underpayment warnings on invoice line items are now legible on dark backgrounds.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Authorization
* Read-only access tokens are now available; they retain full read access, are rejected on write endpoints.
### Bank Transactions
* Bank transactions now support foreign currency in v6: [save](/api-reference/bank-transactions/save-transactions) accepts an
`originalCurrency`, and [responses](/api-reference/bank-transactions/query-transactions) include a `currencyInfo`
object with `originalCurrency`, `originalAmount`, and `exchangeDate`.
* Transaction dashboards now use a responsive card header (review status, bank account, and chart) that collapses to a
single column on narrow screens.
### Dimensions
* Dimension hierarchies are now limited to three levels, and bank transactions and payments accept a maximum of four
dimension values each.
## **Existing v5 Features Upgraded to v6**
### Taxes
* Canadian GST, HST, PST, and QST sales taxes are now auto-calculated and
[General Ledger account](/api-reference/gl-accounts/query-gl-accounts) responses include a `taxCategory` field on
expense accounts.
### Customers
* Query, save, get, and delete endpoints for the [customers](/api-reference/customers/query-customers) API (formerly
clients in v5) are now live in v6, with search by name and email on the query endpoint.
### General Ledger Accounts
* The [get](/api-reference/gl-accounts/get-gl-account) and [delete](/api-reference/gl-accounts/delete-gl-account)
General Ledger account endpoints are now live in v6.
### Reports
* The [Profit & Loss](/api-reference/reports/profit-and-loss) report is now included in v6 Components. Users can
generate P\&L reports on both an accrual or cash basis with filtering and grouping by dimension.
* The [Trial Balance](/api-reference/reports/trial-balance) report API is now live in v6.
* [Profit & Loss](/api-reference/reports/profit-and-loss) responses now include the grouping entity, such as a
dimension, when results are grouped.
* The [Profit & Loss](/api-reference/reports/profit-and-loss), [Balance Sheet](/api-reference/reports/balance-sheet),
[Trial Balance](/api-reference/reports/trial-balance), and
[Cash Flow Statement](/api-reference/reports/cash-flow-statement) report APIs now accept an empty request body,
defaulting the reporting period.
### Companies
* The [company query](/api-reference/company-management/query-companies) endpoint is now live in v6, returning the
companies accessible to an accountant or partner token.
### Bank Transactions
* [Bank transaction](/api-reference/bank-transactions/query-transactions) responses now include a `company` object for
accountant and partner sessions, identifying the owning company in cross-company queries.
* `lastUpdatedDateTime` is now returned in [bank transaction](/api-reference/bank-transactions/query-transactions)
responses.
* `subType` (for example, `CHECKING`) is now returned in bank account responses, matching v5.
* Users can now manage vendors and customers in the new v6 transaction settings menu.
### Integrations
* Payabli: new payment processing integration that syncs Payabli charges, payouts, and transfers as bank transactions.
* Plaid: relinking a bank connection no longer re-imports transactions that were already synced, preventing duplicates.
* Qualpay: activation now submits the complete tax identification and bank account details required to enable the
processor.
## **Fixes**
### Embedded UI
* On the [`FinancialOverview`](/embeddable-ui/react/financial-overview) dashboard, DIY (do-it-yourself) companies no
longer see the Conversations, Financial Summary, and Message Bookkeeper sections.
* Category and account SVG icons now properly support theme customization.
* Default filters have been standardized across all transactions dashboards and tables.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Reports
* The recently upgraded v6 Balance Sheet report supports filtering and grouping by dimension, enabling
multi-dimensional, end-to-end [dimension values](/guides/business-owners/dimensions) on any labels you define through
the dimension labels API.
## **Existing v5 Features Upgraded to v6**
### Payments
* The [save](/api-reference/payments/save-payments), [query](/api-reference/payments/query-payments),
[get](/api-reference/payments/get-payment), and [delete](/api-reference/payments/delete-payment) payment endpoints are
now live. Payment IDs use the `ptxn_` prefix and child line item IDs use the `tli_` prefix; `date`, `amount`, and
`description` are required on save.
### Reports
* The [Balance Sheet](/api-reference/reports/balance-sheet) report API is now live in v6.
### Bank Transactions
* [Save bank transactions](/api-reference/bank-transactions/save-transactions) now accepts
[payments](/api-reference/payments/save-payments) as children. `paymentId` field added to
[bank transaction](/api-reference/bank-transactions/query-transactions) child responses, identifying the linked
payment.
### Bills
* [Bills query](/api-reference/bills/query-bills) now supports a `billStatus` filter with `in` and `notIn` arrays,
alongside the existing `status` filter.
### Companies
* `phoneWork` on [company addresses](/api-reference/company-management/create-a-company) is now restricted to US and
Canada [E.164](https://www.itu.int/rec/T-REC-E.164) format. International numbers outside of US and Canada will be
rejected.
### Embedded UI
* New payment selector on v6 [bank transaction forms](/embeddable-ui/react/bank-transactions/transaction-form) lets
users link [payments](/api-reference/payments/save-payments) (e.g., Stripe charges) to a parent bank transaction
(e.g., a payout). Drawer-based selection includes search, filters, and total validation.
* Overpaid and Underpaid status labels added to invoice and bill line item sections on bank transaction forms, surfacing
mismatches between the transaction amount and linked line item totals.
* Review status display now shows role-specific labels: accountants see Discrepancy, Client Review, Needs Review, and
Staged; business owners see Needs Review, Discrepancy, Processing, and Reconciled.
### Integrations
* Plaid: bank sync now backfills any transactions missed by the standard sync within the configured date range.
* Gusto and Check: payroll expense matching now uses provider-specific logic. Gusto matches across all payroll fields
including benefits, while Check matches only the total debit amount.
## **Fixes**
### Embedded UI
* Tab key now traverses all form fields including date picker months and stays trapped within drawer forms.
### Bank Transactions
* Queries with enum-valued status filters (such as `reviewStatus`) on
[bank transactions](/api-reference/bank-transactions/query-transactions) now return the correct rows.
* [Save bank transactions](/api-reference/bank-transactions/save-transactions) no longer accepts new transactions that
are not Active.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Webhooks
* New [`bankNotLinkedAfterOnboarding`](/api-reference/webhooks) webhook event fires when a company completes onboarding
without linking a bank account.
### Embedded UI
* New `TightApp` component wraps multi-page embedded experiences with built-in navigation, drawer state tracking, and
anchor scrolling.
### Companies
* `phoneWork` on [address](/api-reference/company-management/create-a-company) now requires
[E.164 format](https://www.itu.int/rec/T-REC-E.164) (e.g., `+14155551234`). v5 did not enforce this format, so
payloads accepted by v5 may need to be reformatted before they pass v6 validation.
## **Existing v5 Features Upgraded to v6**
### Bank Transactions
* [Bank transactions](/api-reference/bank-transactions/query-transactions) filter `lastUpdatedDate` renamed to
`lastUpdatedDateTime` and now publicly documented.
* `amount` field on [bank transaction](/api-reference/bank-transactions/save-transactions) child line items is no longer
required.
### Invoicing
* [Invoices query](/api-reference/invoicing--invoices/query-invoices) endpoint now supports an `invoiceStatus` filter
with `in` and `notIn` arrays. The existing `status` filter is retained.
### Embedded UI
* The alert component now uses a responsive layout.
### Integrations
* Stripe: balance transactions with `financing_paydown` reporting category now categorize to the Loan Payable expense
category.
## **Fixes**
### Embedded UI
* Table rows no longer overflow their parent container on hover.
* Bank account rows no longer show "Processing" sub-text after the first sync completes; the label is now scoped to
accounts that have `syncTransactions` enabled but no `lastSyncedDate`, and "Not Synced" is scoped to accounts with
`syncTransactions` disabled.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Dimensions
* Dimension values now enforce parent-child hierarchy validation, automatically inferring the parent when a child
dimension value is provided.
* `child` field on a dimension is now nullable, supporting leaf-level dimensions without children.
### Embedded UI
* Cash Flow and Expense tiles on the [Business Owner Dashboard](/embeddable-ui/react/financial-overview) now
display month-over-month comparison chips.
* [Business Owner Dashboard](/embeddable-ui/react/financial-overview) transaction section now renders on mobile
with search and review capabilities.
## **Existing v5 Features Upgraded to v6**
### Bank Transactions
* [Bank transaction](/api-reference/bank-transactions/query-transactions) `type` field simplified to four public values:
`EXPENSE`, `REVENUE`, `TRANSFER_IN`, `TRANSFER_OUT`. Endpoints still accept previous values via version negotiation.
* `reviewStatus` values consolidated. Endpoints still accept previous values via version negotiation.
* `vendor` field on [bank transaction](/api-reference/bank-transactions/query-transactions) responses now returned only
on expense-type transactions.
* ID format validation now enforced on reference fields (`customerId`, `categoryId`, `glAccountId`, `invoiceId`,
`billId`, `payrollId`) when [saving transactions](/api-reference/bank-transactions/save-transactions).
* Maximum attachment count validation now enforced on
[bank transaction](/api-reference/bank-transactions/save-transactions) save operations.
### Bills
* [Bills query](/api-reference/bills/query-bills) endpoint now supports `search` filter and `DATE_PROXIMITY` sort
option.
### Invoicing
* [Invoices query](/api-reference/invoicing--invoices/query-invoices) endpoint now available in v6 with `search` filter
and `DATE_PROXIMITY` sort option.
### Payroll
* [Payroll query](/api-reference/payroll/query-payroll) endpoint now available in v6 with `search` filter. `amount`
field type widened from `Integer` to `Long`.
### Customers
* [Customer query](/api-reference/customers/query-customers) endpoint now supports `email` filter and `EMAIL` sort
option. `createdDateTime` field added to the response.
### Embedded UI
* Drag-and-drop attachment support now available on
[bank transaction forms](/embeddable-ui/react/bank-transactions/transaction-form).
* Customer selection modal with search and inline create added to bank transaction forms.
* Radio button indicators now display on single-select filter lists across dashboards.
* [Expense Dashboard](/embeddable-ui/react/bank-transactions/expense-dashboard) and
[Income Dashboard](/embeddable-ui/react/bank-transactions/income-dashboard) now available as standalone component
exports.
* Bank transaction form now submits only modified fields, reducing unnecessary writes.
## **Fixes**
### Bank Transactions
* Fixed revenue and expense validation when itemizing transactions.
* Fixed parent dimension value form validation on bank transaction forms.
* Fixed API error in [bank transaction summary](/api-reference/bank-transactions/query-transactions) when `groupBy`
parameter is omitted.
### Embedded UI
* Dashboard charts now update when transactions change and no longer query removed bank accounts.
### Webhooks
* Fixed persistence of non-latin1 characters in outgoing [webhook](/api-reference/webhooks) payloads.
### API
* Standardized error response for requests with missing request body.
* List filter parameters no longer cause errors when containing null values.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features/Enhancements**
### *Bank Transactions*
* Introduction of the [Expense](/embeddable-ui/react/bank-transactions/expense-dashboard) and [Income](/embeddable-ui/react/bank-transactions/income-dashboard) Dashboards in React Components.
* Ability to configure support for multi-dimensional transaction itemization, allowing end users to itemize transactions by customer and class segments such as location and department.
* Support for attaching invoices and bills to [bank transactions in v6 API](/api-reference/bank-transactions/save-transactions).
* Refactor to the `type` field on [bank transactions](/api-reference/bank-transactions/query-transactions) to introduce more granularity for display and filtering purposes.
### *Data Lakes*
* New column for lastUpdatedDate on General Ledger entry transactions.
* Added v6 IDs to transaction and lifecycle event data lake exports.
* Inclusion of deleted and unlinked bank accounts in data lake exports.
* Introduction of General Ledger Audit Trail in the Data Lakes.
## **Bug Fixes**
### *Invoicing*
* Fix issue preventing cancellation of recurring invoices in the embedded UI.
* The address field is now optional during tax filing.
* Fix for duplicate transactions appearing in Money In after removing a matched payout from an invoice.
### *API*
* Fix to 207 multi-status responses incorrectly returning 500 errors when an exception is thrown after validation passes.
* Fix to GL account ID resolution errors when querying transactions via v6 endpoints.
* Fix to include v6 revisions in the v5 Audit Trail API.
## **New Features/Enhancements**
### *Tax Updates*
* Updated 2026 Canada federal and provincial tax tables and 2025 US state tax constants to reflect the latest rates and brackets.
### *Data Lakes*
* New User Information data type (reflects [GET /userInfo](https://docs.tight.com/reference/getuserinfo))
* New User Tax Profile data type (reflects [GET /userTaxSetup](https://docs.tight.com/reference/getusertaxsetup))
* New Integrations data type (reflects [GET /integrations](https://docs.tight.com/reference/getintegrations))
* New Time Entries data type (reflects [GET /times](https://docs.tight.com/reference/gettimes))
* New columns for Bank Transactions: `bankTransferId` and `isPayout`
### *Integrations*
* Update to Plaid integration to update vendor information if modified after the transaction has already been posted.
### *API*
* V5 lifecycle event webhooks now include v6 entity IDs alongside v5 IDs, to better support the migration to v6.
* New DELETE /v6/company/ endpoint with `ENTITY_UPDATE` webhook for company status tracking.
* Updates to Year-End Closing logic to mark all transactions in a closed year as `RECONCILED`.
### *Imports*
* Xero imports now pull client details, including email, address, and phone number in addition to client name, for both new and existing Xero-connected users.
## **Bug Fixes**
### *Transactions*
* Revenue Rules created from transactions by a user are no longer being created in a 'Suggested' state.
* Improved General Ledger entry creation for Bank Transfers where the two sides fall in different months.
* Bug fix on the Income and Expenses Dashboards to correct search for a figure ending in zero.
### *Reports*
* Tax Report discrepancy fix caused by invoice sales tax being included as income in the Tax Details report.
* Fix to Business Revenue Report to only show invoice payments associated with the filtered businesses.
* Exception fix on Balance Sheet Report fix to render all data in totals/balances
### *Invoicing*
* API Fix where `dueDate` was not defined when the invoice term was set to `OTHER`, causing errors when finalizing the invoice.
Tight MCP server and bug fixes.
## **New Features/Enhancements**
### *MCP*
Tight’s MCP server is launched in sandbox and production. Please reach out for access.
* Release of Financial Statements MCP tools that support generating, analyzing, and drilling down into the core financial statements: Profit & Loss, Cash Flow Statement, and Balance Sheet.
* Release of Bank Transaction MCP tools that support reviewing, updating, and summarizing bank transaction data.
### *API*
* Added ability to create parent General Ledger accounts for more advanced CoA customization.
### *CSV Imports*
* Increased the maximum transaction upload limit from 500 to 2,500 transactions during CSV upload.
## **Bug Fixes**
### *API*
* Fix when pulling Plaid institution data into Tight SDK caused by a CORS error.
### *Bank Transactions*
* Bug fix to enable converting Stripe bank transfers to revenue.
* Update to pull bank transaction data when a deleted bank account is restored.
* Prevention of potential duplicate transactions after attaching a deposit to an invoice and subsequently moving the `tranStartDate` forward on the associated bank account.
### *Embedded UI*
* Fix to SDK’s `renderAccountantUserScreen` when switching between accountant users programmatically.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
### Plaid
* Enhancement to trigger a manual pull as a redundancy measure for any Plaid items that haven’t received a webhook for three days.
## **Bug Fixes**
* Fixes when converting Stripe bank transfers to other transaction types.
Data Lake enhancements and bug fixes.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **Data Lakes Enhancements**
* Updates to Bank Transactions Data Lakes to include pertinent General Ledger accounts for all transactions.
* Addition of General Ledger and Chart of Accounts to Data Lakes.
## **Bug Fixes**
* Idempotency fix to [DELETE /v5/expenses/expense](https://docs.tight.com/reference/deleteexpense).
* Fixed invoice validations to allow the removal of payment processor payments that are manually linked to invoices in error.
* Resolved a bug where draft invoices were incorrectly recorded as Services Income.
Tax Form updates, endpoint enhancements, and bug fixes.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
* **2025 US Tax Forms**: Updated Form 1040 Schedule C, Form 1065 population, Form 1120-S, and Form 1120 population for 2024 (commonly filed between April and October 2025), accessible through the Taxes Dashboard and via [API](https://www.hurdlr.com/reference/postreport).
## **Bug Fixes**
* Fixed monthly recurring transaction dates by respecting the user’s timezone.
* Bug fix to recurring invoice links to display the correct invoice PDF.
* Bug fixes to errors when sending certain Lifecycle events related to monthly closings.
Invoice enhancements, updated lifecycle events, and bug fixes
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
### Lifecycle Events
* New lifecycle event for bankStatementIngested for when a Plaid bank statement is ingested.
* Addition of transactionIds to transaction edit and creation events.
### Invoicing
* Improvements to automatic reconciliation for manual Stripe payouts.
* Improved auto-matching logic for direct invoice payments against invoice recurrences.
* Ability to cancel invoices refunded via payment processor via UI.
* Updated invoice email UI to replace the “Review & Pay” button with “Review” when no payment link is included (e.g for direct payments).
## **Bug Fixes**
* Fixed a bug causing delays to Tight’s asynchronous actions queue.
* Fix to include invoice identifier on [POST /invoice](https://docs.tight.com/reference/postinvoice) response for newly created invoices.
Bug fixes for Invoicing, Data Lakes, and the API.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent. Outside of this, Tight is primarily focused on bug fixes.
## **Bug Fixes**
### Invoicing
* Fixes to automatic payout reconciliation for manually initiated Stripe payouts.
* Improvements to the display of CC and BCC emails on invoices.
### Data Lakes
* Population of missing `userID` on `closingCompleted` events.
* Updates to the `accountingClosingCompleted` event to include the `closedByUserId` field
### API
* Fix to validation of beginning date on monthly closings.
Data Lakes updates, accounting import enhancements, and bug fixes
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
### Data Lakes
* **Journal Entries Data Lake**: Addition of journal entries to Data Lakes.
* **Transactions Data Lake**: Addition of GL account names for revenue transactions to Data Lakes.
* **Bank Accounts Data Lake**: Addition of `latestTransactionDate`, `latestStatementDate`, `latestCompletedClosingDate`, and `lastWebhookDatetime` for bank accounts to Data Lakes.
### Invoicing
* **Reopen Invoices**: Enhancement to allow the re-opening of canceled invoices, removing the need to duplicate them.
### Imports
* **Xero / QBO:** Update to support very large file sizes for Xero/QBO imports.
## **Bug Fixes**
### Integrations
* Compliance updates to hide the email field in Mixpanel events by default.
### Reports
* Fix to prevent reports from being cut off in preview UI.
* Fix to exclude newly archived invoices from report totals and Profit & Loss calculations.
### Invoicing
* Bug fix to payout-matching for Stripe payouts to prevent double-counting income and ensure accurate reconciliation for Stripe payouts.
Bug fixes for invoicing, transactions, reports.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent. Outside of this, Tight is primarily focused on bug fixes.
## **Bug Fixes**
### Invoicing
* Fix to invoice total calculation enabling users to close invoices when sales tax and discounts are applied.
* Update to correctly order the consumption of Stripe webhooks to ensure invoice payments are kept up-to-date with the Stripe API.
* Bug fix to the default invoice template to prioritize the invoice email over the default client email.
### Transactions
* Fix enabling users to split expenses over multiple bills.
### Reports
* Fix to the Expense and Income by Client reports to correctly display 'No Client' for expenses without clients, ensuring the report matches the Transactions Dashboard UI.
New Data Lakes, improvements to Bank Transactions, and bug fixes.
## **New Features/Enhancements**
### Data Lakes
* **Transactions Data Lake**: Addition of reviewStatus and client information to transactions data lake.
* **Balance History Data Lake**: New data lake for bank account balance history for Plaid-connected accounts.
* **Closings Data Lake**: Addition of monthly closings to Data Lakes.
* **Rules Data Lake**: Addition of expense and income rules to Data Lakes.
### Transactions
* **Unit Integration**: Unit integration updates to improve bank transaction refund matching.
* **Transactions Logic**: Updates to prevent the removal of invoiced expenses.
* **Receipt Display**: Updates to receipt logic to show file name if there is no thumbnail for clear distinction of receipts to attach to expenses.
## **Bug Fixes**
### Accounting
* Fix to show an alert when creating a new bank reconciliation with a date range that includes an existing Beginning Balance Journal Entry.
* Resolved an error preventing year-end closing prior to all reconciliations being completed including inactive reconciliations.
* Added validations to ensure inactive GL Accounts cannot be assigned as revenue accounts for transactions.
### Invoicing
* Fixed an issue where Stripe payments were not properly updating invoice statuses, ensuring invoices now move from “Processing” to the correct “Paid” status once payments are received.
* Fix to remove duplicate invoice entries in the General Ledger.
* Correction to automatic reconciliation of direct invoice payments to exclude invoices with processing payments.
* Bug fix to properly receive webhooks from Stripe for correct invoice payment processing.
* Fixes to Stripe payout matching based on Stripe webhook data.
OBBBA Tax Updates, Data Lake additions, and big fixes.
## **New Features/Enhancements**
### Taxes
* **One Big Beautiful Bill Act (OBBBA) 2025 Tax Changes**: Rollout of 2025 tax code changes introduced by the OBBBA, including standard deduction number updates, child tax credit increases, adjustments to the Qualified Business Income Deduction calculation, SALT limitation increases, and added support for tip and overtime deductions.
### Data Lakes
* **Data Lakes Additions**: Bank transaction rules, monthly closings, and a history of bank account balance data are now all available in the [Tight Data Lakes](https://docs.tight.com/docs/data-lakes).
### Bills
* **Partial Bill Payments**: Added support for partial payments, allowing multiple expenses to be applied to a single bill and validating against the remaining balance rather than requiring an exact match.
* **Bills API Identifier**: New custom identifier on the [POST /bills endpoint](https://docs.tight.com/reference/postbills) allowing external identifiers to be added to Bills.
## **Bug Fixes**
### API & Embedded UI
* Added validation on [DELETE /payment](https://docs.tight.com/reference/deletepayment) to validate against the deletion of Stripe card/ACH payments.
* Bug fix to allow the merging of bank accounts or updating of the start date even when the account requires a relink with Plaid to enable statements.
* Bug fix to correctly remove all historical transactions [bank account deletion](https://docs.tight.com/reference/deletebankaccount) when `removeAllTransactions` is true.
* Optimizations to application of [template rules](https://docs.tight.com/reference/postsetupexpenserules) to existing users.
* Fix to prevent crashes on Vendor UI forms.
### Invoicing
* Fix to properly label Time & Tasks so they no longer show as INVOICED when no longer attached to an invoice.
* Bug fix to allow the ability to input a full ZIP code in the Business Information section of Invoice Settings.
* Updates to automatically split long invoice messages onto two pages when they exceed a certain length.
* Bug fix to automatically create a Stripe customer when a client adds their default billing information to ensure they can be automatically charged.
Bug fixes for transactions, and integrations, and invoicing.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent. Outside of this, Tight is primarily focused on bug fixes.
## **Bug Fixes**
### Bank Transactions
* Fixes to update the `tranStartDate` on re-linked Plaid accounts to be the date of the latest transaction from the originally linked account to more precisely prevent duplicates.
* Bug fixes to correctly set `currencyType` on bank transactions from Plaid, Unit, and other integrations.
* Bug fixes to bank account merging when there are manual journal entries between the two bank accounts.
* Fixes to support CSV imports that create matching bank transfers with existing transactions.
### Integrations
* Fixes and improvements to Stripe payout matching related to instant and reversed payouts.
* Added validations preventing Stripe payments from being bulk deleted on the Income Dashboard, avoiding issues with payments that were already paid, archived, and duplicated for invoices.
### Invoicing
* Bug fix to correctly update GL entries for paid invoices when an item's income account has been updated.
* Bug fix to allow expenses and time & tasks to be deleted from an invoice and re-attached to other invoices.
* Updates to properly calculate the invoice total when attaching manual payments to invoices for expenses and/or time entries.
* Updates to the [/refundInvoice](https://docs.tight.com/reference/postrefundinvoice) endpoint so refunds correctly mark the paymentMethod instead of defaulting to DIRECT.
* Fix to correct business logo alignment on invoice PDFs.
* Fix to allow edits to recurring invoices in closed years.
Asynchronous CSV imports, improved API validations, and bug fixes.
## **New Features/Enhancements**
### CSV Imports
* Enhancement to make CSV imports asynchronous to prevent timeouts with larger files.
* Addition of a new banner to let users know when a CSV Import is in-progress, failed, or completed.
* Ability to view results after a CSV Import including the number of successful imports and a list of transactions that failed to import, if applicable.
### Invoicing
* **Scheduled Invoices**: Ability to print scheduled invoices prior to their being finalized.
* **Invoice Reminders**: Enhancement to send the invoice reminders and scheduled invoices during the day instead of at night, ensuring clients receive invoice reminders during daytime hours.
* **Direct Payment Matching**: Improvements to direct payment matching including a wider date range and better tie-breaking.
* **Sales Tax Updates**: Added API validation to restrict discounts to percentages when sales tax is applied at the item level, ensuring accurate tax calculations.
### Embedded UI
* **Tooltips Update**: Addition of tooltips to the Filter and Sync buttons on the Banks & Integrations screen.
* **Last Synced Update**: Update to display the last attempted data pull time on the "Last Synced" date instead of the last successful pull.
* **Revenue Rules**: Users can now create revenue rules from any revenue entry in the Embedded Experience.
### Webhooks
* **Integration Error Events**: Updates to the Integration Error lifecycle events to include more API error metadata.
### Accounting
* **Monthly Closing Validations**: Added validations to prevent monthly closings from having overlapping dates for the same bank account.
## **Bug Fixes**
### API
* Performance improvements when reconciling bank accounts with many transactions to ensure all transactions are marked as reconciled efficiently.
* Fixes to correctly return the `apiTransactionId` for bank transfers.
### Invoicing
* Fix to properly display invoice attachments on recurring invoices.
* Improvements to prevent all changes to a duplicated invoice from being reverted when the ‘Back’ option is selected.
### Integrations
* Improvements to bank account deduplication logic when there have been many unlinks and relinks of the same bank connection.
* Bug fix to update Rutter transactions to display the underlying integration’s name as the GL account name instead of "Rutter."
* Improvements to ensure transactions from Unit accounts pull in correctly and match payouts for accurate balances and totals.
* Bug fix to deactivate Bank Accounts during refresh when Plaid has removed them
* Fixes to Stripe matching in tie-breaking cases by using both the transaction’s identifier and the underlying source’s identifier.
* Bug fix to hide the Scheduled Closings feature on the Banks & Integrations screen if Plaid is not linked or bank reconciliations are not enabled.
### Transactions
* Fix to prevent flickering when saving an Expense Rule.
* Bug fix to allow recurring expenses to be deleted from the general ledger, journal, or balance sheet drilldown.
* Updates to properly create a revenue entry when auto classify is enabled and a payment is converted to revenue.
* Ensure matched bank transfers have a status of matched instead of active.
* Bug fix to set bank account’s transaction pull date as the earliest transaction date during a bank merge.
Client contact details on invoices, Unit integration improvements, and V6 transactions summary API.
## **New Features/Enhancements**
### Invoicing
* **Client Contact Details**: Expanded client contact details to support storing additional information such as address, phone number, and more.
* **Stripe Payouts**: Enhancements to Stripe payout matching to better support and reconcile payout reversals.
### Integrations
* **Unit Improvements**: Visual and organizational enhancements to Unit bank accounts in the Embedded UI along with support for setting start dates, pausing transactions, and setting beginning balances.
* **Stripe Permissions**: Ability for customer partners to block their users from unlinking integrations. Please reach out if you would like to enable this functionality.
* **Banks & Integrations**: UI improvements to the Banks & Integrations screen including updating icons and expanding the clickable area of each row for better usability.
### API
* **V6 Summary API**: Ability to [summarize bank transaction data](https://docs.tight.com/v6.0/reference/getbanktransactionssummary) in the V6 API.
* **Closings API**: Addition of a new [POST /closings](https://docs.tight.com/reference/postclosings) endpoint.
## **Bug Fixes**
### Transactions
* Updated default expense naming on the General Ledger Dashboard to display the Vendor name instead of "Manual Expense".
* Bug fix to ensure that all expenses in a recurring series are updated when the bank account is changed.
* Fixes to not alter the start date on bank account merges to avoid transactions from being removed.
* Corrected rule matching logic to support transaction description and vendor-based matches, improving rule application on historical transactions.
### Accounting
* Fix to exclude invoice payments and manual journal entries from bank reconciliation when their dates fall outside the reconciliation range.
* Ability to edit the equity side of a Beginning Balance entry.
* Corrected logic to ensure beginning balance entries are properly disconnected from bank accounts when those accounts are deleted to allow the modification of that entry.
* Bug fix to properly save a bank account's Beginning Balance in the "Edit a Bank Account" view.
### Integrations
* Fixes for accurate currency filtering for transactions ingested as part of the Rutter integration.
* Payroll fixes to display the integration’s name properly on all payroll forms.
### Reports
* Bug fix to support GL exports when descriptions contain multiple line breaks.
### Invoicing
* Added validations to prevent deposits from being automatically matched to recurring parent invoices, ensuring the invoice continues to recur as intended.
* Fix to properly convert invoice payments back to their original bank transaction once removed from an invoice.
* Fixed a UI issue where long client names were not displaying properly when adding payments to invoices.
* Updates to allow the removal of direct Stripe payments from invoices if an incorrect payment is applied.
* Corrected a bug that triggered the "Update Recurring Invoice" alert when only modifying the associated bank transaction.
Bank statements integrated into Closings UX, V6 Bank Transactions query API, and bug fixes.
## **New Features/Enhancements**
### Integrations
* **Bank Statements Integration**: Integration with Plaid’s Statements API to allow bookkeepers to pull Bank Statements directly into the Monthly Closing UX.
* **Rutter**: Ability to programmatically set the minimum transaction date for bank accounts connected with Rutter.
* **Gusto**: Improved dates on General Ledger entries for Gusto payrolls.
### API
* **V6 Bank Transactions Query API**: Early access to the [V6 Bank Transactions Query API](https://docs.tight.com/v6.0/reference/querybanktransactions). Note: there is still a possibility for backwards-incompatible changes as the Tight API team finalizes this new API.
* **Tax Estimates API:** Enhanced detail and additional fields for tax credit calculations on the [tax estimates API](https://docs.tight.com/reference/postgetestimates).
* **Delete bank account API**: New [DELETE /account API](https://docs.tight.com/reference/deletebankaccount) to provide the option to delete all associated transactions when deleting a specific bank account.
* **Invoicing API**: Addition of a `salesTaxPercentage` on [invoice line items](https://docs.tight.com/reference/postinvoice), useful for adding percent sales tax on invoices.
* **Entity Update Webhook:** Updates to send [entity update webhooks](https://docs.tight.com/docs/webhooks#entity_update) upon bank account creation/reactivation.
### Transactions
* **Transaction visibility:** UI update to show the whole transaction description in a tooltip when it is too long to fit on the transaction row.
* **New Vendor Update**: Update to auto-populate the new vendor field when searching for a vendor.
## **Bug Fixes**
### Transactions
* Correction to the Expense Dashboard overview to no longer include recurring parent transactions.
* API fix to correctly set the review status when tagging deposits as an invoice payment.
* Fix to properly bulk tag income categories on the Transaction Dashboard.
* Bug fix for an issue causing bulk deletion of expenses on the Transactions Dashboard to fail.
* Fixed an issue where pagination was not always correctly shown on the Vendor List.
### Accounting
* Corrections to display the field validation on a bank reconciliation’s start date when in a closed year.
* Fixes to remove any extra characters in transaction descriptions when downloading the General Ledger report.
* Fix to allow accountants to search for users on the teammates form.
* Fix to update the existing beginning balance entry when adding a monthly closing with a start date prior to that beginning balance entry.
* Corrected validations to prevent overlapping monthly and yearly closings.
### Integrations
* Fix to the Rutter integration for Shopify transactions to improve payout matching.
* API fix to correctly dedupe bank accounts when a Plaid Item is unlinked and subsequently relinked.
### Invoicing
* Fix to exclude archived/canceled invoices when selecting the next invoice number.
Improvements to the Rutter integration, API access to the Aged Accounts reports, and bug fixes.
## New Features/Enhancements
### Integrations
* **Rutter Updates:**
* Enhancements to the Rutter integration to include the order identifier on pertinent bank transactions.
* Updates to the Rutter integration to exclude transactions that do not match the user's currency.
* Changes to ingested transactions to exclude the Rutter description and instead display only the underlying integration’s name.
* **Integrations Endpoint:** Update to the [GET /integrations](https://docs.tight.com/reference/getintegrations) endpoint to support `lastUpdatedDate` and to include additional API fields.
* **Stripe Update:** Added idempotency to [POST /stripeAccountId](https://docs.tight.com/reference/poststripeaccountid) endpoint.
### Reports
* **Aged Accounts Payable:** Addition of the [Aged Accounts Payable report](https://docs.tight.com/reference/postagedaccountspayable) to the API.
* **Aged Accounts Receivable:** Addition of the [Aged Accounts Receivable report](https://docs.tight.com/reference/postagedaccountsreceivable) to the API.
### Embedded UI
* **Expense Categories:** Ability to create an expense category directly from the general ledger account form.
* **Rule Logic:** Improved rule conflict resolution UX when adding a new rule matching archived rules, giving the option to confirm whether to overwrite or delete the original.
* **Invoice filtering:** Improvements to filtering and sorting algorithms for potential bank transaction payment matches on the invoice form.
### Taxes
* **Tax Setup**: Enhancements to the Manual Filing Jointly tax flow to provide additional context for each field and minor label edits for clarity.
* **Tax Filing Data:** Introduction of tax filing data to Data Lakes, matching [GET /taxFilings](https://docs.tight.com/reference/gettaxfilings).
## Bug Fixes
### Bank Transactions
* API validation fix to require a child category to be used when categorizing expenses.
* Improvements to correctly load transactions with a trailing zero during a search.
* Bug fix to show the correct GL account on tax payments on the Transactions Dashboard.
* Bug fix to ensure matching bank transfers are correctly merged during bank merges.
### Accounting
* UI fixes to the companies drop down on the accountant dashboard.
* Fix to correctly render older year-end closing entries when opened from the journal.
* Corrected validation when attempting to create a monthly closing on an unsupported bank account.
### Bank Linkage
* Fix to Plaid relinks to not sync unsupported bank accounts.
### API
* Bug fix to correctly handle invalid JSON requests as client errors instead of server errors.
* Fixes to [GET /payment](https://docs.tight.com/reference/getpayments) to only include `bankTransferId` when the payment is part of a payout.
Enhanced bank linkage flows, improved vendor management, and bug fixes.
## New Features/Enhancements
### Bank Linkage
* **Initial Plaid Linkage:**
* New prompts to merge existing duplicate bank accounts (e.g. from a QBO migration) into newly linked accounts upon initial Plaid bank account linkage.
* Notification of which newly linked accounts have unsupported account types or sub types upon initial Plaid bank account linkage.
* **Banks & Integrations list:**
* Linked bank accounts are now separated by institution, with new institution level actions.
* Introduction of Synced and Not Synced filters.
* **Historical Pull:** Ability to pull historical transactions to a specific date at both the institution and the bank account levels.
* **Beginning Balances:** Ability to set and edit beginning balance entries directly from the bank account form.
* **Bank Account Merge:** Option to merge duplicate accounts for multiple accounts at once with improved validations to prevent duplicate bank transactions.
* **GL Account Naming:** Updates to keep GL account names in sync with updates from Plaid.
* **Mask Limitations**: Fixes for bank accounts whose mask has less than 4 characters.
### Vendor Management
* **Accountant Access**: Accountants now access the Vendor Dashboard for improved vendor management on behalf of users.
* **Vendor table**: New columns for Default Category and Expense Rules on the Vendor Dashboard to allow for more efficient vendor management.
* **Vendors API**: New enhancement to allow the ability to search by vendor name on [GET /vendors](https://docs.tight.com/reference/getvendors) endpoint.
* **Vendor Merge:** UI improvements to the vendor merge workflow for vendors with very long names.
### Transactions
* **Bulk Restoration**: Ability to bulk restore archived transactions on transactions-related dashboards.
* **Automatic Reconciliation of Direct Invoice Payments:** Improved tie-breaking when automatically reconciling direct invoice payments with invoices including matching on the invoice’s client’s name.
* **Advanced Search**: Improvement on the Expense Advanced Search to only show GL accounts that have associated expense categories and all bank accounts, including inactive/previously linked banks.
### Accounting
* **Accountant access**: Accountants can now update their user’s business information in the embedded experience.
* **QBO Import:** Updated context in the QBO Imports ‘Learn More’ section for pulling the correct files.
### Analytics
* **Transaction Events**: Addition of `transactionRecategorized` [lifecycle event](https://docs.tight.com/docs/lifecycle-event-dictionary#transaction-events) for tracking who recategorized which bank transactions.
* **Invoice Payment Events**: Enhancement to [lifecycle events](https://docs.tight.com/docs/lifecycle-event-dictionary#invoicing-events) for invoice payments to include the source API on invoice payment-related events.
## Bug Fixes
### Bank Transactions
* Fix to allow the creation of personal income transactions via direct [API](https://docs.tight.com/reference/postrevenues).
* Bug fix for Rutter transactions that were being accounted for in the incorrect GL account.
* Improvements to our CSV parsing algorithms for files with missing or blank columns.
### Invoicing
* Fixes to correctly use the business email set in the invoice settings instead of the account email when sending out invoices.
### Embedded UI
* Fix for the pending total to only include active bank accounts in the Historical Closings graph.
* UI fix in the Expenses Dashboard to remain on the exact page of transactions even after transaction updates.
* UI fixes for expenses split between multiple clients.
Introduction of the Wave Migration, a new payment processor, and template rules.
## New Features/Enhancements
### Imports
* **Wave:** Introduction of accounting migration from Wave in embedded UI and [API](https://docs.tight.com/reference/importwave).
* **CoA Mapping API**: New [endpoint](https://docs.tight.com/reference/postmappings) for mapping a user's CoA from their legacy accounting system into the Tight API for more complex migrations.
### Integrations
* **Qualpay:** Integration with new payment processor, [Qualpay](https://docs.tight.com/docs/qualpay).
* **Transaction Sync**: Ability to pause/unpause transaction ingestion for linked Stripe and Unit accounts directly on Banks & Integrations screen.
### Analytics
* **Lifecycle Events**: Added [lifecycle events](https://docs.tight.com/docs/lifecycle-event-dictionary#transaction-events) for transaction rules.
### Bank Transactions
* **Last Synced Date UI**: Bank accounts now reflect their “Last Synced Date” on the Banks & Integrations screen.
* **Advanced Search**: Ability to filter by status in the advanced search in Expense and Income Dashboards.
### Invoicing
* **Bulk deletion**: Ability to bulk delete invoice payments from transaction dashboards and via [API](https://docs.tight.com/reference/deletepayments).
* **Recurring Invoice Emails**: Option to toggle automatic emails for future recurring invoices.
### Embedded UI
* **Expense Rule Templates**: Exposed template rules in [API](https://docs.tight.com/reference/getrules) and embedded UI for bookkeepers and users to review.
* **Monthly Closings**: Updated validation to prevent the creation of monthly closings in closed years.
### API
* **Attachments:** API enhancement to filter [attachments](https://docs.tight.com/reference/getattachments) to a given entity.
* **Bank Accounts:** Minor [API](https://docs.tight.com/reference/getbankaccounts) update to return the `integrationId` on pertinent bank accounts.
## Bug Fixes
### API
* Fixed an issue that prevented manual journal entries from being submitted when line item descriptions were omitted.
* Resolved a bug that reset a business’s invoice prefix when the field was omitted from API requests.
* Fixed a bug where bank account changes on recurring expenses were not being properly saved.
### Integrations
* Fixed an error preventing the auto-charge payment method from working with relinked Stripe accounts.
* Stripe integrations and associated bank accounts are now correctly marked as archived when disconnected.
* Ensured historical Plaid transactions are consistently pulled, regardless of webhook delivery order.
Mileage SDKs, new Analytics events, and other Invoicing & Accounting enhancements.
## New Features/Enhancements
### Mileage
* **Native iOS SDK**: [automatic mileage tracking on iOS](https://docs.tight.com/docs/ios-mileage-tracking-sdk) mobile devices.
* **Native Android SDK**: [automatic mileage tracking on Android](https://docs.tight.com/docs/android-mileage-tracking-sdk) mobile devices.
* **APIs**: [GET](https://docs.tight.com/reference/getmileages), [POST](https://docs.tight.com/reference/savemileages), or [DELETE](https://docs.tight.com/reference/deletemileage) mileage records (for customer-partners building their own UX).
### Analytics
* **Lifecycle Events**: Expanded Lifecycle [Webhooks](https://docs.tight.com/docs/webhooks) and corresponding [list of events](https://docs.tight.com/docs/lifecycle-event-dictionary). The new events are also available via [Data Lakes](https://docs.tight.com/docs/data-lakes) and the [Mixpanel integration](https://docs.tight.com/docs/mixpanel-integration) should you wish to track this information in aggregate.
* While Tight recommends opting into consuming the new lifecycle webhooks, the existing webhooks remain available so as to not break existing implementation. Their documentation has been moved [here](https://docs.tight.com/docs/legacy-lifecycle-webhooks).
### Invoicing
* **Automatic Reconciliation of Direct Invoice Payments**: Automatic reconciliation of bank deposits against Invoices that accept direct payments.
* **Finalized Invoices:** Ability to edit both open and closed invoices.
* **Invoice Refund Tracking Improvements:** Enhancement to account for invoice payment refunds on the Transactions Dashboard.
### Accounting
* **Addition of Beginning Balance Field:** New API-only connection between bank account and its beginning journal entry to view beginningBalanceEntryId to properly track account balances.
* **Payout Matching Enhancements:** Support for bank transfers as children of payouts.
* **Reports API**: Ability to perform projections in the P\&L report in API.
* **Accountant Endpoint**: New endpoint [GET/accountant/userInfo](https://docs.tight.com/reference/getaccountantuserinfo) to retrieve info for an accountant.
### Embedded UI
* **Read-only parameter**: [Embedded UI](https://docs.tight.com/docs/embeddable-ui-getting-started#embedding-specific-components) `renderScreen` function now accepts `readOnly` option to make rendered screens read-only.
## Bug Fixes
### Invoicing
* Fix to now properly pull search results for invoice payments on transaction-related dashboards.
* Corrections to not show split expense parents on the invoice line item expense selection.
* Fixes to correctly track bank transfers converted to invoice payments as debits into the bank transfer’s bank account.
### Embedded UI
* UI fix to show all content in the onboarding banners on mobile devices.
* Minor UI fix to the manual journal entry form for long GL account names.
### Accounting
* Enabled the conversion between S Corp and C Corp to other entities without error.
* Fixes to allow the frontend to convert a payout’s itemized transactions.
* Fixes to historical payout matching, specifically when the status of itemized transactions are modified.
* Bench-imported accounts now correctly show with other migrated accounts.
### API
* API validation to prevent the deletion of default client(s).
* Corrected validations for invalid `clientId` on invoicing APIs.
* Correctly expose `reviewStatus` for invoice payments on [/getTransactions](/v5.0/api-reference/banks/get-transactions) endpoint.
### Integrations
* Bug fix to sync new accounts from Plaid when they are opened on the connection.
Revenue account selection on Invoice line items, Aged Accounts Payable report, and Transaction Rules in the Audit Trail.
## New Brand
Today, my team and I have soft-launched our new brand name, Tight, along with our new website at tight.com and new logo representing the flow and balance of debits and credits, bound together by a tight knot. This name was initially inspired by the saying “keep your books tight,” and also evoked “tight integration,” the essence of embedded accounting. Finally, it evolved into this: “When your customers do their accounting on YOUR platform – that’s Tight.”
Our new brand is reflective of the tight partnership we have with all of you. Your feedback and collaboration has been instrumental in our growth and product evolution. We’ve been investing heavily in our product and team (50% headcount increase over the past six months) and are continuing to build out new features to meet the needs of your users.
Otherwise, there is no other change; we are the same company, same team, and same product… we simply have a new brand name. [Hurdlr](https://www.hurdlr.com) remains as a direct-to-SMB mobile and web app for freelancers and small business. [Tight is the embedded accounting product](https://www.tight.com) that you have embedded into your software platforms to serve the small businesses that use your platform.
Thank you, and let's continue to keep it Tight!
## New Features/Enhancements
### Invoicing
* **Stripe Payment Processing:** Reduced Stripe merchant fees by automatically saving client payment methods.
* **Line Item Revenue Account:** Now allows selection of a revenue account for each invoice line item.
* **Email Errors API:** Programmatic access to setting email errors on invoices for use in Embedded UI.
* **Refund API:** A new [endpoint](https://docs.tight.com/reference/postrefundinvoice) has been added for programmatically refunding invoices.
* **Payment Processing Tutorial:** A new listener in the Embedded UI adds a CTA that allows customer partners to route users to a payment processing tutorial.
* **Invoice Audit Trail:** Ability to audit changes to invoices, including a history of client interactions. This functionality is currently only accessible from the accountant-facing Embedded UI and via [API](https://docs.tight.com/reference/auditinvoice).
* **Invoice Payments:** Minor UI update removes the prompt to set up a payment processor for an invoice when payments are already associated with that invoice.
### Bank Transactions
* **Audit Trail:** The Audit Trail now logs the rule used to categorize each transaction.
* **Rule Matching:** Expense rule matching now defaults to the most recent matching rule when multiple rules apply.
### Integrations
* **Rutter:** Enhanced payout matching for the Rutter integration.
* **Plaid:** Updated the Plaid integration to utilize the new `persistent_account_id` for better bank account de-duplication.
* **Integrations API:** Introduced a [DELETE /integration](https://docs.tight.com/reference/deleteintegration) endpoint for disconnecting a user’s integration via the Tight API.
* **Lifecycle Event:** Added the `INTEGRATION_REPAIRED` event to notify when an integration connection has been repaired.
### Reports
* **Aged Accounts Payable:** New Aged Accounts Payable report supported via both API and UX.
* **Aged Accounts Receivable:** Enhanced with drill-down functionality.
* **Trial Balance:** Updated to include custom data support on GL accounts, additionally reflected in the Trial Balance Report.
## Bug Fixes
### Accounting
* Fixed issues with deleting and restoring invoice payments.
* Corrected signage on manual journal entries in bank reconciliations.
* Added an alert when attempting to cancel an invoice in a closed year.
### Invoicing
* Corrected the display of clients in invoice settings on mobile devices.
* Fixed UI issues for invoice line items on mobile.
* Resolved some issues with expanding and reordering invoice line items.
* Enabled invoiced expenses to be reconciled.
* Corrected the UI for the source name on direct / cash invoice payments.
### Bank Transactions
* Prevented the matching of expenses to deleted payrolls.
* Corrected the API to more consistently include default clients on bank transactions when one is not provided.
### Client Management
* Fixed the API for fetching clients using a given businessId.
Release of Rutter integration, Manual Journal Entry API idempotency, and other API enhancements.
## New Features/Enhancements
### Integrations
* **Rutter Updates:** New integration with Rutter to provide access to [their many commerce integrations](https://docs.rutter.com/support-by-endpoint?activeTab=commerce).
### Accounting
* **Manual Journal Entries Update:** Support for [idempotency](https://en.wikipedia.org/wiki/Idempotence) on Manual Journal Entries API.
* **Bank Reconciliation:** Bank Reconciliations belonging to merged or otherwise deleted bank accounts will always be accessible in the Reconciliation Dashboard.
### Invoicing
* **External Invoicing Support:** Improved support for programmatically syncing Invoices from non-Hurdlr systems for tighter integrations with customer-partners’ external invoicing implementations.
* **Invoice Payments API:** Inclusion of `invoiceId` in response for INVOICE\_PAYMENT transactions on [POST /getTransactions](https://www.hurdlr.com/v5.0/api-reference/banks/get-transactions) endpoint for invoices.
### API
* **Account Creation Errors:** Improvements to account creation error handling providing more programmatic-safe error messages.
* **Account Restoration Authentication:** Support for Partner-level authentication on [POST/restoreAccount](https://www.hurdlr.com/reference/postpartnerrestoreaccount) endpoint.
* **Bank Transactions:** Ability to filter by \`reviewStatuses\` on [POST /getTransactions](https://www.hurdlr.com/v5.0/api-reference/banks/get-transactions).
### Imports
* **QBO Modern Report:** Updated instructions for exporting QBO’s “modern” reports when performing a [QBO Migration](https://www.hurdlr.com/docs/quickbooks-online) in the Embedded UI.
## Bug Fixes
### Accounting
* Manual Journal Entries are correctly included when pertinent bank accounts are merged.
* Corrections to ensure that Manual Journal Entries’ amounts display correctly on Bank Reconciliations.
* Fixes to properly split expenses belonging to [Manually Tracked Accounts](https://www.hurdlr.com/docs/transaction-dashboard-user-guide#manually-tracked-accounts) even after being merged into a Plaid-linked bank account.
### Bank Transactions
* Fixes to payout matching for advanced transaction types and negative payouts.
* Better handling of matching Bank Transfers when deleting or updating matches.
* Fixes to [POST/getTransactions](https://www.hurdlr.com/v5.0/api-reference/banks/get-transactions) when filtering on a specific Revenue \`id\`.
* Pagination bug fix on [GET /expenses](https://www.hurdlr.com/reference/getinterviewexpenses).
### Reports
* Fix to Financial Report drilldowns bug when multiple General Ledger accounts share the same account number.
### Imports
* Bug fix to correctly handle Revenue refunds in Bench import.
### Invoicing
* Correction to stop sending reminders on Invoices with a pending Invoice Payment.
* Fix to allow opening of attachments on Invoices.
* Ability to generate PDFs for Invoices migrated from legacy accounting platforms.
* Fixes to include CC and BCC emails when duplicating an Invoice.
### Tax
* Fixed bug causing crashes on the Tax Dashboard when rendering Embedded Experience in Spanish.
* Correction to the constant used on line 21 of the Schedule D (Form 1040).
### Embedded UI
* Bug fixes to Business Intelligence Tiles’ callback events to match their UI more accurately.
### API
* Fix to allow the account creation for bizNames that are shorter than 3 characters after the removal of whitespace.
Enhancements to the Invoicing user experience, Bank Transaction functionality, and availability of 2025 Tax Filing and Estimates.
## New Features/Enhancements
### Invoicing
* **Ability to edit finalized Invoices:** Ability for users to make edits to Invoices that have already been finalized and/or sent to their clients.
* **API Update:** Ability to include relevant Invoice Payment data on [GET /invoices](https://www.hurdlr.com/reference/getinvoices) via new API parameter, `includePayments`.
* **Invoice Message**: The Invoice message now allows emojis and other unicode characters.
* **Payment Processing Options:** Ability to specify what [Payment Processing options](https://www.hurdlr.com/docs/embeddable-user-interface-invoice-dashboard#3-modifying-the-payment-processing-options) users can accept on their Invoices in the Invoice Dashboard.
* **Recurring Invoices:** Improved UI to distinguish recurring Invoices in the Invoicing Dashboard.
### Bank Transactions
* **Expense Rules:** Ability to create Expense Rules without a Vendor; transactions matching such rules will use the Vendor already associated with the given transaction.
* **Plaid Historical Pull Improvements:** More robust validations in place during historical transaction pulls to avoid transaction duplicates for banking institutions that have been unlinked and relinked with Plaid.
* **Import CSV:** Update to display a transaction’s description as its Vendor when a Vendor is not provided during the review flow.
### Tax
* **2024 US Tax Forms**: Updated Form 1120-S and Form 1120 population for 2024 (commonly filed between April and October 2025), accessible through the Taxes Dashboard and via [API](https://www.hurdlr.com/reference/postreport).
* **2025 Canada Tax Estimates**: Review of all 2025 Canadian tax forms and subsequent updates to Hurdlr's tax engine for precise [Tax Estimates](https://www.hurdlr.com/docs/tax-calculations) on 2025 data with full Canadian support (federal and all 10 provinces).
### Integrations
* **Bank Account Refresh:** Updates to the Plaid integration to perform additional updates on Bank Account metadata if Plaid modifies this information.
* **Stripe Updates:** Inclusion of Stripe’s account identifier on [GET /integrations](https://www.hurdlr.com/reference/getintegrations).
### Imports
* **QBO Modern Report Support**: Support for QBO’s new “Modern” reports in the [QBO Import](https://www.hurdlr.com/reference/importqbo).
* **Import Validations**: Improved validations to the provided reports for easier self-service when performing Accounting Imports.
## Bug Fixes
### Accounting
* Fixed bug preventing the bulk tagging of Tax Payments.
* Fixes to GL Entry creation for matching Bank Transfers.
* Corrections to GL account names for Plaid-linked Bank Accounts to safely include the name of the corresponding banking institution.
### Bank Transactions
* Fixes to correctly update and/or unmatch a Bank Transfers matching Bank Transfer when relevant modifications are made to the match.
* Corrected the Audit Trail to now reflect "\ System" for all entries that are system generated.
* UI bug fixes to now correctly show the ‘Continue’ button when merging long lists of vendors.
### Reports
* Fix for directly embedding the Expenses by Category report.
New Invoicing Features: customizable business information and custom invoice numbers & formats.
## New Features/Enhancements
### Invoicing
* **Customizable Business Information:** Users can now control exactly what appears on their invoices by customizing business details.
* **Custom Invoice Numbers & Formats:** Ability to customize invoice numbers and formats at the Client and/or Invoice level.
* **QBO Import Updates:** The [QBO Import](/docs/qbo-import-user-guide#uploading-reports) now accepts the "Invoices and Received Payments" report for better Invoice and Payment matching.
* **Email Field Defaults:** Improved defaults for email-related fields in Invoicing APIs.
### Accounting
* **General Ledger Report API Enhancement:** The [API](/reference/postgeneralledger) now accepts `accountNo` for a simplified method to fetch General Ledger entries for specific GL accounts across multiple user accounts.
* **Bank Account Merging:** Deleted bank accounts with active monthly Closings will now always be included as potential duplicates.
### Taxes
* **2024 Tax Forms:** Updated Form 1040 Schedule C and Form 1065 population for 2024 (commonly filed between April and October 2025), accessible through the Taxes Dashboard and via [API](https://www.hurdlr.com/reference/postreport).
## Bug Fixes
### Accounting
* Fixed issues with drilling down into "Capital Stock," "Owner's Draw," and other related Equity accounts from the Balance Sheet.
* Corrected the duplication of General Ledger entries for archived and converted Bank Transactions.
* Fixed Journal Entries for Tax Payments, ensuring they update correctly when the linked bank account is changed.
* Addressed issues with saving Bank Reconciliations when matching Bank Transfers.
### Bank Transactions
* Resolved bug causing duplicate Plaid Bank Transactions.
* Fixed display issues for manually entered transactions merged into Plaid bank accounts.
### Imports
* Fixed issues with parsing Excel files during Xero Imports.
* Updated Bench import to support their latest offboarding package.
### Invoicing
* Fixed issue with archiving Invoice Payments attached to archived invoices.
* Removed the 'Create Link' option from scheduled invoices.
### Payroll
* Fixed the ability to attach Expense refunds to Payroll entries for better support of Payroll reversals.
Enhancements to user onboarding in the Embedded UI, Invoicing, and Bank Transaction classification.
## New Features/Enhancements
### Embedded UI
* More informative CTAs on zero states for the Expense, Revenue, Invoicing, and Time & Tasks Dashboards to help drive activation.
* Addition of [optional tooltips on each of the Business Intelligence tiles](https://www.hurdlr.com/docs/business-intelligence-tile-components#8-displaying-tile-tooltips) for better user education.
* New copy on the rule form to provide explanations for using rules.
* Inclusion of character counters on all text-area fields.
* Updates to prevent accountants from editing user-level information, e.g. email.
### Invoicing
* The Invoice message field now respects line breaks.
* Ability to edit Invoice settings inline in the Embedded UI.
* Addition of `status` filtering on [GET /invoices](https://www.hurdlr.com/reference/getinvoices)[.](https://www.hurdlr.com/docs/invoicing-api)
### Integrations
* API and UX handling of [new Plaid webhooks for pending disconnects](https://plaid.com/docs/api/items/#pending_disconnect).
* Enhancement to allow unlinked bank accounts to be merged into linked bank accounts.
### Transactions
* Improvements to vendor identification and matching on CSV and Accounting imports.
* UI and UX enhancements to the CSV Import in the Embedded UI.
* Improved transaction details in Income reports for Invoice Payments.
### Accounting
* More robust validations for General Ledger account numbers.
* Improved automated reconciliation of withdrawals against their corresponding payrolls.
* Accounting imports can be run on users that have already used Invoicing.
### Taxes
* Tax Estimates now use the last twelve months of user data when calculating projected estimates.
### API
* `userId` is now editable on [POST /userInfo](https://www.hurdlr.com/reference/postuserinfo).
* Partners can opt-in to release the `email` uniqueness constraint on Hurdlr accounts, useful for multi-company setups. Please reach out if you would like to opt in.
## Bug Fixes
### Accounting
* Fixes to timezone-related issues on Bank Reconciliation.
* Fix to the creation of bi-weekly Manual Journal Entries.
* Fix when updating a bank account’s GL account to ensure the update only impacts that bank’s transactions.
### Integrations
* Correctly hide deleted imported bank accounts.
* Fix to correctly display the bank account on manually imported transactions after being merged into a linked bank account.
### Invoicing
* Fix to allow for the reordering of invoice line items.
### Transactions
* Fixes to the attachment of receipts for an existing/tagged transaction.
### Payroll
* Fix to improve the matching of GL account categories for payroll.
* Bug fixes for processing and display of split Payroll expenses.
### Reports
* Fix to allow emailing of all downloadable reports.
Enhancements to Invoicing and Payroll and Bank Transaction matching algorithms.
## New Features/Enhancements
### Invoicing
* Addition of the Aged Accounts Receivable Report preview on the Invoicing Dashboard.
* Removal of limit to number of line items on invoice form.
* UI Improvements to visually disable ACH/CC payment options on invoices if Stripe is not linked.
### Integrations
* Addition of a [new endpoint](/reference/postintegration) which allows programmatic creation of OAuth linkages in the Hurdlr API for some of our native integrations, e.g. [Stripe](/integrations/payment-processing/stripe#connect-your-user’s-stripe-accounts).
* Inclusion of tax filing related [events for the Mixpanel integration](/docs/mixpanel-events).
### Accounting
* Improvements to Payroll and Bank Transaction matching algorithms.
* Update to completely hide duplicate bank accounts once merged.
### Embedded UI
* Minor enhancement to all dashboards to only allow one field dropdown to be open at a time.
## Bug Fixes
### Invoicing
* Fix to allow duplicating archived invoices.
* Fixes to allow deletion of QBO/Xero imported Invoice Payments.
### Accounting
* Fixes to conversions and matching of Bank Transfers during Bank Reconciliations.
* Fixes to split expense handling in Bank Reconciliations.
* Fixes to ensure pertinent Invoice Payments show on corresponding Bank Reconciliations.
* Time zone fixes to correctly reflect the correct date on manual Journal Entries.
* Fixes to tax treatment of “Dues and Subscription” expenses on the Form 1065 and tax reports.
### Patches
#### 41.8.1
* Time zone fixes for accurate transaction display on Bank Reconciliations.
Enhancements to Embedded UI versioning, Accounting Migrations, Invoicing, and Financial Reports.
## New Features/Enhancements
### Embedded UI
* Ability to delay opting into the latest releases of the [Embedded UI](/docs/embeddable-white-labeled-experience)
* Requires a [slight change](/docs/embeddable-ui-getting-started) in the way the Embedded UI is added to an your application. Existing implementations are safe.
### Imports
* Update to [QBO Import](/docs/quickbooks-online) to consume QBO’s "Invoices and Received Payments" report for improved invoice to payment matching.
### Invoicing
* Ability to filter to scheduled invoices from the [Invoice Dashboard](/docs/embeddable-user-interface-invoice-dashboard).
* Increased character limit of 800 for “Message” field on invoices.
* Updates to formatting of invoice lines items on the invoice form to be clearer and more consistent with the invoice PDF.
* Addition of dismissible Stripe Payment Processing setup CTAs.
### Reports
* Improved default ordering of reports on the [Report Dashboard](/docs/report-dashboard) to be more accounting focused.
### Accounting
* Addition of warning when merging bank accounts or vendors to indicate that the action cannot be undone.
### Transactions
* API addition of `reviewStatus` to transaction-related APIs, e.g. [POST /getTransactions](/v5.0/api-reference/banks/get-transactions).
* Minor language updates to conversion UI on [transaction forms](/docs/transaction-form).
## Bug Fixes
### Invoicing
* Fixes to `customData` on [GET invoices](/reference/getinvoices).
* Better error handling on [client invoice payment screen](/docs/embeddable-user-interface-client-invoice).
### Accounting
* Fixes to respect a user’s `availableFeatures.bookkeeping` when granting and revoking access to accountants in the Hurdlr API.
* Fix to prevent virtual bank accounts from using the same GL account.
### Transactions
* Fixes to [/getTransactions endpoint](/v5.0/api-reference/banks/get-transactions) to now include active TaxPayments.
* Fixes to bulk categorization from the [Transactions Dashboard](/docs/transactions-dashboard).
* Fixes to correctly expand the Bank Transfer form when editing withdrawal [payouts](/docs/payout-user-guide).
* Updates to Audit Trail to show the correct editor on the initial entry for all transactions.
### Patches
#### 41.7.1 through 41.7.2
Bug fixes and minor improvements.
Enhancements to Invoicing, Accounting, Bank Transactions, and API Authorization.
## New Features/Enhancements
### Invoicing
* Improvements to [Stripe Integration](/docs/stripe) for increased accuracy of matching Stripe [Payouts](/docs/payout-user-guide) to their itemized transactions, including Stripe Climate Contributions and other obscure items.
* Addition of “All” option to [Invoice Dashboard](/docs/embeddable-user-interface-invoice-dashboard) filters.
### Accounting
* Ability to specify both the cash and accrual transactions on a [Manual Journal Entry](/docs/general-ledger-component) via [API](/reference/postmanualjournalentry).
* Addition of the manualJournalEntry entity to our [Entity Update Webhooks](/docs/webhooks).
### Bank Transactions
* Improvement of the display of split expenses on all transaction-related dashboards.
* Ability to define the user-level and accountant-level access of individual transactions, via new userAccess and accountantAccess fields ([Revenue](/reference/postrevenue) for reference).
* Ability to merge bank accounts in the Embedded UI and API.
* Ability to merge vendors via UX and API.
### API
* Introduction of Partner-level authorization
## Bug Fixes
### Transactions
* Fixes to ingestion of [Stripe](/docs/stripe) payment data.
* Fixes to advanced filtering and searching on [transaction tables](/guides/business-owners/bank-transactions).
* Updates to the display of payment source information for better Invoice Payments UI.
* Fixes to customData on [Bank Transfer](/reference/postbanktransfer) entities.
### Reports
* Fixes to totals on the Aged Accounts Receivable Report.
* Fixes to drill down on the total column on the [Profit & Loss Report](/embeddable-ui/react/financial-statements/profit-loss-report).
### Bank Reconciliation
* Fix to the display of beginning balances when viewing completed Bank Reconciliations.
* Fixes to the bank institution logos displayed on the Reconciliation Dashboard.
### Patches
#### 41.6.1 through 41.6.5
Bugfixes and minor improvements.
#### 41.6.6
Modifications to support SDK versioning released in 41.7
Enhancements to Bank Transactions, Invoicing, Business Intelligence Tiles, and Bills
## New Features/Enhancements
### Bank Transactions
* All possible transaction conversions are now available via API.
* Ability to hide the overview graphs at the top of the [Expense](/docs/expense-dashboard) and [Income](/docs/income-dashboard) Dashboards in the Embedded UI. This can be accomplished by passing an additional parameter to the Embedded UI’s render options, `showDashboardOverview: false`
* Ability to [merge vendors via API](/reference/postvendor).
* Addition of `apiName` field via [POST /getTransactions API](/v5.0/api-reference/banks/get-transactions).
* Addition of a new [lifecycle event webhook](/docs/webhooks#4-lifecycle_event) for newly ingested uncategorized expenses, `EXPENSE_REVIEW_NEEDED`.
### Invoicing
* Income reports updated to include invoice payments for improved consistency between these reports and their respective Embedded dashboards.
* Improvement to bank transactions search on the invoice form.
### Business Intelligence Tiles
* Ability to hide the taxes line item on [Profit & Loss Tile](/docs/business-intelligence#3-profit--loss-tile) for a more accounting-centric view. This line item will be hidden automatically for Partners who are not using the Tax Tile.
### Bills
* Improvements to Bills in the Embedded UI to display the pertinent category on the bill row.
## Bug Fixes
### Accounting
* Fixes to correctly display Manual Journal Entry dates on Journal/[General Ledger](/docs/general-ledger-component) and to ensure the ability to delete Manual Journal Entries is accessible on all entries.
* Fixes to maintain “None” grouping filter when navigating to and from reports, e.g. for General Ledger drill downs.
### Invoicing
* Invoices will be marked as refunded when all of their payments are manually refunded via API.
* UI fixes to expanded display of Payouts on the [General Ledger Dashboard](/docs/general-ledger-component).
* Fixes to display of merchant fees on older Payouts in the [Transaction](/docs/transactions-dashboard)/[Income](/docs/income-dashboard) Dashboards.
* Fixes to ensure all canceled invoice payments are correctly hidden on active transaction views.
* Fixes to some total amount validation issues when matching multiple invoices to a single deposit.
* Ability to add [attachments without captions to invoices via API](/reference/uploadattachment).
* Fixes to display issues for older cash payments that lacked descriptions.
### Transactions
* More robust access to the Audit Trail for all transactions.
* Updates to the Advanced Search filters to allow bank accounts without an account mask to be selected.
* Fixes to transactions API to enable the creation of transactions without the specified client getting overwritten.
### Miscellaneous
* Improvement of idempotence on transaction `DELETE` endpoints so an error is no longer returned on already deleted entities.
* Updates to read-only users to correctly block editing of transactions in the [General Ledger](/docs/general-ledger-component).
### Patches
#### 41.5.1 through 41.5.3
Bugfixes and minor improvements.
#### 41.5.4
Modifications to support SDK versioning released in 41.7
New General Ledger API and improved display of the connection between the payout and its itemized transactions.
## New Features/Enhancements
### General Ledger
* The General Ledger can be exported as a CSV directly from the [General Ledger dashboard](/docs/general-ledger-component). The new report is also available via [API](/reference/postgeneralledger).
### Invoicing / Payouts
* Better display of the connection between the payout and its itemized transactions.
* Ability to match bank transactions directly from the Invoice form.
* Updates to cash/check payment language to reference “direct payments.”
* Invoice payments can be deleted via [DELETE /payment](/reference/deletepayment) endpoint.
* Improved title on the Invoice form to more accurately reflect the invoice’s status.
### Reports
* Support for multi-period [Cash Flow Statement](/docs/cash-flow-statement) in the Embedded UI.
* Performance improvements to [Cash Flow Statement](/v5.0/api-reference/reports/cash-flow-statement-direct) generation.
### UX Enhancements
* Updates to block Embedded UI screens based on users’ [available features](/docs/creating-a-user).
### Unit Integration
* Improvements to [Unit](/docs/unit-integration) transaction parsing for more detailed descriptions on transactions.
### BI Tiles
* Enhancements to the [Cash Flow tile](/docs/business-intelligence#4-cash-flow-tile) to more accurately depict users’ business cash flow and match the Cash Flow Statement.
* Enhancements to the [Income tile](/docs/business-intelligence#7-income-tile) and [Expense tile](/docs/business-intelligence#6-expense-tile) to include manual journal entries in totals.
## Bug Fixes
* Fixes to the 3-dot pagination loader at the bottom of all transaction-related dashboards.
* Fixes to loader in the zero state on the [General Ledger dashboard](/docs/general-ledger-component).
* Updates to the [Expense BI tile](/docs/business-intelligence#6-expense-tile) to only include business expenses.
* Correction to [Cash Flow Statements](/docs/cash-flow-statement) to correctly include security deposit expenses.
* Improvement to Attachments API to maintain a single invoice logo per business.
* Data fix to remove duplicate invoice payments for users that hit a rare duplicate payment bug.
* Fixes to correctly invoke invoicing payment processor listeners when setting up payment processing directly from the Invoice form.
Enhancements to Stripe Integration for improved connection to Hurdlr Invoicing.
## New Features/Enhancements
### Invoicing
* Stripe account data can be ingested via [POST /stripeAccountId endpoint](/v5.0/api-reference/invoicing/save-a-stripe-account).
* More detailed invoice payment data available via [API](/reference/getpayments).
* Invoices can be sent from the user’s business name instead of their email address.
### Accounting
* Support for recurring journal entries in the Embedded UI and [API](/reference/postmanualjournalentry).
### Transactions
* Ability to split expenses for business-only accounts into business and personal expenses.
* Update Bank Transfers to include additional metadata in [API](/reference/getbanktransfers).
### Embedded UI
* The ability to [hide animations in the Embedded UI](/docs/next-steps-user-interface#2-customizing-the-embedded-ui-to-match-your-branding).
## Bug Fixes
* Fix to JSON API response format for [Profit & Loss JSON report](/api-reference/reports/profit-and-loss).
* Fix to Balance Sheet for better handling of suspense accounts.
* Fixes to Cash Flow Statement to be consistent with other reports.
* Fixes to bank reconciliations on deleted bank accounts.
* Fixes to Chart of Accounts aggregate figures.
* UI fixes on invoice form.
* Minor display fixes for dates on the General Ledger.
* Fixes to transaction conversions.
Read-only scope for restricted access in the API and Embedded UI along with other enhancements to Invoicing and Bank Transactions
## New Features/Enhancements
### UX Enhancements
* User’s role can be set to `READ_ONLY` [via API](/reference/postuserinfo) to restrict the Embedded UI to a read-only view.
### Audit Trail
* Transactions can be audited in the Embedded UI and [via API](https://www.hurdlr.com/reference/auditexpense) to view a revision history for that transaction.
### Invoicing
* Inclusion of invoice payments in the [Transaction](/docs/transactions-dashboard) and [Income](/docs/income-dashboard) Dashboards.
* Update to invoice picker on the [Transaction](/docs/transactions-dashboard) and [Income](/docs/income-dashboard) Dashboards to include the invoice date.
* Stripe customer and payment data can be ingested via [POST /payments endpoint](/v5.0/api-reference/invoicing/process-payment).
### Transactions
* [The ability to render a single transaction form overlayed in the partner’s app](/docs/transaction-form).
* Enhanced matching and categorization of expense refunds.
### Reports
* UI support for pulling partial month Balance Sheets.
* Ability to generate comparative Trial Balance reports.
* Performance improvements for the Trial Balance report.
### Accounting Migrations
* Enhanced detection of revenue refunds in accounting imports.
* Enhancements to [QBO Import](/reference/importqbo) to handle reimbursed expenses.
### Bank Reconciliation
* Bank reconciliations automatically merged when corresponding bank accounts are merged.
### Analytics
* Enhancements to the [Mixpanel](/docs/mixpanel-integration) and [Intercom](/docs/intercom) integrations to accept expanded configurations.
## Bug Fixes
* Fixes to date handling on bank reconciliations.
* Fixes to drill-down reports.
* Fixes to Chart of Accounts to ensure correct balances are displayed.
* Fixes for timezone issues when pulling reports.
* Minor fixes to Bank Transfer conversions and matching.
* Update to [Stripe integration](/docs/stripe) so transactions always have distinct API ids.
Enhancements to Tax Estimates, Accounting Migrations, and API performance
## New Features/Enhancements
### Taxes
* Prior quarterly tax obligations always roll into the current quarter.
* Tax estimates displayed even with no business income tracked.
### Accounting Migrations
* Hurdlr [API](/v5.0/api-reference/imports/import-bench) and Embedded UI support for importing users’ data from Bench.
* Improved ingestion of invoices and invoice payments.
### Embedded UI Updates
* [Routing from the Business Intelligence Tiles](/docs/business-intelligence-tile-components#7-routing-the-tiles) can be defined on a specific set of tiles, allowing partners to still take advantage of Hurdlr’s expandable [Profit and Loss tile](/docs/business-intelligence#3-profit--loss-tile).
* `options.showAnimations` can be set to `false` to disable animations in the Embedded UI.
### API Improvement
* Addition of `deletedIds` to attachments API.
### Performance Enhancements
* Faster rendering of the Trial Balance report.
* Performance improvements for loading of the Journal and General Ledger.
## Bug Fixes
* Fixes for rendering the correct balances when flipping between the Profit & Loss and Balance Sheet.
* Fixes to the General Ledger rendering to ensure all entries are displayed.
* Fixes so scheduled invoices send on their scheduled date.
* UX fix for the Plaid [NO\_ACCOUNTS](https://plaid.com/docs/errors/item/#no_accounts) error, so the financial institution can be unlinked in the Embedded UI.
Enhancements to Bank Transaction automatic reconciliation and performance on the core Financial Reports.
## New Features/Enhancements
### Performance Enhancements
* Balance Sheet and Profit & Loss render 80% quicker (80% less latency).
* [General Ledger endpoint](/reference/getgeneralledgerentries) responds 15% quicker (15% less latency).
### Bank Transfer Matching
* Bank Transfers can be matched with any transaction of the same amount, which automatically converts to a Bank Transfer.
### Accounting Migrations
* [Xero](/reference/importxero) and [QBO](/reference/importqbo) migrations support importing XLS/XLSX files in addition to prior CSV support.
### Accountant Dashboard
* Accountants can [automatically get access to all users](/v5.0/api-reference/accountant/create-an-accountant) by setting `canAccessAllUsers` to `true`.
### Plaid
* New function added to render [Plaid Link directly over your existing onboarding UI](/docs/plaid-integration#4-plaid-link-new-implementation), removing the need to manually pass Plaid `access_tokens` to the Hurdlr API
### Transactions UI
* The `bankDescription` field will now be displayed when hovering over transaction rows on the transactions and reconciliation dashboards.
### Bug Fixes
* Fixes to `deletedIds` on [GET /generalLedgerEntries](/reference/getgeneralledgerentries).
* Fixes to CSV Import Completed alert to include counts for bank transfers and tax payments.
* Fixes to date filtering when drilling down into “Current Income” from Balance Sheet.
* Removal of Equity/Liabilities income from business income reports.
* Improved consistency of date-pickers throughout the Embedded UI.
Infrastructure improvements to general ledger, consuming APIs, and monitoring resulting in increased performance (financial reports spanning multiple years generated in milliseconds), robustness (stronger SLAs), and a SOC 2 Type 2 audit completed with zero exceptions. Public exposure of the Audit Trail.
Launch, including iterations with thousands of businesses, of multi-year imports from [QuickBooks Online](/docs/quickbooks-online) and [Xero](/docs/xero)
Launch of dedicated [Accountant Dashboard](/docs/bookkeeper-dashboard), to streamline operations for large Virtual Bookkeeping firms, while keeping the business owner-operator experience simple.
Launch of many [native integrations](/integrations/native-integrations) per customer-partner requests.
First public release of the Embedded UI, for new customer-partners desiring Hurdlr’s proven user experience.
First public release of the Hurdlr API, for the launch of Hurdlr’s first API customer-partner. This release made the Hurdlr API, privately consumed by hundreds of thousands of SMBs by way of the Hurdlr app (lanched in 2015), public for the first time.
Founded in 2012, API development started with the double-entry general ledger with full Audit Trail and then expanded into invoicing, income/expense tracking, financial statements, and income taxes. Learning the “Embedded” space did not yet exist, the Hurdlr app was built and ultimately released in 2015 to showcase the API’s features. The Hurdlr app ultimately grew to hundreds of thousands of small business owners, allowing the API to reach product maturity and cover the many edge cases faced by real users in production. In 2019, Hurdlr received its first organic API lead, realizing its initial API-first product vision.
# Roadmap
Source: https://docs.tight.com/roadmap/roadmap
Breakdown of Tight's ongoing high-level priorities and projects.
## Q2 2026
### Agents & MCP
* **Accounting Agent**: [Tight's Accounting Agent](/ai/agentic/agentic-accountant) will summarize of each business',
financial performance, based
on [configurable periods](/api-reference/agentic-accounting-settings/get-agentic-accountant-settings)
* **Self-Learning Categorization**: Improved accuracy and coverage of transaction categorization, enabled by an
AI-powered model
that [learns from transactions across 1.3M+ SMBs](/ai/categorization/self-learning-transaction-categorization-overview)
### Bank Transactions
* **Rule Engine Enhancements**: More expressive and powerful Rules to classify, categorize, and flag [Bank
Transactions](/guides/business-owners/bank-transactions) for review
* **Ongoing Bank Balance Checks**: Accounts with balances that are inconsistent with Tight's General Ledger will be
automatically flagged
### Dimension Tracking and Reporting
* **Integrated Tracking**: Assign hierarchical [dimension](/guides/business-owners/general-ledger#dimension-tracking)
defined by your
platform to transactions, invoices, and expenses
* **Report Groups & Filters**:
Generate [Profit & Loss reports](/embeddable-ui/react/financial-statements/profit-loss-report#profit-and-loss-report)
segmented by dimension to understand which locations, products, or projects are most profitable
## Q3 2026
### Agents & MCP
* **Bookkeeping and Support Agents**: Introduction
of [Tight's Bookkeeping Agent and Support Agent](/ai/agentic/agentic-accountant):
* Bookkeeping Agent: Detects anomalies in transaction data and reaches out to the user with questions to help
categorize transactions
* Support Agent: Provides support to users with deep context on their business and how Tight works
### Financial Statements
* **Financial Statement Components**: Refreshed Embedded UI
for [Balance Sheet](/embeddable-ui/react/financial-statements/balance-sheet),
[Cash Flow](/embeddable-ui/react/financial-statements/cash-flow-statement), [Profit & Loss](/embeddable-ui/react/financial-statements/profit-loss-report),
and [Trial Balance](/embeddable-ui/react/financial-statements/trial-balance-report) reports
* **Interactive Drill-Downs**: Click any line item on
any [financial report](/guides/business-owners/financial-statements#interactive-drill-downs)
to instantly see the underlying General Ledger entries that compose the figure
* **Report Grouping by Dimension**: Group [financial statements](/guides/business-owners/dimensions) by
location, product line, project, or department to understand which segments drive profitability
### Invoicing
* **Invoicing Components**: Refreshed Embedded UI for Invoicing pages, dashboards, and individual components
* **Invoice Line Item Templates**: Create and customize reusable Invoice Line Item Templates
* **Payment Installments**: Enable customers to pay invoices in multiple installments according to a predefined schedule
* **Invoice Advanced Search and Improved Sorting**: Improved filtering and sorting on the Invoicing Dashboard
### Accounting
* **Accounting Components**: Refreshed Embedded UI for Accounting pages, dashboards, and individual components
## Q4 2026
### Agents & MCP
* **Finance and Accounting Agents**: Introduction of the [Tight CFO Agent](/ai/agentic/agentic-accountant) and updates
to the Accounting Agent:
* Tight CFO Agent: Provides trend analysis and spend management guidance to business owners on all of their
historical data
* Tight Accounting Agent: New ability to perform bank statement reconciliations
* **Two-way Conversations via SMS**: Enable agents to request needed information directly from users via text message
conversations
### Bill Pay (A/P)
* **Bill Components**: New Embedded UI for Bill pages, dashboards, and individual components, built on Tight's proven
[Bills API](/api-reference/bills/query-bills)
* **Bill Payment Processing**: Automate recurring bill payments by sending money to vendors
### Accountant
* **Multi-Client Business Breakdown**: Provide a business-by-business view for accountants who support multiple clients
* **Closings Management**: Review all closings across businesses and insert pending reconciliations on
the day of month specified by the customer partner
* **Connections Management**: Review all linked bank accounts and connection statuses, run real-time balance
confirmations
to flag issues early, and surface institution-level connection outages
* **Transactions Management**: Review all transactions across businesses and filter transactions by review status
* **Comprehensive Audit Trail**: Review the Audit Trail across businesses and filter by business, accountant, and other
dimensions for faster auditing
### Audit Trail
* **Audit Trail Components**: Refreshed Embedded UI for Audit Trail pages, dashboards, and individual components
* **User-Level Audit Trail**: View of the Audit Trail at the user level, useful for auditing actions made by specific
accountants or users across all entities
## Q1 2027
### Accounting
* **Revenue Recognition Schedule**: Simplified entities for revenue recognition schedules, minimizing the need for
recurring journal entries
* **Asset Depreciation Schedule**: Simplified entities for depreciation schedules, minimizing the need for
recurring journal entries
* **Expense Amortization Schedule**: Simplified entities for expense amortization schedules, minimizing the need for
recurring journal entries
### Integrations
* **Parafin Integration**: Enhanced Capital integration to simply require key sharing (as opposed to forwarding from
Tight Data Lakes)
* **CapitalOS Integration**: Enhanced Capital integration to simply require key sharing (as opposed to forwarding from
Tight Data Lakes)
* **Pipe Integration**: Enhanced Capital integration to simply require key sharing (as opposed to forwarding from Tight
Data Lakes)
* **Salsa Payroll Integration**: Native integration with Salsa embedded payroll platform
### Invoicing
* **Multiple Invoice Templates**: Support for multiple, selectable Invoice Templates
* **Improved Quotes**: Functionality around clients accepting or rejecting quotes, including expiration dates
* **Google Pay / Apple Pay for Invoice Payments**: Integrating Google Pay / Apple Pay for Client Invoice Payments
# Releases
Source: https://docs.tight.com/roadmap/releases
## **New Features & Enhancements**
### Agents & MCP
* Agents can now tailor a business's chart of accounts via MCP by adding and editing its
[General Ledger accounts](/api-reference/gl-accounts/save-gl-accounts).
## **Existing v5 Features Upgraded to v6**
### Bank Transactions
* Searching or filtering [bank transactions](/api-reference/bank-transactions/query-transactions) now returns a split
transaction when any of its line items match.
### Embedded UI
* You can now restyle the empty-state call-to-action buttons in the v6 embedded UI with new
[design tokens](/embeddable-ui/react/reference/design-tokens).
## **Fixes**
### Bank Transactions
* Users can now pick accounts imported from another accounting platform, such as QuickBooks Online, when merging
duplicates into a linked account in [Banks & Integrations](/embeddable-ui/react/banks-and-integrations).
* [Bank statements](/api-reference/bank-statements/query-bank-statements) now download soon after Plaid finishes
refreshing them, rather than waiting behind a backlog of transaction updates.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* Agents can now create and manage [payroll](/api-reference/payroll/query-payroll) entries via MCP.
## **Existing v5 Features Upgraded to v6**
### Payroll
* When a [bank transaction](/api-reference/bank-transactions/query-transactions) is linked to a payroll, expanding
the payroll now returns the individual line items the transaction is linked to.
### Bank Transactions
* Tax payments now appear as an expense category in the
[transaction form](/embeddable-ui/react/bank-transactions/transaction-form), instead of a separate type.
## **Fixes**
### Reports
* Drilling from Net Income on the [Cash Flow Statement](/embeddable-ui/react/financial-statements/cash-flow-statement)
into the [Profit & Loss report](/embeddable-ui/react/financial-statements/profit-loss-report) now carries the
report's customer and dimension filters and grouping.
* A [Balance Sheet](/api-reference/reports/balance-sheet) now exports to CSV successfully when an account's balance
is above \$21 million.
### Integrations
* QuickBooks: [imports](/embeddable-ui/react/imports/quickbooks-online-import) now record bill payments made by
credit card as bill payments rather than manual journal entries.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* Agents can now create and manage [categorization rules](/api-reference/transaction-rules/save-transaction-rules)
via MCP, including [partner-level template rules](/api-reference/templates/save-template-rules) that apply across
every company you manage.
## **Existing v5 Features Upgraded to v6**
### Payroll
* Payroll is now available in v6, with [save](/api-reference/payroll/save-payroll),
[query](/api-reference/payroll/query-payroll), and [get](/api-reference/payroll/get-payroll) operations covering a
payroll and its line items, such as net pay, employer tax, and employee benefit.
### Journal
* The [`Journal`](/embeddable-ui/react/accounting/journal) component is now available in the v6 embedded UI, where end
users can review journal entries with their debits and credits.
* An edit to one occurrence of a recurring
[manual journal entry](/api-reference/manual-journal-entries/save-manual-journal-entries) can now be applied to
every later occurrence at once with the new `SINGLE_RECURRENCE_AND_ALL_FUTURE` update type.
### General Ledger
* [General Ledger entries](/api-reference/gl-entries/query-gl-entries) can now be filtered by customer, with the
beginning and running balances recalculated for the filtered set.
### Bank Transactions
* A [payment](/api-reference/payments/query-payments) or
[bank transaction](/api-reference/bank-transactions/query-transactions) query can now expand its linked invoice
with the `apiSourceId` you assigned, so you can match it to your own invoice record without a second lookup.
### Embedded UI
* The [`FinancialOverview`](/embeddable-ui/react/financial-overview) dashboard now opens on the previous month by
default rather than the current one.
## **Fixes**
### Reports
* Specifying `accountingMethod: ACCRUAL` on a [Balance Sheet](/api-reference/reports/balance-sheet) report request
now returns the correct value for Current Income.
* Drilling from a report into the [General Ledger](/embeddable-ui/react/accounting/general-ledger) now carries the
report's dimension and customer filters, and returning by breadcrumb restores the report as it was left.
### Bank Transactions
* A money-in [bank transaction](/api-reference/bank-transactions/query-transactions) categorized to a `SUSPENSE`
General Ledger account now returns a `type` of `REVENUE` instead of `EXPENSE`.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* Agents can now read and write[ manual journal entries](/api-reference/manual-journal-entries/save-manual-journal-entries) via MCP.
* New MCP tooling for building and managing [chart of accounts templates](/api-reference/templates/save-chart-of-accounts-template).
* The new `generate_one_time_link` MCP tool returns a single-use login link, so an agent can drop a user straight into
your [Ready-to-Launch](/guides/launch-paths/ready-to-launch) experience.
### Authentication
* Partners using [Ready-to-Launch](/guides/launch-paths/ready-to-launch) can now generate
[one-time login links](/api-reference/auth/generate-one-time-link) for any of their users, including bookkeepers
accessing a specific business directly.
## **Existing v5 Features Upgraded to v6**
### Bank Reconciliation
* [Bank account queries](/api-reference/bank-accounts/query-bank-accounts) now return each account's reconciliation
state, including the end date of the most recent completed reconciliation.
### Journal
* [Journal entries](/api-reference/journal/query-journal-entries) now include a `typeDisplayName` alongside the raw
`type`.
## **Fixes**
### Bank Transactions
* [Saving a transaction](/api-reference/bank-transactions/save-transactions) now rejects an `originalCurrency` for
which no exchange rate is published, such as `MRU` or `MGA`, with a validation error on that field.
* Creating a [payment](/api-reference/payments/save-payments) with an `apiSourceId` already used on the same bank
account is now rejected as a duplicate.
* Choosing "Bank transfer" on a transaction in the embedded
[transaction form](/embeddable-ui/react/bank-transactions/transaction-form) now returns the matching transactions to
link against, including transfers already recorded on another account regardless of date.
### General Ledger
* Opening a payment-processor entry in the
[`GeneralLedger`](/embeddable-ui/react/accounting/general-ledger) component now fires
`OPEN_PROCESSOR_TRANSACTION_FORM` carrying the payment record, so a listener typed only to a bank transaction needs
to widen to accept both shapes.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* New MCP tools for [Bank Statements](/api-reference/bank-statements/query-bank-statements).
### Embedded UI
* Addition of new [design tokens](/embeddable-ui/react/reference/design-tokens) for improved customizability on the
navigation panel, menu controls, and expense and income overviews.
### Bank Transactions
* Incoming bank transactions now automatically match to processor transactions created through the API, not only
to processor payouts Tight ingested as part of its [payment processor integrations](/integrations/payment-processing/stripe).
## **Existing v5 Features Upgraded to v6**
### Embedded UI
* Transaction form events can now be received through dedicated `bankTransactionForm` and `processorTransactionForm`
listeners.
### Chart of Accounts
* The [Chart of Accounts](/embeddable-ui/react/accounting/chart-of-accounts) component is now available in the v6
embedded UI, where end users can manage accounts and drill into the General Ledger from an individual account.
### Journal
* The journal is now available in v6 through `POST /v6/reports/journal/query`, returning every journal entry in date
order with its debit and credit lines.
* [Manual journal entries](/api-reference/manual-journal-entries/save-manual-journal-entries) are now live in v6.
### Reports
* [Profit & Loss](/api-reference/reports/profit-and-loss), [Balance Sheet](/api-reference/reports/balance-sheet), and
[Cash Flow Statement](/api-reference/reports/cash-flow-statement) exports/emails are now available in the v6 embedded UI.
* The [Trial Balance report](/embeddable-ui/react/financial-statements/trial-balance-report) is now available in the v6
[`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component.
### General Ledger
* The [`GeneralLedger`](/embeddable-ui/react/accounting/general-ledger) component is now available in v6. Use it to search
ledger entries and recategorize transactions inline.
* Select any amount in the Balance Sheet and Cash Flow Statement report to drill down to the
[`GeneralLedger`](/embeddable-ui/react/accounting/general-ledger) component, filtered to the account and date range of
the selected amount.
## **Fixes**
### Companies
* [Company queries](/api-reference/company-management/query-companies) now return a `status` of `ACTIVE` or `INACTIVE`
on every company.
### Bank Transactions
* Saving a transaction as `TRANSFER_IN` or `TRANSFER_OUT` while removing all of its line items now succeeds instead of
failing with "Bank Transfers cannot have children".
* Updating or deleting a payment nested under a parent bank transaction no longer clears its `bankTransaction` link.
* [Saving a split transaction](/api-reference/bank-transactions/save-transactions) now requires every child to be
itemized by the same fields, so mixing children with and without a `customerId` or `dimensionValueIds` is rejected.
* The bank transaction form in the embedded UI now includes an editable Review Status field.
* [Deleting a payment](/api-reference/payments/delete-payment), or changing its amount or status, is now rejected when
that payment is matched to a bank transaction.
### Reports
* Suspense account balances, such as "Ask My Client", now appear under Other Expenses on the v6
[Profit & Loss](/api-reference/reports/profit-and-loss) report and reduce net income, matching v5.
### Embedded UI
* Selecting a status other than Active on the transaction, income, and expense dashboards now filters the list, and
Active appears as a visible default filter chip rather than being applied invisibly.
* Opening a transaction from a General Ledger row now fires `OPEN_BANK_TRANSACTION_FORM` with the full transaction in
`data` instead of `null`.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* New MCP tools for creating mileage and related entities, dimension values, time tracking, tax profile, transactions in
bulk, invoices, and payments.
### Integrations
* Integration credential configuration is now live in v6: save credentials for
[Plaid](/api-reference/integrations/configure-plaid), [Stripe](/api-reference/integrations/configure-stripe), and
seven other providers directly through the API.
* Plaid: a new `statementsEnabled` flag on [Plaid credentials](/api-reference/integrations/configure-plaid) turns on
bank statement syncing; the Statements product must first be enabled for your `client_id` in the Plaid Dashboard.
* Plaid: Added ability to automatically estimate beginning balances on all synced accounts. Reach out to the Tight team
to enable this feature.
## **Existing v5 Features Upgraded to v6**
### General Ledger
* The [query](/api-reference/gl-accounts/query-gl-accounts) and [save](/api-reference/gl-accounts/save-gl-accounts)
General Ledger account endpoints are now live in v6, so you can list a company's accounts and create, update, or
deactivate them.
* The [General Ledger entries query](/api-reference/gl-entries/query-gl-entries) accepts a new
`includeBeginningBalance` flag to request a beginning balance for non-balance-sheet accounts; balance sheet accounts
include one automatically.
## **Fixes**
### Bank Transactions
* Inserting a transaction line item with an `apiItemId` that already exists in the company now returns a validation
error instead of a generic exception.
* Line items on a split transaction can now be assigned personal (`EQUITY`-type) General Ledger accounts, which were
previously rejected as transfer accounts.
* Updating a payment transaction that came no longer clears its `apiProcessorPayoutId`; the transaction stays linked to
its payout.
### Vendors
* Syncing bank transactions no longer creates duplicate vendors when a matching vendor already exists, even one that is
inactive or was removed; the existing vendor is reused and is reactivated when tagged to an expense transaction.
### Integrations
* Adyen: outgoing internal transfers on an Adyen balance platform account are now recorded as expense transactions.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* The [`query_bank_transactions`](https://docs.tight.com/ai/mcp-tools/bank-transactions-mcp#query-bank-transactions)
MCP tool now supports cursor pagination and an `lastUpdatedDatetime` filter, and `update_bank_transaction` now enables
manually matching transfers and refunds.
### Conversations
* [Conversations](/api-reference/conversations/save-conversations) now support a `DRAFT` `resolutionStatus`; messages
added to a draft conversation are not visible to the business owner until the conversation is finalized.
### General Ledger
* The [General Ledger entries query](/api-reference/gl-entries/query-gl-entries) now accepts a `dimensionValues`
filter, with running balances computed within the filtered set.
### Embedded UI
* Transaction form events are now delivered through a single `transactionForm` listener in
`useEmbeddedEventListeners`.
* Dimension filter and group-by controls on the Profit & Loss report in the
[`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component are now enabled for all
partners.
* Keyboard navigation is improved across [embedded components](/embeddable-ui/tight-embeddable-ui): transactions
dashboard rows can be focused with Tab and opened with Enter or Space, and form fields, including the vendor and
customer selectors, are now reachable with Tab.
## **Existing v5 Features Upgraded to v6**
### Embedded UI
* The [Balance Sheet](/api-reference/reports/balance-sheet) and
[Cash Flow Statement](/api-reference/reports/cash-flow-statement) reports are now available in the
[`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component alongside Profit & Loss.
### General Ledger
* [General Ledger entries](/api-reference/gl-entries/query-gl-entries) now return the full General Ledger account
object on each entry and an `entity.secondaryDisplayName` that contains a secondary description of a transaction: for
bank transaction: the bank account, for invoices: the customer, for bills: the vendor.
## **Fixes**
### Bank Transactions
* Unsplitting a transaction (removing all of its child line items) no longer leaves it reported as a split parent
transaction.
* Instant or manual payouts from a connected payment processor now match to the corresponding bank transaction and
categorize automatically, instead of remaining unmatched.
### Vendors
* Saving a vendor that conflicts with an existing vendor now returns a `409` error suggesting merging duplicate
vendors, instead of a generic concurrent-request message.
### Integrations
* QuickBooks: migrations now import beginning balances for accounts nested at any depth in the balance sheet;
accounts more than five levels deep were previously skipped.
* Unit: bank accounts reopened on Unit's side are now reactivated automatically during sync, accounts closed in Unit
are marked removed, and accounts a user manually deactivated stay inactive.
* Plaid: [integrations](/api-reference/integration-management/query-integrations) now include an
`additionalConsentRequired` flag indicating when a bank connection needs re-consent to keep syncing, and embedded
components show a "Relink for Statements" badge that launches the Plaid re-consent flow, matching v5.
* Adyen: bank payouts are always recorded as withdrawal transactions on the user's Adyen account even when a matching
bank transaction is not in the system
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* The `update_bank_transaction` [MCP tool](https://docs.tight.com/ai/mcp-tools/bank-transactions-mcp#update-bank-transaction)
can now split a transaction into child line items, and `query_bank_transactions` output distinguishes parent rows
from child rows.
## **Existing v5 Features Upgraded to v6**
### General Ledger
* The [General Ledger entries query](/api-reference/gl-entries/query-gl-entries) now supports a free-text `search`
across an entry's description, date, and amount, returns a `type` for each entry (such as `EXPENSE`, `REVENUE`,
`TRANSFER_IN`, or `JOURNAL_ENTRY`), and includes a `beginningBalance` for balance sheet accounts.
### Bank Statements
* The v6 [bank statements query API](/api-reference/bank-statements/query-bank-statements) is now live, returning
uploaded bank statements with their `status`, a download `url`, and the statement `period`, filterable by bank
account.
### Embedded UI
* [Embedded components](/embeddable-ui/tight-embeddable-ui) now emit events for actions such as linking a bank through
Plaid or opening a form, which your application can handle through the new `useEmbeddedEventListeners` hook, with an
optional `preventDefault` flag to suppress the component's built-in behavior.
* Saving, updating, or deleting a record now gives clearer feedback; a toast notification confirms success or surfaces
an error when it completes.
## **Fixes**
### Bank Transactions
* Searching transactions by text containing characters outside the Latin-1 set no longer fails the request.
### Companies
* [Creating or updating a company](/api-reference/company-management/create-a-company) now validates the nested
`address`, including phone number format; addresses that previously passed without validation may now be rejected.
* Retrieving a company no longer returns an error when there is more than one user associated with the company.
### Webhooks
* Outgoing [webhook](/api-reference/webhooks) payloads larger than 4,500 characters are no longer truncated; the full
payload is now delivered.
### Embedded UI
* Fixed an issue in Chrome where opening a conversation attached to a transaction would move off the screen.
### Integrations
* Stripe: a charge that is also recorded as a Plaid bank transaction no longer fails to reconcile when the bank
transaction is processed before the charge; the charge is matched to the existing transaction instead of creating a
duplicate.
* QuickBooks: chart of accounts imports now handle account names containing commas, deeply nested sub-accounts, and
accounts identified by number.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Agents & MCP
* The MCP server now includes tools for querying and saving vendors and customers.
### Companies
* The [bank transaction query](/api-reference/bank-transactions/query-transactions) and summary endpoints now accept a
`company` filter to return transactions for a specific set of companies (up to five) in accountant and partner
sessions.
### Embedded UI
* Transaction review status names have been updated to be more clear, and relevant to the user's role. Business owners
and bookkeepers each see statuses relevant to their workflows.
## **Existing v5 Features Upgraded to v6**
### Reports
* All report API responses now return monetary amounts as integer cents (for example, `5000` rather than `50.00`);
margin percentages remain decimal values.
* Reports now support a `NONE` date grouping that returns a single total for the full reporting period without breaking
it out by month or quarter.
### Embedded UI
* The [`ReportDashboard`](/embeddable-ui/react/financial-statements/report-dashboard) component is now available in the
v6 React component library. It includes the new v6 Profit & Loss report, with placeholders for forthcoming v6 reports.
### Bank Accounts
* The [bank accounts query](/api-reference/bank-accounts/query-bank-accounts) endpoint now accepts an `apiName` filter
to return only accounts from a specific source, such as `PLAID` or `MANUAL_ENTRY`.
### Bank Transactions
* [Saving a bank transaction](/api-reference/bank-transactions/save-transactions) now enforces additional validations:
the assigned General Ledger account must be a leaf account (an account with no sub-accounts), line items cannot use a
bank-transfer account, and any referenced vendor must be active.
### General Ledger
* Querying [General Ledger entries](/api-reference/gl-entries/query-gl-entries) is now live in v6, returning each
entry's account, debit and credit amounts, and a running balance, with date-range, account, and accounting-method
(accrual or cash) filters.
### Integrations
* Payabli: Payabli invoice payments and refunds now sync automatically.
* Plaid: synced accounts are now matched by their exact account ID before falling back to the persistent account ID,
reducing cases where transactions were linked to the wrong bank account.
* QuickBooks: CSV imports now recognize a `Description` column header, and imports no longer fail when an invoice has no
associated payment.
## **Fixes**
### Embedded UI
* Payment processor accounts (such as Stripe) no longer appear on the bank account card on transaction dashboards; they
remain available under Banks & Integrations.
* The sender column in the conversations list now populates correctly.
* Over- and underpayment warnings on invoice line items are now legible on dark backgrounds.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Authorization
* Read-only access tokens are now available; they retain full read access, are rejected on write endpoints.
### Bank Transactions
* Bank transactions now support foreign currency in v6: [save](/api-reference/bank-transactions/save-transactions) accepts an
`originalCurrency`, and [responses](/api-reference/bank-transactions/query-transactions) include a `currencyInfo`
object with `originalCurrency`, `originalAmount`, and `exchangeDate`.
* Transaction dashboards now use a responsive card header (review status, bank account, and chart) that collapses to a
single column on narrow screens.
### Dimensions
* Dimension hierarchies are now limited to three levels, and bank transactions and payments accept a maximum of four
dimension values each.
## **Existing v5 Features Upgraded to v6**
### Taxes
* Canadian GST, HST, PST, and QST sales taxes are now auto-calculated and
[General Ledger account](/api-reference/gl-accounts/query-gl-accounts) responses include a `taxCategory` field on
expense accounts.
### Customers
* Query, save, get, and delete endpoints for the [customers](/api-reference/customers/query-customers) API (formerly
clients in v5) are now live in v6, with search by name and email on the query endpoint.
### General Ledger Accounts
* The [get](/api-reference/gl-accounts/get-gl-account) and [delete](/api-reference/gl-accounts/delete-gl-account)
General Ledger account endpoints are now live in v6.
### Reports
* The [Profit & Loss](/api-reference/reports/profit-and-loss) report is now included in v6 Components. Users can
generate P\&L reports on both an accrual or cash basis with filtering and grouping by dimension.
* The [Trial Balance](/api-reference/reports/trial-balance) report API is now live in v6.
* [Profit & Loss](/api-reference/reports/profit-and-loss) responses now include the grouping entity, such as a
dimension, when results are grouped.
* The [Profit & Loss](/api-reference/reports/profit-and-loss), [Balance Sheet](/api-reference/reports/balance-sheet),
[Trial Balance](/api-reference/reports/trial-balance), and
[Cash Flow Statement](/api-reference/reports/cash-flow-statement) report APIs now accept an empty request body,
defaulting the reporting period.
### Companies
* The [company query](/api-reference/company-management/query-companies) endpoint is now live in v6, returning the
companies accessible to an accountant or partner token.
### Bank Transactions
* [Bank transaction](/api-reference/bank-transactions/query-transactions) responses now include a `company` object for
accountant and partner sessions, identifying the owning company in cross-company queries.
* `lastUpdatedDateTime` is now returned in [bank transaction](/api-reference/bank-transactions/query-transactions)
responses.
* `subType` (for example, `CHECKING`) is now returned in bank account responses, matching v5.
* Users can now manage vendors and customers in the new v6 transaction settings menu.
### Integrations
* Payabli: new payment processing integration that syncs Payabli charges, payouts, and transfers as bank transactions.
* Plaid: relinking a bank connection no longer re-imports transactions that were already synced, preventing duplicates.
* Qualpay: activation now submits the complete tax identification and bank account details required to enable the
processor.
## **Fixes**
### Embedded UI
* On the [`FinancialOverview`](/embeddable-ui/react/financial-overview) dashboard, DIY (do-it-yourself) companies no
longer see the Conversations, Financial Summary, and Message Bookkeeper sections.
* Category and account SVG icons now properly support theme customization.
* Default filters have been standardized across all transactions dashboards and tables.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Reports
* The recently upgraded v6 Balance Sheet report supports filtering and grouping by dimension, enabling
multi-dimensional, end-to-end [dimension values](/guides/business-owners/dimensions) on any labels you define through
the dimension labels API.
## **Existing v5 Features Upgraded to v6**
### Payments
* The [save](/api-reference/payments/save-payments), [query](/api-reference/payments/query-payments),
[get](/api-reference/payments/get-payment), and [delete](/api-reference/payments/delete-payment) payment endpoints are
now live. Payment IDs use the `ptxn_` prefix and child line item IDs use the `tli_` prefix; `date`, `amount`, and
`description` are required on save.
### Reports
* The [Balance Sheet](/api-reference/reports/balance-sheet) report API is now live in v6.
### Bank Transactions
* [Save bank transactions](/api-reference/bank-transactions/save-transactions) now accepts
[payments](/api-reference/payments/save-payments) as children. `paymentId` field added to
[bank transaction](/api-reference/bank-transactions/query-transactions) child responses, identifying the linked
payment.
### Bills
* [Bills query](/api-reference/bills/query-bills) now supports a `billStatus` filter with `in` and `notIn` arrays,
alongside the existing `status` filter.
### Companies
* `phoneWork` on [company addresses](/api-reference/company-management/create-a-company) is now restricted to US and
Canada [E.164](https://www.itu.int/rec/T-REC-E.164) format. International numbers outside of US and Canada will be
rejected.
### Embedded UI
* New payment selector on v6 [bank transaction forms](/embeddable-ui/react/bank-transactions/transaction-form) lets
users link [payments](/api-reference/payments/save-payments) (e.g., Stripe charges) to a parent bank transaction
(e.g., a payout). Drawer-based selection includes search, filters, and total validation.
* Overpaid and Underpaid status labels added to invoice and bill line item sections on bank transaction forms, surfacing
mismatches between the transaction amount and linked line item totals.
* Review status display now shows role-specific labels: accountants see Discrepancy, Client Review, Needs Review, and
Staged; business owners see Needs Review, Discrepancy, Processing, and Reconciled.
### Integrations
* Plaid: bank sync now backfills any transactions missed by the standard sync within the configured date range.
* Gusto and Check: payroll expense matching now uses provider-specific logic. Gusto matches across all payroll fields
including benefits, while Check matches only the total debit amount.
## **Fixes**
### Embedded UI
* Tab key now traverses all form fields including date picker months and stays trapped within drawer forms.
### Bank Transactions
* Queries with enum-valued status filters (such as `reviewStatus`) on
[bank transactions](/api-reference/bank-transactions/query-transactions) now return the correct rows.
* [Save bank transactions](/api-reference/bank-transactions/save-transactions) no longer accepts new transactions that
are not Active.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Webhooks
* New [`bankNotLinkedAfterOnboarding`](/api-reference/webhooks) webhook event fires when a company completes onboarding
without linking a bank account.
### Embedded UI
* New `TightApp` component wraps multi-page embedded experiences with built-in navigation, drawer state tracking, and
anchor scrolling.
### Companies
* `phoneWork` on [address](/api-reference/company-management/create-a-company) now requires
[E.164 format](https://www.itu.int/rec/T-REC-E.164) (e.g., `+14155551234`). v5 did not enforce this format, so
payloads accepted by v5 may need to be reformatted before they pass v6 validation.
## **Existing v5 Features Upgraded to v6**
### Bank Transactions
* [Bank transactions](/api-reference/bank-transactions/query-transactions) filter `lastUpdatedDate` renamed to
`lastUpdatedDateTime` and now publicly documented.
* `amount` field on [bank transaction](/api-reference/bank-transactions/save-transactions) child line items is no longer
required.
### Invoicing
* [Invoices query](/api-reference/invoicing--invoices/query-invoices) endpoint now supports an `invoiceStatus` filter
with `in` and `notIn` arrays. The existing `status` filter is retained.
### Embedded UI
* The alert component now uses a responsive layout.
### Integrations
* Stripe: balance transactions with `financing_paydown` reporting category now categorize to the Loan Payable expense
category.
## **Fixes**
### Embedded UI
* Table rows no longer overflow their parent container on hover.
* Bank account rows no longer show "Processing" sub-text after the first sync completes; the label is now scoped to
accounts that have `syncTransactions` enabled but no `lastSyncedDate`, and "Not Synced" is scoped to accounts with
`syncTransactions` disabled.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features & Enhancements**
### Dimensions
* Dimension values now enforce parent-child hierarchy validation, automatically inferring the parent when a child
dimension value is provided.
* `child` field on a dimension is now nullable, supporting leaf-level dimensions without children.
### Embedded UI
* Cash Flow and Expense tiles on the [Business Owner Dashboard](/embeddable-ui/react/financial-overview) now
display month-over-month comparison chips.
* [Business Owner Dashboard](/embeddable-ui/react/financial-overview) transaction section now renders on mobile
with search and review capabilities.
## **Existing v5 Features Upgraded to v6**
### Bank Transactions
* [Bank transaction](/api-reference/bank-transactions/query-transactions) `type` field simplified to four public values:
`EXPENSE`, `REVENUE`, `TRANSFER_IN`, `TRANSFER_OUT`. Endpoints still accept previous values via version negotiation.
* `reviewStatus` values consolidated. Endpoints still accept previous values via version negotiation.
* `vendor` field on [bank transaction](/api-reference/bank-transactions/query-transactions) responses now returned only
on expense-type transactions.
* ID format validation now enforced on reference fields (`customerId`, `categoryId`, `glAccountId`, `invoiceId`,
`billId`, `payrollId`) when [saving transactions](/api-reference/bank-transactions/save-transactions).
* Maximum attachment count validation now enforced on
[bank transaction](/api-reference/bank-transactions/save-transactions) save operations.
### Bills
* [Bills query](/api-reference/bills/query-bills) endpoint now supports `search` filter and `DATE_PROXIMITY` sort
option.
### Invoicing
* [Invoices query](/api-reference/invoicing--invoices/query-invoices) endpoint now available in v6 with `search` filter
and `DATE_PROXIMITY` sort option.
### Payroll
* [Payroll query](/api-reference/payroll/query-payroll) endpoint now available in v6 with `search` filter. `amount`
field type widened from `Integer` to `Long`.
### Customers
* [Customer query](/api-reference/customers/query-customers) endpoint now supports `email` filter and `EMAIL` sort
option. `createdDateTime` field added to the response.
### Embedded UI
* Drag-and-drop attachment support now available on
[bank transaction forms](/embeddable-ui/react/bank-transactions/transaction-form).
* Customer selection modal with search and inline create added to bank transaction forms.
* Radio button indicators now display on single-select filter lists across dashboards.
* [Expense Dashboard](/embeddable-ui/react/bank-transactions/expense-dashboard) and
[Income Dashboard](/embeddable-ui/react/bank-transactions/income-dashboard) now available as standalone component
exports.
* Bank transaction form now submits only modified fields, reducing unnecessary writes.
## **Fixes**
### Bank Transactions
* Fixed revenue and expense validation when itemizing transactions.
* Fixed parent dimension value form validation on bank transaction forms.
* Fixed API error in [bank transaction summary](/api-reference/bank-transactions/query-transactions) when `groupBy`
parameter is omitted.
### Embedded UI
* Dashboard charts now update when transactions change and no longer query removed bank accounts.
### Webhooks
* Fixed persistence of non-latin1 characters in outgoing [webhook](/api-reference/webhooks) payloads.
### API
* Standardized error response for requests with missing request body.
* List filter parameters no longer cause errors when containing null values.
See the [v5 release notes](/roadmap/v5/releases) for changes specific to v5.
## **New Features/Enhancements**
### *Bank Transactions*
* Introduction of the [Expense](/embeddable-ui/react/bank-transactions/expense-dashboard) and [Income](/embeddable-ui/react/bank-transactions/income-dashboard) Dashboards in React Components.
* Ability to configure support for multi-dimensional transaction itemization, allowing end users to itemize transactions by customer and class segments such as location and department.
* Support for attaching invoices and bills to [bank transactions in v6 API](/api-reference/bank-transactions/save-transactions).
* Refactor to the `type` field on [bank transactions](/api-reference/bank-transactions/query-transactions) to introduce more granularity for display and filtering purposes.
### *Data Lakes*
* New column for lastUpdatedDate on General Ledger entry transactions.
* Added v6 IDs to transaction and lifecycle event data lake exports.
* Inclusion of deleted and unlinked bank accounts in data lake exports.
* Introduction of General Ledger Audit Trail in the Data Lakes.
## **Bug Fixes**
### *Invoicing*
* Fix issue preventing cancellation of recurring invoices in the embedded UI.
* The address field is now optional during tax filing.
* Fix for duplicate transactions appearing in Money In after removing a matched payout from an invoice.
### *API*
* Fix to 207 multi-status responses incorrectly returning 500 errors when an exception is thrown after validation passes.
* Fix to GL account ID resolution errors when querying transactions via v6 endpoints.
* Fix to include v6 revisions in the v5 Audit Trail API.
## **New Features/Enhancements**
### *Tax Updates*
* Updated 2026 Canada federal and provincial tax tables and 2025 US state tax constants to reflect the latest rates and brackets.
### *Data Lakes*
* New User Information data type (reflects [GET /userInfo](https://docs.tight.com/reference/getuserinfo))
* New User Tax Profile data type (reflects [GET /userTaxSetup](https://docs.tight.com/reference/getusertaxsetup))
* New Integrations data type (reflects [GET /integrations](https://docs.tight.com/reference/getintegrations))
* New Time Entries data type (reflects [GET /times](https://docs.tight.com/reference/gettimes))
* New columns for Bank Transactions: `bankTransferId` and `isPayout`
### *Integrations*
* Update to Plaid integration to update vendor information if modified after the transaction has already been posted.
### *API*
* V5 lifecycle event webhooks now include v6 entity IDs alongside v5 IDs, to better support the migration to v6.
* New DELETE /v6/company/ endpoint with `ENTITY_UPDATE` webhook for company status tracking.
* Updates to Year-End Closing logic to mark all transactions in a closed year as `RECONCILED`.
### *Imports*
* Xero imports now pull client details, including email, address, and phone number in addition to client name, for both new and existing Xero-connected users.
## **Bug Fixes**
### *Transactions*
* Revenue Rules created from transactions by a user are no longer being created in a 'Suggested' state.
* Improved General Ledger entry creation for Bank Transfers where the two sides fall in different months.
* Bug fix on the Income and Expenses Dashboards to correct search for a figure ending in zero.
### *Reports*
* Tax Report discrepancy fix caused by invoice sales tax being included as income in the Tax Details report.
* Fix to Business Revenue Report to only show invoice payments associated with the filtered businesses.
* Exception fix on Balance Sheet Report fix to render all data in totals/balances
### *Invoicing*
* API Fix where `dueDate` was not defined when the invoice term was set to `OTHER`, causing errors when finalizing the invoice.
Tight MCP server and bug fixes.
## **New Features/Enhancements**
### *MCP*
Tight’s MCP server is launched in sandbox and production. Please reach out for access.
* Release of Financial Statements MCP tools that support generating, analyzing, and drilling down into the core financial statements: Profit & Loss, Cash Flow Statement, and Balance Sheet.
* Release of Bank Transaction MCP tools that support reviewing, updating, and summarizing bank transaction data.
### *API*
* Added ability to create parent General Ledger accounts for more advanced CoA customization.
### *CSV Imports*
* Increased the maximum transaction upload limit from 500 to 2,500 transactions during CSV upload.
## **Bug Fixes**
### *API*
* Fix when pulling Plaid institution data into Tight SDK caused by a CORS error.
### *Bank Transactions*
* Bug fix to enable converting Stripe bank transfers to revenue.
* Update to pull bank transaction data when a deleted bank account is restored.
* Prevention of potential duplicate transactions after attaching a deposit to an invoice and subsequently moving the `tranStartDate` forward on the associated bank account.
### *Embedded UI*
* Fix to SDK’s `renderAccountantUserScreen` when switching between accountant users programmatically.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
### Plaid
* Enhancement to trigger a manual pull as a redundancy measure for any Plaid items that haven’t received a webhook for three days.
## **Bug Fixes**
* Fixes when converting Stripe bank transfers to other transaction types.
Data Lake enhancements and bug fixes.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **Data Lakes Enhancements**
* Updates to Bank Transactions Data Lakes to include pertinent General Ledger accounts for all transactions.
* Addition of General Ledger and Chart of Accounts to Data Lakes.
## **Bug Fixes**
* Idempotency fix to [DELETE /v5/expenses/expense](https://docs.tight.com/reference/deleteexpense).
* Fixed invoice validations to allow the removal of payment processor payments that are manually linked to invoices in error.
* Resolved a bug where draft invoices were incorrectly recorded as Services Income.
Tax Form updates, endpoint enhancements, and bug fixes.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
* **2025 US Tax Forms**: Updated Form 1040 Schedule C, Form 1065 population, Form 1120-S, and Form 1120 population for 2024 (commonly filed between April and October 2025), accessible through the Taxes Dashboard and via [API](https://www.hurdlr.com/reference/postreport).
## **Bug Fixes**
* Fixed monthly recurring transaction dates by respecting the user’s timezone.
* Bug fix to recurring invoice links to display the correct invoice PDF.
* Bug fixes to errors when sending certain Lifecycle events related to monthly closings.
Invoice enhancements, updated lifecycle events, and bug fixes
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
### Lifecycle Events
* New lifecycle event for bankStatementIngested for when a Plaid bank statement is ingested.
* Addition of transactionIds to transaction edit and creation events.
### Invoicing
* Improvements to automatic reconciliation for manual Stripe payouts.
* Improved auto-matching logic for direct invoice payments against invoice recurrences.
* Ability to cancel invoices refunded via payment processor via UI.
* Updated invoice email UI to replace the “Review & Pay” button with “Review” when no payment link is included (e.g for direct payments).
## **Bug Fixes**
* Fixed a bug causing delays to Tight’s asynchronous actions queue.
* Fix to include invoice identifier on [POST /invoice](https://docs.tight.com/reference/postinvoice) response for newly created invoices.
Bug fixes for Invoicing, Data Lakes, and the API.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent. Outside of this, Tight is primarily focused on bug fixes.
## **Bug Fixes**
### Invoicing
* Fixes to automatic payout reconciliation for manually initiated Stripe payouts.
* Improvements to the display of CC and BCC emails on invoices.
### Data Lakes
* Population of missing `userID` on `closingCompleted` events.
* Updates to the `accountingClosingCompleted` event to include the `closedByUserId` field
### API
* Fix to validation of beginning date on monthly closings.
Data Lakes updates, accounting import enhancements, and bug fixes
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent.
## **New Features/Enhancements**
### Data Lakes
* **Journal Entries Data Lake**: Addition of journal entries to Data Lakes.
* **Transactions Data Lake**: Addition of GL account names for revenue transactions to Data Lakes.
* **Bank Accounts Data Lake**: Addition of `latestTransactionDate`, `latestStatementDate`, `latestCompletedClosingDate`, and `lastWebhookDatetime` for bank accounts to Data Lakes.
### Invoicing
* **Reopen Invoices**: Enhancement to allow the re-opening of canceled invoices, removing the need to duplicate them.
### Imports
* **Xero / QBO:** Update to support very large file sizes for Xero/QBO imports.
## **Bug Fixes**
### Integrations
* Compliance updates to hide the email field in Mixpanel events by default.
### Reports
* Fix to prevent reports from being cut off in preview UI.
* Fix to exclude newly archived invoices from report totals and Profit & Loss calculations.
### Invoicing
* Bug fix to payout-matching for Stripe payouts to prevent double-counting income and ensure accurate reconciliation for Stripe payouts.
Bug fixes for invoicing, transactions, reports.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent. Outside of this, Tight is primarily focused on bug fixes.
## **Bug Fixes**
### Invoicing
* Fix to invoice total calculation enabling users to close invoices when sales tax and discounts are applied.
* Update to correctly order the consumption of Stripe webhooks to ensure invoice payments are kept up-to-date with the Stripe API.
* Bug fix to the default invoice template to prioritize the invoice email over the default client email.
### Transactions
* Fix enabling users to split expenses over multiple bills.
### Reports
* Fix to the Expense and Income by Client reports to correctly display 'No Client' for expenses without clients, ensuring the report matches the Transactions Dashboard UI.
New Data Lakes, improvements to Bank Transactions, and bug fixes.
## **New Features/Enhancements**
### Data Lakes
* **Transactions Data Lake**: Addition of reviewStatus and client information to transactions data lake.
* **Balance History Data Lake**: New data lake for bank account balance history for Plaid-connected accounts.
* **Closings Data Lake**: Addition of monthly closings to Data Lakes.
* **Rules Data Lake**: Addition of expense and income rules to Data Lakes.
### Transactions
* **Unit Integration**: Unit integration updates to improve bank transaction refund matching.
* **Transactions Logic**: Updates to prevent the removal of invoiced expenses.
* **Receipt Display**: Updates to receipt logic to show file name if there is no thumbnail for clear distinction of receipts to attach to expenses.
## **Bug Fixes**
### Accounting
* Fix to show an alert when creating a new bank reconciliation with a date range that includes an existing Beginning Balance Journal Entry.
* Resolved an error preventing year-end closing prior to all reconciliations being completed including inactive reconciliations.
* Added validations to ensure inactive GL Accounts cannot be assigned as revenue accounts for transactions.
### Invoicing
* Fixed an issue where Stripe payments were not properly updating invoice statuses, ensuring invoices now move from “Processing” to the correct “Paid” status once payments are received.
* Fix to remove duplicate invoice entries in the General Ledger.
* Correction to automatic reconciliation of direct invoice payments to exclude invoices with processing payments.
* Bug fix to properly receive webhooks from Stripe for correct invoice payment processing.
* Fixes to Stripe payout matching based on Stripe webhook data.
OBBBA Tax Updates, Data Lake additions, and big fixes.
## **New Features/Enhancements**
### Taxes
* **One Big Beautiful Bill Act (OBBBA) 2025 Tax Changes**: Rollout of 2025 tax code changes introduced by the OBBBA, including standard deduction number updates, child tax credit increases, adjustments to the Qualified Business Income Deduction calculation, SALT limitation increases, and added support for tip and overtime deductions.
### Data Lakes
* **Data Lakes Additions**: Bank transaction rules, monthly closings, and a history of bank account balance data are now all available in the [Tight Data Lakes](https://docs.tight.com/docs/data-lakes).
### Bills
* **Partial Bill Payments**: Added support for partial payments, allowing multiple expenses to be applied to a single bill and validating against the remaining balance rather than requiring an exact match.
* **Bills API Identifier**: New custom identifier on the [POST /bills endpoint](https://docs.tight.com/reference/postbills) allowing external identifiers to be added to Bills.
## **Bug Fixes**
### API & Embedded UI
* Added validation on [DELETE /payment](https://docs.tight.com/reference/deletepayment) to validate against the deletion of Stripe card/ACH payments.
* Bug fix to allow the merging of bank accounts or updating of the start date even when the account requires a relink with Plaid to enable statements.
* Bug fix to correctly remove all historical transactions [bank account deletion](https://docs.tight.com/reference/deletebankaccount) when `removeAllTransactions` is true.
* Optimizations to application of [template rules](https://docs.tight.com/reference/postsetupexpenserules) to existing users.
* Fix to prevent crashes on Vendor UI forms.
### Invoicing
* Fix to properly label Time & Tasks so they no longer show as INVOICED when no longer attached to an invoice.
* Bug fix to allow the ability to input a full ZIP code in the Business Information section of Invoice Settings.
* Updates to automatically split long invoice messages onto two pages when they exceed a certain length.
* Bug fix to automatically create a Stripe customer when a client adds their default billing information to ensure they can be automatically charged.
Bug fixes for transactions, and integrations, and invoicing.
The Tight team is underway on a MCP-first, new major API version and consuming Embedded Components which is where the majority of our product and engineering resources are being spent. Outside of this, Tight is primarily focused on bug fixes.
## **Bug Fixes**
### Bank Transactions
* Fixes to update the `tranStartDate` on re-linked Plaid accounts to be the date of the latest transaction from the originally linked account to more precisely prevent duplicates.
* Bug fixes to correctly set `currencyType` on bank transactions from Plaid, Unit, and other integrations.
* Bug fixes to bank account merging when there are manual journal entries between the two bank accounts.
* Fixes to support CSV imports that create matching bank transfers with existing transactions.
### Integrations
* Fixes and improvements to Stripe payout matching related to instant and reversed payouts.
* Added validations preventing Stripe payments from being bulk deleted on the Income Dashboard, avoiding issues with payments that were already paid, archived, and duplicated for invoices.
### Invoicing
* Bug fix to correctly update GL entries for paid invoices when an item's income account has been updated.
* Bug fix to allow expenses and time & tasks to be deleted from an invoice and re-attached to other invoices.
* Updates to properly calculate the invoice total when attaching manual payments to invoices for expenses and/or time entries.
* Updates to the [/refundInvoice](https://docs.tight.com/reference/postrefundinvoice) endpoint so refunds correctly mark the paymentMethod instead of defaulting to DIRECT.
* Fix to correct business logo alignment on invoice PDFs.
* Fix to allow edits to recurring invoices in closed years.
Asynchronous CSV imports, improved API validations, and bug fixes.
## **New Features/Enhancements**
### CSV Imports
* Enhancement to make CSV imports asynchronous to prevent timeouts with larger files.
* Addition of a new banner to let users know when a CSV Import is in-progress, failed, or completed.
* Ability to view results after a CSV Import including the number of successful imports and a list of transactions that failed to import, if applicable.
### Invoicing
* **Scheduled Invoices**: Ability to print scheduled invoices prior to their being finalized.
* **Invoice Reminders**: Enhancement to send the invoice reminders and scheduled invoices during the day instead of at night, ensuring clients receive invoice reminders during daytime hours.
* **Direct Payment Matching**: Improvements to direct payment matching including a wider date range and better tie-breaking.
* **Sales Tax Updates**: Added API validation to restrict discounts to percentages when sales tax is applied at the item level, ensuring accurate tax calculations.
### Embedded UI
* **Tooltips Update**: Addition of tooltips to the Filter and Sync buttons on the Banks & Integrations screen.
* **Last Synced Update**: Update to display the last attempted data pull time on the "Last Synced" date instead of the last successful pull.
* **Revenue Rules**: Users can now create revenue rules from any revenue entry in the Embedded Experience.
### Webhooks
* **Integration Error Events**: Updates to the Integration Error lifecycle events to include more API error metadata.
### Accounting
* **Monthly Closing Validations**: Added validations to prevent monthly closings from having overlapping dates for the same bank account.
## **Bug Fixes**
### API
* Performance improvements when reconciling bank accounts with many transactions to ensure all transactions are marked as reconciled efficiently.
* Fixes to correctly return the `apiTransactionId` for bank transfers.
### Invoicing
* Fix to properly display invoice attachments on recurring invoices.
* Improvements to prevent all changes to a duplicated invoice from being reverted when the ‘Back’ option is selected.
### Integrations
* Improvements to bank account deduplication logic when there have been many unlinks and relinks of the same bank connection.
* Bug fix to update Rutter transactions to display the underlying integration’s name as the GL account name instead of "Rutter."
* Improvements to ensure transactions from Unit accounts pull in correctly and match payouts for accurate balances and totals.
* Bug fix to deactivate Bank Accounts during refresh when Plaid has removed them
* Fixes to Stripe matching in tie-breaking cases by using both the transaction’s identifier and the underlying source’s identifier.
* Bug fix to hide the Scheduled Closings feature on the Banks & Integrations screen if Plaid is not linked or bank reconciliations are not enabled.
### Transactions
* Fix to prevent flickering when saving an Expense Rule.
* Bug fix to allow recurring expenses to be deleted from the general ledger, journal, or balance sheet drilldown.
* Updates to properly create a revenue entry when auto classify is enabled and a payment is converted to revenue.
* Ensure matched bank transfers have a status of matched instead of active.
* Bug fix to set bank account’s transaction pull date as the earliest transaction date during a bank merge.
Client contact details on invoices, Unit integration improvements, and V6 transactions summary API.
## **New Features/Enhancements**
### Invoicing
* **Client Contact Details**: Expanded client contact details to support storing additional information such as address, phone number, and more.
* **Stripe Payouts**: Enhancements to Stripe payout matching to better support and reconcile payout reversals.
### Integrations
* **Unit Improvements**: Visual and organizational enhancements to Unit bank accounts in the Embedded UI along with support for setting start dates, pausing transactions, and setting beginning balances.
* **Stripe Permissions**: Ability for customer partners to block their users from unlinking integrations. Please reach out if you would like to enable this functionality.
* **Banks & Integrations**: UI improvements to the Banks & Integrations screen including updating icons and expanding the clickable area of each row for better usability.
### API
* **V6 Summary API**: Ability to [summarize bank transaction data](https://docs.tight.com/v6.0/reference/getbanktransactionssummary) in the V6 API.
* **Closings API**: Addition of a new [POST /closings](https://docs.tight.com/reference/postclosings) endpoint.
## **Bug Fixes**
### Transactions
* Updated default expense naming on the General Ledger Dashboard to display the Vendor name instead of "Manual Expense".
* Bug fix to ensure that all expenses in a recurring series are updated when the bank account is changed.
* Fixes to not alter the start date on bank account merges to avoid transactions from being removed.
* Corrected rule matching logic to support transaction description and vendor-based matches, improving rule application on historical transactions.
### Accounting
* Fix to exclude invoice payments and manual journal entries from bank reconciliation when their dates fall outside the reconciliation range.
* Ability to edit the equity side of a Beginning Balance entry.
* Corrected logic to ensure beginning balance entries are properly disconnected from bank accounts when those accounts are deleted to allow the modification of that entry.
* Bug fix to properly save a bank account's Beginning Balance in the "Edit a Bank Account" view.
### Integrations
* Fixes for accurate currency filtering for transactions ingested as part of the Rutter integration.
* Payroll fixes to display the integration’s name properly on all payroll forms.
### Reports
* Bug fix to support GL exports when descriptions contain multiple line breaks.
### Invoicing
* Added validations to prevent deposits from being automatically matched to recurring parent invoices, ensuring the invoice continues to recur as intended.
* Fix to properly convert invoice payments back to their original bank transaction once removed from an invoice.
* Fixed a UI issue where long client names were not displaying properly when adding payments to invoices.
* Updates to allow the removal of direct Stripe payments from invoices if an incorrect payment is applied.
* Corrected a bug that triggered the "Update Recurring Invoice" alert when only modifying the associated bank transaction.
Bank statements integrated into Closings UX, V6 Bank Transactions query API, and bug fixes.
## **New Features/Enhancements**
### Integrations
* **Bank Statements Integration**: Integration with Plaid’s Statements API to allow bookkeepers to pull Bank Statements directly into the Monthly Closing UX.
* **Rutter**: Ability to programmatically set the minimum transaction date for bank accounts connected with Rutter.
* **Gusto**: Improved dates on General Ledger entries for Gusto payrolls.
### API
* **V6 Bank Transactions Query API**: Early access to the [V6 Bank Transactions Query API](https://docs.tight.com/v6.0/reference/querybanktransactions). Note: there is still a possibility for backwards-incompatible changes as the Tight API team finalizes this new API.
* **Tax Estimates API:** Enhanced detail and additional fields for tax credit calculations on the [tax estimates API](https://docs.tight.com/reference/postgetestimates).
* **Delete bank account API**: New [DELETE /account API](https://docs.tight.com/reference/deletebankaccount) to provide the option to delete all associated transactions when deleting a specific bank account.
* **Invoicing API**: Addition of a `salesTaxPercentage` on [invoice line items](https://docs.tight.com/reference/postinvoice), useful for adding percent sales tax on invoices.
* **Entity Update Webhook:** Updates to send [entity update webhooks](https://docs.tight.com/docs/webhooks#entity_update) upon bank account creation/reactivation.
### Transactions
* **Transaction visibility:** UI update to show the whole transaction description in a tooltip when it is too long to fit on the transaction row.
* **New Vendor Update**: Update to auto-populate the new vendor field when searching for a vendor.
## **Bug Fixes**
### Transactions
* Correction to the Expense Dashboard overview to no longer include recurring parent transactions.
* API fix to correctly set the review status when tagging deposits as an invoice payment.
* Fix to properly bulk tag income categories on the Transaction Dashboard.
* Bug fix for an issue causing bulk deletion of expenses on the Transactions Dashboard to fail.
* Fixed an issue where pagination was not always correctly shown on the Vendor List.
### Accounting
* Corrections to display the field validation on a bank reconciliation’s start date when in a closed year.
* Fixes to remove any extra characters in transaction descriptions when downloading the General Ledger report.
* Fix to allow accountants to search for users on the teammates form.
* Fix to update the existing beginning balance entry when adding a monthly closing with a start date prior to that beginning balance entry.
* Corrected validations to prevent overlapping monthly and yearly closings.
### Integrations
* Fix to the Rutter integration for Shopify transactions to improve payout matching.
* API fix to correctly dedupe bank accounts when a Plaid Item is unlinked and subsequently relinked.
### Invoicing
* Fix to exclude archived/canceled invoices when selecting the next invoice number.
Improvements to the Rutter integration, API access to the Aged Accounts reports, and bug fixes.
## New Features/Enhancements
### Integrations
* **Rutter Updates:**
* Enhancements to the Rutter integration to include the order identifier on pertinent bank transactions.
* Updates to the Rutter integration to exclude transactions that do not match the user's currency.
* Changes to ingested transactions to exclude the Rutter description and instead display only the underlying integration’s name.
* **Integrations Endpoint:** Update to the [GET /integrations](https://docs.tight.com/reference/getintegrations) endpoint to support `lastUpdatedDate` and to include additional API fields.
* **Stripe Update:** Added idempotency to [POST /stripeAccountId](https://docs.tight.com/reference/poststripeaccountid) endpoint.
### Reports
* **Aged Accounts Payable:** Addition of the [Aged Accounts Payable report](https://docs.tight.com/reference/postagedaccountspayable) to the API.
* **Aged Accounts Receivable:** Addition of the [Aged Accounts Receivable report](https://docs.tight.com/reference/postagedaccountsreceivable) to the API.
### Embedded UI
* **Expense Categories:** Ability to create an expense category directly from the general ledger account form.
* **Rule Logic:** Improved rule conflict resolution UX when adding a new rule matching archived rules, giving the option to confirm whether to overwrite or delete the original.
* **Invoice filtering:** Improvements to filtering and sorting algorithms for potential bank transaction payment matches on the invoice form.
### Taxes
* **Tax Setup**: Enhancements to the Manual Filing Jointly tax flow to provide additional context for each field and minor label edits for clarity.
* **Tax Filing Data:** Introduction of tax filing data to Data Lakes, matching [GET /taxFilings](https://docs.tight.com/reference/gettaxfilings).
## Bug Fixes
### Bank Transactions
* API validation fix to require a child category to be used when categorizing expenses.
* Improvements to correctly load transactions with a trailing zero during a search.
* Bug fix to show the correct GL account on tax payments on the Transactions Dashboard.
* Bug fix to ensure matching bank transfers are correctly merged during bank merges.
### Accounting
* UI fixes to the companies drop down on the accountant dashboard.
* Fix to correctly render older year-end closing entries when opened from the journal.
* Corrected validation when attempting to create a monthly closing on an unsupported bank account.
### Bank Linkage
* Fix to Plaid relinks to not sync unsupported bank accounts.
### API
* Bug fix to correctly handle invalid JSON requests as client errors instead of server errors.
* Fixes to [GET /payment](https://docs.tight.com/reference/getpayments) to only include `bankTransferId` when the payment is part of a payout.
Enhanced bank linkage flows, improved vendor management, and bug fixes.
## New Features/Enhancements
### Bank Linkage
* **Initial Plaid Linkage:**
* New prompts to merge existing duplicate bank accounts (e.g. from a QBO migration) into newly linked accounts upon initial Plaid bank account linkage.
* Notification of which newly linked accounts have unsupported account types or sub types upon initial Plaid bank account linkage.
* **Banks & Integrations list:**
* Linked bank accounts are now separated by institution, with new institution level actions.
* Introduction of Synced and Not Synced filters.
* **Historical Pull:** Ability to pull historical transactions to a specific date at both the institution and the bank account levels.
* **Beginning Balances:** Ability to set and edit beginning balance entries directly from the bank account form.
* **Bank Account Merge:** Option to merge duplicate accounts for multiple accounts at once with improved validations to prevent duplicate bank transactions.
* **GL Account Naming:** Updates to keep GL account names in sync with updates from Plaid.
* **Mask Limitations**: Fixes for bank accounts whose mask has less than 4 characters.
### Vendor Management
* **Accountant Access**: Accountants now access the Vendor Dashboard for improved vendor management on behalf of users.
* **Vendor table**: New columns for Default Category and Expense Rules on the Vendor Dashboard to allow for more efficient vendor management.
* **Vendors API**: New enhancement to allow the ability to search by vendor name on [GET /vendors](https://docs.tight.com/reference/getvendors) endpoint.
* **Vendor Merge:** UI improvements to the vendor merge workflow for vendors with very long names.
### Transactions
* **Bulk Restoration**: Ability to bulk restore archived transactions on transactions-related dashboards.
* **Automatic Reconciliation of Direct Invoice Payments:** Improved tie-breaking when automatically reconciling direct invoice payments with invoices including matching on the invoice’s client’s name.
* **Advanced Search**: Improvement on the Expense Advanced Search to only show GL accounts that have associated expense categories and all bank accounts, including inactive/previously linked banks.
### Accounting
* **Accountant access**: Accountants can now update their user’s business information in the embedded experience.
* **QBO Import:** Updated context in the QBO Imports ‘Learn More’ section for pulling the correct files.
### Analytics
* **Transaction Events**: Addition of `transactionRecategorized` [lifecycle event](https://docs.tight.com/docs/lifecycle-event-dictionary#transaction-events) for tracking who recategorized which bank transactions.
* **Invoice Payment Events**: Enhancement to [lifecycle events](https://docs.tight.com/docs/lifecycle-event-dictionary#invoicing-events) for invoice payments to include the source API on invoice payment-related events.
## Bug Fixes
### Bank Transactions
* Fix to allow the creation of personal income transactions via direct [API](https://docs.tight.com/reference/postrevenues).
* Bug fix for Rutter transactions that were being accounted for in the incorrect GL account.
* Improvements to our CSV parsing algorithms for files with missing or blank columns.
### Invoicing
* Fixes to correctly use the business email set in the invoice settings instead of the account email when sending out invoices.
### Embedded UI
* Fix for the pending total to only include active bank accounts in the Historical Closings graph.
* UI fix in the Expenses Dashboard to remain on the exact page of transactions even after transaction updates.
* UI fixes for expenses split between multiple clients.
Introduction of the Wave Migration, a new payment processor, and template rules.
## New Features/Enhancements
### Imports
* **Wave:** Introduction of accounting migration from Wave in embedded UI and [API](https://docs.tight.com/reference/importwave).
* **CoA Mapping API**: New [endpoint](https://docs.tight.com/reference/postmappings) for mapping a user's CoA from their legacy accounting system into the Tight API for more complex migrations.
### Integrations
* **Qualpay:** Integration with new payment processor, [Qualpay](https://docs.tight.com/docs/qualpay).
* **Transaction Sync**: Ability to pause/unpause transaction ingestion for linked Stripe and Unit accounts directly on Banks & Integrations screen.
### Analytics
* **Lifecycle Events**: Added [lifecycle events](https://docs.tight.com/docs/lifecycle-event-dictionary#transaction-events) for transaction rules.
### Bank Transactions
* **Last Synced Date UI**: Bank accounts now reflect their “Last Synced Date” on the Banks & Integrations screen.
* **Advanced Search**: Ability to filter by status in the advanced search in Expense and Income Dashboards.
### Invoicing
* **Bulk deletion**: Ability to bulk delete invoice payments from transaction dashboards and via [API](https://docs.tight.com/reference/deletepayments).
* **Recurring Invoice Emails**: Option to toggle automatic emails for future recurring invoices.
### Embedded UI
* **Expense Rule Templates**: Exposed template rules in [API](https://docs.tight.com/reference/getrules) and embedded UI for bookkeepers and users to review.
* **Monthly Closings**: Updated validation to prevent the creation of monthly closings in closed years.
### API
* **Attachments:** API enhancement to filter [attachments](https://docs.tight.com/reference/getattachments) to a given entity.
* **Bank Accounts:** Minor [API](https://docs.tight.com/reference/getbankaccounts) update to return the `integrationId` on pertinent bank accounts.
## Bug Fixes
### API
* Fixed an issue that prevented manual journal entries from being submitted when line item descriptions were omitted.
* Resolved a bug that reset a business’s invoice prefix when the field was omitted from API requests.
* Fixed a bug where bank account changes on recurring expenses were not being properly saved.
### Integrations
* Fixed an error preventing the auto-charge payment method from working with relinked Stripe accounts.
* Stripe integrations and associated bank accounts are now correctly marked as archived when disconnected.
* Ensured historical Plaid transactions are consistently pulled, regardless of webhook delivery order.
Mileage SDKs, new Analytics events, and other Invoicing & Accounting enhancements.
## New Features/Enhancements
### Mileage
* **Native iOS SDK**: [automatic mileage tracking on iOS](https://docs.tight.com/docs/ios-mileage-tracking-sdk) mobile devices.
* **Native Android SDK**: [automatic mileage tracking on Android](https://docs.tight.com/docs/android-mileage-tracking-sdk) mobile devices.
* **APIs**: [GET](https://docs.tight.com/reference/getmileages), [POST](https://docs.tight.com/reference/savemileages), or [DELETE](https://docs.tight.com/reference/deletemileage) mileage records (for customer-partners building their own UX).
### Analytics
* **Lifecycle Events**: Expanded Lifecycle [Webhooks](https://docs.tight.com/docs/webhooks) and corresponding [list of events](https://docs.tight.com/docs/lifecycle-event-dictionary). The new events are also available via [Data Lakes](https://docs.tight.com/docs/data-lakes) and the [Mixpanel integration](https://docs.tight.com/docs/mixpanel-integration) should you wish to track this information in aggregate.
* While Tight recommends opting into consuming the new lifecycle webhooks, the existing webhooks remain available so as to not break existing implementation. Their documentation has been moved [here](https://docs.tight.com/docs/legacy-lifecycle-webhooks).
### Invoicing
* **Automatic Reconciliation of Direct Invoice Payments**: Automatic reconciliation of bank deposits against Invoices that accept direct payments.
* **Finalized Invoices:** Ability to edit both open and closed invoices.
* **Invoice Refund Tracking Improvements:** Enhancement to account for invoice payment refunds on the Transactions Dashboard.
### Accounting
* **Addition of Beginning Balance Field:** New API-only connection between bank account and its beginning journal entry to view beginningBalanceEntryId to properly track account balances.
* **Payout Matching Enhancements:** Support for bank transfers as children of payouts.
* **Reports API**: Ability to perform projections in the P\&L report in API.
* **Accountant Endpoint**: New endpoint [GET/accountant/userInfo](https://docs.tight.com/reference/getaccountantuserinfo) to retrieve info for an accountant.
### Embedded UI
* **Read-only parameter**: [Embedded UI](https://docs.tight.com/docs/embeddable-ui-getting-started#embedding-specific-components) `renderScreen` function now accepts `readOnly` option to make rendered screens read-only.
## Bug Fixes
### Invoicing
* Fix to now properly pull search results for invoice payments on transaction-related dashboards.
* Corrections to not show split expense parents on the invoice line item expense selection.
* Fixes to correctly track bank transfers converted to invoice payments as debits into the bank transfer’s bank account.
### Embedded UI
* UI fix to show all content in the onboarding banners on mobile devices.
* Minor UI fix to the manual journal entry form for long GL account names.
### Accounting
* Enabled the conversion between S Corp and C Corp to other entities without error.
* Fixes to allow the frontend to convert a payout’s itemized transactions.
* Fixes to historical payout matching, specifically when the status of itemized transactions are modified.
* Bench-imported accounts now correctly show with other migrated accounts.
### API
* API validation to prevent the deletion of default client(s).
* Corrected validations for invalid `clientId` on invoicing APIs.
* Correctly expose `reviewStatus` for invoice payments on [/getTransactions](/v5.0/api-reference/banks/get-transactions) endpoint.
### Integrations
* Bug fix to sync new accounts from Plaid when they are opened on the connection.
Revenue account selection on Invoice line items, Aged Accounts Payable report, and Transaction Rules in the Audit Trail.
## New Brand
Today, my team and I have soft-launched our new brand name, Tight, along with our new website at tight.com and new logo representing the flow and balance of debits and credits, bound together by a tight knot. This name was initially inspired by the saying “keep your books tight,” and also evoked “tight integration,” the essence of embedded accounting. Finally, it evolved into this: “When your customers do their accounting on YOUR platform – that’s Tight.”
Our new brand is reflective of the tight partnership we have with all of you. Your feedback and collaboration has been instrumental in our growth and product evolution. We’ve been investing heavily in our product and team (50% headcount increase over the past six months) and are continuing to build out new features to meet the needs of your users.
Otherwise, there is no other change; we are the same company, same team, and same product… we simply have a new brand name. [Hurdlr](https://www.hurdlr.com) remains as a direct-to-SMB mobile and web app for freelancers and small business. [Tight is the embedded accounting product](https://www.tight.com) that you have embedded into your software platforms to serve the small businesses that use your platform.
Thank you, and let's continue to keep it Tight!
## New Features/Enhancements
### Invoicing
* **Stripe Payment Processing:** Reduced Stripe merchant fees by automatically saving client payment methods.
* **Line Item Revenue Account:** Now allows selection of a revenue account for each invoice line item.
* **Email Errors API:** Programmatic access to setting email errors on invoices for use in Embedded UI.
* **Refund API:** A new [endpoint](https://docs.tight.com/reference/postrefundinvoice) has been added for programmatically refunding invoices.
* **Payment Processing Tutorial:** A new listener in the Embedded UI adds a CTA that allows customer partners to route users to a payment processing tutorial.
* **Invoice Audit Trail:** Ability to audit changes to invoices, including a history of client interactions. This functionality is currently only accessible from the accountant-facing Embedded UI and via [API](https://docs.tight.com/reference/auditinvoice).
* **Invoice Payments:** Minor UI update removes the prompt to set up a payment processor for an invoice when payments are already associated with that invoice.
### Bank Transactions
* **Audit Trail:** The Audit Trail now logs the rule used to categorize each transaction.
* **Rule Matching:** Expense rule matching now defaults to the most recent matching rule when multiple rules apply.
### Integrations
* **Rutter:** Enhanced payout matching for the Rutter integration.
* **Plaid:** Updated the Plaid integration to utilize the new `persistent_account_id` for better bank account de-duplication.
* **Integrations API:** Introduced a [DELETE /integration](https://docs.tight.com/reference/deleteintegration) endpoint for disconnecting a user’s integration via the Tight API.
* **Lifecycle Event:** Added the `INTEGRATION_REPAIRED` event to notify when an integration connection has been repaired.
### Reports
* **Aged Accounts Payable:** New Aged Accounts Payable report supported via both API and UX.
* **Aged Accounts Receivable:** Enhanced with drill-down functionality.
* **Trial Balance:** Updated to include custom data support on GL accounts, additionally reflected in the Trial Balance Report.
## Bug Fixes
### Accounting
* Fixed issues with deleting and restoring invoice payments.
* Corrected signage on manual journal entries in bank reconciliations.
* Added an alert when attempting to cancel an invoice in a closed year.
### Invoicing
* Corrected the display of clients in invoice settings on mobile devices.
* Fixed UI issues for invoice line items on mobile.
* Resolved some issues with expanding and reordering invoice line items.
* Enabled invoiced expenses to be reconciled.
* Corrected the UI for the source name on direct / cash invoice payments.
### Bank Transactions
* Prevented the matching of expenses to deleted payrolls.
* Corrected the API to more consistently include default clients on bank transactions when one is not provided.
### Client Management
* Fixed the API for fetching clients using a given businessId.
Release of Rutter integration, Manual Journal Entry API idempotency, and other API enhancements.
## New Features/Enhancements
### Integrations
* **Rutter Updates:** New integration with Rutter to provide access to [their many commerce integrations](https://docs.rutter.com/support-by-endpoint?activeTab=commerce).
### Accounting
* **Manual Journal Entries Update:** Support for [idempotency](https://en.wikipedia.org/wiki/Idempotence) on Manual Journal Entries API.
* **Bank Reconciliation:** Bank Reconciliations belonging to merged or otherwise deleted bank accounts will always be accessible in the Reconciliation Dashboard.
### Invoicing
* **External Invoicing Support:** Improved support for programmatically syncing Invoices from non-Hurdlr systems for tighter integrations with customer-partners’ external invoicing implementations.
* **Invoice Payments API:** Inclusion of `invoiceId` in response for INVOICE\_PAYMENT transactions on [POST /getTransactions](https://www.hurdlr.com/v5.0/api-reference/banks/get-transactions) endpoint for invoices.
### API
* **Account Creation Errors:** Improvements to account creation error handling providing more programmatic-safe error messages.
* **Account Restoration Authentication:** Support for Partner-level authentication on [POST/restoreAccount](https://www.hurdlr.com/reference/postpartnerrestoreaccount) endpoint.
* **Bank Transactions:** Ability to filter by \`reviewStatuses\` on [POST /getTransactions](https://www.hurdlr.com/v5.0/api-reference/banks/get-transactions).
### Imports
* **QBO Modern Report:** Updated instructions for exporting QBO’s “modern” reports when performing a [QBO Migration](https://www.hurdlr.com/docs/quickbooks-online) in the Embedded UI.
## Bug Fixes
### Accounting
* Manual Journal Entries are correctly included when pertinent bank accounts are merged.
* Corrections to ensure that Manual Journal Entries’ amounts display correctly on Bank Reconciliations.
* Fixes to properly split expenses belonging to [Manually Tracked Accounts](https://www.hurdlr.com/docs/transaction-dashboard-user-guide#manually-tracked-accounts) even after being merged into a Plaid-linked bank account.
### Bank Transactions
* Fixes to payout matching for advanced transaction types and negative payouts.
* Better handling of matching Bank Transfers when deleting or updating matches.
* Fixes to [POST/getTransactions](https://www.hurdlr.com/v5.0/api-reference/banks/get-transactions) when filtering on a specific Revenue \`id\`.
* Pagination bug fix on [GET /expenses](https://www.hurdlr.com/reference/getinterviewexpenses).
### Reports
* Fix to Financial Report drilldowns bug when multiple General Ledger accounts share the same account number.
### Imports
* Bug fix to correctly handle Revenue refunds in Bench import.
### Invoicing
* Correction to stop sending reminders on Invoices with a pending Invoice Payment.
* Fix to allow opening of attachments on Invoices.
* Ability to generate PDFs for Invoices migrated from legacy accounting platforms.
* Fixes to include CC and BCC emails when duplicating an Invoice.
### Tax
* Fixed bug causing crashes on the Tax Dashboard when rendering Embedded Experience in Spanish.
* Correction to the constant used on line 21 of the Schedule D (Form 1040).
### Embedded UI
* Bug fixes to Business Intelligence Tiles’ callback events to match their UI more accurately.
### API
* Fix to allow the account creation for bizNames that are shorter than 3 characters after the removal of whitespace.
Enhancements to the Invoicing user experience, Bank Transaction functionality, and availability of 2025 Tax Filing and Estimates.
## New Features/Enhancements
### Invoicing
* **Ability to edit finalized Invoices:** Ability for users to make edits to Invoices that have already been finalized and/or sent to their clients.
* **API Update:** Ability to include relevant Invoice Payment data on [GET /invoices](https://www.hurdlr.com/reference/getinvoices) via new API parameter, `includePayments`.
* **Invoice Message**: The Invoice message now allows emojis and other unicode characters.
* **Payment Processing Options:** Ability to specify what [Payment Processing options](https://www.hurdlr.com/docs/embeddable-user-interface-invoice-dashboard#3-modifying-the-payment-processing-options) users can accept on their Invoices in the Invoice Dashboard.
* **Recurring Invoices:** Improved UI to distinguish recurring Invoices in the Invoicing Dashboard.
### Bank Transactions
* **Expense Rules:** Ability to create Expense Rules without a Vendor; transactions matching such rules will use the Vendor already associated with the given transaction.
* **Plaid Historical Pull Improvements:** More robust validations in place during historical transaction pulls to avoid transaction duplicates for banking institutions that have been unlinked and relinked with Plaid.
* **Import CSV:** Update to display a transaction’s description as its Vendor when a Vendor is not provided during the review flow.
### Tax
* **2024 US Tax Forms**: Updated Form 1120-S and Form 1120 population for 2024 (commonly filed between April and October 2025), accessible through the Taxes Dashboard and via [API](https://www.hurdlr.com/reference/postreport).
* **2025 Canada Tax Estimates**: Review of all 2025 Canadian tax forms and subsequent updates to Hurdlr's tax engine for precise [Tax Estimates](https://www.hurdlr.com/docs/tax-calculations) on 2025 data with full Canadian support (federal and all 10 provinces).
### Integrations
* **Bank Account Refresh:** Updates to the Plaid integration to perform additional updates on Bank Account metadata if Plaid modifies this information.
* **Stripe Updates:** Inclusion of Stripe’s account identifier on [GET /integrations](https://www.hurdlr.com/reference/getintegrations).
### Imports
* **QBO Modern Report Support**: Support for QBO’s new “Modern” reports in the [QBO Import](https://www.hurdlr.com/reference/importqbo).
* **Import Validations**: Improved validations to the provided reports for easier self-service when performing Accounting Imports.
## Bug Fixes
### Accounting
* Fixed bug preventing the bulk tagging of Tax Payments.
* Fixes to GL Entry creation for matching Bank Transfers.
* Corrections to GL account names for Plaid-linked Bank Accounts to safely include the name of the corresponding banking institution.
### Bank Transactions
* Fixes to correctly update and/or unmatch a Bank Transfers matching Bank Transfer when relevant modifications are made to the match.
* Corrected the Audit Trail to now reflect "\ System" for all entries that are system generated.
* UI bug fixes to now correctly show the ‘Continue’ button when merging long lists of vendors.
### Reports
* Fix for directly embedding the Expenses by Category report.
New Invoicing Features: customizable business information and custom invoice numbers & formats.
## New Features/Enhancements
### Invoicing
* **Customizable Business Information:** Users can now control exactly what appears on their invoices by customizing business details.
* **Custom Invoice Numbers & Formats:** Ability to customize invoice numbers and formats at the Client and/or Invoice level.
* **QBO Import Updates:** The [QBO Import](/docs/qbo-import-user-guide#uploading-reports) now accepts the "Invoices and Received Payments" report for better Invoice and Payment matching.
* **Email Field Defaults:** Improved defaults for email-related fields in Invoicing APIs.
### Accounting
* **General Ledger Report API Enhancement:** The [API](/reference/postgeneralledger) now accepts `accountNo` for a simplified method to fetch General Ledger entries for specific GL accounts across multiple user accounts.
* **Bank Account Merging:** Deleted bank accounts with active monthly Closings will now always be included as potential duplicates.
### Taxes
* **2024 Tax Forms:** Updated Form 1040 Schedule C and Form 1065 population for 2024 (commonly filed between April and October 2025), accessible through the Taxes Dashboard and via [API](https://www.hurdlr.com/reference/postreport).
## Bug Fixes
### Accounting
* Fixed issues with drilling down into "Capital Stock," "Owner's Draw," and other related Equity accounts from the Balance Sheet.
* Corrected the duplication of General Ledger entries for archived and converted Bank Transactions.
* Fixed Journal Entries for Tax Payments, ensuring they update correctly when the linked bank account is changed.
* Addressed issues with saving Bank Reconciliations when matching Bank Transfers.
### Bank Transactions
* Resolved bug causing duplicate Plaid Bank Transactions.
* Fixed display issues for manually entered transactions merged into Plaid bank accounts.
### Imports
* Fixed issues with parsing Excel files during Xero Imports.
* Updated Bench import to support their latest offboarding package.
### Invoicing
* Fixed issue with archiving Invoice Payments attached to archived invoices.
* Removed the 'Create Link' option from scheduled invoices.
### Payroll
* Fixed the ability to attach Expense refunds to Payroll entries for better support of Payroll reversals.
Enhancements to user onboarding in the Embedded UI, Invoicing, and Bank Transaction classification.
## New Features/Enhancements
### Embedded UI
* More informative CTAs on zero states for the Expense, Revenue, Invoicing, and Time & Tasks Dashboards to help drive activation.
* Addition of [optional tooltips on each of the Business Intelligence tiles](https://www.hurdlr.com/docs/business-intelligence-tile-components#8-displaying-tile-tooltips) for better user education.
* New copy on the rule form to provide explanations for using rules.
* Inclusion of character counters on all text-area fields.
* Updates to prevent accountants from editing user-level information, e.g. email.
### Invoicing
* The Invoice message field now respects line breaks.
* Ability to edit Invoice settings inline in the Embedded UI.
* Addition of `status` filtering on [GET /invoices](https://www.hurdlr.com/reference/getinvoices)[.](https://www.hurdlr.com/docs/invoicing-api)
### Integrations
* API and UX handling of [new Plaid webhooks for pending disconnects](https://plaid.com/docs/api/items/#pending_disconnect).
* Enhancement to allow unlinked bank accounts to be merged into linked bank accounts.
### Transactions
* Improvements to vendor identification and matching on CSV and Accounting imports.
* UI and UX enhancements to the CSV Import in the Embedded UI.
* Improved transaction details in Income reports for Invoice Payments.
### Accounting
* More robust validations for General Ledger account numbers.
* Improved automated reconciliation of withdrawals against their corresponding payrolls.
* Accounting imports can be run on users that have already used Invoicing.
### Taxes
* Tax Estimates now use the last twelve months of user data when calculating projected estimates.
### API
* `userId` is now editable on [POST /userInfo](https://www.hurdlr.com/reference/postuserinfo).
* Partners can opt-in to release the `email` uniqueness constraint on Hurdlr accounts, useful for multi-company setups. Please reach out if you would like to opt in.
## Bug Fixes
### Accounting
* Fixes to timezone-related issues on Bank Reconciliation.
* Fix to the creation of bi-weekly Manual Journal Entries.
* Fix when updating a bank account’s GL account to ensure the update only impacts that bank’s transactions.
### Integrations
* Correctly hide deleted imported bank accounts.
* Fix to correctly display the bank account on manually imported transactions after being merged into a linked bank account.
### Invoicing
* Fix to allow for the reordering of invoice line items.
### Transactions
* Fixes to the attachment of receipts for an existing/tagged transaction.
### Payroll
* Fix to improve the matching of GL account categories for payroll.
* Bug fixes for processing and display of split Payroll expenses.
### Reports
* Fix to allow emailing of all downloadable reports.
Enhancements to Invoicing and Payroll and Bank Transaction matching algorithms.
## New Features/Enhancements
### Invoicing
* Addition of the Aged Accounts Receivable Report preview on the Invoicing Dashboard.
* Removal of limit to number of line items on invoice form.
* UI Improvements to visually disable ACH/CC payment options on invoices if Stripe is not linked.
### Integrations
* Addition of a [new endpoint](/reference/postintegration) which allows programmatic creation of OAuth linkages in the Hurdlr API for some of our native integrations, e.g. [Stripe](/integrations/payment-processing/stripe#connect-your-user’s-stripe-accounts).
* Inclusion of tax filing related [events for the Mixpanel integration](/docs/mixpanel-events).
### Accounting
* Improvements to Payroll and Bank Transaction matching algorithms.
* Update to completely hide duplicate bank accounts once merged.
### Embedded UI
* Minor enhancement to all dashboards to only allow one field dropdown to be open at a time.
## Bug Fixes
### Invoicing
* Fix to allow duplicating archived invoices.
* Fixes to allow deletion of QBO/Xero imported Invoice Payments.
### Accounting
* Fixes to conversions and matching of Bank Transfers during Bank Reconciliations.
* Fixes to split expense handling in Bank Reconciliations.
* Fixes to ensure pertinent Invoice Payments show on corresponding Bank Reconciliations.
* Time zone fixes to correctly reflect the correct date on manual Journal Entries.
* Fixes to tax treatment of “Dues and Subscription” expenses on the Form 1065 and tax reports.
### Patches
#### 41.8.1
* Time zone fixes for accurate transaction display on Bank Reconciliations.
Enhancements to Embedded UI versioning, Accounting Migrations, Invoicing, and Financial Reports.
## New Features/Enhancements
### Embedded UI
* Ability to delay opting into the latest releases of the [Embedded UI](/docs/embeddable-white-labeled-experience)
* Requires a [slight change](/docs/embeddable-ui-getting-started) in the way the Embedded UI is added to an your application. Existing implementations are safe.
### Imports
* Update to [QBO Import](/docs/quickbooks-online) to consume QBO’s "Invoices and Received Payments" report for improved invoice to payment matching.
### Invoicing
* Ability to filter to scheduled invoices from the [Invoice Dashboard](/docs/embeddable-user-interface-invoice-dashboard).
* Increased character limit of 800 for “Message” field on invoices.
* Updates to formatting of invoice lines items on the invoice form to be clearer and more consistent with the invoice PDF.
* Addition of dismissible Stripe Payment Processing setup CTAs.
### Reports
* Improved default ordering of reports on the [Report Dashboard](/docs/report-dashboard) to be more accounting focused.
### Accounting
* Addition of warning when merging bank accounts or vendors to indicate that the action cannot be undone.
### Transactions
* API addition of `reviewStatus` to transaction-related APIs, e.g. [POST /getTransactions](/v5.0/api-reference/banks/get-transactions).
* Minor language updates to conversion UI on [transaction forms](/docs/transaction-form).
## Bug Fixes
### Invoicing
* Fixes to `customData` on [GET invoices](/reference/getinvoices).
* Better error handling on [client invoice payment screen](/docs/embeddable-user-interface-client-invoice).
### Accounting
* Fixes to respect a user’s `availableFeatures.bookkeeping` when granting and revoking access to accountants in the Hurdlr API.
* Fix to prevent virtual bank accounts from using the same GL account.
### Transactions
* Fixes to [/getTransactions endpoint](/v5.0/api-reference/banks/get-transactions) to now include active TaxPayments.
* Fixes to bulk categorization from the [Transactions Dashboard](/docs/transactions-dashboard).
* Fixes to correctly expand the Bank Transfer form when editing withdrawal [payouts](/docs/payout-user-guide).
* Updates to Audit Trail to show the correct editor on the initial entry for all transactions.
### Patches
#### 41.7.1 through 41.7.2
Bug fixes and minor improvements.
Enhancements to Invoicing, Accounting, Bank Transactions, and API Authorization.
## New Features/Enhancements
### Invoicing
* Improvements to [Stripe Integration](/docs/stripe) for increased accuracy of matching Stripe [Payouts](/docs/payout-user-guide) to their itemized transactions, including Stripe Climate Contributions and other obscure items.
* Addition of “All” option to [Invoice Dashboard](/docs/embeddable-user-interface-invoice-dashboard) filters.
### Accounting
* Ability to specify both the cash and accrual transactions on a [Manual Journal Entry](/docs/general-ledger-component) via [API](/reference/postmanualjournalentry).
* Addition of the manualJournalEntry entity to our [Entity Update Webhooks](/docs/webhooks).
### Bank Transactions
* Improvement of the display of split expenses on all transaction-related dashboards.
* Ability to define the user-level and accountant-level access of individual transactions, via new userAccess and accountantAccess fields ([Revenue](/reference/postrevenue) for reference).
* Ability to merge bank accounts in the Embedded UI and API.
* Ability to merge vendors via UX and API.
### API
* Introduction of Partner-level authorization
## Bug Fixes
### Transactions
* Fixes to ingestion of [Stripe](/docs/stripe) payment data.
* Fixes to advanced filtering and searching on [transaction tables](/guides/business-owners/bank-transactions).
* Updates to the display of payment source information for better Invoice Payments UI.
* Fixes to customData on [Bank Transfer](/reference/postbanktransfer) entities.
### Reports
* Fixes to totals on the Aged Accounts Receivable Report.
* Fixes to drill down on the total column on the [Profit & Loss Report](/embeddable-ui/react/financial-statements/profit-loss-report).
### Bank Reconciliation
* Fix to the display of beginning balances when viewing completed Bank Reconciliations.
* Fixes to the bank institution logos displayed on the Reconciliation Dashboard.
### Patches
#### 41.6.1 through 41.6.5
Bugfixes and minor improvements.
#### 41.6.6
Modifications to support SDK versioning released in 41.7
Enhancements to Bank Transactions, Invoicing, Business Intelligence Tiles, and Bills
## New Features/Enhancements
### Bank Transactions
* All possible transaction conversions are now available via API.
* Ability to hide the overview graphs at the top of the [Expense](/docs/expense-dashboard) and [Income](/docs/income-dashboard) Dashboards in the Embedded UI. This can be accomplished by passing an additional parameter to the Embedded UI’s render options, `showDashboardOverview: false`
* Ability to [merge vendors via API](/reference/postvendor).
* Addition of `apiName` field via [POST /getTransactions API](/v5.0/api-reference/banks/get-transactions).
* Addition of a new [lifecycle event webhook](/docs/webhooks#4-lifecycle_event) for newly ingested uncategorized expenses, `EXPENSE_REVIEW_NEEDED`.
### Invoicing
* Income reports updated to include invoice payments for improved consistency between these reports and their respective Embedded dashboards.
* Improvement to bank transactions search on the invoice form.
### Business Intelligence Tiles
* Ability to hide the taxes line item on [Profit & Loss Tile](/docs/business-intelligence#3-profit--loss-tile) for a more accounting-centric view. This line item will be hidden automatically for Partners who are not using the Tax Tile.
### Bills
* Improvements to Bills in the Embedded UI to display the pertinent category on the bill row.
## Bug Fixes
### Accounting
* Fixes to correctly display Manual Journal Entry dates on Journal/[General Ledger](/docs/general-ledger-component) and to ensure the ability to delete Manual Journal Entries is accessible on all entries.
* Fixes to maintain “None” grouping filter when navigating to and from reports, e.g. for General Ledger drill downs.
### Invoicing
* Invoices will be marked as refunded when all of their payments are manually refunded via API.
* UI fixes to expanded display of Payouts on the [General Ledger Dashboard](/docs/general-ledger-component).
* Fixes to display of merchant fees on older Payouts in the [Transaction](/docs/transactions-dashboard)/[Income](/docs/income-dashboard) Dashboards.
* Fixes to ensure all canceled invoice payments are correctly hidden on active transaction views.
* Fixes to some total amount validation issues when matching multiple invoices to a single deposit.
* Ability to add [attachments without captions to invoices via API](/reference/uploadattachment).
* Fixes to display issues for older cash payments that lacked descriptions.
### Transactions
* More robust access to the Audit Trail for all transactions.
* Updates to the Advanced Search filters to allow bank accounts without an account mask to be selected.
* Fixes to transactions API to enable the creation of transactions without the specified client getting overwritten.
### Miscellaneous
* Improvement of idempotence on transaction `DELETE` endpoints so an error is no longer returned on already deleted entities.
* Updates to read-only users to correctly block editing of transactions in the [General Ledger](/docs/general-ledger-component).
### Patches
#### 41.5.1 through 41.5.3
Bugfixes and minor improvements.
#### 41.5.4
Modifications to support SDK versioning released in 41.7
New General Ledger API and improved display of the connection between the payout and its itemized transactions.
## New Features/Enhancements
### General Ledger
* The General Ledger can be exported as a CSV directly from the [General Ledger dashboard](/docs/general-ledger-component). The new report is also available via [API](/reference/postgeneralledger).
### Invoicing / Payouts
* Better display of the connection between the payout and its itemized transactions.
* Ability to match bank transactions directly from the Invoice form.
* Updates to cash/check payment language to reference “direct payments.”
* Invoice payments can be deleted via [DELETE /payment](/reference/deletepayment) endpoint.
* Improved title on the Invoice form to more accurately reflect the invoice’s status.
### Reports
* Support for multi-period [Cash Flow Statement](/docs/cash-flow-statement) in the Embedded UI.
* Performance improvements to [Cash Flow Statement](/v5.0/api-reference/reports/cash-flow-statement-direct) generation.
### UX Enhancements
* Updates to block Embedded UI screens based on users’ [available features](/docs/creating-a-user).
### Unit Integration
* Improvements to [Unit](/docs/unit-integration) transaction parsing for more detailed descriptions on transactions.
### BI Tiles
* Enhancements to the [Cash Flow tile](/docs/business-intelligence#4-cash-flow-tile) to more accurately depict users’ business cash flow and match the Cash Flow Statement.
* Enhancements to the [Income tile](/docs/business-intelligence#7-income-tile) and [Expense tile](/docs/business-intelligence#6-expense-tile) to include manual journal entries in totals.
## Bug Fixes
* Fixes to the 3-dot pagination loader at the bottom of all transaction-related dashboards.
* Fixes to loader in the zero state on the [General Ledger dashboard](/docs/general-ledger-component).
* Updates to the [Expense BI tile](/docs/business-intelligence#6-expense-tile) to only include business expenses.
* Correction to [Cash Flow Statements](/docs/cash-flow-statement) to correctly include security deposit expenses.
* Improvement to Attachments API to maintain a single invoice logo per business.
* Data fix to remove duplicate invoice payments for users that hit a rare duplicate payment bug.
* Fixes to correctly invoke invoicing payment processor listeners when setting up payment processing directly from the Invoice form.
Enhancements to Stripe Integration for improved connection to Hurdlr Invoicing.
## New Features/Enhancements
### Invoicing
* Stripe account data can be ingested via [POST /stripeAccountId endpoint](/v5.0/api-reference/invoicing/save-a-stripe-account).
* More detailed invoice payment data available via [API](/reference/getpayments).
* Invoices can be sent from the user’s business name instead of their email address.
### Accounting
* Support for recurring journal entries in the Embedded UI and [API](/reference/postmanualjournalentry).
### Transactions
* Ability to split expenses for business-only accounts into business and personal expenses.
* Update Bank Transfers to include additional metadata in [API](/reference/getbanktransfers).
### Embedded UI
* The ability to [hide animations in the Embedded UI](/docs/next-steps-user-interface#2-customizing-the-embedded-ui-to-match-your-branding).
## Bug Fixes
* Fix to JSON API response format for [Profit & Loss JSON report](/api-reference/reports/profit-and-loss).
* Fix to Balance Sheet for better handling of suspense accounts.
* Fixes to Cash Flow Statement to be consistent with other reports.
* Fixes to bank reconciliations on deleted bank accounts.
* Fixes to Chart of Accounts aggregate figures.
* UI fixes on invoice form.
* Minor display fixes for dates on the General Ledger.
* Fixes to transaction conversions.
Read-only scope for restricted access in the API and Embedded UI along with other enhancements to Invoicing and Bank Transactions
## New Features/Enhancements
### UX Enhancements
* User’s role can be set to `READ_ONLY` [via API](/reference/postuserinfo) to restrict the Embedded UI to a read-only view.
### Audit Trail
* Transactions can be audited in the Embedded UI and [via API](https://www.hurdlr.com/reference/auditexpense) to view a revision history for that transaction.
### Invoicing
* Inclusion of invoice payments in the [Transaction](/docs/transactions-dashboard) and [Income](/docs/income-dashboard) Dashboards.
* Update to invoice picker on the [Transaction](/docs/transactions-dashboard) and [Income](/docs/income-dashboard) Dashboards to include the invoice date.
* Stripe customer and payment data can be ingested via [POST /payments endpoint](/v5.0/api-reference/invoicing/process-payment).
### Transactions
* [The ability to render a single transaction form overlayed in the partner’s app](/docs/transaction-form).
* Enhanced matching and categorization of expense refunds.
### Reports
* UI support for pulling partial month Balance Sheets.
* Ability to generate comparative Trial Balance reports.
* Performance improvements for the Trial Balance report.
### Accounting Migrations
* Enhanced detection of revenue refunds in accounting imports.
* Enhancements to [QBO Import](/reference/importqbo) to handle reimbursed expenses.
### Bank Reconciliation
* Bank reconciliations automatically merged when corresponding bank accounts are merged.
### Analytics
* Enhancements to the [Mixpanel](/docs/mixpanel-integration) and [Intercom](/docs/intercom) integrations to accept expanded configurations.
## Bug Fixes
* Fixes to date handling on bank reconciliations.
* Fixes to drill-down reports.
* Fixes to Chart of Accounts to ensure correct balances are displayed.
* Fixes for timezone issues when pulling reports.
* Minor fixes to Bank Transfer conversions and matching.
* Update to [Stripe integration](/docs/stripe) so transactions always have distinct API ids.
Enhancements to Tax Estimates, Accounting Migrations, and API performance
## New Features/Enhancements
### Taxes
* Prior quarterly tax obligations always roll into the current quarter.
* Tax estimates displayed even with no business income tracked.
### Accounting Migrations
* Hurdlr [API](/v5.0/api-reference/imports/import-bench) and Embedded UI support for importing users’ data from Bench.
* Improved ingestion of invoices and invoice payments.
### Embedded UI Updates
* [Routing from the Business Intelligence Tiles](/docs/business-intelligence-tile-components#7-routing-the-tiles) can be defined on a specific set of tiles, allowing partners to still take advantage of Hurdlr’s expandable [Profit and Loss tile](/docs/business-intelligence#3-profit--loss-tile).
* `options.showAnimations` can be set to `false` to disable animations in the Embedded UI.
### API Improvement
* Addition of `deletedIds` to attachments API.
### Performance Enhancements
* Faster rendering of the Trial Balance report.
* Performance improvements for loading of the Journal and General Ledger.
## Bug Fixes
* Fixes for rendering the correct balances when flipping between the Profit & Loss and Balance Sheet.
* Fixes to the General Ledger rendering to ensure all entries are displayed.
* Fixes so scheduled invoices send on their scheduled date.
* UX fix for the Plaid [NO\_ACCOUNTS](https://plaid.com/docs/errors/item/#no_accounts) error, so the financial institution can be unlinked in the Embedded UI.
Enhancements to Bank Transaction automatic reconciliation and performance on the core Financial Reports.
## New Features/Enhancements
### Performance Enhancements
* Balance Sheet and Profit & Loss render 80% quicker (80% less latency).
* [General Ledger endpoint](/reference/getgeneralledgerentries) responds 15% quicker (15% less latency).
### Bank Transfer Matching
* Bank Transfers can be matched with any transaction of the same amount, which automatically converts to a Bank Transfer.
### Accounting Migrations
* [Xero](/reference/importxero) and [QBO](/reference/importqbo) migrations support importing XLS/XLSX files in addition to prior CSV support.
### Accountant Dashboard
* Accountants can [automatically get access to all users](/v5.0/api-reference/accountant/create-an-accountant) by setting `canAccessAllUsers` to `true`.
### Plaid
* New function added to render [Plaid Link directly over your existing onboarding UI](/docs/plaid-integration#4-plaid-link-new-implementation), removing the need to manually pass Plaid `access_tokens` to the Hurdlr API
### Transactions UI
* The `bankDescription` field will now be displayed when hovering over transaction rows on the transactions and reconciliation dashboards.
### Bug Fixes
* Fixes to `deletedIds` on [GET /generalLedgerEntries](/reference/getgeneralledgerentries).
* Fixes to CSV Import Completed alert to include counts for bank transfers and tax payments.
* Fixes to date filtering when drilling down into “Current Income” from Balance Sheet.
* Removal of Equity/Liabilities income from business income reports.
* Improved consistency of date-pickers throughout the Embedded UI.
Infrastructure improvements to general ledger, consuming APIs, and monitoring resulting in increased performance (financial reports spanning multiple years generated in milliseconds), robustness (stronger SLAs), and a SOC 2 Type 2 audit completed with zero exceptions. Public exposure of the Audit Trail.
Launch, including iterations with thousands of businesses, of multi-year imports from [QuickBooks Online](/docs/quickbooks-online) and [Xero](/docs/xero)
Launch of dedicated [Accountant Dashboard](/docs/bookkeeper-dashboard), to streamline operations for large Virtual Bookkeeping firms, while keeping the business owner-operator experience simple.
Launch of many [native integrations](/integrations/native-integrations) per customer-partner requests.
First public release of the Embedded UI, for new customer-partners desiring Hurdlr’s proven user experience.
First public release of the Hurdlr API, for the launch of Hurdlr’s first API customer-partner. This release made the Hurdlr API, privately consumed by hundreds of thousands of SMBs by way of the Hurdlr app (lanched in 2015), public for the first time.
Founded in 2012, API development started with the double-entry general ledger with full Audit Trail and then expanded into invoicing, income/expense tracking, financial statements, and income taxes. Learning the “Embedded” space did not yet exist, the Hurdlr app was built and ultimately released in 2015 to showcase the API’s features. The Hurdlr app ultimately grew to hundreds of thousands of small business owners, allowing the API to reach product maturity and cover the many edge cases faced by real users in production. In 2019, Hurdlr received its first organic API lead, realizing its initial API-first product vision.