{"templateId":"markdown","sharedDataIds":{"sidebar":"sidebar-sidebars.yaml"},"props":{"metadata":{"markdoc":{"tagList":["admonition"]},"type":"markdown"},"seo":{"title":"How past-dated transactions work","siteUrl":"https://docs.peachfinance.com","description":"API and product documentation for Peach Finance, a lending-as-a-service platform."},"dynamicMarkdocComponents":[],"compilationErrors":[],"ast":{"$$mdtype":"Tag","name":"article","attributes":{},"children":[{"$$mdtype":"Tag","name":"Heading","attributes":{"level":1,"id":"how-past-dated-transactions-work","__idx":0},"children":["How past-dated transactions work"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On a loan that isn't being migrated onto Peach, you can create a one-time payment, down payment, or service credit that takes effect at a past date and time, in a single API call. Peach records the transaction at that past instant and runs a ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loan-replay"},"children":["Loan Replay™"]}," from it, which recalculates the loan from that instant onward."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["This page explains how past-dated transactions work on loans that aren't being migrated onto Peach. To make the call, see the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#"},"children":["create transaction API reference"]},". Loans being migrated onto Peach follow different rules; see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loc-migration"},"children":["LOC portfolio migration"]},"."]},{"$$mdtype":"Tag","name":"Admonition","attributes":{"type":"danger","name":"Sending effectiveDate now backdates the transaction"},"children":[{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Since June 2026, on a loan that isn't being migrated onto Peach, a create that sends ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," records the transaction at that past instant and replays the loan. Before the change, Peach ignored both values on one-time payments and down payments and posted the transaction at today's date. On service credits, it dropped ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," and rejected ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," with a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},". An integration that sent both fields on external one-time payments or down payments with status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]}," now creates backdated transactions without an error. The same request on a payment that is not external, or whose status is not ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]},", now returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Known limitation:"]}," Peach has no setting that turns this off, asks for no confirmation, and sets no minimum distance into the past. Any valid date and time replays the loan, including an earlier time today."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Sending ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," without ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},". That error first said only that ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," is required. An integration that responded by adding ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," now creates backdated transactions. The error now tells you to leave ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," blank to create a transaction effective today."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["To create a transaction effective today, send neither ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," nor ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]},". To check whether a transaction was backdated, compare its timestamps after the replay finishes: a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]}," later than ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["appliedAt"]}," marks a backdate."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"what-youll-learn","__idx":1},"children":["What you'll learn"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":["Which creates Peach records at a past instant, and what each one must include"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["How the replay recalculates the loan, and what the create response does and does not show"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["How to tell afterward that a transaction was backdated"]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":["How the behavior differs by loan type and transaction type"]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"concept-overview","__idx":2},"children":["Concept overview"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A past-dated transaction is a transaction whose effective date and time are earlier than the moment you create it. You send the instant the payment or credit actually happened, and Peach places the transaction there in the loan's history. Peach then replays the loan from that instant, so everything after it is recalculated."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The create call returns before the replay finishes unless you send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sync=true"]}," to wait for it. This is different from the separate backdate operation, which changes the effective date of an existing transaction."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"key-concepts","__idx":3},"children":["Key concepts"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Single-call backdate"]}," — a create of a one-time payment, down payment, or service credit that sends ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," and no ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]},", on a loan that isn't being migrated onto Peach and whose status accepts the transaction (see ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#behavior-by-loan-type"},"children":["Behavior by loan type"]},"). Peach records the transaction at that instant and replays the loan."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Requested instant"]}," — ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," plus ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]},", read in the product timezone, the timezone set on the loan's loan type. It must not be later than the time of the call."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loan-replay"},"children":["Loan Replay™"]}]}," — the recalculation that runs from the requested instant onward."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Two-step backdate"]}," — the separate ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#"},"children":["backdate operation"]},", which changes the effective date of an existing succeeded or pending transaction. It requires the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["transaction:backdate"]}," permission and also accepts paid-off loans."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Operation ID"]}," — the identifier you poll to learn whether the replay has finished. Peach returns it in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["X-OPERATION-ID"]}," header, or in the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["408"]}," response when a waiting call times out."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"how-it-works","__idx":4},"children":["How it works"]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"1-request-validated","__idx":5},"children":["1. Request validated"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Peach treats a create as a single-call backdate when the loan is not being migrated, the type is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["oneTime"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["downPayment"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["service"]},", ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," is present, and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]}," is absent. It then checks the request. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," is required. One-time payments and down payments must be external: ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["isExternal"]}," is ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["true"]},", or the payment instrument is external. Service credits are exempt from that check. A payment's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," must be ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]},"; an omitted ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," is rejected, because it resolves to ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduled"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The requested instant must not be later than the time of the call. A date of today with a time already past is accepted and replays; a later time today returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},". Each failed check returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},", listed in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/past-dated-transaction-errors"},"children":["past-dated transaction errors reference"]},"."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For a one-time payment, down payment, or service credit on a loan that isn't being migrated onto Peach, the three date fields combine as follows."]},{"$$mdtype":"Tag","name":"div","attributes":{"className":"md-table-wrapper"},"children":[{"$$mdtype":"Tag","name":"table","attributes":{"className":"md"},"children":[{"$$mdtype":"Tag","name":"thead","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"effectiveDate"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"effectiveTimeOfDay"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"scheduledDate"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]}]},{"$$mdtype":"Tag","name":"th","attributes":{"data-label":"Outcome"},"children":["Outcome"]}]}]},{"$$mdtype":"Tag","name":"tbody","attributes":{},"children":[{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Created effective today."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/past-dated-transaction-errors#request-fields"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay is required when creating and backdating a transaction in one call (i.e. when effectiveDate is provided). To create a transaction effective today, leave effectiveDate blank."]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/past-dated-transaction-errors#request-fields"},"children":[{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate is required when effectiveTimeOfDay is provided."]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Single-call backdate: Peach checks the request, records the transaction at the requested instant, and replays the loan. Each failed check returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]}," listed in the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/past-dated-transaction-errors"},"children":["errors reference"]},"."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Created for ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]}," with status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduled"]},", or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["initiated"]}," when ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]}," is today and the transaction isn't external. A ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]}," earlier than today returns a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},": ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["Scheduled date cannot be in the past."]}]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["As in the row above. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," is ignored."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["—"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["As in the row above. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," is ignored."]}]},{"$$mdtype":"Tag","name":"tr","attributes":{},"children":[{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["Sent"]},{"$$mdtype":"Tag","name":"td","attributes":{},"children":["As in the row above. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," are ignored."]}]}]}]}]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["For a single-call backdate, one-time payments and down payments must also be external, with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["status"]}," ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeeded"]}," or ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pending"]},". Service credits are exempt from both checks."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Known limitation:"]}," if you also send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]},", Peach does not apply ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," and returns no error. Leave ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["scheduledDate"]}," empty."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Known limitation:"]}," a create on a loan with status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paidOff"]}," is refused, while the two-step backdate operation accepts a paid-off loan."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"2-transaction-recorded-at-the-past-instant","__idx":6},"children":["2. Transaction recorded at the past instant"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Peach saves the transaction with its effective date set to the requested date. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["pendingAt"]}," equals the requested instant, while ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]}," records the time of the call. For a succeeded payment, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeededAt"]}," equals ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]},". ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["appliedAt"]}," stays empty until the replay applies the transaction, which sets it to the requested instant. ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["originalEffectiveDate"]}," is also set to the requested date, so it does not show that the transaction was backdated."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"3-response-returned","__idx":7},"children":["3. Response returned"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["By default (",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sync=false"]},"), the create returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["201 Created"]}," before the replay finishes. The response carries an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["X-OPERATION-ID"]}," header; ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"#"},"children":["poll that operation"]}," to learn when the replay is done. With ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sync=true"]},", the call waits for the replay. If the wait times out, it returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["408"]}," with an operation ID to poll. If Peach hits an error outside the replay itself, for example before the replay starts, it returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},"; the transaction is already saved. See the ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/past-dated-transaction-errors"},"children":["errors reference"]},"."]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Known limitation:"]}," with ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sync=true"]},", the ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["201"]}," body is the transaction as it was before the replay. Read the transaction again to see its state after the replay."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Known limitation:"]}," a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["201"]},", or a completed operation, doesn't confirm that the replay succeeded. If the replay itself fails, the operation still reports success, and a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["sync=true"]}," call returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["201"]},". Replay failures are rare and Peach monitors them, so in general you don't need to do anything."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Known limitation:"]}," without an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalId"]},", Peach cannot recognize a retry as a duplicate, so a retry after a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["408"]}," or a dropped connection can create a second transaction. When the first request carried an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["externalId"]},", a retry with the same value returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["409"]},", which means the first request was saved."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"4-replay-recalculates-the-loan","__idx":8},"children":["4. Replay recalculates the loan"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Peach replays the loan from the requested instant and recalculates it from that point onward. ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loan-replay"},"children":["Loan Replay™"]}," describes what a replay recalculates."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":3,"id":"5-post-replay-state","__idx":9},"children":["5. Post-replay state"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Loan status changes that the transaction causes, such as paying off the loan, take effect through the replay rather than at the moment of the create. Peach evaluates a payoff during the replay, on balances recalculated from the earlier date, so the loan can be paid off as of a past point. A past-dated payment can pay off a loan that the same payment at today's date would not, because less interest accrues when the payment is moved earlier."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The payoff timestamp doesn't always match that past point. When a past-dated payment pays off the loan and no other succeeded transaction on the loan was applied after it, the loan's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["timestamps.paidOffAt"]}," is the time of the create call, not the payment's requested instant. A past-dated service credit in the same position gives a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paidOffAt"]}," equal to the credit's requested instant. When another succeeded transaction was applied later, ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["paidOffAt"]}," can come from that transaction's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeededAt"]}," instead."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["A succeeded payment appears on the next day's ",{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/data-reporting/loan-tape-reference"},"children":["loan tape"]},", counted from the call date. To see the recalculated loan, read the transaction or the loan after the operation completes."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"in-practice","__idx":10},"children":["In practice"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["On September 18, 2026, at 10:15 a.m. product time, an integration records a $250.00 check that the borrower wrote on September 12. It creates a succeeded, external one-time payment on loan ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["LN-7K2P-Q9XD"]}," with an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," of September 12 and an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveTimeOfDay"]}," of 2:30 p.m."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The create returns ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["201"]}," with transaction ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["TX-4R8M-2JWC"]},", whose ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]}," and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["succeededAt"]}," are 10:15 a.m. on September 18. Peach replays the loan from 2:30 p.m. on September 12. After the replay, the transaction's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["appliedAt"]}," is 2:30 p.m. on September 12, earlier than its ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["createdAt"]},", which marks it as backdated. The payment appears on the loan tape with a report date of September 18, which Peach generates on September 19."]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["Had the integration sent an ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["effectiveDate"]}," of September 18 with a time of 4:00 p.m., later than the call, the create would have returned a ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["400"]},". A time of 9:00 a.m. that day would have replayed the loan from 9:00 a.m."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"why-it-works-this-way","__idx":11},"children":["Why it works this way"]},{"$$mdtype":"Tag","name":"p","attributes":{},"children":["The two-step backdate first creates the transaction at today's date and then moves it. Between the two steps, the loan reflects the payment at today's date and can briefly show today's outcome, such as a payoff, until the backdate replays. The single call records the transaction at the past instant from the start, so the loan never shows that intermediate state."]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"behavior-by-loan-type","__idx":12},"children":["Behavior by loan type"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Down payments"]}," — accepted only on loans with status ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["active"]},". One-time payments and service credits also accept ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["accelerated"]},", and ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["chargedOff"]}," when the loan type allows payments on charged-off loans."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Lines of credit"]}," — you can send ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["drawId"]},". The requested instant must then be after the draw's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startedAt"]}," as well as the loan's ",{"$$mdtype":"Tag","name":"code","attributes":{},"children":["startedAt"]}," (when each was activated)."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Installment loans"]}," — no migration cutoff applies."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"strong","attributes":{},"children":["Lines of credit migrated onto Peach"]}," — when the line has a migration period, the requested date cannot be earlier than its migration cutoff date."]}]},{"$$mdtype":"Tag","name":"Heading","attributes":{"level":2,"id":"see-also","__idx":13},"children":["See also"]},{"$$mdtype":"Tag","name":"ul","attributes":{},"children":[{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/loan-replay"},"children":["Loan Replay™"]}," — How a replay recalculates a loan after a retroactive change."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/loan-lifecycle/past-dated-transaction-errors"},"children":["Past-dated transaction errors reference"]}," — Every error a past-dated create can return, with its cause and what to do next."]},{"$$mdtype":"Tag","name":"li","attributes":{},"children":[{"$$mdtype":"Tag","name":"MarkdownLink","attributes":{"href":"/servicing-operations/agent-only-tools/agent-tools-manage-payments"},"children":["Manage payments"]}," — Backdate an existing payment from the agent view of the Borrower Portal."]}]}]},"headings":[{"value":"How past-dated transactions work","id":"how-past-dated-transactions-work","depth":1},{"value":"What you'll learn","id":"what-youll-learn","depth":2},{"value":"Concept overview","id":"concept-overview","depth":2},{"value":"Key concepts","id":"key-concepts","depth":2},{"value":"How it works","id":"how-it-works","depth":2},{"value":"1. Request validated","id":"1-request-validated","depth":3},{"value":"2. Transaction recorded at the past instant","id":"2-transaction-recorded-at-the-past-instant","depth":3},{"value":"3. Response returned","id":"3-response-returned","depth":3},{"value":"4. Replay recalculates the loan","id":"4-replay-recalculates-the-loan","depth":3},{"value":"5. Post-replay state","id":"5-post-replay-state","depth":3},{"value":"In practice","id":"in-practice","depth":2},{"value":"Why it works this way","id":"why-it-works-this-way","depth":2},{"value":"Behavior by loan type","id":"behavior-by-loan-type","depth":2},{"value":"See also","id":"see-also","depth":2}],"frontmatter":{"title":"How past-dated transactions work","description":"How Peach records a payment or service credit created with a past effective date, replays the loan, and how to avoid backdating by accident.","verifiedDate":"2026-10-29T00:00:00.000Z","verifiedSpec":"openapi/transactions-public.yml","verifiedRef":"peach@c61d1b5f138bb934f16bc9d80adcdd49b71cd6c2","verifiedBranch":"main","seo":{"title":"How past-dated transactions work"}},"lastModified":"2026-11-03T23:31:11.225Z","pagePropGetterError":{"message":"","name":""}},"slug":"/loan-lifecycle/past-dated-transactions","userData":{"isAuthenticated":false,"teams":["anonymous"]},"isPublic":true}