Learning Center

OData Schema Reference

Every entity set, every column, and every join — the complete schema for the Standard Time® OData feed. Bookmark this page when building Power BI models, writing Python queries, or exploring the API for the first time.


The 11 Entity Sets

The Standard Time® OData feed exposes 11 entity sets over a single HTTPS endpoint. Each maps to one table you can pull into Power BI, Excel, or any OData-compatible tool. The base URL pattern is:

https://stcloud67.com/odata/{EntitySet}?cid={YourCID}
Diagram grouping the 11 Standard Time OData entity sets into Fact Tables (TimeLogs, Expenses, Invoices) and Dimension Tables (Projects, ProjectTasks, Subprojects, Users, Clients, Categories, Inventory, BillingRates)
TimeLogs is the primary fact table. Expenses and Invoices are secondary fact tables. Everything else is a dimension or reference table.
Entity SetEntity TypePrimary KeyWhat It Contains
TimeLogsTimeLogTimeLogIDEvery time entry — who worked, on which project and task, start/end, duration, billable flag, computed cost
ProjectsProjectProjectIDWork orders and jobs — status, dates, billing type, quoted cost, folder, assembly line
ProjectTasksProjectTaskTaskIDTask rows under each project — estimated vs. actual hours, cost estimates, percent complete, due dates
SubprojectsSubprojectSubsystemIDProject phases and nested sub-assemblies (the "subsystem" level between projects and tasks)
UsersUserUserIDEmployee roster — name, email, workgroup, role, billing rates, hire date
ClientsClientClientIDCustomer records — contacts, addresses, tax rate, payment terms
ExpensesExpenseExpenseIDMaterial usage, out-of-pocket costs, and mileage; created automatically by inventory barcode scans
InventoryInventoryItemInventoryIDParts catalog — name, SKU, qty in stock, unit cost, reorder thresholds, vendor
CategoriesCategoryCategoryIDLabor and expense categories (e.g., Machining, Assembly) with optional per-category billing rates
InvoicesInvoiceInvoiceIDInvoice records — subtotal, tax, amount paid, balance due, paid-in-full flag
BillingRatesBillingRateBillingRateIDPer-user, per-project, or per-category rate overrides with effective date ranges
Denormalized display columns: Most entities carry denormalized name fields (e.g., ProjectName, UserName) so a basic query returns readable labels without requiring a join. The FK columns (e.g., ProjectID, UserID) are also included for building relationships in BI tools. For simple ad-hoc queries, the denormalized fields are sufficient. For dashboards with slicers and cross-filtering, define proper FK relationships.

Column Schema by Entity

PK Primary key FK Foreign key — join to another entity DN Denormalized — display-only copy of a name field String = text DateTimeOffset = timestamp with UTC offset Date = date only (no time) Boolean = true/false Int32 = integer Decimal(18,4) = numeric, 4 decimal places

TimeLogs33 columns · primary fact table

One row per time entry. Join to all six dimension tables on the FK columns below. TimeLogDurationHours is the key measure field for most labor dashboards.

ColumnTypeDescription
TimeLogID PKStringPrimary key — unique identifier for this time entry
DateDateDate of the time entry (no time component); use for date-range filters and grouping by day/week/month
StartTimeDateTimeOffsetTimestamp when the timer started; includes UTC offset
EndTimeDateTimeOffsetTimestamp when the timer stopped; null if the timer is still running
TimeLogDurationHoursDecimal(18,4)Duration in hours (e.g., 1.5000 = 90 minutes). Primary measure for labor dashboards.
BillableBooleanWhether this time entry is billable to the client
BilledBooleanWhether this entry has been included on an invoice
ApprovedBooleanWhether this time entry has been approved by a manager
TimeLogCostClientDecimal(18,4)Computed client-billable cost: hours × client rate
TimeLogCostSalaryDecimal(18,4)Computed internal labor cost: hours × salary/payroll rate
TimeLogClientRateDecimal(18,4)Client billing rate applied to this entry ($/hr)
TimeLogSalaryRateDecimal(18,4)Salary/payroll rate applied to this entry ($/hr)
TimeLogQtyDecimal(18,4)Units produced (if tracking production quantity alongside time)
NotesStringFree-form text notes attached to this time entry
LocationStringLocation tag (e.g., work cell, site, or machine)
CreatedDateTimeOffsetRecord creation timestamp; use as the filter column for incremental data loads
ModifiedDateTimeOffsetLast-modified timestamp
UserID FKStringFK → Users.UserID
ProjectID FKStringFK → Projects.ProjectID
ClientID FKStringFK → Clients.ClientID
ProjectTaskID FKStringFK → ProjectTasks.TaskID (note: column names differ)
CategoryID FKStringFK → Categories.CategoryID
SubsystemID FKStringFK → Subprojects.SubsystemID
UserName DNStringEmployee username — denormalized from Users
TimeLogUserFullName DNStringEmployee full name — denormalized from Users
ProjectName DNStringProject/work order name — denormalized from Projects
ClientName DNStringCustomer name — denormalized from Clients
TaskName DNStringTask name — denormalized from ProjectTasks
SubsystemName DNStringSubproject name — denormalized from Subprojects
CategoryName DNStringCategory name — denormalized from Categories
UserText1StringCustom text field 1 (user-configurable label and data)
UserText2StringCustom text field 2
UserText3StringCustom text field 3

Projects30 columns

Work orders and jobs. Note: Projects carries a denormalized ClientName but no ClientID FK column — to join Projects to Clients in Power BI, route through TimeLogs (which has both ProjectID and ClientID).

ColumnTypeDescription
ProjectID PKStringPrimary key
ProjectNameStringWork order or job name
DescriptionStringFree-form description
StatusStringProject status (e.g., Open, In Progress, Closed)
PriorityStringPriority level
ActiveBooleanWhether this project is active and visible on the shop floor
ProjectProjectCodeStringUser-assigned project code or job number
BillingTypeStringBilling method (Fixed, Hourly, etc.)
ProjectClientRateDecimal(18,4)Default client billing rate for this project ($/hr)
ProjectSalaryRateDecimal(18,4)Default internal labor cost rate for this project ($/hr)
ProjectQtyDecimal(18,4)Estimated quantity to produce
ProjectQtyBuiltDecimal(18,4)Actual quantity produced to date
StartDateDatePlanned start date
FinishDateDatePlanned finish date
ProjectLaunchDateDateLaunch or ship date
DeliveryDateDateCustomer delivery date
ProjectQuotedDurationInt32Quoted duration in seconds
ProjectQuotedCostDecimal(18,4)Quoted cost to the customer
POStringPurchase order reference number (text field — not a full PO system)
ProjectFolderStringFolder name used to group projects (filterable in grids)
ClientName DNStringCustomer name — denormalized; no ClientID FK available on this entity
ProjectProjectTypeName DNStringProject type label
ManagerUserName DNStringManager username — denormalized from Users
ManagerFullName DNStringManager full name — denormalized from Users
ProjectAssemblyLineName DNStringAssembly line name assigned to this project
CreatedDateTimeOffsetRecord creation timestamp; use for incremental loads
ModifiedDateTimeOffsetLast-modified timestamp
UserText1StringCustom text field 1
UserText2StringCustom text field 2
UserText3StringCustom text field 3

ProjectTasks41 columns

Task rows under each project. Contains the richest cost and scheduling data: estimated vs. actual vs. remaining hours, budget vs. actuals, percent complete, and due dates. Join to Projects on ProjectID; join to TimeLogs on TaskIDProjectTaskID.

ColumnTypeDescription
TaskID PKStringPrimary key — referenced as ProjectTaskID in TimeLogs
TaskNameStringTask name
DescriptionStringTask description
StatusStringTask status
PriorityStringPriority level
PercentCompleteInt32Completion percentage (0–100)
CompletedBooleanTrue when the task is marked complete
BillableBooleanWhether time logged to this task is billable by default
StartDateDatePlanned start date (used in Gantt scheduling)
FinishDateDatePlanned finish date
TaskDueDateDateCustomer-facing due date for this task
CompletedDateDateDate the task was marked complete
TaskDurationHoursDecimal(18,4)Estimated duration in hours (the planned budget)
ActualHoursDecimal(18,4)Total hours logged against this task to date
RemainingHoursDecimal(18,4)Remaining estimated hours (estimate-to-complete)
TaskCostClientDecimal(18,4)Estimated client cost: estimated hours × client rate
TaskCostSalaryDecimal(18,4)Estimated internal cost: estimated hours × salary rate
TaskCostClientActualDecimal(18,4)Actual client cost from time logs logged to this task
TaskCostClientRemainDecimal(18,4)Remaining client cost: remaining hours × client rate
TaskCostSalaryActualDecimal(18,4)Actual internal cost from time logs logged to this task
TaskCostSalaryRemainDecimal(18,4)Remaining internal cost: remaining hours × salary rate
TaskClientRateDecimal(18,4)Per-task client billing rate override ($/hr)
TaskSalaryRateDecimal(18,4)Per-task salary rate override ($/hr)
TaskQuotedCostDecimal(18,4)Quoted cost for this task
TaskQtyDecimal(18,4)Estimated quantity to produce
TaskQtyBuiltDecimal(18,4)Actual quantity produced
ProjectID FKStringFK → Projects.ProjectID
ClientID FKStringFK → Clients.ClientID
SubsystemID FKStringFK → Subprojects.SubsystemID
CategoryID FKStringFK → Categories.CategoryID
ProjectName DNStringProject name — denormalized from Projects
ClientName DNStringCustomer name — denormalized from Clients
SubsystemName DNStringSubproject name — denormalized from Subprojects
CategoryName DNStringCategory name — denormalized from Categories
TaskProjectTypeName DNStringProject type label
TaskAssemblyLineName DNStringAssembly line name
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
UserText1StringCustom text field 1
UserText2StringCustom text field 2
UserText3StringCustom text field 3

Subprojects27 columns

Project phases and nested sub-assemblies. Sit between a Project and its Tasks in the hierarchy. TimeLogs and ProjectTasks both carry a SubsystemID FK that links here.

ColumnTypeDescription
SubsystemID PKStringPrimary key — referenced as SubsystemID in TimeLogs and ProjectTasks
NameStringSubproject or phase name
ExtendedNameStringFull hierarchical name including parent path
DescriptionStringDescription
StatusStringStatus
PriorityStringPriority
ActiveBooleanWhether this subproject is active
LevelInt32Nesting depth in the project hierarchy
OrderInt32Display order among siblings
SubprojectProjectCodeStringUser-assigned code for this subproject
StartDateDatePlanned start date
FinishDateDatePlanned finish date
SubprojectLaunchDateDateLaunch date for this phase
SubprojectQuotedDurationInt32Quoted duration in seconds
SubprojectQuotedCostDecimal(18,4)Quoted cost for this subproject
SubprojectClientRateDecimal(18,4)Client billing rate override for this subproject
SubprojectSalaryRateDecimal(18,4)Internal cost rate override
SubprojectQtyDecimal(18,4)Estimated quantity
SubprojectQtyBuiltDecimal(18,4)Actual quantity built
ProjectID FKStringFK → Projects.ProjectID
ParentID FKStringFK → Subprojects.SubsystemID — self-referential parent for multi-level nesting
ProjectName DNStringProject name — denormalized from Projects
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
UserText1StringCustom text field 1
UserText2StringCustom text field 2
UserText3StringCustom text field 3

Users26 columns

Employee roster. TimeLogs, Expenses, and BillingRates all carry UserID as a FK. Use FullName or UserName in report visuals; use UserID to define the relationship.

ColumnTypeDescription
UserID PKStringPrimary key
UserNameStringLogin username (used in barcode scanning)
FullNameStringDisplay name (First Last)
EmailStringEmail address
ActiveBooleanWhether this user is active
AdminBooleanWhether this user has administrator rights
ContractorBooleanWhether classified as a contractor (vs. employee)
ExemptBooleanWhether the user is exempt (FLSA/overtime classification)
WorkgroupStringWorkgroup or department tree path the user belongs to
DepartmentStringDepartment label
EmployeeNumStringEmployee number or HR identifier
ResourceTypeStringResource type classification (e.g., Labor, Equipment)
HireDateDateHire date
UserClientRateDecimal(18,4)Default client billing rate for this employee ($/hr)
UserSalaryRateDecimal(18,4)Default internal salary/payroll rate ($/hr)
UserMileageRateDecimal(18,4)Reimbursement rate per mile for this employee
SkillsStringFree-text skills description
UserRoleStringRole code assigned to this user
UserRoleName DNStringRole name — denormalized from the Roles table
ManagerID FKStringFK → Users.UserID — self-referential manager reference
ParentName DNStringManager or parent workgroup name — denormalized
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
UserText1StringCustom text field 1
UserText2StringCustom text field 2
UserText3StringCustom text field 3

Clients38 columns

Customer records. TimeLogs, ProjectTasks, and Expenses all carry ClientID. The most column-rich entity because it stores two full contact/address blocks.

ColumnTypeDescription
ClientID PKStringPrimary key
CompanyNameStringCustomer company name
DescriptionStringDescription or notes about this client
StatusStringClient status
PriorityStringPriority level
ActiveBooleanWhether this client is active
ThisCompanyBooleanTrue when this record represents your own company (used to mark internal jobs)
ClientTermsStringPayment terms (e.g., Net 30)
WebStringWebsite URL
ClientInvoiceNoteStringDefault note printed on invoices for this client
ClientTaxRateDecimal(18,4)Sales tax rate applied to this client's invoices
TaxIDStringTax ID / EIN
CurrencyIDStringCurrency identifier for multi-currency billing
ClientFolderStringFolder for grouping clients
MainContactStringPrimary contact name
MainContactPhoneStringPrimary contact phone
MainContactMobileStringPrimary contact mobile
MainContactFaxStringPrimary contact fax
MainContactEmailStringPrimary contact email
MainAddress1StringMain address line 1
MainAddress2StringMain address line 2
MainCityStringMain city
MainStateStringMain state/province
MainZipStringMain postal code
MainCountryStringMain country
BillingContactStringBilling contact name
BillingContactPhoneStringBilling contact phone
BillingContactMobileStringBilling contact mobile
BillingContactFaxStringBilling contact fax
BillingContactEmailStringBilling contact email
BillingAddress1StringBilling address line 1
BillingAddress2StringBilling address line 2
BillingCityStringBilling city
BillingStateStringBilling state/province
BillingZipStringBilling postal code
BillingCountryStringBilling country
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp

Expenses40 columns

Material usage, out-of-pocket costs, and mileage records. Expense rows are created automatically when inventory barcodes are scanned on the shop floor. Combine with TimeLogs for full job cost (labor + materials). Use ExpenseAmount as the measure.

ColumnTypeDescription
ExpenseID PKStringPrimary key
ExpenseDateDateDate of the expense
ExpenseAmountDecimal(18,4)Total expense amount (primary measure for material cost dashboards)
PriceDecimal(18,4)Unit price
ExpenseQtyDecimal(18,4)Quantity (units consumed in this expense record)
TaxDecimal(18,4)Tax amount on this expense
ExpenseMileageRateDecimal(18,4)Per-mile reimbursement rate (for mileage expense rows)
DistanceDecimal(18,4)Distance traveled (for mileage rows)
OdometerBeginDecimal(18,4)Odometer reading at trip start
OdometerEndDecimal(18,4)Odometer reading at trip end
BillableBooleanWhether this expense is billable to the client
BilledBooleanWhether this expense has been invoiced
ReimbursableBooleanWhether this expense is reimbursable to the employee
ReimbursedBooleanWhether reimbursement has been paid
CompanyPaidBooleanWhether the company paid this expense directly
ApprovedBooleanWhether this expense is approved
POStringPurchase order reference number (text field)
PayeeStringVendor or payee name
CheckNumStringCheck number (for reimbursed expenses)
DescriptionStringExpense description
LocationStringLocation tag
UserID FKStringFK → Users.UserID
ProjectID FKStringFK → Projects.ProjectID
ClientID FKStringFK → Clients.ClientID
SubsystemID FKStringFK → Subprojects.SubsystemID
CategoryID FKStringFK → Categories.CategoryID
UserName DNStringEmployee username — denormalized
ExpenseUserFullName DNStringEmployee full name — denormalized
ProjectName DNStringProject name — denormalized
ClientName DNStringCustomer name — denormalized
SubsystemName DNStringSubproject name — denormalized
CategoryName DNStringCategory name — denormalized
ExpenseProjectTypeName DNStringProject type label — denormalized
InventoryName DNStringInventory item name — set when created by an inventory barcode scan
InventoryCode DNStringInventory item code/SKU — set when created by an inventory barcode scan
CreatedDateTimeOffsetRecord creation timestamp; use for incremental loads
ModifiedDateTimeOffsetLast-modified timestamp
UserText1StringCustom text field 1
UserText2StringCustom text field 2
UserText3StringCustom text field 3

Inventory34 columns

Parts catalog. Use for stock-level and cost-of-goods dashboards. Each item deduction on the shop floor creates an Expense record; join InventoryName in Expenses to Name here for item-level analysis (or join CodeInventoryCode).

ColumnTypeDescription
InventoryID PKStringPrimary key
NameStringItem name
CodeStringShort item code (matches InventoryCode in Expenses)
DescriptionStringItem description
StatusStringItem status
ActiveBooleanWhether this item is active
QtyInStockDecimal(18,4)Current quantity in stock
QtyWhenToReorderDecimal(18,4)Reorder trigger threshold — alert when QtyInStock falls at or below this value
QtyToReorderDecimal(18,4)Standard reorder quantity when restocking
UnitsTypeStringUnit of measure (e.g., each, lb, ft)
CostUnitDecimal(18,4)Internal cost per unit (what you pay)
CostClientDecimal(18,4)Billable price per unit (what you charge)
LeadTimeDaysInt32Supplier lead time in days
BuyOrBuildString"Buy" for purchased items, "Build" for manufactured/assembled items
LaborDecimal(18,4)Labor hours required to build one unit (for Build items)
WeightStringWeight (text — allows units like "2.5 lbs")
SizeStringSize or dimensions
ConditionStringCondition (New, Used, Refurbished, etc.)
SKUStringYour internal stock-keeping unit number
VendorSKUStringVendor's part number
MfgSKUStringManufacturer's part number
ModelNumStringModel number
SerialNumStringSerial number
VendorStringVendor/supplier name
ManufacturerStringManufacturer name
LocationStringDefault storage location
WeblinkStringSupplier or product URL
NotesStringFree-form notes
InventoryFolderStringFolder for grouping inventory items
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp
UserText1StringCustom text field 1
UserText2StringCustom text field 2
UserText3StringCustom text field 3

Categories12 columns

Labor and expense categories with optional per-category billing rate overrides. TimeLogs, Expenses, ProjectTasks, and BillingRates all carry a CategoryID FK. Small table — no date filter needed.

ColumnTypeDescription
CategoryID PKStringPrimary key
NameStringCategory name (e.g., Machining, Assembly, Inspection)
DescriptionStringDescription
ActiveBooleanWhether this category is active
CategoryClientRateDecimal(18,4)Per-category client billing rate override ($/hr); overrides the user- and project-level rates when set
CategorySalaryRateDecimal(18,4)Per-category salary rate override ($/hr)
ProjectID FKStringFK → Projects.ProjectID — if set, this category is scoped to a specific project
SubsystemID FKStringFK → Subprojects.SubsystemID — if set, scoped to a subproject
UserID FKStringFK → Users.UserID — if set, scoped to a specific user
CategoryFolderStringFolder for grouping categories
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp

Invoices32 columns

Invoice records. Join to Clients on ClientID for receivables dashboards. BalanceDue and PaidInFull are the key fields for outstanding balance reports.

ColumnTypeDescription
InvoiceID PKStringPrimary key
InvoiceNumStringHuman-readable invoice number
DateSentDateDate the invoice was sent to the customer
InvoiceDueDateDatePayment due date
DatePaidDateDate payment was received; null if unpaid
StartRangeDateStart of the billing period covered by this invoice
EndRangeDateEnd of the billing period
MilestoneDateDateMilestone date (for milestone-based billing)
PaidInFullBooleanTrue when the invoice has been paid in full
SubTotalDecimal(18,4)Pre-tax subtotal
InvoiceTaxRateDecimal(18,4)Tax rate applied to this invoice
TaxAmountDecimal(18,4)Calculated tax amount
InvoiceAmountDecimal(18,4)Total invoice amount including tax
AmountPaidDecimal(18,4)Total payments received to date
BalanceDueDecimal(18,4)Outstanding balance (InvoiceAmountAmountPaid)
InvoiceTermsStringPayment terms on this invoice (e.g., Net 30)
POStringPurchase order reference
InvoiceInvoiceNoteStringNote printed on this invoice
NotesStringInternal notes
RepresentativeStringSales rep name
MilestoneNameStringMilestone name (for milestone billing)
ClientID FKStringFK → Clients.ClientID
ProjectID FKStringFK → Projects.ProjectID
SubprojectID FKStringFK → Subprojects.SubsystemID
TaskID FKStringFK → ProjectTasks.TaskID
ClientName DNStringCustomer name — denormalized
ProjectName DNStringProject name — denormalized
SubprojectName DNStringSubproject name — denormalized
TaskName DNStringTask name — denormalized
UserName DNStringUsername — denormalized
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp

BillingRates16 columns

Per-user, per-project, or per-category billing rate overrides with effective date ranges. When Standard Time® calculates cost on a time entry, the most specific matching BillingRate row wins (user + project overrides user alone). Small table — no date filter needed.

ColumnTypeDescription
BillingRateID PKStringPrimary key
RateTypeStringScope of this rate: User, Project, Category, Role, or a combination
StartDateDateEffective start date for this rate
EndDateDateEffective end date; null means the rate is still in effect
BillingRateClientRateDecimal(18,4)Client billing rate override ($/hr)
BillingRateSalaryRateDecimal(18,4)Salary/payroll rate override ($/hr)
UserID FKStringFK → Users.UserID; null if this rate applies to all users
ProjectID FKStringFK → Projects.ProjectID; null if not scoped to a project
CategoryID FKStringFK → Categories.CategoryID; null if not scoped to a category
RoleID FKStringFK → Roles table (not an OData entity set — text join only)
UserName DNStringUsername — denormalized
ProjectName DNStringProject name — denormalized
CategoryName DNStringCategory name — denormalized
BillingRateRoleName DNStringRole name — denormalized
CreatedDateTimeOffsetRecord creation timestamp
ModifiedDateTimeOffsetLast-modified timestamp

Recommended Relationships

All relationships below are Many-to-One — the fact table (many side) joins to the dimension table (one side) on the listed columns. In Power BI Model view, the arrow points toward the "one" side.

Relationship diagram showing TimeLogs at the center with arrows pointing to Users, Clients, Projects, ProjectTasks, Categories, and Subprojects; secondary facts Expenses, Invoices, and BillingRates shown below with their join columns
Star-schema layout: TimeLogs is the central fact table. Expenses and Invoices are secondary facts that share the same dimensions.
From (many side)ColumnTo (one side)ColumnNotes
TimeLogsUserIDUsersUserIDAdds employee name, workgroup, department, rates
TimeLogsProjectIDProjectsProjectIDAdds job name, status, dates, quoted cost
TimeLogsClientIDClientsClientIDAdds company name, contact info, terms
TimeLogsProjectTaskIDProjectTasksTaskIDColumn names differ — ProjectTaskIDTaskID
TimeLogsCategoryIDCategoriesCategoryIDAdds category name and per-category rates
TimeLogsSubsystemIDSubprojectsSubsystemIDAdds phase/sub-assembly name
ExpensesUserIDUsersUserIDAdds employee info to expense rows
ExpensesProjectIDProjectsProjectIDEnables project-level material cost totals
ExpensesClientIDClientsClientIDEnables client-level material cost totals
ExpensesCategoryIDCategoriesCategoryIDGroups expenses by category
ProjectTasksProjectIDProjectsProjectIDLinks task estimates to the parent job
ProjectTasksClientIDClientsClientIDAllows filtering tasks by client
InvoicesClientIDClientsClientIDCore join for receivables dashboards
InvoicesProjectIDProjectsProjectIDLinks invoices to specific jobs
BillingRatesUserIDUsersUserIDIdentifies which employee a rate applies to
BillingRatesProjectIDProjectsProjectIDScopes a rate override to a specific project
BillingRatesCategoryIDCategoriesCategoryIDScopes a rate override to a category
CategoriesProjectIDProjectsProjectIDWhen a category is scoped to a project
SubprojectsProjectIDProjectsProjectIDLinks each phase/sub-assembly to its parent job
Projects has no ClientID FK. The Projects entity carries ClientName (denormalized text) but no ClientID foreign key column. To join Projects to Clients in Power BI, route through TimeLogs: TimeLogs.ProjectID → Projects.ProjectID and TimeLogs.ClientID → Clients.ClientID. Cross-filtering will propagate client context to the Projects table via TimeLogs.
Multi-table joins in Power BI: You do not need to load all 11 entity sets to build a useful report. Start with TimeLogs + Users + Projects for a basic labor dashboard. Add Expenses if you need material cost. Add ProjectTasks if you need budget-vs.-actual. Load Clients only when you need to filter or group by customer contact data.

OData Type Reference

OData types map to familiar BI and programming types as follows:

OData TypeWhat It IsPower BI / DAX TypeJSON Example
Edm.String Text (Unicode, variable length) Text "Machining"
Edm.Boolean True/false flag True/False true or false
Edm.Int32 32-bit integer Whole Number 42
Edm.Decimal (Precision 18, Scale 4) Fixed-point number — 4 decimal places Decimal Number "1.5000" (IEEE754 quoted)
Edm.Date Date only — no time component Date "2026-06-21"
Edm.DateTimeOffset Timestamp with UTC offset Date/Time/Timezone "2026-06-21T08:30:00-06:00"

Decimal columns are returned as quoted strings in the JSON response ("1.5000" not 1.5). This is the IEEE 754 compatible format required by Power BI to avoid precision errors with Edm.Decimal. Power BI's OData connector handles this automatically — no manual conversion needed.


Related guides
OData & Power BI Integration Guide — API key setup, step-by-step Power BI connection, all 11 M queries, DAX starter measures, and a list of other OData-compatible tools (Excel, Tableau, Python, R).
Build Four Dashboards in Power BI — step-by-step recipes for shop floor time, project budget, full job cost, and inventory health dashboards using these entity sets.
Integrations & Data FAQ
Back to Learning Center

Ready to Connect Your Data?

Standard Time® OData feeds are available on the cloud plan. Start a free 30-day trial today.

View Pricing Contact Us