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

# Start Workflows from Underwriting Results

> Use the Funding Machine 'Underwriting Completed' workflow trigger to start any CRM workflow when a contact gets an underwriting result, and use the outcome, funding range, credit score, and more in later steps.

# Start Workflows from Underwriting Results

The Funding Machine app ships a workflow trigger, **Underwriting Completed**. It starts your workflow when a contact gets an underwriting result. Every value in that result is then available to the steps that follow, so you can send your own messages, move opportunities, add tags, notify your team, or send the result to your own systems.

The trigger fires:

* when a contact's first underwriting result is ready, and
* again whenever that result changes: a re-run with new numbers, or a review decision such as approve, park, decline, a revised decision or range, or a change to the selected products or target utilization.

A re-run that changes nothing does not start the workflow again.

<Info>
  The values are always the contact's latest result, including any changes made during review. They are the same numbers you see on the contact's Funding tab.
</Info>

## Before You Start

* The Funding Machine app must be installed in the sub-account. If you can open Funding Machine from the left sidebar, it is.
* Workflow triggers from installed apps are premium workflow components. Premium triggers and actions must be enabled for the sub-account, and each run is billed by the CRM like any other premium trigger.
* The app must be up to date in the sub-account. The CRM does not add new app triggers to a sub-account that already has the app installed; the sub-account has to update the app, or reinstall it. If **Underwriting Completed** is missing in step 2, open the workflow builder's app list, look for an **Update** offer on Funding Machine, and accept it. If no update is offered, reinstalling the app is the fallback.

<Warning>
  **Every change is a new, billed run.** Approving, parking or declining a file, revising a decision or range, and changing the selected products or target utilization each start the workflow again when they change the result. A file you review in several steps can run the workflow several times. Use the **Outcome** filter so the workflow starts only for the results you need; a change whose outcome is not in the filter does not start the workflow and is not billed.
</Warning>

<Note>
  **Results that already exist are not sent.** The trigger does not replay past results when you add it. A contact underwritten before your workflow was published starts it the next time underwriting is re-run or reviewed for that contact. If another workflow already uses this trigger, a new workflow waits until that contact's result actually changes.
</Note>

## Step-by-Step

<Steps>
  <Step title="1. Create or open a workflow">
    From the left sidebar click **Automation**, then **Workflows**. Create a new workflow or open an existing one.
  </Step>

  <Step title="2. Add the trigger">
    Click **Add New Trigger**, search for **Funding Machine**, and choose **Underwriting Completed**. If Funding Machine is listed without **Underwriting Completed**, update the app first (see **Before You Start**).
  </Step>

  <Step title="3. Choose outcomes (optional)">
    Use the **Outcome** filter to start the workflow only for the results you care about. Leave it empty to start for every result.

    | Outcome | Meaning |
    | - | - |
    | Qualified | Qualified for funding |
    | Qualified - multiple funding paths | Qualified on more than one funding path |
    | Qualified - paydowns required | Qualified once card balances are paid down |
    | Qualified - inquiry removal required | Qualified once recent inquiries are removed |
    | Revenue Based funding | Routed to Revenue Based funding |
    | Parked for callback | Parked until a callback date |
    | Declined - credit repair referral | Declined, with a credit repair recommendation |
    | Declined - no fit | Declined, no funding product fits |
    | Manual review | Waiting for a manual review |
    | Credit not found | No credit file was found for the applicant's details, usually because of a typo. Check the details and pull credit again |

    Outcome is the underwriting result. Approving, declining or parking a file does not change it, and neither does editing a decision, although those changes still start the workflow again. To act on them, check **Review status** and **Card status** or **Term loan status** in an If/Else step. The one exception is **Credit not found**: once you choose a card decision for that file, the outcome follows your revised decisions and the file's Revenue Based results. For example, Doesn't Qualify changes the outcome to **Declined - no fit**, or to **Revenue Based funding** if the file qualifies for Revenue Based funding. Until you choose a card decision, the outcome stays **Credit not found**.
  </Step>

  <Step title="4. Add your actions">
    Add any actions you like below the trigger. The workflow runs for the contact the result belongs to, so actions that work on the contact, such as sending a message, adding a tag, updating a field, or moving an opportunity, act on that contact. When you insert a value into an action, the underwriting values appear under the trigger's name in the value picker.

    <Tip>
      If contact actions skip the contact, add a **Find Contact** action right after the trigger, look the contact up by **Contact ID**, and insert the trigger's **Contact ID** value. When the contact is already attached, the CRM skips the Find Contact step and the rest of the workflow runs normally.
    </Tip>
  </Step>

  <Step title="5. Save and publish">
    Click **Save**, then turn the workflow to **Published**.
  </Step>
</Steps>

## Recipes

### Send the result to another system

1. Add the trigger and choose your outcomes (steps 2 and 3).
2. Add a **Custom Webhook** action. Choose **POST** and enter your system's URL.
3. In the request body, add the values your system needs, inserting each one from the trigger: for example **Contact ID**, **Outcome**, **Review status**, and **Estimated funding range**.
4. Save and publish. Each run sends that contact's latest values.

### Save the result to contact fields

1. Create a custom contact field for each value you want to keep on the contact, for example **Underwriting outcome** and **Estimated funding range**.
2. Add the trigger and choose your outcomes (steps 2 and 3).
3. Below the trigger, add an **Update Contact Field** action. Choose each field and insert the matching value from the trigger.
4. Save and publish. The fields are updated on every run, so they hold the contact's latest result.

## Values You Can Use

| Value | Example |
| - | - |
| Contact ID | `contact-123` |
| Outcome / Outcome label | `qualified_paydowns` / `Qualified - paydowns required` |
| Review status | `approved` (also `pending`, `declined`, or `parked`) |
| Needs manual review | `false` |
| Card decision / Card status | `Qualified w/ Paydowns` / `qualified_paydowns` |
| Estimated funding range, low, high | `$50,000-$100,000`, `50000`, `100000` |
| Personal only range / Business only range | `$30,000-$60,000` / `$20,000-$40,000` |
| Term loan decision, status, range, low, high | `TL Qualified`, `tl_qualified`, `15k to 30k`, `15000`, `30000` |
| Funding track | `creative` (also `established`, `both`, or `unknown`) |
| Funding paths | `term_loan`, `card_funding` |
| Qualifying products | `Term loan, Credit card funding` |
| Selected products | `card_stacking`, `term_loan` |
| Paydowns required / Inquiry removal required / Seasoning required | `true` / `false` / `false` |
| Target utilization | `30` |
| Decline reason | blank; for a declined file, for example `repair_referral` |
| Callback date | blank; for a parked file, for example `2026-11-01` |
| Credit score / Credit score note | `742` / blank when there is a score |
| Utilization percent | `42` |
| Inquiries last 6, 12, and 24 months | `2`, `3`, `5` |
| Derogatory items | `0` |
| Credit repair recommended | `false` |
| Reason codes | `income_basis_net` |
| Report ID | `report-123` |
| Completed at | `2026-10-14T15:00:00.000Z` |

Values that do not apply to a result are blank, or `0` for numbers. For example, Callback date is blank unless the file is parked, and Credit score is `0` when there is no score (Credit score note says why). A **Credit not found** result has Card status `credit_not_found`, Estimated funding range `N/A`, Term loan status `tl_not_applicable`, and Reason codes that include `no_credit_file`.

### Sample trigger data

This is the full set of values for the example above, as a workflow step receives them:

```json theme={null}
{
  "contactId": "contact-123",
  "contact": {
    "id": "contact-123"
  },
  "underwriting": {
    "outcome": "qualified_paydowns",
    "outcomeLabel": "Qualified - paydowns required",
    "reviewStatus": "approved",
    "requiresManualReview": false,
    "decision": "Qualified w/ Paydowns",
    "cardStatus": "qualified_paydowns",
    "estimatedFundingRange": "$50,000-$100,000",
    "estimatedFundingLow": 50000,
    "estimatedFundingHigh": 100000,
    "personalOnlyRange": "$30,000-$60,000",
    "businessOnlyRange": "$20,000-$40,000",
    "termLoanDecision": "TL Qualified",
    "termLoanStatus": "tl_qualified",
    "termLoanRange": "15k to 30k",
    "termLoanLow": 15000,
    "termLoanHigh": 30000,
    "fundingTrack": "creative",
    "fundingPaths": [
      "term_loan",
      "card_funding"
    ],
    "qualifyingProducts": "Term loan, Credit card funding",
    "selectedProducts": [
      "card_stacking",
      "term_loan"
    ],
    "paydownsRequired": true,
    "inquiryRemovalRequired": false,
    "seasoningRequired": false,
    "targetUtilization": 30,
    "declineReason": "",
    "callbackDate": "",
    "creditScore": 742,
    "creditScoreNote": "",
    "utilizationPercent": 42,
    "inquiriesLast6Months": 2,
    "inquiriesLast12Months": 3,
    "inquiriesLast24Months": 5,
    "derogatoryItems": 0,
    "creditRepairRecommended": false,
    "reasonCodes": [
      "income_basis_net"
    ],
    "reportId": "report-123",
    "completedAt": "2026-10-14T15:00:00.000Z"
  }
}
```

## Verify It Worked

Open a test contact in Funding Machine and re-run underwriting, or make a review decision. Then open the workflow's **Execution Logs**. You should see a new run for the contact, with the underwriting values on the trigger step.

<Check>
  Your workflow now starts from Funding Machine underwriting results.
</Check>

## Troubleshooting

* **I do not see "Funding Machine" when I search for the trigger.** Check that the app is installed in this sub-account and that premium triggers are enabled for it.
* **Funding Machine is listed, but "Underwriting Completed" is not.** The sub-account most likely installed the app before this trigger was added, and the CRM does not add new triggers to an existing install on its own. Look for an **Update** offer on Funding Machine in the workflow builder's app list and accept it. If no update is offered, reinstall the app. If the trigger is still missing, contact support.
* **The workflow did not start.** Check the **Outcome** filter: the result's outcome must be one of the ones you picked. A re-run that changes nothing does not start the workflow, and results from before the workflow was published are not sent. Sample files never start it.
* **Contact actions skip the contact.** Add a **Find Contact** step right after the trigger that looks the contact up by the trigger's **Contact ID**. If they still skip the contact, contact support.


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.