Teamwork Graph from Any HR Source

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:

  1. Fetches all records from your Source HR connection

  2. Maps source fields → Teamwork Graph fields (Workers, Positions, or Organizations)

  3. Normalizes values (dates, booleans, enums) to Atlassian’s expected format

  4. Builds a full-snapshot CSV and overwrites the fixed file name in your S3 bucket

Object type

CSV file uploaded

Object type

CSV file uploaded

Workers

workers.csv

Positions

positions.csv

Organizations

organizations.csv

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

  1. HR Source connection (any saved connection)

  2. 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).

  1. S3 Target connection

  • OnLink → Connections → Add System → HRIS S3

  • image-20260831-203802.png

     


Create the bulk job

OnLink → Bulk Jobs → Add New Bulk Job

Field

What to set

Field

What to set

Batch job name

Descriptive name, e.g. TG Workers – Workday

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

Type

Format

Example

Field map

map:<sourceField>=<targetField>

map:employee_id=workerId

Fetch config

config:<key>=<value>

config:data_path=results

Supported config: keys (Anysource / API tuning)

Key

Purpose

Key

Purpose

api

Override API path

data_path

JSON path to the record array

http_body

POST request body (JSON)

http_method

HTTP method override

max_pages

Cap pagination pages

connection_name

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

  1. Select Source and enter mappings

  2. Click Fetch API Sample

  3. Review Sample Data — confirms connectivity and shows exact source field names for map: lines

  4. Fix mapping until required fields are covered

  5. 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

Field kind

Output format

Examples accepted

datetime

ISO UTC, e.g. 2024-09-18T13:00:00.000Z

Most date strings

date

YYYY-MM-DD

Most date strings

bool01 (isActive)

1 or 0

true/false, yes/no, active/inactive

enum

Canonical value

status: Filled / Unfilled; employmentType: Employee / Contingent / Contractor

Rows missing required fields are dropped. Invalid optional values are blanked.

You can use below transformations:

  1. concat(firstName, ‘ ‘, lastName) e.g. map:concat(firstName, ‘ ‘, lastName)=name

  2. if(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

Job name

Object type

Output file

TG Organizations

Organizations

organizations.csv

TG Positions

Positions

positions.csv

TG Workers

Workers

workers.csv

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 source

  • uploaded workers.csv with N row(s)

  • Errors: missing mapping, zero records, S3 PUT failure, invalid required fields

Common errors

Error

Likely cause

Error

Likely cause

required field(s) not mapped

Mapping missing a required Teamwork Graph field

source returned no records

Wrong data_path, filter, or empty HR API response

all N record(s) were dropped

Required fields empty or wrong format in source data

target connection must use AWS Signature V4

Target is not an S3 Anysource connection

S3 upload failed with status 403

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=title

Target: S3 connection Teamwork Graph Bucket

Result: workers.csv uploaded to the bucket; Atlassian HRIS S3 connector ingests it on its next sync.