What Is an XER File
Last reviewed 9 September 20261,974 words9 min read
Structure, tables, what's actually inside
๐ฉ In one line: An XER is a plain tab-delimited text file that carries a P6 project as a set of database tables โ activities, logic, calendars, resources, codes โ with every duration and float stored in hours, every percent stored as a fraction, and a one-line header that decides whether it will import at all.
๐ค Who this is for: Junior planners who have only ever double-clicked one; mid-level planners who need to read a file before it touches an enterprise database; seniors checking what a contractor actually sent. You should know what a P6 project, WBS and calendar are.
First, let's be honest about why this page exists
Most planners treat an XER as a black box: export, email, import, hope. That works until the day a client's reviewer says "your file shows a 3.75-day duration" and you have no idea why, or an Oracle-type enterprise database inherits forty stray calendars because nobody looked inside a subcontractor's file first.
The file is not mysterious. It is around thirty named tables written one after another in a text format you can open in any editor. Once you can read the five tables that matter, you can audit a submission, diagnose an import failure, and explain every strange number P6 shows after import.
๐จ The standard โ what "good" looks like
There is no standard that defines XER; it is Oracle's proprietary interchange format. But the standards say a great deal about native electronic files being the record.
| Source | What it says (paraphrased) |
|---|---|
| Oracle P6 XER Import/Export Data Map Guide | Defines each table, field and unit in the file; the authoritative reference for what a column means |
| FIDIC 2017 Cl 8.3 (check the edition in your contract) | Programme to be submitted in paper and electronic form, using the software named in the Specification โ in practice, the native XER |
| SCL Delay & Disruption Protocol 2nd ed., Guidance Part B, section 1 | Programme should be kept and exchanged in native electronic form so logic and float can be examined, not just PDF bars |
| Typical Gulf client schedule specifications | Native XER submitted with every update; PDF alone is non-compliant |
| AACE RP 29R-03 (forensic) | Analysis relies on the electronic files as maintained at the time โ the XER is the evidence |
๐ข Rule to remember: the XER is the programme; the PDF is a picture of it. Whoever holds the XER holds the logic, the float and the argument.
How it actually works
The file skeleton. Open an XER in a text editor and you see four kinds of line, distinguished by their first characters:
| Line starts with | Meaning | Notes |
|---|---|---|
ERMHDR | Single header line, first in the file | Holds the P6 version number, export date, the exporting user, database name and base currency. The version field is what blocks imports into older P6 |
%T | Start of a table | Followed by the table name, e.g. TASK |
%F | The field (column) names for that table | One tab-separated list |
%R | One record (row) | Same number of tab-separated values as the %F line. Every row, no exceptions |
%E | End of file | Missing %E means a truncated file |
Everything is tab-delimited. Spaces are data; tabs are structure. That is why opening the file in a spreadsheet and saving it back usually destroys it.
The tables that matter. A typical export contains 25โ35 tables. Five of them are the programme; the rest are enterprise furniture.
| Table | What it holds | Key fields to know |
|---|---|---|
| PROJECT | One row per project: ID, planned start, data date | proj_short_name (Project ID), last_recalc_date (data date), plan_start_date, scd_end_date (must-finish-by), clndr_id (default calendar) |
| PROJWBS | The WBS tree, including the project root node | wbs_id, parent_wbs_id, wbs_short_name, wbs_name |
| TASK | One row per activity | task_code (Activity ID), task_name, task_type, status_code, clndr_id, wbs_id, durations, dates, float, constraint fields |
| TASKPRED | One row per relationship | task_id, pred_task_id, pred_type (PR_FS / PR_SS / PR_FF / PR_SF), lag_hr_cnt |
| CALENDAR | Every calendar referenced | clndr_name, clndr_type (CA_Base global / CA_Project / CA_Rsrc), day_hr_cnt, week_hr_cnt, and a long encoded clndr_data string holding the work week and date exceptions |
The supporting cast:
| Table(s) | Purpose | Why you care |
|---|---|---|
| RSRC, TASKRSRC, RSRCRATE | Resources, assignments, rates | Resources are global; they land in the enterprise database on import |
| ACTVTYPE, ACTVCODE, TASKACTV | Activity code types, values, assignments | Code types can be global, EPS or project scope (actv_code_type_scope) |
| UDFTYPE, UDFVALUE | User-defined fields and values | Global; duplicate names cause silent confusion |
| MEMOTYPE, TASKMEMO | Notebook topics and text | Duration-basis notes live here; so do comments you may not want a client to read |
| SCHEDOPTIONS | The F9 scheduling options for the project | Retained logic vs progress override, calendar for lags โ all here |
| PROJCOST, ACCOUNT | Expenses and cost accounts | Confidential on most contractor submissions |
| FINDATES, TRSRCFIN, TASKFIN | Financial periods and stored period performance | A frequent import complaint |
| OBS, POBS | Organisational breakdown | POBS is a known bloat table in P6 8.x onward; safe to delete |
| CURRTYPE | Currencies | Base currency mismatch triggers a prompt on import |
Units and encodings inside TASK. This is where every "P6 is showing a strange number" question is answered.
| Field | Stored as | Example | What P6 shows |
|---|---|---|---|
target_drtn_hr_cnt (original duration) | Hours | 240 | 24 d on a 10 h/day calendar; 30 d on 8 h/day |
remain_drtn_hr_cnt | Hours | 60 | 6 d or 7.5 d depending on hours/day |
total_float_hr_cnt | Hours | -80 | -8 d on 10 h/day |
phys_complete_pct | Percent as a number | 45 | 45% |
complete_pct_type | Code | CP_Phys / CP_Drtn / CP_Units | Physical / Duration / Units |
task_type | Code | TT_Task / TT_Mile / TT_FinMile / TT_LOE / TT_Rsrc / TT_WBS | Task Dependent, Start Milestone, Finish Milestone, LOE, Resource Dependent, WBS Summary |
status_code | Code | TK_NotStart / TK_Active / TK_Complete | Not Started / In Progress / Completed |
cstr_type, cstr_date | Code + date | CS_MSOA, 2025-03-01 08:00 | Start On or After 01-Mar-25 |
| Dates | Text YYYY-MM-DD HH:MM | 2025-06-14 17:00 | 14-Jun-25 17:00 |
driving_path_flag | Y/N | Y | On the longest path at last F9 |
The hours-to-days conversion is done on your side. P6 uses Admin > Admin Preferences > Time Periods (hours per day), unless "Use assigned calendar to specify the number of work hours for each time period" is ticked, in which case each activity's calendar does it. A file exported from a 10-hour database and imported into an 8-hour one shows 10 days as 12.5 days. Nothing in the file changed; the divisor did.
IDs are internal, not the ones you see. task_id, wbs_id, clndr_id are database integers. The human Activity ID is task_code. TASKPRED links by the integers, which is why a tool-generated XER with mismatched integers imports with missing logic.
๐ฅ Where people go wrong
- Opening the XER in Excel and saving it. Excel strips leading zeros from codes like
0010, reformats dates, and may replace tabs. The file is now unimportable or, worse, imports with corrupted IDs. Use a text editor or a purpose-built parser; if you must use Excel, import it as a copy and never save over the original.
- Assuming the days shown are the days sent. A contractor plans on 9 h/day; the client's database defaults to 8. Every duration and float value grows by 12.5% on the client's screen. Agree hours/day in the schedule specification and state it in the narrative.
- Treating the header as decoration. The
ERMHDRversion field is the first thing P6 reads. A 22.12 file will not open in 19.12 until the number is changed (see xer-file-wont-import).
- Forgetting resources, calendars and codes are global. They do not belong to the project. Importing a subcontractor's XER without checking pushes their calendars and 200 resources into your enterprise database permanently.
- Sending cost you didn't mean to send. PROJCOST, TASKRSRC and RSRCRATE carry unit rates and expenses. A resource-loaded contractor file handed straight to a client is a commercial disclosure. Export from a copy with costs removed.
- Reading Notebook as private. TASKMEMO is in the file in plain text. "Client's consultant is useless, pad this by 2 weeks" is now in the client's database.
โ๏ธ When you're challenged
"Why does your duration show 12.5 days when your narrative says 10?" "The file stores 100 hours. Our calendar is 10 hours a day; your database is dividing by 8. Tick 'use assigned calendar' in Admin Preferences, or check the calendar table in the file, and it reads 10."
"Can you just send the PDF? The XER is too complicated." "The specification calls for the native file, and the PDF can't show logic or float. I'll send both, with the XER named by revision and data date."
"Is the XER you sent the same one you're working in?" "Yes. The header records the export date and database, and the data date in the PROJECT table matches the update. I keep a copy of every exported file by revision."
"There's no cost in your file โ is it resource-loaded or not?" "It's manhour-loaded. Costs are removed on export as agreed; the TASKRSRC table carries units, not rates."
๐ Related pages
- XER File Won't Import โ the header, POBS and encoding faults that stop the import
- Cleaning an XER Before Import โ stripping global data before it enters your database
- Hours per day and duration display โ the divisor problem in full
- Importing and Exporting XER โ the import dialog and what each option overwrites
- Xer in excel โ parsing the tables yourself, safely
- Calendar Setup and Holidays โ what the
clndr_datastring is encoding - Handing over a schedule โ what files the next planner needs
โ๏ธ Worked example
A mid-rise in Sharjah. The client's reviewer opens the contractor's XER and reports "negative float of -100 days on the tower crane dismantle; contractor's narrative says -10". One TASK record, decoded:
| Field in file | Value | Meaning |
|---|---|---|
task_code | TC-DIS-01 | Activity ID |
task_name | Dismantle tower crane TC2 | โ |
task_type | TT_Task | Task dependent |
status_code | TK_NotStart | Not started |
clndr_id | 1187 | Points to CALENDAR row "6-Day 10h Site" (day_hr_cnt = 10) |
target_drtn_hr_cnt | 50 | 5 days on a 10 h calendar |
total_float_hr_cnt | -100 | -10 days on a 10 h calendar |
early_start_date | 2025-09-04 07:00 | โ |
late_start_date | 2025-08-23 07:00 | 10 working days earlier |
cstr_type / cstr_date | (blank) | No constraint on this activity |
The reviewer's database divided -100 hours by 1 hour/day because their Admin Preferences had been left at a test setting. The contractor's -10 days was correct. Ten minutes in the file settled what an email chain would not.
๐ References
- Oracle, P6 XER Import/Export Data Map Guide (table and field definitions)
- Oracle, P6 Professional User Guide โ Importing and Exporting; Admin Preferences, Time Periods
- FIDIC Conditions of Contract 2017, Cl 8.3 (check the edition in your contract)
- SCL Delay and Disruption Protocol, 2nd ed. (2017), Part B Guidance, section 1
- AACE RP 29R-03, Forensic Schedule Analysis โ source validation
From the field
Experience from working planners. Unreviewed โ read it as experience, not guidance.
Add what you know about what is an xer file. What worked, what the consultant pushed back on, what you would do differently next time. A paragraph is plenty.
Contributors get their name and one link on the site โ your own templates, course or consultancy. We take nothing and hold nothing.
Add your experience