# Patient control numbers: How to track claims

> A patient control number (PCN) is a tracking ID for a claim. Get best practices for creating PCNs and where to find them in each transaction.

Published Sep 11, 2025

Category: Guide

**Big takeaway:** Use patient control numbers to track a claim from submission to remit.

A **patient control number** is a tracking ID for a claim.

You create a patient control number when you submit a claim. The payer sends the ID back in follow-up transactions: claim acknowledgments, Electronic Remittance Advice (ERAs), and claim status checks.

This guide gives you best practices for creating patient control numbers and where to find them in each transaction.

## Patient control number locations

This table shows the location of patient control numbers across claim-related transactions in Stedi’s JSON API requests and responses.

| <br><br>                               | **837P, 837I, 837D claim submissions**                                                                                                                                                                                                                                                                                                             | **277CA claim acknowledgments**                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                                           | **835 ERAs**                                                                                                                                                                                                                       | **276/277 claim status checks**                                                                                                                                                               |
| -------------------------------------- | -------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- | --------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- |
| JSON API endpoint                      | [Professional Claims JSON](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-claims)<br><br>[Dental Claims JSON](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-dental-claims)<br><br>[Institutional Claims JSON](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-institutional-claims) | [277CA Report](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-277)                                                                                                                                                                                                                                                                                                                                                                                                                                                                                            | [835 ERA Report](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-835)                                                                                                                                   | [276/277 Real-Time Claim Status JSON](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-claim-status)                                                                       |
| Location of the patient control number | **Request:<br>**`claimInformation<br>└─patientControlNumber<br><br>`**Response:<br>**`claimReference<br>└─patientControlNumber`                                                                                                                                                                                                                    | **Response:<br>**`[claimStatus<br>└─patientAccountNumber](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-277#response.transactions.payers.claimStatusTransactions.claimStatusDetails.patientClaimStatusDetails.claims.claimStatus.patientAccountNumber)`<br>or<br>`[claimStatus<br>└─referencedTransactionTraceNumber](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-277#response.transactions.payers.claimStatusTransactions.claimStatusDetails.patientClaimStatusDetails.claims.claimStatus.referencedTransactionTraceNumber)` | **Response:<br>**`[claimPaymentInfo<br>└─patientControlNumber](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-835#response.transactions.detailInfo.paymentInfo.claimPaymentInfo.patientControlNumber)` | **Response:<br>**`[claimStatus<br>└─patientAccountNumber](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-claim-status#response.claims.claimStatus.patientAccountNumber)` |

## Best practices for creating patient control numbers

Here's what we found works best in practice:

- **Stick to 17 characters.**  
  X12 states patient control numbers can be up to 20 characters. But some payers cut off values longer than 17 characters in ERAs and claim acknowledgments.

- **Use a unique patient control number for each claim.**  
  If multiple claims have the same patient control number, you may match the claim to the wrong ERA or acknowledgment.

- **Use alphanumeric characters only**.  
  Patient control numbers can contain both letters and numbers. Avoid special characters. Many payers don’t handle them properly.

- **Use random strings.**  
  Predictable formats, like `{patientInitials}-{DOS}`, can create duplicates.

**Our recommendation:** Use [nanoid](https://www.npmjs.com/package/nanoid) or a similar library to create a strong, unique 17-character patient control number for each claim.

## Claim submission

You set the patient control number when you submit the claim.

For [JSON-based claims submission endpoints](https://www.stedi.com/docs/healthcare/intro-to-claim-submission), pass the patient control number in the `patientControlNumber` field. For example, using the [Professional Claims (837P) JSON](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-claims) endpoint:

```bash
curl --request POST \
  --url "https://healthcare.us.stedi.com/2024-04-01/change/medicalnetwork/professionalclaims/v3/submission" \
  --header "Authorization: <api_key>" \
  --header "Content-Type: application/json" \
  --data '{
  ...
  "claimInformation": {
    "patientControlNumber": "ABCDEF12345267890",  // Patient control number
    "claimChargeAmount": "109.20",
    ...
  }
  ...
}'
```

## Claim acknowledgments

A [277CA claim acknowledgment](https://www.stedi.com/docs/healthcare/receive-claim-responses) indicates whether the claim was accepted or rejected. Payers send claim acknowledgments to the clearinghouse that submitted the claim.

**Listen for claim acknowledgments**  
Use a [webhook](https://www.stedi.com/docs/healthcare/receive-claim-responses#set-up-event-destinations) or the [Poll Transactions endpoint](https://www.stedi.com/docs/healthcare/receive-claim-responses#poll-for-transactions) to listen for incoming 277 transactions. When a claim acknowledgment arrives, use the transaction ID to fetch the acknowledgment using Stedi’s [Claims acknowledgment endpoint](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-277).

**Retrieve claim acknowledgments**  
The claim’s [`claimStatus.patientAccountNumber`](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-277#response.transactions.payers.claimStatusTransactions.claimStatusDetails.patientClaimStatusDetails.claims.claimStatus.patientAccountNumber) and [`claimStatus.referencedTransactionTraceNumber`](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-277#response.transactions.payers.claimStatusTransactions.claimStatusDetails.patientClaimStatusDetails.claims.claimStatus.referencedTransactionTraceNumber) fields contain the claim’s patient control number. You can use either of these fields in your application logic.

```jsonc
{
  "claims": [
    {
      "claimStatus": {
        "claimServiceBeginDate": "20250101",
        "claimServiceEndDate": "20250101",
        "clearinghouseTraceNumber": "01J1SNT1FQC8ABWD44MAMBDYKA",
        "patientAccountNumber": "ABCDEF12345267890", // Patient control number
        "referencedTransactionTraceNumber": "ABCDEF12345267890", // Patient control number
        ...
      },
      ...
    },
    ...
  ]
}
```

## ERAs

An [835 ERA](https://www.stedi.com/docs/healthcare/receive-claim-responses) contains details about payments for a claim, including explanations for any adjustments or denials.

**ERAs require** [**transaction enrollment**](https://www.stedi.com/docs/healthcare/transaction-enrollment)  
Payers send ERAs to the provider's designated clearinghouse. The provider designates this clearinghouse through transaction enrollment. Providers can receive ERAs at one clearinghouse per payer.

**Listen for ERAs**  
Use a [webhook](https://www.stedi.com/docs/healthcare/receive-claim-responses#set-up-event-destinations) or the [Poll Transactions endpoint](https://www.stedi.com/docs/healthcare/receive-claim-responses#poll-for-transactions) to listen for incoming 835 transactions. When an ERA arrives, you can use the transaction ID to fetch the ERA using Stedi’s [835 ERA endpoint](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-835).

**Retrieve ERAs**  
The endpoint’s response contains the patient control number in the [`claimPaymentInfo.patientControlNumber`](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-835#response.transactions.detailInfo.paymentInfo.claimPaymentInfo.patientControlNumber) field.

```jsonc
{
  ...
  "transactions": [
    {
      ...
      "detailInfo": [
        {
          "assignedNumber": "1",
          "paymentInfo": [
            {
              "claimPaymentInfo": {
                "patientControlNumber": "ABCDEF12345267890", // Patient control number
                "patientResponsibilityAmount": "30",
                ...
              },
              ...
            },
            ...
          ]
        }
      ],
      ...
    }
  ]
}
```

## Claim status checks

Unlike claim acknowledgments or ERAs, you run [276/277 claim status checks](https://www.stedi.com/docs/healthcare/check-claim-status) in real time.

**Claim status requests**  
The [Real-Time Claim Status JSON endpoint](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-claim-status) doesn’t accept a patient control number as a request parameter. Instead, you pass in information for the payer, provider, patient, and date of service. For detailed guidance, see our recommended [base JSON request.](https://www.stedi.com/docs/healthcare/check-claim-status#json-base-request)

**Claim status responses**  
If the payer has multiple claims on file that match the information you provided, the response may include multiple claims. Each claim’s [`claimStatus.patientAccountNumber`](https://www.stedi.com/docs/healthcare/api-reference/post-healthcare-claim-status#response.claims.claimStatus.patientAccountNumber) field contains the claim’s patient control number.

```jsonc
{
  "claims": [
    {
      "claimStatus": {
        "patientAccountNumber": "ABCDEF12345267890",  // Patient control number
        "amountPaid": "95.55",
        ...
      },
      ...
    }
  ],
  ...
}
```

## Other tracking IDs

### Tracking service line items

This guide covers tracking at the claims level. However, you can also track service line items from a claim in claim acknowledgments and ERAs. For details, check our docs:

- [Service lines in 277CA claim acknowledgments](https://www.stedi.com/docs/healthcare/receive-claim-responses#service-line)

- [Service lines in 835 ERAs](https://www.stedi.com/docs/healthcare/receive-claim-responses#service-line-1)

### Payer claim control numbers

**Don’t use payer claim control numbers for tracking.**  
Payers use payer claim control numbers to internally track claims. You can use them when talking to a payer, but they can’t easily be matched to a claim submission.

Payer claim control numbers are returned in the following fields:

- [`claimStatus.tradingPartnerClaimNumber`](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-277#response.transactions.payers.claimStatusTransactions.claimStatusDetails.patientClaimStatusDetails.claims.claimStatus.tradingPartnerClaimNumber) of claim acknowledgment responses

- [`claimPaymentInfo.payerClaimControlNumber`](https://www.stedi.com/docs/healthcare/api-reference/get-healthcare-reports-835#response.transactions.detailInfo.paymentInfo.claimPaymentInfo.payerClaimControlNumber) of ERA responses

### X12 control numbers

**If you’re using Stedi’s JSON APIs, you can safely ignore X12 control numbers.**  
X12 control numbers are used by Stedi and payers for general EDI file processing. If you’re using our JSON APIs, Stedi manages them for you. They’re not useful for tracking claims or individual transactions.

## Process claims with Stedi

Stedi’s [JSON Claims APIs](https://www.stedi.com/docs/healthcare/intro-to-claim-submission) are available on all paid Stedi plans.

To get started with Stedi, [sign up](https://portal.stedi.com/auth/sign-up-intent) for a free sandbox account. It takes less than two minutes. No credit card is required.

When you're ready, upgrade to production on our [pay-as-you-go plan](https://www.stedi.com/pricing). There are no monthly minimums or setup fees. You only pay for the transactions you use.
