Equifax Canada Metro 2 Test Submission Handbook
Everything you need to prepare, check and send the Metro 2 test file
Equifax Canada takes monthly credit reporting in the Metro 2 format. Before it accepts live reporting from a new lender, it asks for a test file that proves the lender can produce a correct one. This handbook explains how to prepare that file with the tools already built for this project: which values you need and where each one comes from, where to put them, how to build and check the file, and what to send with it.
Where things stand. Done: the decision flows (35 flows, 757 decision points, written for Equifax Canada), the file builder and its quality checks, and a complete test file built from 8 made-up accounts that passes every check except the two placeholder identifiers.
Still to do, and the subject of this handbook: the Program Identifier from Equifax Canada, our own Identification Number, the mapping from our loan system to the file, and the real accounts.
Every link in this document opens without signing in: no account, password or authenticator code. The pages and files hold made-up people only, so they are safe to forward. Never put real customer information on them (Section 11).
Contents
1. What you will send to Equifax Canada
| Item | What it is | How you get it |
|---|---|---|
| The Metro 2 test file | A plain-text file named like EFXCA-M2-202609-TEST.TXT: one 844-character line per record (a header, one record per account, a trailer). | The builder makes it from the accounts CSV and the settings (Section 8). |
| The test submission summary | A one-page text file (...-submission.txt) with the facts Equifax Canada asks about: format, record counts, identifiers, period, contents and the QA result. Five lines are left for you to fill in. | The builder writes it next to the file, read from the file itself (Section 9). |
| Answers to their onboarding questions | Contacts, the loan system, how the file is sent, the planned first live month. | You, with Section 10. |
Two more files stay with us: the QA report (...-qa.csv, every finding of the checks) and the completed value worksheet (which field of our loan system feeds each value). Equifax Canada replies with an acknowledgement or an error report: fix what it lists, rebuild and send again until the test is accepted. Monthly live reporting starts after that.
2. Links (no sign-in needed)
Every link was checked from outside the network with no login on 1 October 2026. A .TXT or .csv link may open as text in the browser: right-click it and choose Save link as to keep the exact file.
2.1 Pages
| Page | Link | Use it to |
|---|---|---|
| This handbook | https://basehub.cc/equifax-metro2/handbook.html | This document as a web page: the easiest way to share it. |
| Decision flows | https://basehub.cc/equifax-metro2/ | See the decision behind every field: 35 flows, the Canadian rules, and the 53 points marked "Confirm with Equifax Canada". |
| File guide | https://basehub.cc/equifax-metro2/file-guide.html | Read the test file field by field: the format, where the value comes from, why the field is there and why it has this value. |
| Every value you need | https://basehub.cc/equifax-metro2/file-guide.html#values | The online copy of Section 6, with a spreadsheet download. |
| Where real values go | https://basehub.cc/equifax-metro2/file-guide.html#paste | The settings, marked up (Section 7). |
| Test submission summary | https://basehub.cc/equifax-metro2/file-guide.html#submission | The summary of the test file (Section 9). |
| Field by field | https://basehub.cc/equifax-metro2/file-guide.html#file | All 10 records of the test file, every field explained. |
| CSV template, column by column | https://basehub.cc/equifax-metro2/file-guide.html#template | What goes in each column of the accounts CSV. |
| Build a file from your own accounts | https://basehub.cc/equifax-metro2/?f=OUT/build | The browser builder (Section 8.1). |
| Sample outputs | https://basehub.cc/equifax-metro2/?f=OUT | What the file, the QA report and typical mistakes look like. |
| Coverage audit | https://basehub.cc/equifax-metro2/?f=COV | The check that every section of the source guides is covered by a flow. |
2.2 Files
| File | Link | What it is |
|---|---|---|
| The test file | https://basehub.cc/equifax-metro2/files/EFXCA-M2-202609-TEST.TXT | The Metro 2 file built from the 8 made-up accounts, with placeholder identifiers. |
| Test submission summary | https://basehub.cc/equifax-metro2/files/EFXCA-M2-202609-TEST-submission.txt | The facts about the test file that Equifax Canada asks for. |
| QA report | https://basehub.cc/equifax-metro2/files/EFXCA-M2-202609-TEST-qa.csv | Every finding of the checks on the test file (two warnings: the placeholders). |
| Accounts CSV template | https://basehub.cc/equifax-metro2/files/accounts-template.csv | The header row only: paste the accounts under it, one per row. |
| The test accounts as CSV | https://basehub.cc/equifax-metro2/files/accounts-sample.csv | The template filled with the 8 made-up accounts: a worked example. |
| Settings | https://basehub.cc/equifax-metro2/files/config.json | The identifiers, company details and reporting month the builder reads. |
| Value worksheet | https://basehub.cc/equifax-metro2/files/value-worksheet.csv | Section 6 as a spreadsheet, with an empty column for our own system’s field names. |
| Column list | https://basehub.cc/equifax-metro2/files/COLUMNS.md | Every column of the accounts CSV in one plain-text list. |
| This handbook (Word) | https://basehub.cc/equifax-metro2/files/Equifax-Canada-Metro2-Test-Submission-Handbook.docx | This document as a Word file. |
| This handbook (PDF) | https://basehub.cc/equifax-metro2/files/Equifax-Canada-Metro2-Test-Submission-Handbook.pdf | This document as a PDF, ready to print. |
3. The steps, start to finish
- Read Sections 4 and 5. They explain the format and the two identifiers everything else hangs on (about 15 minutes).
- Get the onboarding details from Equifax Canada: the Program Identifier, the test window, how to send the file and how to encrypt it, any file-name rule, the line ending, and their own Canadian Metro 2 reporting guide (Section 10).
- Settle our Identification Number with the company: our own company or branch code, 5 to 20 letters or digits, the same every month. Tell Equifax Canada what it is.
- Map the values. Open the value worksheet and fill its last column, "Your system’s field", with the loan system’s field for each value. Section 6 explains every value.
- Export the accounts into the CSV template: one row per account, header row unchanged (Section 7.2).
- Enter the settings: the Program Identifier, the Identification Number, the company name, address and phone, and the reporting month (Section 7.1).
- Build the file in the browser builder or with the command-line tool (Section 8).
- Clear the QA findings: fix every BLOCK (no file is produced until there are none) and read every WARN.
- Download the TXT file, the submission summary and the QA report. Fill in the five blank lines at the end of the summary.
- Send the file and the summary the way Equifax Canada specifies. Keep a copy of both and the SHA-256 shown in the summary: it proves later exactly which file was sent.
- Handle the reply: fix what the error report lists, rebuild, send again.
Real data or test data? The published test file uses 8 made-up people and placeholder identifiers so that it can be shared. Equifax tests whether our data processes, so the file sent for the test is normally built from a real month of real accounts with the real identifiers. Ask Equifax Canada what they want in it.
4. The file format in brief
Metro 2 is the credit-reporting format published by the Consumer Data Industry Association in its Credit Reporting Resource Guide (the CRRG). Equifax Canada uses the same layout, with Canadian meanings for some fields (Section 4.3). The format is fixed-width: every field sits at a set position and length, with no commas or separators, so one extra character shifts every field after it. That is why nobody edits the file by hand: change the inputs and rebuild.
4.1 Records and segments
| Line | Record | What it holds |
|---|---|---|
| 1 | Header | Who we are (the Program Identifier at positions 23-32, name, address, phone), the reporting period, the date the file was created and the software that made it. |
| 2 to N-1 | One account record per account, sorted by account number | The 426-character Base segment (the account and the primary borrower), then fixed slots for the optional segments below. |
| N (last) | Trailer | Totals: records, accounts by status, SINs, dates of birth, segments. Equifax recounts them to check the file arrived whole. |
| Segment | Length | Used when | In the test file |
|---|---|---|---|
| Base | 426 | The account and the primary borrower | Every account |
| J1 | 100 | Another person on the account (co-borrower, co-signer, guarantor) at the same address | Account S1 |
| J2 | 200 | Another person on the account at a different address | Account S2 |
| K2 | 34 | The account was bought from, or sold to, another company | Account S7 |
| K4 | 30 | A special payment arrangement: deferred first payment or balloon payment | Account S5 |
| L1 | 54 | The account number (or Identification Number) changed | Account S8 |
| Record | 844 | Every account record. An unused segment slot holds only its two-letter ID and blanks, so every record stays the same length. |
Equifax Canada also has an optional P1 segment (533 characters: extra phone numbers, e-mail, driver’s licence, passport). It is not in our layout; ask Equifax Canada whether they want it.
4.2 Formatting rules
| Rule | Example from the test file | Why |
|---|---|---|
| One record per line, in this order: header, one record per account sorted by account number, trailer. | Line 1 header, lines 2-9 AUTO000101 to AUTO000108, line 10 trailer | Equifax reads the header first to know whose file it is, and the trailer last to check the totals. |
| Every record is exactly 844 characters, and its first 4 characters give that length (the RDW). | 0844 at the start of every line | Fixed-length records are the simplest to read and check. |
| Numbers: digits only, right-justified, zero-filled. | 25000 → 000025000 | A fixed-width number must fill its field; zeros on the left do not change the value. |
| Money: whole dollars, cents dropped (never rounded up). A credit balance becomes 0. | $15,022.40 → 000015022 | The format has no decimal point; dropping cents never overstates what a consumer owes. |
| Dates: MMDDYYYY. A date that does not apply is all zeros. | 2024-03-15 → 03152024 | The Metro 2 date form; zeros mean "not applicable", not "unknown". |
| Text: uppercase, left-justified, blank-filled. | EDMONTON then blanks | Blanks on the right do not change the value. |
| Names: letters, spaces and hyphens; accents become plain letters; apostrophes are dropped. | Gagné → GAGNE | The file is plain ASCII; transliterating keeps the name matchable. |
| Characters and line ending: plain ASCII, one record per line, ending with a line feed (LF) unless Equifax Canada asks for CRLF. | 8,450 bytes = 10 lines × (844 + 1) | Confirm the line ending with Equifax Canada. |
4.3 What is Canadian about it
- SIN, not SSN. Field 34 carries the Social Insurance Number. It is optional: a SIN is never a condition of credit. When reported it must be 9 digits, pass the Luhn check and not start with 0 or 8;
000000000means none, and the date of birth then carries the match. - Province and postal code (fields 43 and 44): two-letter province, postal code as A1A1A1 whose first letter matches the province; country code CA.
- Positions 214-230 are the Currency Type Code (left blank). Position 231 and field 2 of J1 / J2 carry the Consumer Transaction Type: a new account, or a change of name, address or SIN.
- Account status ZA (in a consumer proposal, Orderly Payment of Debts or credit-counselling plan; shown on Equifax Canada reports as R7) is Canadian. Statuses 05, 07 and 87 are still valid in Canada.
- Insolvency codes (field 38, codes A to P) cover bankruptcy, consumer proposals, Orderly Payment of Debts and credit counselling: filed, discharged or completed, dismissed, withdrawn.
- Association codes (field 37): 1 individual, 2 joint, 7 has a co-signer, 9 has a guarantor, A assumed mortgage, T terminated, W business, X deceased, Z delete. There is no authorized-user code.
- Compliance codes XA to XG, XJ and XR; there is no XH.
- Age of majority is 18 in AB, MB, ON, PE, QC and SK and 19 elsewhere; the checks flag a borrower younger than that.
- Disputes: e-OSCAR, the US dispute system, does not apply. How Equifax Canada sends disputes is an onboarding question.
5. The two identifiers
Two identifiers tell Equifax Canada whose file it is. They are easy to mix up, and they come from different places.
| Identifier | Where it goes | Who sets it | In the test file | Rules |
|---|---|---|---|---|
| Equifax Program Identifier | Header, positions 23-32 | Equifax Canada, at onboarding | EFXPENDING | 1-10 letters or digits. |
| Identification Number | Every account record: Base field 5, positions 21-40 | We do: our own company or branch code | PENDINGID01 | 5-20 letters or digits; the same every month; tell Equifax Canada, and never change it without telling them. |
The Identification Number is not an Equifax number. Some early project notes called it an "Equifax member number"; that was wrong. The CRRG defines it as the lender’s own internal code (Oracle OFSLL builds it from the company and branch codes). Only the Program Identifier comes from Equifax.
While either one is still a placeholder, the builder names the file ...-TEST.TXT and the checks raise two warnings. With both real values in, the file name ends in -LIVE.TXT and the warnings go away.
6. Every value you need
There are 74 values in five groups. The first three groups are entered once, in the settings; the last two are columns of the accounts CSV, one row per account. For each value the table gives where to find it (and the exact field if our loan system is Oracle OFSLL, the platform the company’s Metro 2 guide describes), how to enter it, which field and positions of the file it fills, and how it looks in the test file. In the examples a · marks a blank, so the padding shows. Yellow rows are the placeholders to replace. The same table is a spreadsheet: value-worksheet.csv, with an empty last column for our own system’s field names.
Values you never enter: the account status, payment rating, 24-month payment history, special comment, compliance code, date of first delinquency, consumer transaction type, association code, insolvency indicator, the record length and every trailer total. The builder works them out from the facts in the CSV, following the decision flows, so they stay consistent with each other.
6.1 From Equifax Canada (6)
| Value | Where to find it | Enter it as | Goes into the file | In the test file | Needed |
|---|---|---|---|---|---|
| Equifax Program Identifier | Equifax Canada, at onboarding (with the data furnisher agreement) OFSLL: Setup > Credit Bureau Reporting > Program Identifier, bureau code EFX | config.json "equifaxProgramId": 1-10 letters or digits | Header 5 (Equifax Program Identifier), positions 23-32 | EFXPENDINGfrom header | Always |
| Test file window and the date to send it | Equifax Canada | Not in the file | Not in the file | Before the first live file | |
| How to send the file (e.g. SFTP address and login) | Equifax Canada. Keep logins in your password manager, never in these files | Not in the file | Not in the file | Before the first file | |
| Encryption key (e.g. a PGP public key) | Equifax Canada | Not in the file | Not in the file | If they require encryption | |
| File name pattern | Equifax Canada | config.json "fileName", e.g. EFXCA-M2-{period}-{mode}.TXT | Not in the file | Before the first file | |
| Line ending between records | Equifax Canada (LF or CRLF) | config.json "lineEnding": LF or CRLF | Not in the file | Before the first file |
6.2 Your company (6)
| Value | Where to find it | Enter it as | Goes into the file | In the test file | Needed |
|---|---|---|---|---|---|
| Identification Number (your company / branch code) | You choose it; tell Equifax Canada. One per branch or office that verifies data, if you have several OFSLL: Company code + branch code (ACCOUNTS.ACC_PTC_COMPANY + ACC_PCB_BRANCH) | config.json "identificationNumber": 5-20 letters or digits, no spaces, never all 0 or 9 | Base 5 (Identification Number), positions 21-40 | PENDINGID01·········from AUTO000101 | Always |
| Reporter (company) name | Your legal name, as on the Equifax agreement OFSLL: Setup > Companies > Company Definition: Company | config.json "reporterName": up to 40 characters | Header 12 (Reporter Name), positions 80-119 | SAMPLE·LENDING·CO·······················from header | Always |
| Reporter address | Your mailing address OFSLL: Setup > Companies > Company Definition: Address, City, State, Zip | config.json "reporterAddress": up to 96 characters | Header 13 (Reporter Address), positions 120-215 | 100·EXAMPLE·AVE·NW·EDMONTON·AB·T5J0N3···························································from header | Always |
| Reporter phone | A number Equifax can call about the file OFSLL: Setup > Companies > Company Definition: Remittance Address Phone 1 | config.json "reporterPhone": 10 digits | Header 14 (Reporter Telephone Number), positions 216-225 | 7805550100from header | Always |
| Software vendor and version | Who built the program that writes the file OFSLL: Fixed: ORACLE FINANCIAL SERVICES SOFTWARE, 1.0 | config.json "softwareVendor" (up to 40), "softwareVersion" (up to 5) | Header 15 (Software Vendor Name), positions 226-265 | IN-HOUSE································from header | Always |
| Program date and revision date | When your reporting program started, and when it last changed OFSLL: Metro II release and revision dates | config.json "programDate", "programRevisionDate": YYYY-MM-DD | Header 10 (Program Date), positions 64-71 | 09012026from header | Always |
6.3 Each file (2)
| Value | Where to find it | Enter it as | Goes into the file | In the test file | Needed |
|---|---|---|---|---|---|
| Reporting period | The month you are reporting (the month that just ended) OFSLL: GL post date (CMN_GL_POST_DT) | config.json "period": YYYY-MM | Header 8 (Activity Date), positions 48-55 | 09302026from header | Every file |
| Date the file is built | The day you build it, after the month has ended OFSLL: Batch run date | config.json "created": YYYY-MM-DD (blank = today) | Header 9 (Date Created), positions 56-63 | 10022026from header | Every file |
6.4 Each account (CSV) (41)
| Value | Where to find it | Enter it as | Goes into the file | In the test file | Needed |
|---|---|---|---|---|---|
id | Your own label, e.g. the loan ID (not sent) | Text: Optional label for the row (e.g. your loan ID) | Not sent to Equifax | Optional | |
account_number | Loan system: the account / loan number OFSLL: ACCOUNTS.ACC_NBR | Text: Account number as reported: letters and digits only, never the SIN | Base 7, positions 43-72 | AUTO000101····················from AUTO000101 | Always |
new_account_number | Loan system: the new number after a conversion or renumbering (that month only) OFSLL: ACCOUNTS.ACC_ORIG_SYS_XREF | Text: Only in the month the number changes: the new number (sends an L1 segment) | L1 segment, positions 794-823 | AL2026000108··················from AUTO000108 | Only in the month the number changes |
portfolio_type | Product set-up: the kind of credit OFSLL: Product: credit bureau portfolio type (lookup CRB_PORTFOLIO_TYPE_CD) | Code (any case): I installment, M mortgage, C line of credit, R revolving, O open | Base 8, positions 73-73 | Ifrom AUTO000101 | Always |
account_type | Product set-up: Equifax account type code OFSLL: Product: credit bureau account type (lookup CRB_ACC_TYPE_CD) | Code (any case): Equifax Canada account type, e.g. 00 auto, 01 unsecured, 3A auto lease, 26 mortgage | Base 9, positions 74-75 | 00from AUTO000101 | Always |
date_opened | Loan system: contract / funding date OFSLL: ACCOUNTS.ACC_EFFECTIVE_DT | Date YYYY-MM-DD: Date the account was opened | Base 10, positions 76-83 | 03152024from AUTO000101 | Always |
credit_limit | Loan system: current credit limit (lines and revolving only) OFSLL: ACCOUNTS.ACC_CR_LMT_CUR | Number in dollars (e.g. 15022.40): Lines of credit and revolving accounts only | Base 11, positions 84-92 | 000000000from AUTO000101 (no account in the test file uses it) | Lines of credit and revolving |
original_amount | Loan system: amount financed (lines: highest balance) OFSLL: ACCOUNTS.ACC_CRB_HIGHEST_BAL_AMT | Number in dollars (e.g. 15022.40): Original loan amount (highest balance for lines) | Base 12, positions 93-101 | 000025000from AUTO000101 | Always |
terms_payments | Loan system: number of payments, including extensions OFSLL: ACCOUNTS.ACC_TERM_CUR + ACC_EXTN_TERM_LIFE | Whole number: Number of scheduled payments (installment / mortgage) | Base 13, positions 102-104 | 060from AUTO000101 | Installment and mortgage |
terms_frequency | Loan system: payment frequency OFSLL: ACCOUNTS.ACC_BILL_CYCLE_CD | Code (any case): M monthly, B every 2 weeks, E twice a month, W weekly, D deferred, P single payment | Base 13, 14, positions 105-105 | Mfrom AUTO000101 | Always |
scheduled_payment | Loan system: contractual payment amount OFSLL: Current payment amount (parameter MET_SCH_PMT_METHOD) | Number in dollars (e.g. 15022.40): Payment due each period | Base 15, positions 106-114 | 000000483from AUTO000101 | Always (0 when nothing is due) |
payments_this_period | Transaction history: payments received this month, net of reversals OFSLL: Payment transactions incl. non-cash (PAYMENT_NON_CASH) | Number in dollars (e.g. 15022.40): Total received this month | Base 16, positions 115-123 | 000000483from AUTO000101 | Always (0 when nothing came in) |
current_balance | Loan system: total owed at month end OFSLL: ACCOUNTS.ACC_OUTSTANDING_TOTAL_AMT (written off: ACC_DEFICIENCY_AMT) | Number in dollars (e.g. 15022.40): Balance at month end (0 when paid) | Base 21, positions 155-163 | 000015022from AUTO000101 | Always |
amount_past_due | Loan system / collections: amount 30+ days overdue OFSLL: ACCOUNTS.ACC_DUE_DLQ_AMT | Number in dollars (e.g. 15022.40): Amount 30+ days past due | Base 22, positions 164-172 | 000000704from AUTO000102 | Always (0 when current) |
oldest_unpaid_due_date | Collections: due date of the oldest unpaid payment OFSLL: Oldest due date on the account (delinquency details) | Date YYYY-MM-DD: Due date of the oldest unpaid payment; blank when nothing is overdue | Base 17A, 25 (worked out by the engine) | When a payment is overdue | |
date_last_payment | Transaction history: date of the last payment OFSLL: ACCOUNTS.ACC_PMT_DT_LAST | Date YYYY-MM-DD: Date of the most recent payment | Base 27, positions 206-213 | 09142026from AUTO000101 | When a payment was ever made |
date_paid | Loan system: payoff date OFSLL: Paid-off date | Date YYYY-MM-DD: Date paid in full (payoff month only) | Base 17A, 24, 26, positions 198-205 | 09222026from AUTO000103 | In the payoff month |
date_closed | Loan system: date closed (lines of credit) OFSLL: ACCOUNTS.ACC_CLOSE_DT (ACC_OPEN_IND = N) | Date YYYY-MM-DD: Date closed (lines of credit) | Base 26, positions 198-205 | 09222026from AUTO000103 | When a line is closed |
closed_by | Loan system: who closed the account OFSLL: Account close transaction | Code (any case): GRANTOR, CONSUMER or INACTIVITY | Base 19, 20 (worked out by the engine) | When closed | |
worst_days_late_this_period | Collections: worst days past due during the month OFSLL: Payment rating (ACCOUNTS.ACC_CRB_PMT_RATING_CD) | Whole number: Payoff month: worst days late during the month (sets the rating) | Base 17B (worked out by the engine) | In the payoff month | |
rating_first_delinquency_date | Collections: when that delinquency began OFSLL: ACCOUNTS.ACC_CRB_FIRST_DLQ_DT | Date YYYY-MM-DD: Payoff month rated 1-6: first 30-day delinquency behind that rating | Base 25 (worked out by the engine) | Payoff month rated 1-6 | |
charged_off | Collections / accounting: written off? OFSLL: Account status Charged-Off | Y or N: Y if written off | Base 17A (worked out by the engine) | When written off | |
charge_off_amount | Accounting: amount written off OFSLL: ACCOUNTS.ACC_CHGOFF_AMT | Number in dollars (e.g. 15022.40): Amount written off (never changes) | Base 23, positions 173-181 | 000008200from AUTO000104 | When written off |
in_collections | Collections: placed with collections? OFSLL: Collections condition | Y or N: Y if placed with collections | Base 17A, 17B (worked out by the engine) | When placed with collections | |
repossession | Collections: vehicle / collateral taken back OFSLL: REPO condition (voluntary / involuntary) | Code (any case): VOLUNTARY (surrender) or INVOLUNTARY | Base 17A (worked out by the engine) | When the collateral was taken back | |
settled_for_less | Collections: settled for less than owed? OFSLL: Settlement condition | Y or N: Y if paid for less than the full balance | Base 19 (worked out by the engine) | When paid for less than owed | |
final_disposition | Loan system: sold or transferred this month OFSLL: Pool status ACC_POOL_ACC_STATUS_CD = S | Code (any case): SOLD or TRANSFERRED: sends the final record | Base 15, 17A, 19, 21-26, K2, positions 151-152 | AHfrom AUTO000107 | In the month of a sale or transfer |
final_date | Sale / transfer agreement: date OFSLL: Pool sale date | Date YYYY-MM-DD: Sale / transfer date | Base 24, 26, positions 182-189 | 09252026from AUTO000107 | With final_disposition |
sold_to | Sale agreement: buyer name OFSLL: Pool sale details: buyer | Text: Buyer name (sends a K2 segment) | K2 segment, positions 730-759 | SAMPLE·RECOVERY·INC···········from AUTO000107 | When sold |
transferred_internally | Loan system: transferred within the company? | Y or N: Y if transferred within the company | Base 19 (worked out by the engine) | When transferred within the company | |
dispute_open | Customer service: open credit-reporting dispute? OFSLL: Compliance condition on the account | Y or N: Y while a consumer dispute is being investigated | Base 20, positions 153-154 | XBfrom AUTO000102 | While a dispute is investigated |
dispute_type | Customer service: consumer or billing dispute | Code (any case): CONSUMER or BILLING | Base 20 (worked out by the engine) | With dispute_open | |
arrangement_type | Loan system: deferral or forbearance in place OFSLL: Deferment / forbearance condition | Code (any case): DEFERRAL or FORBEARANCE | Base 13-15, 17A, 18, 19, K4 (worked out by the engine) | During a deferral or forbearance | |
arrangement_payment | Loan system: payment due during the arrangement | Number in dollars (e.g. 15022.40): Payment due during the arrangement (0 = nothing due) | Base 15 (worked out by the engine) | With arrangement_type | |
first_payment_due_date | Loan system: first payment due date OFSLL: First payment due date | Date YYYY-MM-DD: Deferral: first payment due date (sends a K4 segment) | K4 segment, positions 765-772 | 11012026from AUTO000105 | Deferral with a known first due date |
ever_in_repayment | Loan system: has any payment ever fallen due? | Y or N: N if the loan has never been in repayment | Base 18 (worked out by the engine) | With a deferral | |
last_update | Loan system: when the account record last changed OFSLL: Metro II batch time stamp | Text: When the account data was last updated: YYYY-MM-DDTHH:MM:SS | Base 3, header 8, positions 6-19 | 09302026180000from AUTO000101 | Always |
last_status | Last month’s file: the status sent OFSLL: Previous Metro II row: account status | Code (any case): Status sent last month; blank = first time reported | Base 18, 29 (worked out by the engine) | Every month after the first | |
last_payment_history | Last month’s file: the 24-character history sent OFSLL: ACCOUNTS.ACC_CRB_FULL_PMT_HISTORY | Code (any case): The 24-character payment history sent last month | Base 18, positions 127-150 | 0000000000000000000BBBBBfrom AUTO000101 | Every month after the first |
last_nothing_due | Last month’s file: was nothing due? | Y or N: Y if nothing was due last month (deferral) | Base 18 (worked out by the engine) | After a deferral month | |
first_delinquency_date | Collections: stored date the current delinquency began OFSLL: ACCOUNTS.ACC_CRB_FIRST_DLQ_DT | Date YYYY-MM-DD: Stored date of first delinquency of the current delinquency | Base 25, positions 190-197 | 08142026from AUTO000102 | While a delinquency continues |
6.5 Each person on the account (CSV, c1_ / c2_ / c3_) (19)
| Value | Where to find it | Enter it as | Goes into the file | In the test file | Needed |
|---|---|---|---|---|---|
c1_rolealso c2_, c3_ | Customer relations on the account OFSLL: CUS_ACC_RELATIONS (relation type) | Code (any case): PRIMARY (c1), JOINT, COSIGNER or GUARANTOR | Base / J1 / J2 placement (worked out by the engine) | Always | |
c1_relationalso c2_, c3_ | Customer relations: how the person is liable OFSLL: CUS_ACC_RELATIONS.CAR_CRB_ECOA_CD | Word: individual, joint, cosigned (primary with a co-signer), cosigner, guaranteed, guarantor, assumed | Base 37 / J 10, positions 325-325 | 2from AUTO000101 | Always |
c1_surnamealso c2_, c3_ | Customer record: last name OFSLL: CUSTOMERS.CUS_LAST_NAME | Text: Accents are fine: the file carries them as plain letters | Base 30 / J 3, positions 232-256 | TREMBLAY·················from AUTO000101 | Always |
c1_first_namealso c2_, c3_ | Customer record: first name OFSLL: CUSTOMERS.CUS_FIRST_NAME | Text | Base 31 / J 4, positions 257-276 | JANE················from AUTO000101 | Always |
c1_middle_namealso c2_, c3_ | Customer record: middle name OFSLL: CUSTOMERS.CUS_MIDDLE_NAME | Text | Base 32 / J 5, positions 277-296 | Q···················from AUTO000101 | If known |
c1_generationalso c2_, c3_ | Customer record: suffix (Jr, Sr, II) OFSLL: CUSTOMERS.CUS_GENERATION_CD | Code (any case): J, S or 2-9 | Base 33 / J 6, positions 297-297 | ·from AUTO000101 (no account in the test file uses it) | If any |
c1_sinalso c2_, c3_ | Customer record: SIN, only if the customer gave it OFSLL: CUSTOMERS.CUS_SSN (holds the SIN in a Canadian set-up) | Digits: Optional: leave blank when not collected | Base 34 / J 7, positions 298-306 | 000000000from AUTO000101 (no account in the test file uses it) | Optional |
c1_date_of_birthalso c2_, c3_ | Customer record: date of birth OFSLL: CUSTOMERS.CUS_BIRTH_DT | Date YYYY-MM-DD: Required when there is no SIN | Base 35 / J 8, positions 307-314 | 04121985from AUTO000101 | Always (required without a SIN) |
c1_phonealso c2_, c3_ | Customer record: phone OFSLL: ADDRESS.ADR_PHONE | Digits: 10 digits | Base 36 / J 9, positions 315-324 | 7805550101from AUTO000101 | If known |
c1_address1also c2_, c3_ | Customer mailing address, line 1 OFSLL: ADDRESS.ADR_ADDRESS1 | Text: Street address or PO Box | Base 40 / J2 13, positions 330-361 | 123·MAIN·ST·NW··················from AUTO000101 | Always |
c1_address2also c2_, c3_ | Customer mailing address, line 2 OFSLL: ADDRESS.ADR_ADDRESS2 | Text: Unit, station, etc. | Base 41 / J2 14, positions 362-393 | UNIT·2··························from AUTO000102 | If any |
c1_cityalso c2_, c3_ | Customer mailing address: city OFSLL: ADDRESS.ADR_CITY | Text | Base 42 / J2 15, positions 394-413 | EDMONTON············from AUTO000101 | Always |
c1_provincealso c2_, c3_ | Customer mailing address: province OFSLL: ADDRESS.ADR_STATE_CD | Code (any case): AB, BC, MB, NB, NL, NS, NT, NU, ON, PE, QC, SK, YT | Base 43 / J2 16, positions 414-415 | ABfrom AUTO000101 | Always |
c1_postal_codealso c2_, c3_ | Customer mailing address: postal code OFSLL: ADDRESS.ADR_ZIP | Code (any case): A1A 1A1 | Base 44 / J2 17, positions 416-424 | T5J0N3···from AUTO000101 | Always |
c1_identity_changealso c2_, c3_ | Customer maintenance log: what changed this month OFSLL: Customer maintenance (CUS_MAINT) history | Code (any case): This month only: NAME, ADDRESS, SIN, or e.g. NAME+ADDRESS | Base 29 / J 2, positions 231-231 | 3from AUTO000103 | Only in the month of a change |
c1_insolvency_typealso c2_, c3_ | Notice from the trustee, court or counselling agency OFSLL: Bankruptcy details on the account | Code (any case): BANKRUPTCY, PROPOSAL, OPD, COUNSELLING or RECEIVERSHIP | Base 17A, 38 / J 11, positions 326-327 | B·from AUTO000106 | When the person is insolvent |
c1_insolvency_stagealso c2_, c3_ | Same notice: filed, discharged, dismissed or withdrawn OFSLL: Bankruptcy disposition | Code (any case): FILED, COMPLETED (discharged), DISMISSED (annulled) or WITHDRAWN | Base 38 / J 11 (worked out by the engine) | With insolvency_type | |
c1_insolvency_datealso c2_, c3_ | Same notice: filing or decision date OFSLL: Bankruptcy notice date | Date YYYY-MM-DD: Filing / decision date | Base 25 (worked out by the engine) | With insolvency_type | |
c1_insolvency_includes_accountalso c2_, c3_ | Trustee’s list of included debts | Y or N: Y if this account is in the insolvency (default Y) | Base 38 (worked out by the engine) | With insolvency_type |
7. Where the real values go
Never type into the TXT file. Every record is fixed-width and the trailer totals are counted from the records, so a hand edit shifts fields or breaks the totals. Put the real values into the two inputs below and rebuild.
7.1 The settings (config.json, or the boxes in the browser builder)
| Setting | Now (test file) | What to put | Where it lands |
|---|---|---|---|
period | 2026-09 | The month being reported, YYYY-MM. | Dates in every record fall in this month |
created | 2026-10-02 | The day the file is built (after month end), YYYY-MM-DD. Blank = today. | Header, positions 56-63 |
equifaxProgramId | EFXPENDING | Replace: The Program Identifier from Equifax Canada. | Header, positions 23-32 |
identificationNumber | PENDINGID01 | Replace: Our own company or branch code (Section 5). | Every account record, positions 21-40 |
reporterName | SAMPLE LENDING CO | Our legal name as Equifax Canada has it (up to 40 characters). | Header, positions 80-119 |
reporterAddress | 100 EXAMPLE AVE NW EDMONTON AB T5J0N3 | Our office address (up to 96 characters). | Header, positions 120-215 |
reporterPhone | 7805550100 | Our phone number, 10 digits. | Header, positions 216-225 |
softwareVendor | IN-HOUSE | Who made the software that builds the file. | Header |
softwareVersion | 1.0 | Its version. | Header |
layout | J1, J2, K2, K4, L1 | Leave as it is: it fixes the 844-character record. | Every account record |
lineEnding | LF | LF or CRLF, once Equifax Canada says which. | Between records |
fileName | EFXCA-M2-{period}-{mode}.TXT | {period} becomes YYYYMM; {mode} is TEST until both real identifiers are in, then LIVE. | The file name |
The file itself, as published (config.json):
{
"period": "2026-09",
"created": "2026-10-02",
"equifaxProgramId": "EFXPENDING",
"identificationNumber": "PENDINGID01",
"reporterName": "SAMPLE LENDING CO",
"reporterAddress": "100 EXAMPLE AVE NW EDMONTON AB T5J0N3",
"reporterPhone": "7805550100",
"softwareVendor": "IN-HOUSE",
"softwareVersion": "1.0",
"layout": ["J1", "J2", "K2", "K4", "L1"],
"lineEnding": "LF",
"fileName": "EFXCA-M2-{period}-{mode}.TXT"
}7.2 The accounts (accounts CSV)
- Start from accounts-template.csv. Keep row 1, the header, exactly as it is; put one account per row from row 2.
- There are 98 columns: 41 about the account, and 19 for each of up to three people on it.
c1_is the primary borrower;c2_andc3_are co-borrowers, co-signers or guarantors. - Dates are YYYY-MM-DD. Money is in dollars; cents are fine (the builder drops them). Yes / no columns take Y or N. Leave a cell blank when the column does not apply.
- Include every account to report for the month, including accounts paid off, written off or sold during it: they get a final record.
- Save as CSV (UTF-8). Accented letters are fine: the builder converts them to plain letters.
- accounts-sample.csv is the template filled with the 8 test accounts: a worked example of every column. Sections 6.4 and 6.5 explain each column; COLUMNS.md lists them in one place.
8. Build and check the file
8.1 In the browser (recommended)
- Open https://basehub.cc/equifax-metro2/?f=OUT/build (the Outputs tab, section 8).
- Fill the set-up boxes: reporting period, date created, Equifax Program Identifier, Identification Number, company name, address and phone, line ending.
- Choose or drop the accounts CSV.
- Read the verdict and the list of findings. Changing a set-up box rebuilds at once from the same CSV.
- Download the TXT file (offered only when there is no BLOCK), the QA report and the submission summary.
Nothing is uploaded. The builder runs inside your browser tab: the CSV is read on your own computer and never leaves it. It takes files up to 50 MB.
8.2 From the command line
Needs Node.js and a copy of the project folder (tools/, visualizer/ and templates/), which is not public: ask the person who sent you this handbook. Then, from the project folder:
node tools/build_file.js --accounts accounts.csv --config config.json --out out
It writes four files into out/: the TXT file, -qa.csv (every finding), -manifest.json (counts, SHA-256, QA totals) and -submission.txt (the summary). The exit code says how it went:
| Exit code | Meaning |
|---|---|
| 0 | Clean: the file is written and no check raised anything. |
| 1 | Warnings only: the file is written; read every WARN in the QA report. |
| 2 | A BLOCK finding or a set-up error: the TXT file is not written. Fix what the output lists and run it again. |
8.3 Reading the QA result
- BLOCK: the file would be wrong or rejected (a bad date, a value that does not fit its field, totals that do not match). No file is produced until every BLOCK is fixed.
- WARN: probably fine, but a person should look (a placeholder, an unusual combination).
- Each finding names a rule, such as QAF-02PY. Search for it in the decision flows to see the rule and where it comes from.
The published test file has 0 BLOCK and 2 WARN findings, both about the placeholders:
| Severity | Rule | Account | Finding |
|---|---|---|---|
| WARN | QA-02BN | header | Equifax Program Identifier is missing or still a placeholder: put in the one Equifax Canada issues before sending |
| WARN | QAF-02PY | AUTO000101 | Identification Number is still a placeholder on 8 record(s): put in your own company / branch code and tell Equifax Canada what it is |
9. The test submission summary
The builder writes a summary next to every file (...-submission.txt). It is read from the file itself, so it always matches what is sent. Below is the summary of the published test file; ours will show the real identifiers and counts. The SHA-256 is a fingerprint of the exact bytes of the file: if Equifax Canada’s copy has the same fingerprint, it arrived unchanged.
| Item | Value for the test file | Note |
|---|---|---|
| The file | ||
| File name | EFXCA-M2-202609-TEST.TXT | |
| Bureau | Equifax Canada | |
| Format | Metro 2, character format, fixed-length records (no block descriptor word) | |
| Record length | 844 characters = Base 426 + J1 100 + J2 200 + K2 34 + K4 30 + L1 54 | |
| Records | 10 = 1 header + 8 account records + 1 trailer | |
| Segments in each record (how many carry data) | Base 8, J1 1, J2 1, K2 1, K4 1, L1 1 | An unused segment slot carries only its two-letter ID |
| Characters and line ending | ASCII, uppercase, accents transliterated; one record per line, LF | |
| Size | 8,450 bytes | |
| SHA-256 | 016234dfaf524301b531052ad4e21638e27f02e567a39d55dd00c9915eaaca15 | |
| Reporting | ||
| Reporting period | September 2026 (2026-09-01 to 2026-09-30) | |
| Frequency | Monthly, as of the end of the month | |
| Date created (header, positions 56-63) | 2026-10-02 | |
| Activity date (header, positions 48-55) | 2026-09-30 | |
| Identifiers | ||
| Equifax Program Identifier (header, positions 23-32) | EFXPENDING | PLACEHOLDER: replace with the Program Identifier Equifax Canada issues |
| Identification Number (every account record, positions 21-40) | PENDINGID01 | PLACEHOLDER: replace with your own company / branch code |
| Reporter name | SAMPLE LENDING CO | |
| Reporter address | 100 EXAMPLE AVE NW EDMONTON AB T5J0N3 | |
| Reporter phone | 7805550100 | |
| Software | IN-HOUSE 1.0; program date 2026-09-01, last revised 2026-09-01 | |
| Contents | ||
| Accounts by portfolio type (field 8) | I Installment: 8 | |
| Accounts by account status (field 17A) | 11 Current: 3, 13 Paid / closed, zero balance: 1, 78 60-89 days late: 1, 80 90-119 days late: 1, 97 Written off: 1, ZA In a consumer proposal, OPD or credit counselling plan: 1 | |
| Associated consumers | J1 (same address) 1, J2 (different address) 1 | |
| Identity data reported | SIN 0, date of birth 10, phone 10 | The SIN is optional; where none was given the date of birth carries the match |
| Provinces (field 43) | AB: 2, BC: 1, MB: 1, NS: 1, ON: 2, QC: 1 | |
| Insolvency indicators (field 38) | B Consumer proposal filed: 1 | |
| Consumer Transaction Types (field 29) | 3 Address change: 1 | |
| Quality check | ||
| QA result | 0 BLOCK, 2 WARN | • Equifax Program Identifier is missing or still a placeholder: put in the one Equifax Canada issues before sending • Identification Number is still a placeholder on 8 record(s): put in your own company / branch code and tell Equifax Canada what it is |
| Trailer totals | Recounted from the records: every total matches | |
| To fill in before sending | ||
| Our contact for this file (name, email, phone) | ____________________ | |
| Equifax Canada data reporting contact | ____________________ | |
| Loan system that holds the accounts (name and version) | ____________________ | |
| How the file is sent (the method Equifax Canada gave us) | ____________________ | |
| Planned first live reporting month | ____________________ | |
Do not send this example summary with a real file. Build the real file, and send the summary the builder writes for it, with the five blank lines filled in.
10. What to settle with Equifax Canada
10.1 Before the test
- The data furnisher agreement, and the Program Identifier for the header.
- Whether the test should use real accounts (usual) or test accounts, and how many months of files they want.
- The test window and the date to send.
- How the file is sent (usually SFTP) and how it must be encrypted (often PGP, with their public key).
- Their file-name rule, if any, and the line ending (LF or CRLF).
- The layout of their acknowledgement and error report, and who to contact about it.
- Their own Canadian Metro 2 reporting guide. It is not public; the decision flows will be checked against it.
- Whether they want the optional P1 segment.
10.2 Format and code questions
Each of these is a point marked Confirm with Equifax Canada in the decision flows, where the reasoning is set out.
- How disputes reach us, and how to correct a record between monthly files (e-OSCAR is US-only).
- How a co-signer’s or guarantor’s own J1 / J2 segment is coded (association codes 7 and 9).
- Which special comment codes they accept.
- How statuses ZA, 07 and 87 are counted in the trailer (it has no totals for them).
- Postal code spacing: A1A1A1 or A1A 1A1.
- Whether positions 214-230 (Currency Type Code) stay blank.
- Whether to keep using statuses 05, 07 and 87.
- Status and payment rating while a borrower is in bankruptcy, compared with a consumer proposal.
- How the "Subject disputes this account" note is cleared, given there is no XH code.
- Whether a new account carries Consumer Transaction Type 1 on its first report.
- Whether association code X (deceased) is still bypassed.
10.3 Company decisions (internal)
- How we report insolvencies, and the order of priority when several special comments apply.
- How long we keep reporting data (Equifax Canada drops negative information about 6 years after the first delinquency), and whether paid accounts keep being reported.
- The credit-reporting consent wording in our loan agreements.
- Compliance sign-off on the choices built into the flows: the order of the paid statuses 61-65, payment rating L before G and then Y, and ZA ahead of a write-off.
11. Handling data and credentials
- The basehub pages and files hold made-up people only. Never upload, paste or publish real customer information there. The browser builder never sends anything anywhere.
- The real accounts CSV and the real TXT file contain personal information: names, dates of birth, SINs, addresses and account details. Keep them on company systems, send them only by Equifax Canada’s secure method, and delete working copies according to the company’s retention policy.
- Report a SIN only when the consumer gave it with consent; never require one.
- Logins, passwords and encryption keys for sending the file belong in the transfer tool or a password manager. Never put them in config.json, the CSV, the summary, this handbook or an e-mail.
- Keep each month’s sent file, its submission summary and its SHA-256: together they are the record of what was reported.
Appendix A. The 8 test accounts
The test file covers the cases most likely to go wrong. Every person in it is made up.
| # | Account | Province | Status in the file | Case |
|---|---|---|---|---|
| S1 | AUTO000101 | AB | 11 Current (Equifax Canada rate 1) | Current auto loan, joint borrowers at the same address (AB) Paid on time. Two borrowers on the contract, living together in Edmonton. |
| S2 | AUTO000102 | ON | 78 60-89 days late (Equifax Canada rate 3) | 60 days late, co-signer at a different address, consumer dispute open (ON) Missed the 07/15 and 08/15 payments. Disputed the balance with us directly; investigation running. His mother co-signed. |
| S3 | AUTO000103 | BC | 13 Paid / closed, zero balance (Equifax Canada rate 1) | Paid in full this month, was 30 days late earlier in the month; moved (BC) The 08/10 payment was 30 days late on 09/09; the loan was paid off on 09/22. Also moved to a new address this month. |
| S4 | AUTO000104 | MB | 97 Written off (Equifax Canada rate 9) | Charged off, consumer still paying it down (MB) Charged off in March 2026 for $8,200. A $150 payment came in this month. |
| S5 | AUTO000105 | NS | 11 Current (Equifax Canada rate 1) | New loan in deferral: first payment not due until November (NS) Opened 08/20 with the first payment deferred to 11/01. Never in repayment yet. |
| S6 | AUTO000106 | ON | ZA In a consumer proposal, OPD or credit counselling plan (Equifax Canada rate 7) | Consumer proposal filed; account was current (ON) Borrower filed a consumer proposal with a Licensed Insolvency Trustee on 09/08. Payments now go to the trustee, so nothing is due to us. Equifax Canada shows this as R7. |
| S7 | AUTO000107 | AB | 80 90-119 days late (Equifax Canada rate 4) | Sold to another company while 90 days late (final record, AB) Buyer will not carry our history, so we send a final "sold" record on 09/25. |
| S8 | AUTO000108 | QC | 11 Current (Equifax Canada rate 1) | Account renumbered in a system conversion (L1); French name with accents (QC) New account number from 10/2026. This file still carries the old number plus an L1 with the new one. The name and address are keyed with accents; the file carries them as plain letters (GAGNE, ELODIE, MONTREAL). |
Appendix B. Glossary
| Term | Meaning |
|---|---|
| Metro 2 | The standard fixed-width format for reporting consumer credit accounts to credit bureaus. |
| CRRG | The Credit Reporting Resource Guide: the Metro 2 specification, published by the Consumer Data Industry Association (CDIA). Licensed. |
| Data furnisher | A lender that reports its accounts to a credit bureau: here, us. |
| Program Identifier | The identifier Equifax Canada issues to us; header positions 23-32. |
| Identification Number | Our own company or branch code, in every account record (Base field 5, positions 21-40). |
| Header / trailer | The first and last records of the file. The trailer holds the totals. |
| Base segment | The 426-character core of each account record: the account and the primary borrower. |
| J1 / J2 | Segments for another person on the account, at the same / a different address. |
| K2, K4, L1 | Segments for an account bought or sold (K2), a special payment arrangement (K4), and an account number change (L1). |
| P1 | An optional Equifax Canada segment for extra contact and identity details. |
| RDW | Record descriptor word: the 4-digit record length at the start of each record (0844). |
| Account status (17A) | The account’s state this month: 11 current; 71, 78, 80, 82, 83 and 84 for 30, 60, 90, 120, 150 and 180+ days late; 13 paid; 97 written off; ZA in a proposal or plan; and so on. |
| Payment rating (17B) | How up to date the account was when it reached a final status (paid, closed, transferred). |
| Payment history (18) | 24 characters, one per month, most recent first. |
| DOFD (25) | Date of first delinquency: when the delinquency that led to a negative status began. It sets how long the negative information stays on file. |
| Insolvency indicator (38) | The Consumer Information Indicator: bankruptcy, consumer proposal, Orderly Payment of Debts, credit counselling. |
| Association code (37) | The person’s relationship to the account (individual, joint, co-signer, guarantor...). |
| Consumer Transaction Type | Flags a new account, or a change of name, address or SIN. |
| SIN | Social Insurance Number. Optional in credit reporting. |
| OPD | Orderly Payment of Debts: a provincial debt-repayment program. |
| OFSLL | Oracle Financial Services Lending and Leasing: the loan platform described in the Metro 2 guide the company was sent. Its fields are listed in Section 6 in case it is our system. |
| QA | The checks run on the built file. BLOCK must be fixed; WARN must be read. |
| R0-R9 | Equifax Canada’s rating scale on credit reports, from R1 (paid as agreed) to R9 (bad debt). ZA shows as R7. |
| SHA-256 | A fingerprint of a file’s exact bytes. Two files with the same SHA-256 are identical. |
Appendix C. Sources
- CDIA, Credit Reporting Resource Guide (CRRG), 2020: the Metro 2 standard. Licensed; do not redistribute.
- Oracle, OFSLL 14.12 Metro II Data Preparation and Reporting: how an OFSLL system builds the file (the OFSLL fields in Section 6).
- Equifax Canada, Consumer Credit Report User Guide (public): the R0-R9 ratings.
- "Metro2 Format for Canadian Reporting", a public developer’s transcription of Equifax Canada’s layouts and codes: the source of the Canadian meanings, marked Confirm in the flows until Equifax Canada’s own guide is in hand.
- Equifax Canada’s own Metro 2 reporting guide: to be obtained at onboarding (Section 10.1).
Built from the project’s engine on 1 October 2026; the figures match the published test file (SHA-256 016234dfaf524301b531052ad4e21638e27f02e567a39d55dd00c9915eaaca15).