Teamwork Graph from Any HR Source
OnLink Bulk Job: Teamwork Graph CSV Export from Any HR Source
Use this guide to configure an OnLink Teamwork Graph bulk job. The job pulls employee/org data from any HR connection (Workday, BambooHR, ADP, Anysource, etc.), maps it to Atlassian’s HRIS S3 format, and uploads a CSV to your S3 bucket for the Teamwork Graph HRIS S3 connector.
What it does
Each run:
Fetches all records from your Source HR connection
Maps source fields → Teamwork Graph fields (Workers, Positions, or Organizations)
Normalizes values (dates, booleans, enums) to Atlassian’s expected format
Builds a full-snapshot CSV and overwrites the fixed file name in your S3 bucket
Object type | CSV file uploaded |
|---|---|
Workers |
|
Positions |
|
Organizations |
|
You typically need one bulk job per object type (three jobs for a full org chart).
Atlassian field reference:
https://support.atlassian.com/organization-administration/docs/hris-s3-connector-field-reference/
Prerequisites
In Atlassian
Teamwork Graph HRIS S3 connector configured to read from your S3 bucket
Connector expecting the standard file names above
In OnLink
HR Source connection (any saved connection)
Two identities (simplest and matches how each product works today):
IAM user + access key → OnLink write (
PutObject)IAM role + External ID → Atlassian read (
GetObject/ListBucket)
Examples: Workday, BambooHR, Oracle HCM, Azure, Anysource (custom REST API).
S3 Target connection
OnLink → Connections → Add System → HRIS S3
Create the bulk job
OnLink → Bulk Jobs → Add New Bulk Job
Field | What to set |
|---|---|
Batch job name | Descriptive name, e.g. |
Bulk job type | Teamwork Graph |
Object type | Workers, Positions, or Organizations |
Source | HR connection that supplies the data |
Target | AWS S3 Anysource connection (SigV4) |
Schedule | Optional — toggle on for daily/hourly/weekly/monthly runs |
Teamwork Graph jobs use a single screen (no JQL / HTTP body step). Click Submit when done.
Configure field mapping
The mapping editor pre-fills a template with one line per Teamwork Graph field:
map:<source field name>=workerId
map:<source field name>=createdAt
...Replace <source field name> with the flattened field name from your HR API (use Fetch API Sample — see below).
Mapping line format
Type | Format | Example |
|---|---|---|
Field map |
|
|
Fetch config |
|
|
Supported config: keys (Anysource / API tuning)
Key | Purpose |
|---|---|
| Override API path |
| JSON path to the record array |
| POST request body (JSON) |
| HTTP method override |
| Cap pagination pages |
| Anysource connection name (usually auto-filled) |
Note: Only one
:per line is allowed in the mapping parser. Custom HTTP headers are not supported in bulk-job mappings.
Required fields (must be mapped)
Workers: workerId, createdAt, name, isActive
Positions: positionId, createdAt, isActive, organizationId, workerId
Organizations: organizationId, organizationName, createdAt, isActive
Optional fields can be left as placeholders; they export as empty columns.
Test before saving
Select Source and enter mappings
Click Fetch API Sample
Review Sample Data — confirms connectivity and shows exact source field names for
map:linesFix mapping until required fields are covered
Click Submit
Run the job
Manual run
Bulk Jobs list → Run on the job row.
Scheduled run
Enable Schedule, set period (daily / hourly / weekly / monthly), save.
Value formats (automatic normalization)
OnLink converts mapped values before writing CSV:
Field kind | Output format | Examples accepted |
|---|---|---|
datetime | ISO UTC, e.g. | Most date strings |
date |
| Most date strings |
bool01 ( |
| true/false, yes/no, active/inactive |
enum | Canonical value |
|
Rows missing required fields are dropped. Invalid optional values are blanked.
You can use below transformations:
concat(firstName, ‘ ‘, lastName)e.g.map:concat(firstName, ‘ ‘, lastName)=nameif(status eq ’active’,’1’,’0’)e.g.map:if(status eq ’active’,’1’,’0’)=isActive
Recommended setup (full org chart)
Create three bulk jobs sharing the same Source and Target:
Job name | Object type | Output file |
|---|---|---|
TG Organizations | Organizations |
|
TG Positions | Positions |
|
TG Workers | Workers |
|
Run Organizations → Positions → Workers (or on the schedule Atlassian expects).
Monitoring & troubleshooting
OnLink job logs (Bulk Jobs / import log UI) show messages like:
fetched N record(s) from sourceuploaded workers.csv with N row(s)Errors: missing mapping, zero records, S3 PUT failure, invalid required fields
Common errors
Error | Likely cause |
|---|---|
| Mapping missing a required Teamwork Graph field |
| Wrong |
| Required fields empty or wrong format in source data |
| Target is not an S3 Anysource connection |
| IAM permissions or bucket URL incorrect |
Example: Anysource HR API → Workers
Source: Anysource connection MyHR API (GET employees)
Mapping:
config:data_path=employees
map:emp_id=workerId
map:created_date=createdAt
map:full_name=name
map:active_flag=isActive
map:email=emailAddress
map:hire_date=hireDate
map:job_title=titleTarget: S3 connection Teamwork Graph Bucket
Result: workers.csv uploaded to the bucket; Atlassian HRIS S3 connector ingests it on its next sync.