Unanet GovCon Integrated Data
Field mapping reference for Unanet GovCon
What this page covers: A complete reference mapping every Unanet GovCon field to its Mosaic equivalent. Use this guide when configuring your integration, verifying synced data, or troubleshooting discrepancies.
| Integration type | Cloud (Unanet GovCon REST API) |
| Authentication | Username + password (bearer token, 20-minute TTL) |
| Setup complexity | Moderate |
| Configurable fields | Project status mappings, inactive phase mapping, project status exclusions |
| Prerequisite | Unanet GovCon Integration Setup |
How Data Flows
Unanet GovCon (REST API) → Mosaic Sync Engine (field mapping) → Mosaic (12 synced data types)
The integration uses the Unanet GovCon REST API to query People, Project Organizations, Projects, Tasks, Time, Labor Categories, Person Rates, Project People-Assignments, and Project Labor-Categories. Portfolios and Rate Groups are derived client-side from project records.
Data flows one way only — Unanet → Mosaic. Records are read-only from Mosaic's perspective.
Integrated Data Types
The integration syncs 12 data categories from Unanet GovCon into Mosaic:
| Data Type | Description |
|---|---|
| Members | Employee records (name, email, username, default role, archive status) |
| Member Roles | Member-to-labor-category assignments derived from the employee's labor category |
| Clients | Project organization records |
| Projects | Contract / project records (title, code, status, organization, budget, billable flag) |
| Phases | Tasks under projects with multi-level parent linkage |
| Time Entries | Timeslip records (hours, billable, description, hourly rate, status) |
| Roles | Labor categories |
| Bill Rates | Per-employee bill rate history (rate, classification, effective dates) |
| Cost Rates | Per-employee cost rate history (paired with bill rates from the same endpoint) |
| Member Project Bill Rates | Override bill rates per (employee × project × phase) from people-assignments |
| Member Project Roles | Per-(employee × project × phase) role assignments from people-assignments |
| Rate Groups | One per project (synthesized from [code] - [title]) |
| Entity Rates / Rates | Per-(role × project) rates from project labor-categories |
| Portfolios | Synthesized from each project's Project Lead |
This list may expand as new features are added.
Not Synced
| Data Type | Description |
|---|---|
| Project Manager (Mosaic field) | The projectManager field is loaded but not assigned to a Mosaic Project Manager field |
| Bill Rate from Employee record | Bill/cost rates do not come from the Employee record — they come from /people/{id}/rates |
| Labor Category on Time Entries | Time entries' own labor category is loaded but not surfaced as a Mosaic field |
| Cost Rates from labor categories | Project-level labor category cost rates are not synced (only bill rates are) |
| Activities | No activity entity is fetched |
| Work Plans / Budget Estimates | Resource planning data is not synced |
| Project member cost rate overrides | Only project member bill rate overrides are synced |
Reading the Field Mapping Tables
Symbol legend for technical tables
The Technical Reference tabs below use a shorthand notation for API sources. Read this legend before reviewing the mappings.
| Symbol | Meaning | Example |
|---|---|---|
. | API field reference | Person.firstName = the firstName field on the Person resource |
• | Values combined into one composite value | code • title = combined into [code] - [title] |
> | Fallback priority — use the first available value | revStartDate > origStartDate = use revised; if null, use original |
or | Configurable — an integration setting selects which | Status mappings select different Mosaic statuses |
Members
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Employee ID | The unique Unanet person identifier |
| First Name | The person's first name |
| Middle Name | The person's middle initial |
| Last Name | The person's last name |
| The person's email address | |
| Username | The person's Unanet username |
| Default Role | The person's labor category (linked to a Role) |
| Is Archived | Derived from the person's active flag — active = false = archived |
| Created / Modified | When the person record was created and last modified |
Bill rates and cost rates do not come from the Member record. They come from a separate endpoint — see Bill Rates and Cost Rates.
| Mosaic Field | Source |
|---|---|
| Employee ID | Person.key |
| First Name | Person.firstName |
| Last Name | Person.lastName |
| Middle Name | Person.middleInitial |
Person.email | |
| Username | Person.username |
| Default Role | Person.laborCategory.key |
| Is Active | Person.active |
| Is Archived | !Person.active |
| Created / Modified | Person.createdTimestamp / Person.lastModifiedTimestamp |
Source:
GET /rest/people. ThePersonresource does not includebillRateorcostRatefields.
Unanet Documentation
Member Roles
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Member Role ID | A composite of the employee and labor category keys |
| Employee | The employee this role belongs to |
| Role | The employee's labor category |
Member Roles only sync when the employee has a labor category assigned. Member Role records do not have start or end dates.
| Mosaic Field | Source |
|---|---|
| Member Role ID | Person.key • Person.laborCategory.key (composite) |
| Employee | Person.key |
| Role | Person.laborCategory.key |
| Start / End Dates | null |
Triggered as an
alsoFetchof Member sync.
Unanet Documentation
Clients
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Client ID | The unique Unanet project organization identifier |
| Client Title | The organization name |
| Client Number | The organization code |
Source:
GET /rest/assigning/projects/organizations.
| Mosaic Field | Source |
|---|---|
| Client ID | Organization.key |
| Client Title | Organization.name |
| Client Number | Organization.code |
Project → Client linkage is resolved through the project's
projectOrg.keyfield.
Unanet Documentation
Projects
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Project ID | The unique Unanet project identifier |
| Project Title | The project title |
| Project Number | The project code |
| Client | The project organization linked to the project |
| Description | Project comments |
| Currency | The project currency code |
| Start Date | The revised start date (falling back to the original start date); sentinel dates 1900-01-01 and 2099-12-31 are nulled |
| End Date | The revised end date (falling back to the original end date); same sentinel handling |
| Fee | The project's labor bill budget |
| Status | The project status, mapped to Mosaic's status values via configurable mappings |
| Is Billable | Derived from the project type — billable project types result in billable projects |
| Rate Group | The project itself acts as a rate group (when bill rate source is Labor Category) |
| Billing Type | Employee when bill rate source is Person; Role otherwise (i.e., Labor Category or Override) |
| Portfolio | The project lead is mapped to a Portfolio |
| Created / Modified | When the project record was created and last updated |
Project Manager
Mosaic does not populate a Project Manager field. The
projectLeadfield is used to derive a Portfolio instead.
Project Status Exclusion
Projects whose status name is in
projectCustomStatusExclusionare skipped entirely.
| Mosaic Field | Source |
|---|---|
| Project ID | Project.key |
| Project Title | Project.title |
| Project Number | Project.code |
| Client | Project.projectOrg.key |
| Description | Project.comments |
| Currency | Project.projectCurrency.code |
| Start Date | Project.revStartDate > Project.origStartDate (sentinel 1900-01-01/2099-12-31 → null) |
| End Date | Project.revEndDate > Project.origEndDate (same sentinel handling) |
| Fee | Project.laborBillBudget |
| Status | Project.status.name mapped via customProjectStatusesTo*Mapping settings |
| Is Billable | Derived from Project.projectType.key against the cached billable project types |
| Rate Group | Project.key when billRateSource === LABOR_CATEGORY |
| Billing Type | Employee when billRateSource === PERSON; Role otherwise (LABOR_CATEGORY or OVERRIDE) |
| Portfolio | Project.projectLead.key |
| Created / Modified | Project.createdTimestamp / Project.lastUpdatedTimestamp |
Source:
POST /rest/projects/search(summary) →GET /rest/projects/{id}(detail). Billable derivation uses a cached list of project types fromGET /rest/project-types?limit=100(24 h cache).
Unanet Documentation
Phases
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Phase ID | The unique Unanet task identifier |
| Phase Title | The task name |
| Phase Number | The task number |
| Project | The project the task belongs to |
| Parent | The parent task (if nested), or the project (if top-level) |
| Start Date / End Date | The revised dates (falling back to original); sentinel dates nulled (same handling as projects) |
| Fee | The task's labor bill budget |
| Is Billable | Inherited from the parent project's billable project type |
| Status | Active if the task is active; otherwise the configured "inactive phase" mapping |
| Budget Fee Type | Derived from the project's billing type — FP (Fixed Price) → Use Entered Budget; TM → Total Spent and Planned Time |
| Mosaic Field | Source |
|---|---|
| Phase ID | Task.key |
| Phase Title | Task.name |
| Phase Number | Task.number |
| Project | Task.project.key |
| Parent | Task.parentTask.key (if set); otherwise Task.project.key |
| Start Date | Task.revStartDate > Task.origStartDate (sentinel handling applies) |
| End Date | Task.revEndDate > Task.origEndDate (sentinel handling applies) |
| Fee | Task.laborBillBudget |
| Is Billable | Computed via billableProjectTypes.has(parentProject.key) (see note below) |
| Status | Active when Task.active is true; else inactivePhaseStatusMapping (default Hold) |
| Budget Fee Type | Project.projectBillingType.code — FP → UseEnteredBudget; TM → TotalSpentAndPlannedTime |
Source:
GET /rest/projects/{projectKey}/tasks(summary) →GET /rest/projects/{projectKey}/tasks/{key}(detail).
Note on phase
Is Billable: Unlike the project-level computation (which usesprojectType.key), the phase-level lookup uses the parent project'skeyagainst the cached billable project type set. BecausebillableProjectTypesis keyed by project type IDs, this lookup will not match in most tenants — phaseIs Billablewill typically resolve tofalse. Track in the agent backlog if your tenant requires phase-level billable inheritance.
Unanet Documentation
Time Entries
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Time Entry ID | The unique Unanet timeslip identifier |
| Date | The work date |
| Hours | The hours worked |
| Description | The timeslip comments |
| Employee | The owner of the parent timesheet |
| Project | The project the time was logged against |
| Phase | The task the time was logged against (null if logged directly to the project) |
| Hourly Rate | The bill rate on the timeslip |
| Billable | Derived from the project type — billable project types result in billable time |
| Status | Rejected if a rejection reason exists; Approved if the timesheet status is APPROVING; otherwise Submitted |
| Created / Modified | When the timeslip was posted and last updated |
| Mosaic Field | Source |
|---|---|
| Time Entry ID | Timeslip.key |
| Date | Timeslip.workDate |
| Hours | Timeslip.hoursWorked |
| Description | Timeslip.comments |
| Employee | Timesheet.owner.key (parent timesheet) |
| Project | Timeslip.project.key |
| Phase | Timeslip.task.key (when set; else null) |
| Hourly Rate | Timeslip.billRate |
| Billable | Derived from Timeslip.projectType.key against the cached billable project types |
| Status | Rejected if Timesheet.rejectionReason; Approved if Timesheet.status === 'APPROVING'; else Submitted |
| Created / Modified | Timeslip.postDate / Timeslip.lastUpdate |
Source:
POST /rest/time/search(summary) →GET /rest/time/{id}(detail; returns the timesheet withtimeslips[]).
Unanet Documentation
Roles
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Role ID | The unique Unanet labor category identifier |
| Role Name | The labor category name |
| Description | The labor category description |
| Is Archived | Derived from the labor category active flag — active = false = archived |
| Mosaic Field | Source |
|---|---|
| Role ID | LaborCategory.key |
| Role Name | LaborCategory.name |
| Description | LaborCategory.description |
| Is Archived | !(LaborCategory.active ?? true) |
Source:
GET /rest/labor-categories.
Unanet Documentation
Bill Rates
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Bill Rate ID | The unique Unanet rate record identifier |
| Employee | The employee this rate applies to |
| Rate Amount | The bill rate amount |
| Description | The rate classification (e.g., NON_EMPLOYEE) |
| Start / End Dates | The effective date range for the rate |
Bill rates are fetched from a per-employee endpoint, not from the employee record itself.
| Mosaic Field | Source |
|---|---|
| Bill Rate ID | BillRate.key |
| Employee | BillRate.personKey |
| Rate Amount | BillRate.billRate |
| Description | BillRate.classification |
| Start Date | BillRate.beginDate |
| End Date | BillRate.endDate |
Source:
GET /rest/people/{personKey}/rates. Triggered as analsoFetchof Member sync.
Unanet Documentation
Cost Rates
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Cost Rate ID | The unique Unanet rate record identifier |
| Employee | The employee this cost rate applies to |
| Hourly Rate | The cost rate amount |
| Rate Type | Always Hourly |
| Description | The rate classification |
| Start / End Dates | The effective date range for the rate |
Bill rates and cost rates come from the same endpoint — each rate record contains both
billRateandcostRatefields.
| Mosaic Field | Source |
|---|---|
| Cost Rate ID | BillRate.key |
| Employee | BillRate.personKey |
| Hourly Rate | BillRate.costRate |
| Rate Type | Always Hourly |
| Description | BillRate.classification |
| Start Date | BillRate.beginDate |
| End Date | BillRate.endDate |
Source:
GET /rest/people/{personKey}/rates(same endpoint as Bill Rates).
Unanet Documentation
Member Project Bill Rates
Override bill rates per (employee × project × phase) — used when a specific person has a different rate on a specific project than their default rate.
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Employee | The person assigned to the project |
| Project | The project the assignment is for |
| Phase | The task the assignment is for (if set) |
| Rate Amount | The override bill rate |
| Start / End Dates | The effective date range for the override |
Only assignments where
billRateSource === OVERRIDEandbillRateis set are synced.
| Mosaic Field | Source |
|---|---|
| Employee | PeopleAssignment.person.key |
| Project | PeopleAssignment.project.key |
| Phase | PeopleAssignment.task.key (when set) |
| Rate Amount | PeopleAssignment.billRate |
| Start / End Dates | PeopleAssignment.beginDate / PeopleAssignment.endDate |
| Modified Date | PeopleAssignment.lastUpdated |
Source:
POST /rest/projects/{projectKey}/people-assignments/search. Filtered tobillRateSource === OVERRIDEwith non-nullbillRate.
Unanet Documentation
Member Project Roles
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Employee | The person assigned to the project |
| Project | The project the assignment is for |
| Phase | The task the assignment is for (if set) |
| Role | The labor category on the assignment |
| Start / End Dates | The effective date range for the assignment |
For projects whose
billRateSource === LABOR_CATEGORY, all people-assignments with a labor category sync. For other projects, onlyOVERRIDEassignments with a labor category sync.
| Mosaic Field | Source |
|---|---|
| Employee | PeopleAssignment.person.key |
| Project | PeopleAssignment.project.key |
| Phase | PeopleAssignment.task.key (when set) |
| Role | PeopleAssignment.laborCategory.key |
| Start / End Dates | PeopleAssignment.beginDate / PeopleAssignment.endDate |
| Modified Date | PeopleAssignment.lastUpdated |
Source: same
POST /rest/projects/{projectKey}/people-assignments/searchendpoint as Member Project Bill Rates.
Unanet Documentation
Rate Groups
A Rate Group is created for every project synced from Unanet — there is no separate Rate Group entity in Unanet GovCon. The Project's targetRateGroupId is set to the Rate Group only when the project's bill rate source is Labor Category.
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Rate Group ID | The project key |
| Rate Group Name | A composite of project code and title: {code} - {title} |
| Active Entity Type | Always Role |
| Mosaic Field | Source |
|---|---|
| Rate Group ID | Project.key |
| Rate Group Name | Project.code • Project.title |
| Active Entity Type | Always Role |
Triggered as an
alsoFetchof Project sync.
Unanet Documentation
Entity Rates / Rates
Each project's labor categories produce one Entity Rate and one Rate per (project × role × effective period). End dates are derived as the day before the next rate's start date; the latest rate has no end date.
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Rate ID | A composite of the labor category key and start date |
| Rate Group | The project (the project itself is the rate group) |
| Role | The labor category |
| Rate Amount | The bill rate from the project labor category rate row |
| Description | A composite display label: [{projectCode}]: {laborCategoryName} - {beginDate} (with - {endDate} appended when end date is set) |
| Start / End Dates | The effective date range (end date derived from the next entry's start) |
| Is Cost Rate | Always false |
Project-level cost rates from labor categories are loaded by the API but are not synced as Mosaic cost rate records — only bill rates flow through.
| Mosaic Field | Source |
|---|---|
| Rate ID | key={laborCategory.key}&startDate={beginDate}[&endDate={endDate}] (composite) |
| Rate Group | Project.key |
| Role | ProjectLaborCategory.laborCategory.key |
| Rate Amount | ProjectLaborCategoryRate.billRate |
| Description | Project.code • ProjectLaborCategory.laborCategory.name • ProjectLaborCategoryRate.beginDate (• ProjectLaborCategoryRate.endDate when set) |
| Start Date | ProjectLaborCategoryRate.beginDate |
| End Date | Day before the next rate's beginDate (null on the latest rate) |
| Is Cost Rate | Always false |
Source:
GET /rest/projects/{projectKey}/labor-categories. Triggered as analsoFetchof Project sync.
Unanet Documentation
Portfolios
Portfolios are synthesized from each project's Project Lead — Unanet GovCon does not have a dedicated Portfolio entity. A portfolio is created per unique Project Lead.
| What Syncs to Mosaic | Where It Comes From in Unanet GovCon |
|---|---|
| Portfolio ID | The Project Lead's employee identifier |
| Portfolio Name | The Project Lead's name |
A portfolio is only created for projects that have a
projectLeadset. The project'stargetPortfolioIdis the same Project Lead key.
| Mosaic Field | Source |
|---|---|
| Portfolio ID | Project.projectLead.key |
| Portfolio Name | Project.projectLead.name |
Triggered as an
alsoFetchof Project sync.
Unanet Documentation
Configurable Settings
| Setting | Purpose | Default |
|---|---|---|
projectCustomStatusExclusion | Skip projects whose Unanet status name is in this list | [] |
customProjectStatusesToProposalMapping | Map custom Unanet statuses → Mosaic Proposal | [] |
customProjectStatusesToActiveMapping | Map custom Unanet statuses → Mosaic Active | [] |
customProjectStatusesToHoldMapping | Map custom Unanet statuses → Mosaic Hold | [] |
customProjectStatusesToCompleteMapping | Map custom Unanet statuses → Mosaic Complete | [] |
inactivePhaseStatusMapping | Mosaic phase status when Unanet active = false | Hold |
overrideNewestRate | Always push the newest member bill rate (consumed downstream) | false |
Adjust these via your Customer Success Manager.
Troubleshooting & FAQ
Where does the project's Project Manager go in Mosaic?
The projectManager field is loaded from Unanet but not assigned to a Mosaic Project Manager field. The projectLead field is used to derive a Mosaic Portfolio instead.
Why aren't bill rates and cost rates on the Member record?
Unanet GovCon stores rates in a separate /people/{key}/rates endpoint, not on the Person record. Each rate record contains both billRate and costRate fields, which become Mosaic Bill Rates and Cost Rates respectively.
Why aren't certain projects syncing?
Projects whose status name appears in projectCustomStatusExclusion are skipped entirely. Adjust this setting to include those projects.
Why isn't a phase's labor budget for expenses syncing?
Only Task.laborBillBudget is mapped to Mosaic's Fee field. The separate expBillBudget field is not synced.
Are cost rates from project labor categories synced?
No. Only bill rates from project labor categories sync (as Entity Rates and Rates). The corresponding costRate field on each rate row is not surfaced.
I need a data source or field that isn't listed here.
Any integration not listed in this documentation is considered a customization and is charged at an hourly rate. For more information, see Integration Requests.
Unanet Documentation Links
| Topic | Link |
|---|---|
| Unanet Help Center | Unanet Help |
| Unanet Website | Unanet |
Related Documentation
Updated 4 months ago
