> ## Documentation Index
> Fetch the complete documentation index at: https://developers.pleo.io/llms.txt
> Use this file to discover all available pages before exploring further.

# How to Assign Accounting Periods

export const WhatComesNext = ({children, href}) => <div className="mt-4">
    <a href={href} className="btn-primary">
      {children} →
    </a>
  </div>;

export const AssignAccountingPeriodsDiagram = () => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "22px"}}}%%
flowchart LR
    S1["1. Determine Posting Date"] --> S2["2. Attempt Posting"]
    S2 -->|success| S5["5. Resolve Accounting Period"]
    S2 -->|rejected| S3["3. Handle Closed Period Rejection"] --> S4["4. Apply Closed Period Strategy"]
    S4 -->|retry| S2
    S4 -->|fail item| FAIL["Item Failed"]

click S1 "#1-determine-posting-date"
click S2 "#2-attempt-posting"
click S3 "#3-handle-closed-period-rejection"
click S4 "#4-apply-closed-period-strategy"
click S5 "#5-resolve-accounting-period"

style S1 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S2 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S3 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S4 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style S5 white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
style FAIL white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const WorkflowDiagramTopNavASERP = ({highlight}) => {
  const [isDark, setIsDark] = useState(false);
  useEffect(() => {
    const check = () => setIsDark(document.documentElement.classList.contains("dark"));
    check();
    const observer = new MutationObserver(check);
    observer.observe(document.documentElement, {
      attributes: true,
      attributeFilter: ["class"]
    });
    return () => observer.disconnect();
  }, []);
  const nodeFill = isDark ? "#212222" : "#EEF4F4";
  const nodeStroke = isDark ? "#848989" : "#E1E6E6";
  const nodeTextStyle = isDark ? ",color:#EEF4F4" : ",color:#131414";
  const subgraphFill = isDark ? "#131414" : "#ffffff";
  const subgraphStroke = isDark ? "#848989" : "#6B7070";
  const subgraphTextStyle = isDark ? ",color:#EEF4F4" : ",color:#6B7070";
  const linkStyle = isDark ? "" : "linkStyle default stroke:#848989,stroke-width:1px;";
  const highlightStyle = highlight ? `style ${highlight} stroke:#FEB6FE,stroke-width:2px` : "";
  const shape = (id, label) => `${id}["${label}"]`;
  const diagram = `
%%{init: {"themeVariables": {"fontSize": "30px"}}}%%
flowchart LR

    ${shape("WF1", "Pleo APIs")}

    subgraph ERP["AS/ERP"]
    direction LR
        START1[" "]
        ${shape("A", "1.Determine Bookkeeping Method")} --> ${shape("B", "2.Apply Accounts Mapping")}
        B --> ${shape("C", "3.Apply Data Mapping")}
        C --> ${shape("D", "4.Transfer Attachments")}
        D --> ${shape("E", "5.Assign Accounting Period")}
        E --> ${shape("F", "6.Apply Posting Behaviour")}
    end

    ${shape("WF2", "Pleo APIs")}

    WF1 --> A
    F --> WF2

    %% Click actions
    click WF1 "/docs/current/how-tos/accounting-integrations/how-to-fetch-export-item-data-for-as-erp-processing"
    click A "/docs/current/how-tos/accounting-integrations/how-to-determine-the-bookkeeping-method-for-as-erp-processing"
    click B "/docs/current/how-tos/accounting-integrations/how-to-determine-accounts-mapping-for-as-erp-processing"
    click C "/docs/current/how-tos/accounting-integrations/how-to-apply-data-mapping-for-as-erp-processing"
    click D "/docs/current/how-tos/accounting-integrations/how-to-transfer-attachments-for-as-erp-processing"
    click E "/docs/current/how-tos/accounting-integrations/how-to-assign-accounting-periods-for-as-erp-processing"
    click F "/docs/current/how-tos/accounting-integrations/how-to-apply-posting-behaviour-for-as-erp-processing"
    click WF2 "/docs/current/how-tos/accounting-integrations/how-to-update-export-items-for-as-erp-processing"

    %% Styling for wrapping
    style A white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
    style B white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
    style C white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
    style D white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
    style E white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
    style F white-space:normal,fill:${nodeFill},stroke:${nodeStroke}${nodeTextStyle}
    %% Make subgraph transparent with black border
    style START1 fill:transparent,stroke:transparent,color:transparent
    style ERP fill:${subgraphFill},stroke:${subgraphStroke}${subgraphTextStyle}

${highlightStyle}
${linkStyle}
`;
  return <Mermaid chart={diagram} />;
};

export const NoteCallout = ({title, children}) => <div className="callout-box callout-note">
    <div className="callout-row">
      <span className="callout-icon">
        <svg width="22" height="22" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="currentColor"><path d="M208,104a79.86,79.86,0,0,1-30.59,62.92A24.29,24.29,0,0,0,168,186v6a8,8,0,0,1-8,8H96a8,8,0,0,1-8-8v-6a24.11,24.11,0,0,0-9.3-19A79.87,79.87,0,0,1,48,104.45C47.76,61.09,82.72,25,126.07,24A80,80,0,0,1,208,104Z" opacity="0.2" /><path d="M176,232a8,8,0,0,1-8,8H88a8,8,0,0,1,0-16h80A8,8,0,0,1,176,232Zm40-128a87.55,87.55,0,0,1-33.64,69.21A16.24,16.24,0,0,0,176,186v6a16,16,0,0,1-16,16H96a16,16,0,0,1-16-16v-6a16,16,0,0,0-6.23-12.66A87.59,87.59,0,0,1,40,104.49C39.74,56.83,78.26,17.14,125.88,16A88,88,0,0,1,216,104Zm-16,0a72,72,0,0,0-73.74-72c-39,.92-70.47,33.39-70.26,72.39a71.65,71.65,0,0,0,27.64,56.3A32,32,0,0,1,96,186v6h64v-6a32.15,32.15,0,0,1,12.47-25.35A71.65,71.65,0,0,0,200,104Zm-16.11-9.34a57.6,57.6,0,0,0-46.56-46.55,8,8,0,0,0-2.66,15.78c16.57,2.79,30.63,16.85,33.44,33.45A8,8,0,0,0,176,104a9,9,0,0,0,1.35-.11A8,8,0,0,0,183.89,94.66Z" /></svg>
      </span>
      <div>
        {title && <div className="callout-title">
            {title}
          </div>}
        <div className="callout-body">
          {children}
        </div>
      </div>
    </div>
  </div>;

export const RememberCallout = ({title, children}) => <div className="callout-box callout-remember">
    <div className="callout-row">
      <span className="callout-icon">
        <svg width="22" height="22" xmlns="http://www.w3.org/2000/svg" viewBox="0 0 256 256" fill="currentColor"><path d="M229.66,98.34,172.39,155.8c11.46,22.93-1.72,45.86-10.11,57a8,8,0,0,1-12,.83L42.34,105.76A8,8,0,0,1,43,93.85c29.65-23.92,57.4-10,57.4-10l57.27-57.46a8,8,0,0,1,11.31,0L229.66,87A8,8,0,0,1,229.66,98.34Z" opacity="0.2" /><path d="M235.32,81.37,174.63,20.69a16,16,0,0,0-22.63,0L98.37,74.49c-10.66-3.34-35-7.37-60.4,13.14a16,16,0,0,0-1.29,23.78L85,159.71,42.34,202.34a8,8,0,0,0,11.32,11.32L96.29,171l48.29,48.29A16,16,0,0,0,155.9,224c.38,0,.75,0,1.13,0a15.93,15.93,0,0,0,11.64-6.33c19.64-26.1,17.75-47.32,13.19-60L235.33,104A16,16,0,0,0,235.32,81.37ZM224,92.69h0l-57.27,57.46a8,8,0,0,0-1.49,9.22c9.46,18.93-1.8,38.59-9.34,48.62L48,100.08c12.08-9.74,23.64-12.31,32.48-12.31A40.13,40.13,0,0,1,96.81,91a8,8,0,0,0,9.25-1.51L163.32,32,224,92.68Z" /></svg>
      </span>
      <div>
        {title && <div className="callout-title">
            {title}
          </div>}
        <div className="callout-body">
          {children}
        </div>
      </div>
    </div>
  </div>;

<WorkflowDiagramTopNavASERP highlight="E" />

<div className="border-[1px] rounded-none p-4 bg-[#ffffff] border-[#FEB6FE] dark:bg-[#131414] dark:border-[#FEB6FE]">
  <AssignAccountingPeriodsDiagram />
</div>

Accounting period assignment ensures Export Items are posted into the correct financial period according to both Pleo configuration and Accounting System rules.

## Prerequisites

Before you begin:

* You've [fetched the export item payload data](/docs/current/how-tos/accounting-integrations/how-to-fetch-export-item-data-for-as-erp-processing)
* You've completed:
  * [Accounts Mapping](/docs/current/how-tos/accounting-integrations/how-to-determine-accounts-mapping-for-as-erp-processing)
  * [Data Mapping](/docs/current/how-tos/accounting-integrations/how-to-apply-data-mapping-for-as-erp-processing)
* You're familiar with the [Integration Design for accounting periods](/docs/current/integration-design/exports/integration-design-exports-accounting-periods)

## Relevant Export Item Fields

<Accordion title="Example Export Item Payload (Journal Entry)">
  ```json theme={null}
    {
        "companyId": "12abc3d4-e567-890e-1234-abc56e78fabc",
        "accountingEntryId": "59540ed2-0d68-4e36-9e31-58223975d9e9",
        "type": "card_purchase",
        "subType": null,
        "date": "2025-12-10T15:46:34Z",
        "amount": {
          "inSupplierCurrency": {
            "currency": "GBP",
            "value": 6366
          },
          "inWalletCurrency": {
            "currency": "GBP",
            "value": 6366
          }
        },
        "note": "Printer ink",
        "files": [
          {
            "url": "<string>",
            "type": "image/jpeg",
            "size": 13010
          }
        ],
        "supplier": {
          "code": "1340472473",
          "name": "Target",
          "categoryCode": "1000",
          "country": "GB",
          "account": null,
          "taxIdentifier": null
        },
        "user": {
          "id": "6b71f6bd-e83d-4d49-88ee-2b8cda2d57cf",
          "name": "Luke Richardson",
          "code": null
        },
        "team": {
          "id": "747aaf60-56c6-4b46-ad92-f8a0cb59cf8b",
          "code": "5678",
          "name": "Engineering"
        },
        "accountingEntryLines": [
          {
            "accountingEntryLineId": "0c76ea71-aaaa-4ece-bb68-e1166ccaea04",
            "lineAmount": {
              "inSupplierCurrency": {
                "currency": "GBP",
                "value": 6366
              },
              "inWalletCurrency": {
                "currency": "GBP",
                "value": 6366
              }
            },
            "netAmount": {
              "inSupplierCurrency": {
                "currency": "GBP",
                "value": 6366
              },
              "inWalletCurrency": {
                "currency": "GBP",
                "value": 6366
              }
            },
            "account": {
              "id": "7966c3ba-e4de-4574-8604-6cfa48d62cc8",
              "code": "6990000",
              "name": "Printing & Stationary",
              "identifier": "6990000"
            },
            "tax": {
              "id": "997d8526-5872-484d-ba07-c7a07e08e555",
              "code": "0001",
              "type": "inclusive",
              "amount": {
                "inSupplierCurrency": {
                  "currency": "GBP",
                  "value": 0
                },
                "inWalletCurrency": {
                  "currency": "GBP",
                  "value": 0
                }
              },
              "rate": 0.00
            },
            "tags": []
          }
        ],
        "additionalInformation": {
          "reconciliationId": "2500001",
          "reconciledEntries": null,
          "attendees": [],
          "invoiceInformation": null
        },
        "bookkeeping": {
          "method": "journal"
        },
        "vendor": {
          "id": "22e1f2c9-1360-4291-ab41-6b23dcea8888",
          "name": "TestVendor",
          "code": "acc1234",
          "externalId": "ext12345",
          "registrationNumber": "reg001234",
          "taxRegistrationNumber": "taxreg1234",
          "country": "UK",
          "defaultCurrency": "GBP"
        },
        "contraAccount": {
          "id": "993d664c-9b7c-4efc-a677-510e69200857",
          "code": "0876000",
          "name": "0876000_ChartAccounts",
          "identifier": "0876000"
        },
        "_links": {
          "web": {
            "exportItem": "https://app.staging.pleo.io/export/export-item/0c76ea71-aaaa-4ece-bb68-e1166ccaea04"
          }
        },
        "servicePeriod": null
      },
     # [other Export Items omitted for brevity]
     # [Pagination omitted for brevity]
  ```
</Accordion>

### Expense Date (source date)

This is the transaction date provided by Pleo and represents when the expense occurred.

```json theme={null}
"date": "2023-11-07T05:31:56Z"
```

### Service Period (Optional)

Used for accrual or cost allocation purposes. It does not affect posting date or closed-period handling.

```json theme={null}
"servicePeriod": {
  "from": "...",
  "to": "..."
}
```

## Steps

### 1. Determine Posting Date

The Export Item provides two dates:

* **Expense date** (`exportItem.date`) — the transaction date from Pleo, representing when the expense occurred
* **Posting date** — the date your integration sends to the Accounting System when creating the entry

By default these are the same:

```pseudo theme={null}
postingDate = exportItem.date
```

The posting date may be adjusted later if the target period is closed (see Steps 3–4).

### 2. Attempt Posting

Submit the accounting entry to the Accounting System using the posting date:

```pseudo theme={null}
postToAccountingSystem(exportItem, postingDate)
```

The Accounting System uses the posting date to determine which period the entry belongs to.

* If the posting **succeeds** — the period is open and the entry is accepted. Proceed to Step 5.
* If the posting is **rejected** due to a closed period — proceed to Step 3.

### 3. Handle Closed Period Rejection

A rejection at Step 2 signals that the posting date falls within a period the Accounting System has closed. This is the trigger to apply a closed period strategy.

```pseudo theme={null}
if postingRejectedDueToClosedPeriod:
    applyClosedPeriodStrategy()
```

<RememberCallout title="Remember">
  Closed period handling is not provided by the Export API. It must be implemented as an integration configuration. Whether adjustment is permitted depends on how the integration is configured.
</RememberCallout>

### 4. Apply Closed Period Strategy

The integration must define how to respond when a period is closed. Two options are supported:

#### Option A — Adjust posting date and retry

Adjust the posting date to an open period and return to Step 2:

```pseudo theme={null}
postingDate = exportDate   # e.g. current date
```

or

```pseudo theme={null}
postingDate = accountingSystem.findNextOpenPeriod(postingDate)
```

Then retry posting (return to Step 2).

#### Option B — Fail the Export Item

If adjustment is disabled or not permitted by the integration configuration:

```pseudo theme={null}
markExportItemFailed("Closed accounting period")
```

<RememberCallout title="Remember">
  The chosen strategy depends on integration configuration and Accounting System constraints.
</RememberCallout>

### 5. Resolve Accounting Period

Once posting succeeds (either directly at Step 2 or after a date adjustment at Step 4), confirm which accounting period the entry has been assigned to using the final posting date:

```pseudo theme={null}
period = accountingSystem.resolvePeriod(postingDate)
```

This is a confirmation step — the Accounting System resolves the period based on the final, possibly adjusted, posting date. If the Accounting System uses non-calendar or custom fiscal periods, use its APIs or configuration to resolve the correct period rather than assuming a standard January–December structure.

This may involve:

* calendar periods (monthly, quarterly)
* fiscal periods
* custom accounting calendars

## Result

After completing this step:

* A valid posting date has been determined
* Closed period behaviour has been explicitly handled
* The Accounting System assigns the correct accounting period

***

## What Comes Next?

<WhatComesNext href="/docs/current/how-tos/accounting-integrations/how-to-apply-posting-behaviour-for-as-erp-processing">
  How to Apply Posting Behaviour
</WhatComesNext>

***

<div className="text-xs uppercase" style={{ fontVariant: 'small-caps' }}>
  this how-to is part of:
</div>

<div className="mt-4 flex flex-wrap gap-2">
  <a
    href="/docs/current/guides/accounting-system-processing-workflow-guide"
    className="inline-flex items-center rounded-full border border-gray-300 dark:border-gray-600
px-3 py-1 text-xs font-medium
bg-white dark:bg-[#1f262b] text-black dark:text-white
hover:bg-gray-100 dark:hover:bg-[#2b2f33]
transition-colors"
  >
    AS/ERP Processing Workflow Guide
  </a>

  <a
    href="/docs/current/guides/export-integration-workflow-guide"
    className="inline-flex items-center rounded-full border border-gray-300 dark:border-gray-600
px-3 py-1 text-xs font-medium
bg-white dark:bg-[#1f262b] text-black dark:text-white
hover:bg-gray-100 dark:hover:bg-[#2b2f33]
transition-colors"
  >
    Export Integration Workflow Guide (Step 5)
  </a>
</div>

***

## Related Reading

* [Export Lifecycle](/docs/current/platform/exports/lifecycle)
* [Connection and Authorisation Overview](/docs/current/integration-design/auth/integration-design-auth-overview)

***
