Business setup
BusinessProfile, Clients, Items, SalesTaxRates. Business identities, classifications and reviewed defaults provide stable references for prices and customer documents.
- BusinessProfile
- Clients
- Items
- SalesTaxRates
See the records and references behind the product.
17 tables · 28 relationships
BusinessProfile, Clients, Items, SalesTaxRates. Business identities, classifications and reviewed defaults provide stable references for prices and customer documents.
Estimates, EstimateLines, Invoices, InvoiceLines. Documents preserve dates, amounts, customer decisions and issued versions. Detail records retain their owning document and cannot move across unrelated estimates or invoices.
RecurringSchedules, RecurringScheduleLines, PaymentLinks, Payments, Reminders, Expenses, TimeEntries. Schedules retain each billing occurrence, billable work remains reserved once, and verified receipts explain the collectible invoice balance.
TaxForms1099Sent, AuditEvents. Reviewed outgoing-payment workpapers remain separate from customer receipts. Immutable audit events explain protected changes and external acknowledgments.
Preserve canonical record identifiers, source-system identifiers and the workspace or legal-entity scope. A readable name is not a unique identity. Validate every referenced record before saving a transaction. Derived monetary fields are server-computed; imports cannot bypass that calculation or change issued history.
Ends with: Agree entities, currencies, responsible people and imported opening positions.
Ends with: Resolve duplicate identities and reviewed policy defaults.
Ends with: Preserve source references, line ownership and supporting files.
Ends with: Compare balances and outcomes before enabling automated work.
Ends with: Test permitted and denied actions using actual assigned roles.
| Field | Type | Required | Details |
|---|---|---|---|
BusinessName | text | yes | Legal or DBA name shown on every Invoice |
LogoURL | text | Shown at top of invoice PDF | |
FederalTaxID | text | yes | EIN or SSN — masked except Owner / Admin |
BusinessType | select | yes | SoleProprietor, LLC, SCorp, CCorp, Partnership, Other |
StreetAddress | text | yes | |
City | text | yes | |
StateUS | text | yes | Two-letter US state code |
ZipCode | text | yes | |
Phone | text | ||
Email | text | yes | Default From address on invoice email |
Website | text | ||
BankName | text | ||
BankRoutingNumber | text | US — ABA — masked except Owner / Admin | |
BankAccountNumber | text | Masked except Owner / Admin | |
StripeAccountID | text | When connected to Stripe | |
SquareAccountID | text | When connected to Square | |
DefaultPaymentTermsDays | number | yes | e.g. 0, 7, 14, 30 |
DefaultLateFeePercent | number | Optional flat fee percent applied via reminder | |
InvoiceNumberPrefix | text | e.g. INV — concatenated with sequence |
| Field | Type | Required | Details |
|---|---|---|---|
ClientNumber | text | yes | |
Name | text | yes | |
ContactPersonName | text | When Client is a company | |
Email | text | yes | Natural key — also the invoice send-to address |
Phone | text | ||
BillingStreet | text | ||
BillingCity | text | ||
BillingStateUS | text | Two-letter US state — drives sales-tax auto-calc | |
BillingZipCode | text | Drives sales-tax auto-calc | |
DefaultPaymentTermsDays | number | Overrides BusinessProfile default when set | |
Notes | text | Free-text scratchpad | |
YTDPaidAmount | decimal | Reviewed outgoing contractor-payment snapshot imported from accounting; never derived from incoming Payments | |
Issue1099 | boolean | Marks an externally reviewed payee workpaper requirement; not customer-income reporting | |
Active | boolean | yes |
| Field | Type | Required | Details |
|---|---|---|---|
ItemNumber | text | yes | |
Name | text | yes | Shown on the invoice line |
Description | text | Optional longer description | |
DefaultRate | decimal | yes | |
DefaultUnit | select | yes | Hour, Day, Each, Project |
IsService | boolean | yes | True for service / time-based, false for goods |
IsTaxable | boolean | yes | Drives sales-tax auto-calc on the line |
Active | boolean | yes |
| Field | Type | Required | Details |
|---|---|---|---|
StateUS | text | yes | Two-letter state code |
ZipCode | text | Null = state default rate | |
RateName | text | yes | e.g. "CA Sales Tax", "CA — San Francisco" |
TotalRate | number | yes | Fractional combined state + local rate, e.g. 0.0875 means 8.75 percent; reject percent-form 8.75 as an invalid fraction |
StateRate | number | ||
LocalRate | number | ||
EffectiveFrom | date | yes | |
EffectiveTo | date | ||
Source | select | yes | TaxJar, Avalara, Manual |
Active | boolean | yes |
| Field | Type | Required | Details |
|---|---|---|---|
EstimateNumber | text | yes | |
Client | reference | yes | → Clients |
IssueDate | date | yes | |
ExpiryDate | date | Response deadline; expiry applies only while Status is Sent or Viewed | |
Subtotal | decimal | yes | fx: SUM(EstimateLines.LineSubtotal) |
TaxTotal | decimal | yes | fx: SUM(EstimateLines.LineTax) |
Total | decimal | yes | fx: Subtotal + TaxTotal |
Status | select | yes | Draft, Sent, Viewed, Approved, Declined, Converted, Expired |
SentAt | date | ||
ViewedAt | date | Stamped by tracking pixel on first email open | |
ApprovedAt | datetime | Server timestamp of the evidenced acceptance; null before acceptance | |
ConvertedToInvoice | reference | → Invoices (set when converted) | |
Notes | text | Public notes — appear on the estimate PDF | |
InternalMemo | text | Private — not on the PDF | |
SupersedesEstimate | reference | → Estimates; new offer replacing prior terms without rewriting its decision | |
SentRevision | number | Server revision bound to the current sealed offer and recipient token | |
SentSnapshot | text | Sealed document values, line tax inputs, client, terms, currency and PDF identity at send | |
AcceptedRevision | number | Exact SentRevision accepted; set only by a valid customer decision | |
AcceptedSnapshot | text | Immutable copy of the accepted SentSnapshot; conversion uses it without recalculation | |
DecisionSource | select | SignedRecipient, OfflineRecorded | |
DecisionActor | text | Verified recipient identity or authorized staff principal recording the evidenced decision | |
DecisionEvidence | attachment | Required retained customer evidence for OfflineRecorded acceptance or decline | |
RecipientTokenHash | text | Hashed single-document token bound to client, SentRevision and permitted decision | |
TokenExpiresAt | datetime | Recipient decision token expiry; never revives an expired offer |
| Field | Type | Required | Details |
|---|---|---|---|
Estimate | reference | yes | → Estimates |
Sequence | number | yes | Render order |
Item | reference | → Items (null when ad-hoc line) | |
Description | text | yes | Snapshot from Item.Name + Item.Description, editable |
Quantity | number | yes | |
Unit | select | yes | Hour, Day, Each, Project |
Rate | decimal | yes | |
LineSubtotal | decimal | yes | fx: Quantity * Rate |
TaxRate | reference | → SalesTaxRates (resolved from Client billing state + ZIP) | |
LineTax | decimal | yes | fx: LineSubtotal * TaxRateSnapshot when TaxableSnapshot else 0; use configured currency rounding |
LineTotal | decimal | yes | fx: LineSubtotal + LineTax |
TaxableSnapshot | boolean | yes | Reviewed taxable decision copied from the item or explicitly set for an ad-hoc line |
TaxRateSnapshot | decimal | yes | Fractional rate snapshot: 0.10 means ten percent; zero when not taxable |
TaxRuleVersion | text | yes | Reviewed source/effective rule identity used for the rate and taxable decision |
| Field | Type | Required | Details |
|---|---|---|---|
InvoiceNumber | text | yes | Auto-numbered with BusinessProfile.InvoiceNumberPrefix |
Client | reference | yes | → Clients |
FromEstimate | reference | → Estimates (set when converted) | |
FromRecurringSchedule | reference | → RecurringSchedules (set when generated) | |
IssueDate | date | yes | |
DueDate | date | yes | IssueDate + Client.DefaultPaymentTermsDays (or BusinessProfile default) |
Subtotal | decimal | yes | fx: SUM(InvoiceLines.LineTotal) − SUM(InvoiceLines.LineTax) |
TaxTotal | decimal | yes | fx: SUM(InvoiceLines.LineTax) |
Total | decimal | yes | fx: Subtotal + TaxTotal |
AmountPaid | decimal | yes | Server computed: confirmed cleared gross receipts minus confirmed refunds; exclude pending, failed and disputed amounts |
AmountDue | decimal | yes | Server computed: issued Total less recognized net receipts; retain overpayments separately |
Status | select | yes | Draft, Sent, Viewed, PartialPaid, Paid, Overdue, Voided |
SentAt | date | ||
ViewedAt | date | ||
PaidAt | date | Stamped when AmountDue reaches 0 | |
RenderedPDFURL | text | Frozen PDF snapshot at Send | |
LineSnapshot | text | Frozen JSON of lines at Send for audit | |
PublicNotes | text | Shown on the invoice PDF | |
InternalMemo | text | Private | |
CreatedBy | text | yes | Server-resolved staff principal; immutable creator |
| Field | Type | Required | Details |
|---|---|---|---|
Invoice | reference | yes | → Invoices |
Sequence | number | yes | Render order |
Item | reference | → Items (null when ad-hoc) | |
Description | text | yes | Snapshot from Item, editable |
Quantity | number | yes | |
Unit | select | yes | Hour, Day, Each, Project |
Rate | decimal | yes | |
LineSubtotal | decimal | yes | fx: Quantity * Rate |
TaxRate | reference | → SalesTaxRates | |
LineTax | decimal | yes | fx: LineSubtotal * TaxRateSnapshot when TaxableSnapshot else 0; use configured currency rounding |
LineTotal | decimal | yes | fx: LineSubtotal + LineTax |
FromExpense | reference | → Expenses (set when line was rebilled from a billable Expense) | |
FromTimeEntry | reference | → TimeEntries (set when line was rebilled from a billable TimeEntry) | |
TaxableSnapshot | boolean | yes | Reviewed taxable decision copied from the item or explicitly set for an ad-hoc line |
TaxRateSnapshot | decimal | yes | Fractional rate snapshot: 0.10 means ten percent; zero when not taxable |
TaxRuleVersion | text | yes | Reviewed source/effective rule identity used for the rate and taxable decision |
| Field | Type | Required | Details |
|---|---|---|---|
ScheduleNumber | text | yes | |
Client | reference | yes | → Clients |
Name | text | yes | e.g. "Monthly Retainer — Acme Co" |
Frequency | select | yes | Weekly, BiWeekly, Monthly, Quarterly, Annual |
StartDate | date | yes | |
EndDate | date | Null = open-ended | |
NextRunDate | date | yes | Next IssueDate to materialize |
OccurrencesRemaining | number | Optional — null = unlimited | |
AutoSend | boolean | yes | If true, fires invoice-send-via-email on generation |
AutoChargeOnFile | boolean | If true, attempts a charge against the saved card on file via Stripe | |
Status | select | yes | Active, Paused, Ended, Cancelled |
LastRunAt | date | ||
LastInvoice | reference | → Invoices (most-recent generated) |
| Field | Type | Required | Details |
|---|---|---|---|
Schedule | reference | yes | → RecurringSchedules |
Sequence | number | yes | |
Item | reference | yes | → Items |
Description | text | ||
Quantity | number | yes | |
UnitPrice | decimal | yes | |
TaxRate | number |
| Field | Type | Required | Details |
|---|---|---|---|
Invoice | reference | yes | → Invoices |
Provider | select | yes | Stripe, Square |
TokenizedURL | text | yes | Hosted checkout URL — embedded in invoice email |
ProcessorSessionID | text | Returned by Stripe / Square for webhook correlation | |
AmountAtCreation | decimal | yes | Snapshot of Invoice.AmountDue at link creation |
ExpiresAt | date | ||
Status | select | yes | Active, Used, Expired, Cancelled |
CreatedAt | date | yes | |
UsedAt | date | Stamped when a successful Payment lands |
| Field | Type | Required | Details |
|---|---|---|---|
PaymentNumber | text | yes | |
Invoice | reference | yes | → Invoices |
Client | reference | yes | → Clients (snapshot from Invoice) |
Method | select | yes | Card, ACH, Check, Cash, Other |
Amount | decimal | yes | |
ReceivedAt | date | yes | |
ProcessorRef | text | Stripe / Square charge ID — null for Check / Cash | |
ProcessorFee | decimal | Stripe / Square fee — for net-deposit reconciliation | |
NetDeposit | decimal | fx: Amount − ProcessorFee | |
Status | select | yes | Pending, Cleared, Refunded, Disputed, Failed |
RefundedAmount | decimal | ||
Memo | text | e.g. check number for Method = Check |
| Field | Type | Required | Details |
|---|---|---|---|
Invoice | reference | yes | → Invoices |
ReminderType | select | yes | DueSoon, OverdueDay7, OverdueDay14, OverdueDay30, Manual |
ScheduledAt | date | yes | |
SentAt | date | Null while pending | |
Status | select | yes | Scheduled, Sent, Skipped, Cancelled |
SkipReason | select | InvoicePaid, InvoiceVoided, ManualSkip | |
Channel | select | yes | |
MessageBody | text | Snapshot of the rendered reminder text |
| Field | Type | Required | Details |
|---|---|---|---|
ExpenseNumber | text | yes | |
ExpenseDate | date | yes | |
Vendor | text | yes | |
Category | select | yes | Travel, Meals, Software, Supplies, Equipment, Mileage, Subcontractor, Other |
Amount | decimal | yes | |
ReceiptPhotoURL | text | Phone-snapped photo | |
BillableToClient | boolean | yes | |
Client | reference | → Clients (required when BillableToClient = true) | |
MarkupPercent | number | Optional rebill markup | |
Status | select | yes | Recorded, Billed, NotBillable |
BilledOnInvoice | reference | → Invoices (set when this Expense was added to an Invoice) | |
Notes | text |
| Field | Type | Required | Details |
|---|---|---|---|
EntryNumber | text | yes | |
WorkDate | date | yes | |
Client | reference | → Clients (required when Billable = true) | |
Item | reference | → Items (used to default Rate and Description) | |
Description | text | yes | |
Hours | number | yes | |
Rate | decimal | Defaults from Item.DefaultRate when Item set | |
Amount | decimal | fx: Hours * Rate | |
Billable | boolean | yes | |
Status | select | yes | Recorded, Billed, NotBillable |
BilledOnInvoice | reference | → Invoices |
| Field | Type | Required | Details |
|---|---|---|---|
FormNumber | text | yes | |
TaxYear | number | yes | |
Client | reference | yes | → Clients (the contractor receiving the 1099) |
FormType | select | yes | 1099-MISC, 1099-NEC |
RecipientName | text | yes | Snapshot from Client.Name |
RecipientTaxID | text | Contractor's EIN or SSN — collected via W-9 intake outside this app | |
RecipientAddress | text | yes | Snapshot from Client billing address |
AmountReportable | decimal | yes | Reviewed outgoing-payment amount from accounting; never an incoming invoice-payment rollup |
FederalThreshold | decimal | yes | Snapshot of the IRS threshold used |
Status | select | yes | Draft, Issued, Filed, Corrected, Voided |
GeneratedAt | date | ||
IssuedToRecipientAt | date | ||
FiledWithIRSAt | date | ||
FormPDFURL | text | Frozen 1099 PDF | |
EFileConfirmation | text | Returned by IRS filing partner | |
SourceEvidence | attachment | yes | Verified outgoing-payments reconciliation and current form-type review |
RuleVersion | text | yes | Effective filing-year rule decision and source reference |
| Field | Type | Required | Details |
|---|---|---|---|
AuditNumber | text | yes | Immutable event identifier |
WorkspaceId | text | yes | Server-resolved tenant scope |
RecordType | text | yes | |
RecordId | text | yes | |
Action | text | yes | |
ActorPrincipal | text | yes | Authenticated actor or verified external document identity |
OccurredAt | datetime | yes | Server timestamp |
OperationKey | text | yes | Stable command identity |
ResultRevision | number | yes | Resulting version or unchanged revision for rejected operations |
Status | select | yes | Succeeded, Rejected, Failed |
Details | longtext | Redacted reason and before/after references; no secrets |
Create your ERP.AI account and get started with Proto.
We use essential cookies to run the site and optional cookies for features, analytics, and relevant content. See Cookie policy
We use cookies to enhance your experience, analyze site traffic, and serve relevant content. By clicking "Accept All," you agree to our use of cookies. You can customize your preferences at any time.
Learn more about how we use cookiesThese cookies are required for the website to function properly. They ensure security, enable basic features like page navigation, and store user session data. You cannot disable these cookies.
These cookies enable additional features that enhance your experience, such as live chat, video playback, personalized content recommendations, and remembering user preferences.
These cookies help us understand how visitors interact with our site by collecting anonymous usage data. This allows us to measure performance, detect issues, and continuously improve the user experience.
These cookies allow us and advertising partners, including X, to deliver ads tailored to your interests. They track browsing habits across sites to provide relevant advertising and measure ad effectiveness.