What Is the Maverick OData Feed?

Maverick exposes your project data as a live OData v4 feed — a standard HTTP/JSON API that Power BI, Excel, and other BI tools understand natively. Every request returns JSON; authentication uses an API key sent as the X-Api-Key request header. A missing or invalid key returns HTTP 401.

Base URLs

DeploymentBase URLCID required?
Cloud (stcloud67.com) https://stcloud67.com/odata/ Yes — append ?cid=YOUR_CID_HERE to every request
On-premise https://your-server.com/odata/ No — omit the cid parameter entirely

Supported Query Options

OptionPurposeExample
$filterFilter rows by field value$filter=Created gt 2026-01-01
$selectReturn only specified fields$select=TimeLogID,UserName,Date
$orderbySort results$orderby=Created desc
$topLimit number of rows returned$top=500
$skipSkip N rows (for pagination)$skip=1000
$countInclude total row count in response$count=true

Filter operators: eq ne gt ge lt le and or not. Date literals: ISO 8601 (2026-01-01 or 2026-01-01T00:00:00-05:00). Not supported: $expand, $search, contains(), startswith(), arithmetic operators (add/sub/mul/div), in.

Jump to Entity

TimeLogs · Projects · ProjectTasks · Subprojects · Users · Clients · Categories · Expenses · Invoices · BillingRates · Inventory

Entity Sets Overview

All 11 entity sets are listed below with their primary keys and FK counts. The color coding in the diagram groups related entities: blue = fact table, cyan = project structure, purple = resources/people, green = clients, orange = financial, amber = reference/lookup.

Diagram of all 11 OData entity sets with primary keys and property counts
Entity SetEndpointPrimary KeyFK Fields
TimeLogs/odata/TimeLogsTimeLogIDProjectID, UserID, ClientID, ProjectTaskID, SubsystemID, CategoryID
Projects/odata/ProjectsProjectIDClientID
ProjectTasks/odata/ProjectTasksTaskIDProjectID, ClientID, SubsystemID, CategoryID
Subprojects/odata/SubprojectsSubsystemIDProjectID, ParentID (self-ref)
Users/odata/UsersUserIDManagerID (self-ref)
Clients/odata/ClientsClientIDNone
Categories/odata/CategoriesCategoryIDProjectID, SubsystemID, UserID (optional scoping)
Expenses/odata/ExpensesExpenseIDProjectID, ClientID, UserID, SubsystemID, CategoryID
Invoices/odata/InvoicesInvoiceIDClientID, ProjectID, SubprojectID, TaskID
BillingRates/odata/BillingRatesBillingRateIDUserID, ProjectID, CategoryID
Inventory/odata/InventoryInventoryIDNone

TimeLogs

One row per timesheet entry. Each entry links a user to a project, task, subproject, and category with logged hours. TimeLogs is typically the primary fact table in Power BI models — it contains all hours, costs, and billable flags from employee timesheets.

Endpoint: GET /odata/TimeLogs  ·  Primary key: TimeLogID  ·  Filtered pull recommended (use $filter=Created gt with a rolling date)

PropertyEdm TypeKeyNotes
TimeLogIDEdm.StringPKUnique identifier for the time log record
StartTimeEdm.DateTimeOffsetClock-in date and time
EndTimeEdm.DateTimeOffsetClock-out date and time
DateEdm.DateCalendar date of the entry (yyyy-MM-dd)
TimeLogDurationHoursEdm.DecimalElapsed hours (EndTime − StartTime ÷ 3600), precision 18 scale 4
BillableEdm.BooleanWhether the time is billable to the client
BilledEdm.BooleanWhether an invoice has been issued for this entry
ApprovedEdm.BooleanManager-approved flag
TimeLogCostClientEdm.DecimalHours × client rate (billable cost to charge the client)
TimeLogCostSalaryEdm.DecimalHours × salary rate (internal labor cost)
TimeLogClientRateEdm.DecimalEffective hourly client billing rate applied to this entry
TimeLogSalaryRateEdm.DecimalEffective hourly salary/cost rate applied to this entry
TimeLogQtyEdm.DecimalCustom quantity field (for non-time-based entries)
UserNameEdm.StringLogin name of the employee who logged time
TimeLogUserFullNameEdm.StringFull display name of the employee
NotesEdm.StringFree-text memo entered by the employee
ProjectNameEdm.StringDenormalized project name — convenience field, not a FK
ClientNameEdm.StringDenormalized client name
TaskNameEdm.StringDenormalized task name
SubsystemNameEdm.StringDenormalized subproject/phase name
CategoryNameEdm.StringDenormalized category name
LocationEdm.StringPhysical location recorded at time of entry
UserText1Edm.StringCustom user-defined field 1
UserText2Edm.StringCustom user-defined field 2
UserText3Edm.StringCustom user-defined field 3
ProjectIDEdm.StringFK → ProjectsLinks to Projects.ProjectID
UserIDEdm.StringFK → UsersLinks to Users.UserID
ClientIDEdm.StringFK → ClientsLinks to Clients.ClientID
ProjectTaskIDEdm.StringFK → ProjectTasksLinks to ProjectTasks.TaskID — field names differ; set this join manually in Power BI
SubsystemIDEdm.StringFK → SubprojectsLinks to Subprojects.SubsystemID
CategoryIDEdm.StringFK → CategoriesLinks to Categories.CategoryID
CreatedEdm.DateTimeOffsetRecord creation timestamp — use in $filter for rolling pulls
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Projects

Top-level project records — the primary container for tasks, time logs, and expenses. Each project belongs to a client and can have a project manager, billing type, quoted cost, and custom scheduling dates.

Endpoint: GET /odata/Projects  ·  Primary key: ProjectID

PropertyEdm TypeKeyNotes
ProjectIDEdm.StringPKUnique identifier for the project
ProjectNameEdm.StringProject display name
DescriptionEdm.StringFree-text project description
StatusEdm.StringProject status (e.g. Active, On Hold, Closed)
PriorityEdm.StringPriority level
ActiveEdm.BooleanWhether the project is active (non-archived)
ProjectProjectCodeEdm.StringCustom project code or number
BillingTypeEdm.StringBilling method — Fixed Price, T&M, Retainer, etc.
ProjectClientRateEdm.DecimalDefault hourly client billing rate for this project
ProjectSalaryRateEdm.DecimalDefault hourly salary/cost rate
ProjectQtyEdm.DecimalCustom quantity field
ProjectQtyBuiltEdm.DecimalQuantity completed to date
StartDateEdm.DateScheduled project start date
FinishDateEdm.DateScheduled project end date
ProjectLaunchDateEdm.DatePlanned or actual launch/go-live date
DeliveryDateEdm.DateDelivery or handoff date
ProjectQuotedDurationEdm.Int32Quoted duration in hours
ProjectQuotedCostEdm.DecimalQuoted project cost (contract value)
POEdm.StringPurchase order number
ProjectFolderEdm.StringFolder hierarchy path for organizing projects
ProjectProjectTypeNameEdm.StringProject type classification
ManagerUserNameEdm.StringLogin name of the assigned project manager
ManagerFullNameEdm.StringFull name of the assigned project manager
ProjectAssemblyLineNameEdm.StringAssembly line or workflow name
ClientIDEdm.StringFK → ClientsLinks to Clients.ClientID
ClientNameEdm.StringDenormalized client name
UserText1Edm.StringCustom field 1
UserText2Edm.StringCustom field 2
UserText3Edm.StringCustom field 3
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

ProjectTasks

Individual tasks within projects — the main scheduling unit in Maverick. Each task has dates, duration, percent complete, cost fields, and links to its parent project, subproject, and category. Actual hours from timesheets roll up here as ActualHours.

Endpoint: GET /odata/ProjectTasks  ·  Primary key: TaskID

PropertyEdm TypeKeyNotes
TaskIDEdm.StringPKUnique identifier for the task
TaskNameEdm.StringTask display name
DescriptionEdm.StringFree-text task description
StatusEdm.StringTask status
PriorityEdm.StringPriority level
PercentCompleteEdm.Int32Completion percentage, 0–100
CompletedEdm.BooleanTask fully complete flag
BillableEdm.BooleanWhether time on this task is billable
StartDateEdm.DateScheduled start date
FinishDateEdm.DateScheduled finish date (CPM-calculated)
TaskDueDateEdm.DateDue date (may differ from FinishDate)
CompletedDateEdm.DateActual completion date
TaskDurationHoursEdm.DecimalScheduled duration in decimal hours
ActualHoursEdm.DecimalTotal hours logged from timesheets for this task
RemainingHoursEdm.DecimalEstimated remaining hours to complete
TaskCostClientEdm.DecimalBudgeted client cost (duration × client rate)
TaskCostSalaryEdm.DecimalBudgeted salary/internal cost
TaskCostClientActualEdm.DecimalActual incurred client cost to date
TaskCostClientRemainEdm.DecimalRemaining client cost forecast
TaskCostSalaryActualEdm.DecimalActual incurred salary cost to date
TaskCostSalaryRemainEdm.DecimalRemaining salary cost forecast
TaskClientRateEdm.DecimalEffective hourly client rate for this task
TaskSalaryRateEdm.DecimalEffective hourly salary rate for this task
TaskQuotedCostEdm.DecimalQuoted/estimated cost for the task
TaskQtyEdm.DecimalCustom quantity field
TaskQtyBuiltEdm.DecimalQuantity built/completed to date
ProjectIDEdm.StringFK → ProjectsLinks to Projects.ProjectID
ProjectNameEdm.StringDenormalized project name
ClientIDEdm.StringFK → ClientsLinks to Clients.ClientID
ClientNameEdm.StringDenormalized client name
SubsystemIDEdm.StringFK → SubprojectsLinks to Subprojects.SubsystemID
SubsystemNameEdm.StringDenormalized subproject/phase name
CategoryIDEdm.StringFK → CategoriesLinks to Categories.CategoryID
CategoryNameEdm.StringDenormalized category name
TaskProjectTypeNameEdm.StringProject type classification inherited from the project
TaskAssemblyLineNameEdm.StringAssembly line or workflow name
UserText1Edm.StringCustom field 1
UserText2Edm.StringCustom field 2
UserText3Edm.StringCustom field 3
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Subprojects

Phases and sub-project nodes within the project hierarchy. Subprojects nest inside a parent project and can nest inside each other. The Level field indicates depth (1 = top-level phase). Note that the primary key field is SubsystemID — a legacy field name.

Endpoint: GET /odata/Subprojects  ·  Primary key: SubsystemID

PropertyEdm TypeKeyNotes
SubsystemIDEdm.StringPKUnique identifier for the subproject/phase
NameEdm.StringSubproject display name
ExtendedNameEdm.StringFull hierarchical name including parent path
DescriptionEdm.StringFree-text description
StatusEdm.StringPhase status
PriorityEdm.StringPriority level
ActiveEdm.BooleanActive/archived flag
LevelEdm.Int32Depth in hierarchy — 1 = top-level phase, 2 = sub-phase, etc.
OrderEdm.Int32Display sort order among siblings
SubprojectProjectCodeEdm.StringCustom project code for this phase
StartDateEdm.DatePhase scheduled start date
FinishDateEdm.DatePhase scheduled finish date
SubprojectLaunchDateEdm.DateLaunch or go-live date for this phase
SubprojectQuotedDurationEdm.Int32Quoted phase duration in hours
SubprojectQuotedCostEdm.DecimalQuoted phase cost
SubprojectClientRateEdm.DecimalDefault client billing rate for this phase
SubprojectSalaryRateEdm.DecimalDefault salary/cost rate for this phase
SubprojectQtyEdm.DecimalCustom quantity field
SubprojectQtyBuiltEdm.DecimalQuantity completed
ProjectIDEdm.StringFK → ProjectsLinks to Projects.ProjectID (parent project)
ProjectNameEdm.StringDenormalized project name
ParentIDEdm.StringFK → SubprojectsLinks to Subprojects.SubsystemID (parent phase); null at top level
UserText1Edm.StringCustom field 1
UserText2Edm.StringCustom field 2
UserText3Edm.StringCustom field 3
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Users

Employees, contractors, machines, and material resources. The ResourceType field distinguishes the three resource kinds: Human, Machine, and Materials. Users are organized in workgroups and can be assigned AI providers and billing rates.

Endpoint: GET /odata/Users  ·  Primary key: UserID

PropertyEdm TypeKeyNotes
UserIDEdm.StringPKUnique identifier for the user/resource
UserNameEdm.StringLogin/account name
FullNameEdm.StringFull display name
EmailEdm.StringEmail address
ActiveEdm.BooleanActive/inactive flag
AdminEdm.BooleanAdministrator rights flag
ContractorEdm.BooleanExternal contractor flag
ExemptEdm.BooleanFLSA-exempt (salaried) flag
ResourceTypeEdm.String"Human", "Machine", or "Materials" — the three Maverick resource kinds
WorkgroupEdm.StringWorkgroup assignment name
DepartmentEdm.StringDepartment name
EmployeeNumEdm.StringEmployee ID number
HireDateEdm.DateHire or onboarding date
UserClientRateEdm.DecimalDefault hourly client billing rate
UserSalaryRateEdm.DecimalDefault hourly salary/cost rate
UserMileageRateEdm.DecimalMileage reimbursement rate per mile/km
SkillsEdm.StringFree-text skills list
UserRoleEdm.StringRole code
UserRoleNameEdm.StringRole display name
ManagerIDEdm.StringFK → UsersLinks to Users.UserID (reporting manager); null at org top
ParentNameEdm.StringWorkgroup parent name in the resource tree
UserText1Edm.StringCustom field 1
UserText2Edm.StringCustom field 2
UserText3Edm.StringCustom field 3
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Clients

Client companies and internal organizations. Projects, time logs, and expenses all link back to a client. The ThisCompany flag marks the account holder's own organization. No FK fields — Clients is a root dimension table.

Endpoint: GET /odata/Clients  ·  Primary key: ClientID

PropertyEdm TypeKeyNotes
ClientIDEdm.StringPKUnique identifier for the client
CompanyNameEdm.StringClient company name
DescriptionEdm.StringFree-text description
StatusEdm.StringClient status
PriorityEdm.StringPriority level
ActiveEdm.BooleanActive/inactive flag
ThisCompanyEdm.BooleanMarks the account holder's own company record
ClientTermsEdm.StringPayment terms (e.g. "Net 30")
WebEdm.StringClient website URL
ClientInvoiceNoteEdm.StringDefault note printed on invoices for this client
ClientTaxRateEdm.DecimalDefault tax rate used when generating invoices
TaxIDEdm.StringTax identification number (EIN/VAT)
CurrencyIDEdm.StringCurrency code (e.g. USD, EUR)
ClientFolderEdm.StringFolder path for organizing clients
MainContactEdm.StringPrimary contact person name
MainContactPhoneEdm.StringPrimary contact phone
MainContactMobileEdm.StringPrimary contact mobile
MainContactFaxEdm.StringPrimary contact fax
MainContactEmailEdm.StringPrimary contact email
MainAddress1Edm.StringMain address line 1
MainAddress2Edm.StringMain address line 2
MainCityEdm.StringMain address city
MainStateEdm.StringMain address state/province
MainZipEdm.StringMain address postal code
MainCountryEdm.StringMain address country
BillingContactEdm.StringBilling contact person name
BillingContactPhoneEdm.StringBilling contact phone
BillingContactMobileEdm.StringBilling contact mobile
BillingContactFaxEdm.StringBilling contact fax
BillingContactEmailEdm.StringBilling contact email
BillingAddress1Edm.StringBilling address line 1
BillingAddress2Edm.StringBilling address line 2
BillingCityEdm.StringBilling address city
BillingStateEdm.StringBilling address state/province
BillingZipEdm.StringBilling address postal code
BillingCountryEdm.StringBilling address country
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Categories

Work categories used to classify time log entries and expenses (e.g. Development, Design, Travel). Categories can optionally be scoped to a specific project, phase, or user — when a FK field is set, that category is only available in that scope.

Endpoint: GET /odata/Categories  ·  Primary key: CategoryID

PropertyEdm TypeKeyNotes
CategoryIDEdm.StringPKUnique identifier for the category
NameEdm.StringCategory display name
DescriptionEdm.StringFree-text description
ActiveEdm.BooleanActive/inactive flag
CategoryClientRateEdm.DecimalClient billing rate override for this category
CategorySalaryRateEdm.DecimalSalary/cost rate override for this category
CategoryFolderEdm.StringFolder path for organizing categories
ProjectIDEdm.StringFK → ProjectsOptional — when set, category is scoped to this project only
SubsystemIDEdm.StringFK → SubprojectsOptional — when set, category is scoped to this phase only
UserIDEdm.StringFK → UsersOptional — when set, category is scoped to this user only
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Expenses

Expense reports — receipts, mileage, and reimbursements submitted by employees. Each expense links to a user, project, client, phase, and category, and carries billable, reimbursable, and approval flags.

Endpoint: GET /odata/Expenses  ·  Primary key: ExpenseID

PropertyEdm TypeKeyNotes
ExpenseIDEdm.StringPKUnique identifier for the expense record
ExpenseDateEdm.DateDate the expense was incurred
ExpenseAmountEdm.DecimalTotal expense amount
PriceEdm.DecimalUnit price (for quantity-based expenses)
ExpenseQtyEdm.DecimalQuantity (for quantity-based expenses)
TaxEdm.DecimalTax amount on the expense
ExpenseMileageRateEdm.DecimalPer-mile/km reimbursement rate for mileage entries
DistanceEdm.DecimalDistance traveled (for mileage entries)
OdometerBeginEdm.DecimalStarting odometer reading
OdometerEndEdm.DecimalEnding odometer reading
BillableEdm.BooleanWhether the expense is billable to the client
BilledEdm.BooleanWhether an invoice has been issued for this expense
ReimbursableEdm.BooleanWhether the employee is to be reimbursed
ReimbursedEdm.BooleanWhether reimbursement has been paid
CompanyPaidEdm.BooleanPaid with a company credit card or account
ApprovedEdm.BooleanManager-approved flag
POEdm.StringPurchase order number
PayeeEdm.StringMerchant or payee name
CheckNumEdm.StringCheck number if paid by check
DescriptionEdm.StringExpense description
LocationEdm.StringLocation where the expense was incurred
InventoryNameEdm.StringLinked inventory item name (if expense draws from inventory)
InventoryCodeEdm.StringLinked inventory item code
ExpenseProjectTypeNameEdm.StringProject type classification
UserNameEdm.StringDenormalized employee login name
ExpenseUserFullNameEdm.StringDenormalized employee full name
ProjectNameEdm.StringDenormalized project name
ClientNameEdm.StringDenormalized client name
SubsystemNameEdm.StringDenormalized subproject/phase name
CategoryNameEdm.StringDenormalized category name
ProjectIDEdm.StringFK → ProjectsLinks to Projects.ProjectID
ClientIDEdm.StringFK → ClientsLinks to Clients.ClientID
UserIDEdm.StringFK → UsersLinks to Users.UserID
SubsystemIDEdm.StringFK → SubprojectsLinks to Subprojects.SubsystemID
CategoryIDEdm.StringFK → CategoriesLinks to Categories.CategoryID
UserText1Edm.StringCustom field 1
UserText2Edm.StringCustom field 2
UserText3Edm.StringCustom field 3
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Invoices

Invoice records with totals, due dates, and payment status. Each invoice links to a client and optionally to a project, subproject, or task. Use BalanceDue and PaidInFull to report on outstanding receivables.

Endpoint: GET /odata/Invoices  ·  Primary key: InvoiceID

PropertyEdm TypeKeyNotes
InvoiceIDEdm.StringPKUnique identifier for the invoice
InvoiceNumEdm.StringHuman-readable invoice number (e.g. INV-1042)
DateSentEdm.DateDate the invoice was sent to the client
InvoiceDueDateEdm.DatePayment due date
DatePaidEdm.DateDate payment was received
PaidInFullEdm.BooleanInvoice fully paid flag
SubTotalEdm.DecimalSubtotal before tax
InvoiceTaxRateEdm.DecimalTax rate applied (decimal, e.g. 0.08 for 8%)
TaxAmountEdm.DecimalTax amount (SubTotal × InvoiceTaxRate)
InvoiceAmountEdm.DecimalTotal invoice amount including tax
AmountPaidEdm.DecimalAmount received to date
BalanceDueEdm.DecimalRemaining balance (InvoiceAmount − AmountPaid)
InvoiceTermsEdm.StringPayment terms (e.g. "Net 30")
POEdm.StringClient purchase order number
InvoiceInvoiceNoteEdm.StringNote printed on the invoice
NotesEdm.StringInternal memo
RepresentativeEdm.StringSales representative name
StartRangeEdm.DateBilling period start date (when invoice covers a time range)
EndRangeEdm.DateBilling period end date
MilestoneNameEdm.StringMilestone name if invoice is tied to a milestone
MilestoneDateEdm.DateMilestone date
ClientNameEdm.StringDenormalized client name
ProjectNameEdm.StringDenormalized project name
SubprojectNameEdm.StringDenormalized subproject name
TaskNameEdm.StringDenormalized task name
UserNameEdm.StringDenormalized user name
ClientIDEdm.StringFK → ClientsLinks to Clients.ClientID
ProjectIDEdm.StringFK → ProjectsLinks to Projects.ProjectID
SubprojectIDEdm.StringFK → SubprojectsLinks to Subprojects.SubsystemID
TaskIDEdm.StringFK → ProjectTasksLinks to ProjectTasks.TaskID
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

BillingRates

Rate schedule records — hourly client and salary rates that can be scoped by user, project, category, or role, with optional effective date ranges. The RateType field indicates the scope of each rate record.

Endpoint: GET /odata/BillingRates  ·  Primary key: BillingRateID

PropertyEdm TypeKeyNotes
BillingRateIDEdm.StringPKUnique identifier for the billing rate record
RateTypeEdm.StringScope of this rate — "User", "Project", "Category", or "Role"
BillingRateClientRateEdm.DecimalHourly client billing rate
BillingRateSalaryRateEdm.DecimalHourly salary/cost rate
StartDateEdm.DateEffective date start (null = no start boundary)
EndDateEdm.DateEffective date end (null = no end boundary)
BillingRateRoleNameEdm.StringRole name (when RateType = "Role")
UserNameEdm.StringDenormalized user name
ProjectNameEdm.StringDenormalized project name
CategoryNameEdm.StringDenormalized category name
UserIDEdm.StringFK → UsersLinks to Users.UserID (when RateType = "User")
ProjectIDEdm.StringFK → ProjectsLinks to Projects.ProjectID (when RateType = "Project")
CategoryIDEdm.StringFK → CategoriesLinks to Categories.CategoryID (when RateType = "Category")
RoleIDEdm.StringRole identifier — no corresponding OData entity set
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Inventory

Parts, materials, and physical assets tracked in stock. Inventory items can be linked to expenses (when an expense draws from inventory). No FK fields — Inventory is a standalone reference table with no relationships in the OData feed.

Endpoint: GET /odata/Inventory  ·  Primary key: InventoryID

PropertyEdm TypeKeyNotes
InventoryIDEdm.StringPKUnique identifier for the inventory item
NameEdm.StringItem display name
DescriptionEdm.StringFree-text description
CodeEdm.StringInternal item code
StatusEdm.StringItem status
ActiveEdm.BooleanActive/inactive flag
QtyInStockEdm.DecimalCurrent quantity on hand
QtyWhenToReorderEdm.DecimalReorder point — reorder when stock drops to this level
QtyToReorderEdm.DecimalQuantity to order when reordering
UnitsTypeEdm.StringUnit of measure (each, lb, ft, etc.)
CostUnitEdm.DecimalCost per unit (purchase cost)
CostClientEdm.DecimalClient billing price per unit
LeadTimeDaysEdm.Int32Procurement lead time in days
BuyOrBuildEdm.String"Buy" or "Build" sourcing decision
LaborEdm.DecimalLabor cost component per unit (for Build items)
WeightEdm.StringItem weight
SizeEdm.StringItem dimensions or size
ConditionEdm.StringPhysical condition (New, Used, Refurbished, etc.)
SKUEdm.StringInternal stock keeping unit
VendorSKUEdm.StringVendor's item number
MfgSKUEdm.StringManufacturer's part number
ModelNumEdm.StringModel number
SerialNumEdm.StringSerial number
VendorEdm.StringVendor/supplier name
ManufacturerEdm.StringManufacturer name
LocationEdm.StringPhysical storage location
WeblinkEdm.StringVendor or product page URL
NotesEdm.StringFree-text notes
InventoryFolderEdm.StringFolder path for organizing inventory items
UserText1Edm.StringCustom field 1
UserText2Edm.StringCustom field 2
UserText3Edm.StringCustom field 3
CreatedEdm.DateTimeOffsetRecord creation timestamp
ModifiedEdm.DateTimeOffsetLast-modified timestamp

Power BI M Queries

Each query below is ready to paste into the Power BI Advanced Editor (Home → Get Data → Blank Query → Advanced Editor). Replace YOUR_CID_HERE with your company ID and YOUR_API_KEY with your API key. For on-premise installations, remove the &cid=YOUR_CID_HERE portion — it is not needed.

Queries with a DaysBack variable pull only records created within that rolling window. Increase the number to load more history. For a complete step-by-step Power BI setup guide, see the Power BI OData Integration page.

TimeLogs

let // Fetch only time logs created in the last N days. // Increase DaysBack to load more history; set to 9999 for all records. DaysBack = 14, Cutoff = DateTimeZone.ToText( DateTimeZone.LocalNow() - #duration(DaysBack, 0, 0, 0), "yyyy-MM-ddTHH:mm:sszzz" ), Source = OData.Feed( "https://stcloud67.com/odata/TimeLogs?cid=YOUR_CID_HERE&$filter=Created gt " & Cutoff, null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Projects

let DaysBack = 30, Cutoff = DateTimeZone.ToText( DateTimeZone.LocalNow() - #duration(DaysBack, 0, 0, 0), "yyyy-MM-ddTHH:mm:sszzz" ), Source = OData.Feed( "https://stcloud67.com/odata/Projects?cid=YOUR_CID_HERE&$filter=Created gt " & Cutoff, null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

ProjectTasks

let DaysBack = 30, Cutoff = DateTimeZone.ToText( DateTimeZone.LocalNow() - #duration(DaysBack, 0, 0, 0), "yyyy-MM-ddTHH:mm:sszzz" ), Source = OData.Feed( "https://stcloud67.com/odata/ProjectTasks?cid=YOUR_CID_HERE&$filter=Created gt " & Cutoff, null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Subprojects

let Source = OData.Feed( "https://stcloud67.com/odata/Subprojects?cid=YOUR_CID_HERE", null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Users

let Source = OData.Feed( "https://stcloud67.com/odata/Users?cid=YOUR_CID_HERE", null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Clients

let Source = OData.Feed( "https://stcloud67.com/odata/Clients?cid=YOUR_CID_HERE", null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Categories

let Source = OData.Feed( "https://stcloud67.com/odata/Categories?cid=YOUR_CID_HERE", null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Expenses

let DaysBack = 90, Cutoff = DateTimeZone.ToText( DateTimeZone.LocalNow() - #duration(DaysBack, 0, 0, 0), "yyyy-MM-ddTHH:mm:sszzz" ), Source = OData.Feed( "https://stcloud67.com/odata/Expenses?cid=YOUR_CID_HERE&$filter=Created gt " & Cutoff, null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Invoices

let Source = OData.Feed( "https://stcloud67.com/odata/Invoices?cid=YOUR_CID_HERE", null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

BillingRates

let Source = OData.Feed( "https://stcloud67.com/odata/BillingRates?cid=YOUR_CID_HERE", null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Inventory

let Source = OData.Feed( "https://stcloud67.com/odata/Inventory?cid=YOUR_CID_HERE", null, [Headers = [#"X-Api-Key" = "YOUR_API_KEY"]] ) in Source

Recommended Relationships

The diagram below shows the recommended Power BI table relationships. TimeLogs is the primary fact table — connect it to all six dimension tables for full slicing by project, user, client, task, phase, and category. Power BI auto-detect finds most joins; the one exception is TimeLogs.ProjectTaskID → ProjectTasks.TaskID, where the field names differ and the relationship must be set manually in the Model view.

Star schema diagram showing TimeLogs linked to Projects, Users, Clients, ProjectTasks, Subprojects, and Categories

Primary Relationships (TimeLogs as fact table)

From (Many)FieldTo (One)FieldNote
TimeLogsProjectIDProjectsProjectIDAuto-detected
TimeLogsUserIDUsersUserIDAuto-detected
TimeLogsClientIDClientsClientIDAuto-detected
TimeLogsProjectTaskIDProjectTasksTaskIDSet manually — field names differ
TimeLogsSubsystemIDSubprojectsSubsystemIDAuto-detected
TimeLogsCategoryIDCategoriesCategoryIDAuto-detected

Secondary Relationships

From (Many)FieldTo (One)FieldNote
ProjectsClientIDClientsClientIDAuto-detected
ProjectTasksProjectIDProjectsProjectIDAuto-detected
ProjectTasksClientIDClientsClientIDMay cause ambiguous paths — enable only if needed
ExpensesProjectIDProjectsProjectIDAuto-detected
ExpensesUserIDUsersUserIDAuto-detected
ExpensesClientIDClientsClientIDAuto-detected
InvoicesClientIDClientsClientIDAuto-detected
InvoicesProjectIDProjectsProjectIDAuto-detected
BillingRatesUserIDUsersUserIDAuto-detected; only relevant when RateType = "User"
BillingRatesProjectIDProjectsProjectIDAuto-detected; only relevant when RateType = "Project"
SubprojectsProjectIDProjectsProjectIDAuto-detected