This document aims to help users at partner Credit Unions to better understand our data exports, their available columns and how to use them to generate metrics.
Guidelines
What is a Data Export?
Data export is a daily batch of data, sent in .csv format via SFTP or File Transfer API. It contains one table in a fixed predetermined format.
- Frequency: daily
- Channel: SFTP or File Transfer API
- Format: .csv
Data included: fixed predetermined format that scales across 100+ credit unions.
What is included in this Data Export?
Two different files:
- Account opening applications for the past 1 day:
- A list of all account opening applications (submitted and dropped) in the previous 1 day
- File name (for SFTP):
account-opening-1-day_YYYYMMDDThhmmssZ_part-00000.csv
- Account opening applications for the past 30 days:
- A list of all account opening applications (submitted and dropped) in the previous 30 days
- File name (for SFTP):
account-opening-30-days_YYYYMMDDThhmmssZ_part-00000.csv
Both will have the same fields (columns), but they will differ in use-cases (when to use each) and total volume of data, since one of them will include data for the past 30 days.
How to use the exports?
- Data warehouse ingestion: append the 1 day file into your warehouse, taking care to check if the record already exists there. In case an application started yesterday but finished today, it will be repeated and we have the column
record_last_updated_atto ensure you capture the latest data on that record. - Analysis: if you are going to analyze the data in a spreadsheet, use the 30 day file so you don't need to append anything.
How NOT to use the exports?
- Avoid duplicates:
- If you require a funnel metric (e.g. conversion) of over 30 days, you shouldn't append multiple 30 day files, because if you do you will get duplicates of the same applications.
The best way to proceed in this case would be to iterate through multiple files, getting the most recent status of each application.
Terminology:
- An application refers to any user who started the application process, even if they have dropped-off before opening the account.
- An account is the actual account to be created via an application.
- If one application was made for multiple accounts, the export will have multiple rows for the same application, one for each account.
- If a user applied multiple times for the same account, we'll show multiple applications (one in each row).
Ingesting Exports into your Data Warehouse (DW):
- Update: if an application already exists in your DW as a row in a table, update the entire row; if it doesn't, create a new one.
- Append: always add new rows to the existing table.
Data Dictionary
| Field name | Description | Example |
|---|---|---|
| application_id | String: a uuid that represents an unique account opening application. | 0030dbe4-ead5-4543-afa1-61d24688b4ef |
| applicant_id | String: a uuid that represents an applicant (not unique, we added user_id as unique id per applicant). | 0030dbe4-ead5-4543-afa1-61d24688b4ef |
| account_nr | Number: the account number in core, if an account was created. Null if no account was created. | 300101234 |
| applicant_name | String: applicant's first and last name. Null if the user dropped-off before identifying themselves. | John Smith |
| applicant_email | String: applicant's e-mail. Null if the user dropped-off before identifying themselves. | john.smith@withclutch.com |
| member_nr | Number: the user's member number in core. Null if the user wasn't an existing member and didn't finish the application. | 400012345 |
| applicant_phone | String: applicant's phone number. Null if the user dropped-off before identifying themselves. | 2121234567 |
| applicant_address | String: applicant's address. Null if the user dropped-off before identifying themselves. | 123 Main st. |
| applicant_zipCode | String: applicant's zip code. Null if the user dropped-off before identifying themselves. | 12345 |
| applicant_city | String: applicant's city. Null if the user dropped-off before identifying themselves. | Rio de Janeiro |
| applicant_state | String: applicant's state. Null if the user dropped-off before identifying themselves. | CA |
| applicant_employer | String: applicant's employer. Null if the user dropped-off before identifying themselves. | Amazing Credit Union |
| applicant_job_title | String: applicant's job title. Null if the user dropped-off before identifying themselves. | Member Service Representative |
| eligibility_criteria | String: applicant's eligibility criteria for membership. Null if the user dropped-off before identifying themselves. | family |
| eligibility_detail | String: applicant's eligibility criteria details entered. Null if the user dropped-off before identifying themselves. | Spouse - Name of family member |
| product_name | String: the account name that the user is applying for. Null if the user dropped-off before selecting one. | Amazing Account Plus |
| product_type | String: account type that the user is applying for. Null if the user dropped-off before selecting one. | savings ; certificate ; checking |
| is_new_member | Boolean: true if applicant was an existing member when the application started, false if not. | true ; false |
| funding_type | String: the funding method the applicant has chosen: • CREDIT_CARD: credit card (Stripe); • INTERNAL_ACCOUNT: transfer from existing account at the CU; • ACH: transfer from existing account in another institution (Plaid); • CASH: cash; • LFAO: funding performed by the CU via transfer from the GL; • NULL: user dropped-off before choosing a funding method. | CASH |
| funding_amnt | Number: amount the user decided to use to fund the account. | $1000.00 |
| application_origin | String: a flag that determines where the application originated from: branch portal or consumer portal. | branch ; consumer |
| branch_name | String: the name of the branch where the application is sitting at. | The Best Branch |
| branch_user_id | Number: identifier of the employee responsible for the application. | 1234 |
| employee_name | String: name and last name of the employee responsible for the application. | |
| application_status | String: current status of the application. Possible values: • ACCEPTED: the application was successful and an account has been opened; • INITIATED: the application started but is still undergoing the regular process; • FRAUD_VERIFICATION: our fraud management tool is currently working to make sure this isn't a fraudulent application; • DENIED: the application wasn't allowed to proceed; • CANCELLED: the application started but didn't continue the flow; • ERROR: the application had an issue; • EXTERNAL_FUNDING_CONFIRMATION: we're waiting for funding confirmation; • LOAN_FIRST_DRAFT: a non-member submitted a loan application but no employee has triggered the account opening yet. | ACCEPTED |
| account_status | String: current status of the account. Possible values: • CREATED: the account has been opened; • CANCELLED: the application was cancelled before an account has been created; • PENDING: the application regarding that account is still undergoing the opening process. | PENDING |
| funding_status | String: current status of the funding. Possible values: • COMPLETED: the account has been funded; • CANCELLED_OR_REFUNDED: the application was cancelled before an account has been created; • CREATED / INITIATED / PENDING: we're still waiting for funding to finish; • ERROR: funding issue. | COMPLETED |
| application_created_at | Timestamp: date and time when the application started. | 2024-03-07 18:08:32.765 |
| account_created_at | Timestamp: date and time when the account was created. [DEPRECATED - use account_booked_to_core_at] | 2024-03-07 18:08:32.765 |
| application_updated_at | Timestamp: date and time when we last updated this record. | 2024-03-07 18:08:32.765 |
| received_AAN | Boolean: TRUE if the applicant received an Adverse Action Notice, FALSE if not | true ; false |
| aan_created_at | Timestamp: date and time when the Adverse Action Notice was sent | 2024-03-07 18:08:32.765 |
| aan_reason | String: reasons for why the applicant received an Adverse Action Notice | Asset ownership history |
| utm_source | String: part of the URL used for tracking (must be in the Clutch URL). | |
| utm_medium | String: part of the URL used for tracking (must be in the Clutch URL). | ads |
| utm_campaign | String: part of the URL used for tracking (must be in the Clutch URL). | auto_refi_june_2024 |
| utm_content | String: part of the URL used for tracking (must be in the Clutch URL). | group_a |
| utm_term | String: part of the URL used for tracking (must be in the Clutch URL). | loans |
| funding_started_at | Timestamp: date and time when the user chose a funding method (NULL if they didn't) | 2024-03-07 18:08:32.765 |
| funding_authorized_at | Timestamp: date and time when the user had its funding authorized (NULL if they didn't) | 2024-03-07 18:08:32.765 |
| fraud_check_approved_at | Timestamp: date and time when the user was approved by our integrated fraud check flow (NULL if they didn't) | 2024-03-07 18:08:32.765 |
| account_booked_to_core_at | Timestamp: date and time when the user's account was booked to core (NULL if they didn't) | 2024-03-07 18:08:32.765 |
| user_id | String: a uuid that represents an unique applicant. | 0030dbe4-ead5-4543-afa1-61d24688b4ef |
| session_id | String: an id that represents an unique user session. A session is a period of up to 4 hours in which users are in our application. It will end if the user spends 15 minutes inactive. | 123456789 |
| extra_fee | Number: real number representing the extra fee, can be Null | 5.0 |
| accepted_tcpa_at | Timestamp: date and time when the accepted TCPA (NULL if they didn't) | 2024-03-07 18:08:32.765 |
| fraud_check_entity_token | String: an identifier of the token (can be Null) | J-KASoidfjs09SNGFKJ123 |
| account_id | String: a uuid that represents an unique account. | 0030dbe4-ead5-4543-afa1-61d24688b4ef |
| citizenship | String: applicant's citizenship. | US/American |
| handoff_type | String: property that determines how the handoff for in-branch applications happened. May have two values: DIGITAL or NON_DIGITAL. | digital |
| consent_type | String: property that determines how the consent for account opening was given. May have two values: DIGITAL_CONSENT (if the applicant clicked in the experience) or MANUAL_CONSENT (if the applicant gave the consent to the MSR). | DIGITAL_CONSENT |
| account_features | Array: list of features the applicant added to the account. | [”OVDT” , ”DBT”] |
| fraud_check_status | String: most up to date fraud check status. Possible values:
| APPROVED |
| fraud_check_application_id | String: an identifier of the token (can be Null) | JA-DwyIHO5cTHu9uqquWDy9 |
How to calculate metrics from the export
a) Conversion
This is a metric to measure the % of applications that ended up with an account created among all applications that were initiated.
To better calculate conversion rates, count applications with application_status = ACCEPTED.
After that, divide by the total number of applications. You can break it down by any other fields to have your conversion metric associated with something else, such as by employee, by funding type or by product. Example:
We want to measure conversion by employee. The first thing is to get a list of all employee names and then count the total number of applications handled by each of them. To do that, apply the formula (in a sheet): =COUNTIFS(column: employee_name, field: the employee you want).
This should be the result:
| A: Employee | B: Count of apps |
|---|---|
| Nicholas Hinrichsen | =COUNTIFS(column: employee_name, A1) |
| Arthur Araujo | 23 |
| Tamanna Kotwani | 32 |
| Mauricio Castro | 107 |
After that, just add another column with the count of applications accepted and divide the two numbers:
| A: Employee | B: Count of apps | C: Count of accepted apps | D: Conversion |
|---|---|---|---|
| Nicholas Hinrichsen | 250 | =COUNTIFS(column: employee_name, A1, column: application_status, "ACCEPTED") | =C1 / D1 |
| Arthur Araujo | 23 | 5 | 22% |
| Tamanna Kotwani | 32 | 28 | 88% |
| Mauricio Castro | 107 | 85 | 79% |
b) Avg. time-to-open account
This is the time it takes, on average, to open an account.
To calculate it, add a new column to your table, let's call it time_to_open, which will contain the time to open that account in minutes. The values in this column should be the difference between fields application_created_at and account_created_at.
The results will be in multiples of days, so to convert to hours, multiply by 24, and multiply by 60 to get minutes. See the example below:
| A: application_id | B: application_created_at | C: account_created_at | D: time_to_open |
|---|---|---|---|
| 0030dbe4-ead5-4543-afa1-61d24688b4ef | 3/7/2024 18:08:33 | 3/7/2024 18:16:00 | =(C1 - B1)2460 |
| 00b49222-93db-4664-ba1d-1161ae9960af | 1/23/2024 20:57:05 | 1/23/2024 21:01:58 | 4.88 |
| 0130be4e-79b5-42d8-b45c-398987e6f3de | 1/12/2024 15:23:05 | 1/12/2024 15:26:12 | 3.12 |
| 013d362c-2cec-498c-a444-5fc6f14dc766 | 2/12/2024 22:36:45 | 2/12/2024 22:36:46 | 0.01 |
Now, take the average out of column D, and you have your average time to fund. You can split the average times by account type (or any other field) using the formula AVERAGEIFS.
c) Funding amount by funding type
This is a way of knowing how much is being deposited into new accounts for funding. You can split by any field. In this example we'll usefunding type.
Grab all values for funding type and insert into a table. Then, just take the averages based on them, using =AVERAGEIFS(column: funding_amount, column: funding_type, field: the funding type you want):
| A: Funding type | B: Funding amount |
|---|---|
| CREDIT_CARD | =AVERAGEIFS(column: funding_amount, column: funding_type, A1) |
| INTERNAL_ACCOUNT | $8,761.42 |
| CASH | $5,295.92 |
| ACH | $2,144.23 |
| LFAO | $0.01 |
d) Volume over time
The objective here is to create a chart with the volume (in quantity of accounts or in funding amount) of new accounts.
Decide on desired granularity (daily, weekly, monthly, etc.) and assign each row to one value. For example, let's say you want a weekly report. This means you need to assign each account to a week, and for that you can use the WEEKNUM function, that returns the week number of the year (from 1 to 53).
| A: application_id | B: account_number | C: account_created_at | D: week_of_2024 |
|---|---|---|---|
| 0030dbe4-ead5-4543-afa1-61d24688b4ef | 305576904 | 3/7/2024 18:16:00 | =WEEKNUM(C1) |
| 00b49222-93db-4664-ba1d-1161ae9960af | 305371007 | 1/23/2024 21:01:58 | 4 |
| 0130be4e-79b5-42d8-b45c-398987e6f3de | 305342298 | 1/12/2024 15:26:12 | 2 |
| 013d362c-2cec-498c-a444-5fc6f14dc766 | 305403371 | 2/12/2024 22:36:46 | 7 |
Now, you can simply count the number of accounts or even sum the amount of funding for each week of the year in a new table. For that, you can use the COUNTIFS or SUMIFS functions:
| A: Week of 2024 | B: Number of accounts | C: Total funding |
|---|---|---|
| 1 | =COUNTIFS(column: week_of_2024, A1) | =SUMIFS(column: funding_amount, column: week_of_2024, A1) |
| 2 | 75 | $58,000 |
| 3 | 84 | $72,300 |
| 4 | 23 | $22,087 |
| 5 | 78 | $60,684 |
You can also calculate the average funding amount per week by dividing C by B. On top of this table, just create the chart you want: bar chart, column chart, line chart.
FAQ
- How can I get started with data exports? A: Just ask your Customer Success manager to turn it on for you! We will need to set up a proper SFTP connection, so we might have to engage your IT team. We also require the server to be hosted by you. As an alternative to SFTP, you can download these reports through our File Transfer API.
- Why should I use Clutch's data exports? A: It's a way for your team to be informed about what's going on without having to ask for ad-hoc reports. It works for both operations and IT, because it allows you to manipulate the .csv file in Microsoft Excel or Google Sheets, and also empowers your IT team to ingest the data into your data warehouse. It's an extract of data you can build reports on top of.
- What's the cost? A: Clutch does not charge any additional fees. We just require that you host your own SFTP server if you want to use SFTP to receive these reports. Alternatively, you can use our File Transfer API.
- How long are the exports available for download? A: When using SFTP, it is up to you. Since the server is hosted by you, once we push the .csv files you can decide what's the best approach on how to deal with them. For the File Transfer API, new exports are generated daily at 11:00AM UTC and will remain available until 23:59 UTC each day.
- What should I do if I didn't receive my daily file? A: Contact your Customer Success manager to inform them of the problem. We'll ensure you receive your data ASAP.
- I lost access to a file and I need to recover a copy. How can I get it? A: Talk to your Customer Success manager to arrange a recovery.
- I need a data export for sandbox data, how do I get it? A: Sandbox only has test users and can be misleading when interpreting data. We do not support sandbox data export.
- How can I request a new data export to answer new business questions? A: Help us understand what exactly you are trying to achieve. Your implementation engineer can guide you if there is a way to use existing exports. If not they will bubble up this feedback to the product team.
- What to do if I want to ask for additional fields in my data export? A: We currently only support limited fields as we build a scalable data infrastructure for 2024. However, do send us your feedback for future considerations.
- What to do if I want to report inconsistencies in the data? A: Inform your Customer Success manager, and we will assign an engineer to work on it immediately.
Was this article helpful?
That’s Great!
Thank you for your feedback
Sorry! We couldn't be helpful
Thank you for your feedback
Feedback sent
We appreciate your effort and will try to fix the article
