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

# Payment Providers

> Create and validate a Payment Provider Account so fusionCore can take online card and ACH payments through Stripe.

## Overview

A **Payment Provider** is a third-party service that processes online payments — credit and debit cards, ACH bank transfers, and digital wallets — for transactions such as memberships, event registrations, donations, and product purchases.

In fusionCore, you connect to a payment provider through a **Payment Provider Account** record (`FCORE_PAY__Payment_Provider_Account__c`). This record is the configuration that links your Salesforce org to one external payment account (for example, one Stripe account). Once it exists, is validated, and is linked to your Payment Types, fusionCore can route online payments through it.

<Info>
  The fusionCore team connects and implements the payment provider (Stripe) in your Salesforce org. You usually create the Payment Provider Account record and link it to Payment Types; the underlying API keys and webhook are configured during Stripe setup.
</Info>

<Card title="Stripe" icon="stripe-s" href="/end-user-guides/stripe/index" arrow="true">
  The full Stripe setup lives in its own section — connecting the account, enabling payment methods, configuring webhooks, and testing. Follow it alongside the steps below when you set up a new provider.
</Card>

## How Your Organization Would Use Payment Providers

* **Membership renewals** — collect dues and recurring payments online.
* **Event registrations** — process payments for conferences, workshops, and webinars.
* **Donations** — accept one-time or recurring gifts.
* **E-commerce sales** — take payments for product sales through a portal.

## Before You Start

* The Stripe connection must be in place. Stripe registers itself as the provider named `Stripe`, and the real API keys live in Custom Metadata — not on the Payment Provider Account record. The fusionCore team sets this up. See [Stripe connected-account and webhook setup](/end-user-guides/stripe/connected-account-webhook-set-up).
* To validate a Payment Provider Account, you need the **FC Commerce - Validate Payment Provider Account** permission set (`FCORE_PAY__FC_Commerce_Validate_Payment_Provider_Account`). Ask your admin to assign it.

## Create a Payment Provider Account Record

<Steps>
  <Step title="Open Payment Provider Accounts">
    In the **App Launcher**, type `Payment Provider Accounts` and click **Payment Provider Accounts**.
  </Step>

  <Step title="Start a new record">
    In the list view, click **New**.

    <Frame caption="New Payment Provider Account">
      <img src="https://mintcdn.com/fusionspan/EW_gg4_8FJ-921wF/images/end-user-guides/4027514908/image-20251006-195611.png?fit=max&auto=format&n=EW_gg4_8FJ-921wF&q=85&s=30e4ed65bd58bf6d2fff8eebcec9840a" alt="The New button on the Payment Provider Accounts list view" width="850" height="644" data-path="images/end-user-guides/4027514908/image-20251006-195611.png" />
    </Frame>
  </Step>

  <Step title="Name the record">
    Set the **Payment Provider Account Name**. This is the name of the Salesforce record itself, for example `Society of Innovators Stripe`.
  </Step>

  <Step title="Set the Payment Provider Name">
    Set the **Payment Provider Name** to exactly `Stripe`. Stripe is the only provider fusionCore supports today, and the value must match the installed provider's name exactly.
  </Step>

  <Step title="Save">
    Click **Save**.
  </Step>
</Steps>

<Info>
  The **Request Signature Secret** (Stripe webhook signing secret) and **External Id** (the Stripe account id) are filled in during Stripe setup. See [Stripe connected-account and webhook setup](/end-user-guides/stripe/connected-account-webhook-set-up).
</Info>

## Fields on the Record

The Payment Provider Account holds more than just a name. The fusionCore team typically sets these during Stripe setup, but it helps to know what they do:

* **Payment Provider Name** (`FCORE_PAY__Payment_Provider_Name__c`) — the provider this account connects to. Must be `Stripe`.
* **External Id** (`FCORE_PAY__External_Id__c`) — the Stripe-side account id. Must be unique across all Payment Provider Accounts.
* **Request Signature Secret** (`FCORE_PAY__Request_Signature_Secret__c`) — the Stripe webhook signing secret, stored encrypted and masked.
* **Is Active** (`FCORE_PAY__Is_Active__c`) — turns the account on. A new account is **inactive** until you check this box.
* **Validation Status** (`FCORE_PAY__Validation_Status__c`) — `Pending`, `Failed`, or `Succeeded`. Set by the **Validate** action below. This is separate from **Is Active**.
* **Validation Message** (`FCORE_PAY__Validation_Message__c`) — explains a failed validation.

<Note>
  The API keys for Stripe are **not** stored on this record. They live in Custom Metadata that the fusionCore team deploys. The only secret on the record is the **Request Signature Secret** (the webhook signing secret).
</Note>

## Validate the Account

Validation confirms fusionCore can talk to Stripe with the configured keys and webhook.

<Steps>
  <Step title="Open the record">
    Open the Payment Provider Account you want to validate.
  </Step>

  <Step title="Run Validate">
    Click the **Validate** action. The status changes to **Pending** while fusionCore creates a test customer in Stripe.
  </Step>

  <Step title="Wait for the result">
    The screen polls for up to 30 seconds. When Stripe's webhook confirms the test customer, the status flips to **Succeeded**. If something is wrong, it sets **Failed** and shows a **Validation Message**.
  </Step>
</Steps>

<Warning>
  Validation is asynchronous. The **Succeeded** status is written by an inbound Stripe webhook, not by the **Validate** action itself. If the webhook has not arrived within 30 seconds, the status is set to **Failed** even when the account is actually fine. This requires the org's Stripe inbound webhook endpoint to be configured and reachable — part of the fusionCore team's Stripe setup.
</Warning>

## Link the Account to Payment Types

A validated Payment Provider Account does nothing on its own. To route online payments through it, link it from one or more **Payment Types** using the **Payment Provider Account** field (`FCORE_PAY__Payment_Type__c.FCORE_PAY__Payment_Provider_Account__c`). See [Setting up Stripe payment types](/end-user-guides/accounting/payment-types/setting-up-stripe-payment-types).

## Limitations and Common Pitfalls

* **A new account is inactive.** **Is Active** (`FCORE_PAY__Is_Active__c`) defaults to off. Check it when the account is ready. **Is Active** and **Validation Status** are separate — an account can validate as `Succeeded` and still be inactive.
* **External Id must be unique.** Saving two Payment Provider Accounts with the same **External Id** is blocked. Duplicate External Ids also break payment processing at runtime, not just saving, so never reuse one.
* **The provider must be installed before you can name the account.** If the Stripe provider is not installed, you cannot save a Payment Provider Name, and a name that does not match an installed provider is rejected. The name must match exactly — `Stripe`.
* **API keys are not on the record.** If the Stripe key Custom Metadata is missing or blank, validation fails with a message about a missing secret or public key. The fusionCore team manages these keys.
* **Validation can time out even when the account is good.** Because validation waits on Stripe's webhook, a slow or misconfigured webhook produces a **Failed** status with a "taking too long" message. Re-run **Validate** once the webhook is confirmed reachable.
