Set up payee onboarding via iFrame (New)
Required user role Technical admin
- This article is relevant for payers who embed the payee iFrame experience in a website or platform. For the Supplier Hub, go to Onboard payees.
- The new payee onboarding experience currently only covers non-US local tax and VAT number collection. If you’re collecting US tax forms or documents from payees, you should refer to the original iFrame environment for now.
- For technical information on embedding the iFrame, go to our Dev docs.
New payee onboarding experience
Tipalti is rolling out a simplified new payee onboarding interface. Only the base URL changes — you use the new iFrame URL exactly as you do today, with the same parameters and the same hashkey signature. You can choose to switch to the new experience on your own schedule.
You can preview the new experience in Sandbox before going live in Production. Sandbox testing requires an existing Sandbox account; if you don't have one, contact your Tipalti representative.
What stays the same
- Nothing changes in the information you collect from your payees.
- The way you work with the iFrame is unchanged — same embed, same parameters, same hashkey signature. Only the base URL is new.
What's changing
- A cleaner, more intuitive flow with clear guidance at every step.
- A new setup overview greets payees when they log in, featuring a “Payability” indicator that clearly shows their status and what's left before they can start receiving payments.
- An updated base URL that your platform calls behind the scenes to load the payee iFrame.
- Customized iFrame skins can't be migrated yet, but you can switch to the standard iFrame design at any time. Custom skins will be supported in future rollouts.
Using Tipalti iFrame URLs
The Tipalti iFrame contains the Payment details (setup process), Invoice history, and Payment history for individual payees. To automate this within your own platform, initialize each of these modules in your HTML front end using a separate iFrame container.
Payment details iFrame (main setup process)
- Sandbox:
https://payee-onboarding-app.sandbox.tipalti.com?[your existing parameters] - Production:
https://payee-onboarding-app.tipalti.com?[your existing parameters]
The optional Invoice history and Payment history iFrames remain on the existing domains — only the Payment details tab is moving to a new URL.
Invoice history (optional iFrame)
- Sandbox:
https://ui2.sandbox.tipalti.com/PayeeDashboard/Invoices - Production:
https://ui2.tipalti.com/PayeeDashboard/Invoices
Payment history (optional iFrame)
- Sandbox:
https://ui2.sandbox.tipalti.com/PayeeDashboard/PaymentsHistory - Production:
https://ui2.tipalti.com/PayeeDashboard/PaymentsHistory
Allowlist the new hostnames
Before you switch, check whether anything on your side restricts embedded content — for example a Content-Security-Policy (CSP), firewall, or proxy.
- If you allowlisted a wildcard (for example
https://*.tipalti.com), no action is needed — the new hostnames are already covered. -
If you allowlisted the specific hostname (
ui2.tipalti.com), add the new hostname the same way, or the frame will be blocked:Content-Security-Policy: frame-src https://payee-onboarding-app.tipalti.com; (add https://payee-onboarding-app.sandbox.tipalti.com too if you test in Sandbox)
iFrame authentication
iFrame URL
Tipalti provides an inline iFrame element that securely loads the HTML page of our payee experience within another document.
iFrame example call:
<iframe src="https://payee-onboarding-app.sandbox.tipalti.com?idap=baseTest&payer=Payername&ts=1486771548&hashkey=1385b2e31f9f6011f34d3473a0b44b803d0b134653303ccf19f1df42a3cc7f96">
</iframe>How to set up the iFrame element
The iFrame element consists of four parts (see the example above):
- The iFrame element
- The Tipalti payee dashboard URL, which serves as the endpoint the iFrame call sources data from
- The Tipalti parameters passed via the initial iFrame call
- The encryption key needed for authentication
iFrame call client-side behavior
Tipalti encrypts the string containing the parameters with the HMAC-SHA256 algorithm. Prepare your parameters as shown in the examples below, then use your Tipalti API master key to encrypt them using HMAC-SHA256:
-
idap=baseTest&payer=Payername&ts=1486771548(with base parameters) -
idap=baseTest&payer=Payername&ts=1486771548&country=USA&zip=94044&alias=JohnDoe&ETC(encrypt all the parameters you'd like the iFrame to be prepopulated with)
The basic steps to the HMAC algorithm are as follows:
- Prepare your string with the parameters to be encrypted
- Encode the parameter value to URL-encoded format — for example, if your parameter value includes “é,” convert it to “%C3%A9”
- Encrypt with HMACSHA256 (uses the master key Tipalti gives you)
- Convert to hex
The final encryption key should look like this sample:
1385b2e31f9f6011f34d3473a0b44b803d0b134653303ccf19f1df42a3cc7f96iFrame call server-side (Tipalti) behavior
Once the iFrame URL is called, Tipalti authenticates the string as follows:
- Checks that the time elapsed since the “ts” parameter hasn't exceeded one minute. If it has, the iFrame displays an error message (see the error codes below).
- If the call is within the allowed time interval, the Tipalti application encrypts the parameters using the same method described in iFrame call client-side behavior above.
- If the strings match, Tipalti returns the iFrame content with the relevant data for the payer (whose name is retrieved from the query string).
- If the strings don't match, the iFrame displays an error message.
Python iFrame hash key example:
def Hashkey():
msgiframe = 'idap=' + idap + '&payer=' + payer + '&ts=' + str(ts)
secretkey = 'BUQ9pBJOxfdaQcv++3pUqe5yY8GOnJPp/oDpLn1lGjH22MFoHGu70U/PXtp4QYkK'
hashkey = hmac.new(bytes(secretkey, 'latin-1'), msg=bytes(msgiframe, 'latin-1'), digestmod=hashlib.sha256).hexdigest()
return hashkeyiFrame error codes
| Error code | Status | Description |
|---|---|---|
| 1 | NoIdapInRequest | No payee ID is included in the request. This parameter is mandatory. |
| 2 | UnknownPayerInRequest | The payer's name is unknown in Tipalti. Make sure the payer's name is entered correctly. If the error persists, submit a ticket to our Support team. |
| 5 | MissingRequestParams | Mandatory request parameters are missing. |
| 6 | QueryStringEncryptionError | There's an encryption error in the query string. |
| 8 | PayeeCountryNotSupported | The payee country in the request isn't supported (for example, a blocked Office of Foreign Assets Control [OFAC] country). Use a different country. |
| 10 | UnknownPayeeInRequest | Tipalti doesn't recognize the payee ID in the request, so the system assumes this is a new payee and creates a new record. |
| 12 | InvalidIdap | Payee ID is invalid. Maximum ID length is 64 characters; valid characters are numbers, letters, commas, spaces (not leading or trailing), periods, underscores, and dashes. |
| 13 | InvalidToken | The token for the request isn't valid. Submit a ticket to our Support team. |
| 14 | IllegalPayerUserAccess | You don't have access to the payee's iFrame account (for example, if the payee isn't managed by the payer, or you don't have the Payee Payment Details Administrator role). See User roles for a complete list of roles and permissions. |
| 15 | IllegalPayeeName | Payee name contains illegal characters or is an invalid length. Valid length is 2 to 35 characters each for first and last name. Valid values: letters, spaces, periods, and dashes (can't be the first character); for example, “Mary Jo,” “Jr.,” “Mary-Jo” |
| 16 | UnknownPayerEntity | The payer entity name isn't recognized. Make sure the payer entity is defined in Tipalti. |
| 17 | InvalidErpCurrency | The ERP currency in the request isn't valid. |
| 18 | ErpCurrencyMismatch | The ERP currency doesn't match the currency in the request. |
| 19 | PayeeCountryOfBirthNotSupported | The payee's country of birth isn't supported (for example, a blocked OFAC country). |
| 20 | PayeeDateOfBirthIsNotSupported | The payee's date of birth isn't supported. |
| 21 | NoPaymentMethodAvailable | The payment method wasn't added to the request. |
| 99 | UnknownError | An unknown error occurred. Submit a ticket to our Support team. |
Common questions
What's the new iFrame experience?
The new iFrame gives payees a simpler, step-by-step onboarding flow. For now, it only covers non-US local tax and VAT number collection. If you collect US tax forms, stay on the original iFrame for now. For technical details on embedding the iFrame, go to our Dev docs.
What do I need to do to switch?
Existing payers can switch whenever they're ready by updating the iFrame base URL. New payers start on the new experience from day one. Your parameters and hashkey signature stay the same. Before you switch, check whether you need to allowlist the new hostnames.
Which iFrame URLs change?
Only the Payment details iFrame moves to a new URL:
- Production:
https://ui2.tipalti.com/payeedashboard/homebecomeshttps://payee-onboarding-app.tipalti.com - Sandbox:
https://ui2.sandbox.tipalti.com/payeedashboard/homebecomeshttps://payee-onboarding-app.sandbox.tipalti.com
The Invoice history and Payment history iFrames stay on their existing URLs.
How is the iFrame different from the Supplier Hub?
Both use the same new payee onboarding experience. The difference is where payees see it. The iFrame is embedded in your own website or platform. The Supplier Hub is a portal hosted by Tipalti that payees are invited to. For more on the Supplier Hub, go to Onboard payees with the new Supplier Hub.
Can I keep my custom iFrame skin?
Not yet. Custom skins can't be migrated to the new iFrame. If you want to keep your custom skin, don't switch to the new URL until support for custom skins on the new iFrame is released. Otherwise, you can switch to the standard iFrame design at any time.