Simulate Repayments
Overview
Do not enter production data in the Highnote Test environment, which is for exploring features and training. Use only dummy or test data.
Credit and charge card products use ACH transfers to drive repayments on the Highnote platform. For more information on repayments, see Schedule Repayments.
Simulating repayments in the Test environment requires the following steps:
- Creating a payment.
- Updating the status of the transfer.
- Processing a transfer.
This guide provides steps for simulating repayments in the Test environment.
Prerequisites
- A Highnote account
- An API key or API Explorer
- A financial account with simulated transactions and an outstanding balance
Create a one-time payment
Scheduled payments are initiated by the account holder. You can not schedule a payment for an account holder in the Live environment.
One-time payments can be scheduled based on a balance amount or a custom amount. A scheduled payment will not be initiated if the financial account has an OUTSTANDING_BALANCE less than or equal to $0.
In the Test environment, a transfer ID will be generated within 5 minutes of scheduling a payment for today. Use the findScheduledTransferEvent query to find a transfer event ID and simulate changing the status of the transfer:
CreateOneTimeAchTransfer
Query
mutation CreateOneTimeAchTransfer($input: CreateOneTimeACHTransferInput!) {
createOneTimeACHTransfer(input: $input) {
... on OneTimeACHTransfer {
id
fromFinancialAccount {
... on FinancialAccount {
id
}
}
toFinancialAccount {
... on FinancialAccount {
id
}
}
descriptor {
companyEntryDescription
individualName
individualIdentificationNumber
}
transferAmount {
... on ManualTransferAmount {
amount {
value
currencyCode
}
}
}
status
scheduledTransferDate
createdAt
updatedAt
}
... on UserError {
errors {
errorPath
code
description
}
}
}
}
Variables
{ "input": { "fromFinancialAccountId": "EXTERNAL_BANK_ACCOUNT_ID", "toFinancialAccountId": "FINANCIAL_ACCOUNT_ID", "descriptor": { "companyEntryDescription": "CompanyDes", "individualName": "IndivName", "individualIdentificationNumber": "112345" }, "transferAmountStrategy": { "transferAmount": { "value": "9900", "currencyCode": "USD" } }, "transferDate": "2023-03-11", "transferAgreementConsent": { "consentTimestamp": "2022-03-10T17:10:55.662Z", "authorizedPersonId": "AUTHORIZED_PERSON_ID", "template": { "consentTemplateId": "your-template-id", "consentTemplateVersion": "0" } } } }
Result
{
"data": {
"id": "SCHEDULED_TRANSFER_ID",
"toFinancialAccount": {
"id": "FINANCIAL_ACCOUNT_ID"
},
"fromFinancialAccount": {
"id": "EXTERNAL_BANK_ACCOUNT_ID"
},
"descriptor": {
"companyEntryDescription": "CompanyDes",
"individualName": "IndivName",
"individualIdentificationNumber": "112345"
},
"transferAmount": {
"amount": {
"value": "9900",
"currencyCode": "USD"
}
},
"status": "SCHEDULED",
"scheduledTransferDate": "2022-03-09T00:00:00.000Z",
"createdAt": "2022-02-09T17:10:56.662Z",
"updatedAt": "2022-02-10T17:10:56.662Z"
}
}
Update the transfer status
In the Test environment, you can change the status of a fund in transfer from NEW to PROCESSING using the transfer ID. The simulation will allow you to view the impacts to ledgers from initiating a transfer:
SimulateProcessingIntegratorInitiatedStatusChange
Query
mutation SimulateProcessingIntegratorInitiatedStatusChange(
$input: SimulateProcessingIntegratorInitiatedStatusChangeInput!
) {
simulateProcessingIntegratorInitiatedStatusChange(input: $input) {
__typename
... on IntegratorInitiatedFundsDepositACHTransfer {
id
amount {
currencyCode
value
}
createdAt
updatedAt
ledgers {
id
name
normalBalance
asOf
debitBalance {
value
currencyCode
}
creditBalance {
value
currencyCode
}
}
status {
__typename
... on NonFailureIntegratorInitiatedACHStatus {
status
}
... on FailureIntegratorInitiatedACHStatus {
status
statusReasonCode
}
}
fromFinancialAccount {
... on FinancialAccount {
id
name
}
}
toFinancialAccount {
... on FinancialAccount {
id
name
}
}
companyName
descriptor {
companyEntryDescription
individualIdentificationNumber
individualName
}
companyIdentifier
settlementDate
}
... on UserError {
errors {
errorPath
code
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "id": "ACH_TRANSFER_ID" } }
Result
{
"data": {
"simulateProcessedIntegratorInitiatedStatusChange": {
"__typename": "SecureDepositACHTransfer",
"id": "ACH_TRANSFER_ID",
"amount": {
"currencyCode": "USD",
"value": 10000
},
"createdAt": "2022-04-21T19:15:43.441Z",
"updatedAt": "2022-04-21T19:18:37.369Z",
"ledgers": [
{
"id": "LEDGER_ID",
"name": "SECURED_DEPOSIT_PAYABLE",
"normalBalance": "CREDIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 0,
"currencyCode": "USD"
},
"creditBalance": {
"value": 860300,
"currencyCode": "USD"
}
},
{
"id": "LEDGER_ID",
"name": "ACH_PENDING_SETTLEMENT_OUT",
"normalBalance": "CREDIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 860300,
"currencyCode": "USD"
},
"creditBalance": {
"value": 0,
"currencyCode": "USD"
}
},
{
"id": "LEDGER_ID",
"name": "SECURED_DEPOSIT_RECEIVABLE",
"normalBalance": "DEBIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 860300,
"currencyCode": "USD"
},
"creditBalance": {
"value": 0,
"currencyCode": "USD"
}
},
{
"id": "LEDGER_ID",
"name": "ACH_PENDING_SETTLEMENT",
"normalBalance": "CREDIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 0,
"currencyCode": "USD"
},
"creditBalance": {
"value": 860300,
"currencyCode": "USD"
}
}
],
"status": {
"__typename": "NonFailureIntegratorInitiatedACHStatus",
"status": "PROCESSING"
},
"fromFinancialAccount": {},
"toFinancialAccount": {
"id": "FINANCIAL_ACCOUNT_ID",
"name": "first-account"
},
"companyName": "HIGHNOTEPLATFORM",
"descriptor": {
"companyEntryDescription": "entryDesc",
"individualIdentificationNumber": "",
"individualName": "indName"
},
"companyIdentifier": "1852922649",
"settlementDate": "2022-04-21T19:15:43.439Z"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}
Process a transfer
In the Test environment, you can change the status of a fund in transfer from PROCESSING to PROCESSED using the transfer ID. The simulation will allow you to view the impacts to ledgers from processing a transfer:
SimulateProcessedIntegratorInitiatedStatusChange
Query
mutation SimulateProcessedIntegratorInitiatedStatusChange(
$input: SimulateProcessedIntegratorInitiatedStatusChangeInput!
) {
simulateProcessedIntegratorInitiatedStatusChange(input: $input) {
__typename
... on SecureDepositACHTransfer {
id
amount {
currencyCode
value
}
createdAt
updatedAt
ledgers {
id
name
normalBalance
asOf
debitBalance {
value
currencyCode
}
creditBalance {
value
currencyCode
}
}
status {
__typename
... on NonFailureIntegratorInitiatedACHStatus {
status
}
... on FailureIntegratorInitiatedACHStatus {
status
statusReasonCode
}
}
fromFinancialAccount {
... on FinancialAccount {
id
name
}
}
toFinancialAccount {
... on FinancialAccount {
id
name
}
}
companyName
descriptor {
companyEntryDescription
individualIdentificationNumber
individualName
}
companyIdentifier
settlementDate
}
... on SecureCardBalanceRepaymentACHTransfer {
id
amount {
currencyCode
value
}
createdAt
updatedAt
ledgers {
id
name
normalBalance
asOf
debitBalance {
value
currencyCode
}
creditBalance {
value
currencyCode
}
}
status {
__typename
... on NonFailureIntegratorInitiatedACHStatus {
status
}
... on FailureIntegratorInitiatedACHStatus {
status
statusReasonCode
}
}
fromFinancialAccount {
... on FinancialAccount {
id
name
}
}
toFinancialAccount {
... on FinancialAccount {
id
name
}
}
companyName
descriptor {
companyEntryDescription
individualIdentificationNumber
individualName
}
companyIdentifier
settlementDate
}
... on UserError {
errors {
errorPath
code
}
}
... on AccessDeniedError {
message
}
}
}
Variables
{ "input": { "id": "TRANSFER_ID" } }
Result
{
"data": {
"simulateProcessedIntegratorInitiatedStatusChange": {
"__typename": "SecureDepositACHTransfer",
"id": "TRANSFER_ID",
"amount": {
"currencyCode": "USD",
"value": 10000
},
"createdAt": "2022-04-21T19:15:43.441Z",
"updatedAt": "2022-04-21T19:18:37.369Z",
"ledgers": [
{
"id": "LEDGER_ID",
"name": "SECURED_DEPOSIT_PAYABLE",
"normalBalance": "CREDIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 0,
"currencyCode": "USD"
},
"creditBalance": {
"value": 860300,
"currencyCode": "USD"
}
},
{
"id": "LEDGER_ID",
"name": "ACH_PENDING_SETTLEMENT_OUT",
"normalBalance": "CREDIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 860300,
"currencyCode": "USD"
},
"creditBalance": {
"value": 0,
"currencyCode": "USD"
}
},
{
"id": "LEDGER_ID",
"name": "SECURED_DEPOSIT_RECEIVABLE",
"normalBalance": "DEBIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 860300,
"currencyCode": "USD"
},
"creditBalance": {
"value": 0,
"currencyCode": "USD"
}
},
{
"id": "LEDGER_ID",
"name": "ACH_PENDING_SETTLEMENT",
"normalBalance": "CREDIT",
"asOf": "2022-04-21T19:15:49.553Z",
"debitBalance": {
"value": 0,
"currencyCode": "USD"
},
"creditBalance": {
"value": 860300,
"currencyCode": "USD"
}
}
],
"status": {
"__typename": "NonFailureIntegratorInitiatedACHStatus",
"status": "PROCESSED"
},
"fromFinancialAccount": {},
"toFinancialAccount": {
"id": "FINANCIAL_ACCOUNT_ID",
"name": "first-account"
},
"companyName": "HIGHNOTEPLATFORM",
"descriptor": {
"companyEntryDescription": "entryDesc",
"individualIdentificationNumber": "",
"individualName": "indName"
},
"companyIdentifier": "1852922649",
"settlementDate": "2022-04-21T19:15:43.439Z"
}
},
"extensions": {
"requestId": "REQUEST_ID"
}
}
Automate your integration
To automate your integration, subscribe to ACH notification events.
The details provided in the payloads from this event can be used for the following use cases:
- Automate your application or website's repayment workflows
- Create account holder notifications or alerts
- Create status views in your application or website