customer-onboarding
v1.0 activeOnboard a new business customer for cross-border banking
Start a new run
Owner
banking-team
SLA
72h
Trigger
api
Tags
bankingonboardingcompliancekyb
Inputs
company_name
string · required
contact_email
string · required
country
enum · required
US
MX
source_channel
enum
website
linkedin
email
referral
cold-outbound
deal_id
string
External CRM reference
Outputs
account_id
string
member_id
string
status
enum
approved
rejected
rejection_reason
string
Steps
-
1
Collect business information
collect-business-infoformGather company details, ownership, fiscal address
Inputscompany_name ←process.inputs.company_name contact_email ←process.inputs.contact_emailOutputsbusiness_record (object) -
2
Verify KYB documents
verify-documentsautomatedCheck uploaded documents against requirements
Inputsbusiness_record ←steps.collect-business-info.outputs.business_recordOutputsverification_result (enum) missing_documents (string[])script:./examples/steps/verify-documents.rb -
3
Review application
review-applicationjudgmentAssess risk and decide whether to approve
Inputsbusiness_record ←steps.collect-business-info.outputs.business_record verification_result ←steps.verify-documents.outputs.verification_resultOutputsdecision (enum) risk_notes (string) rejection_reason (string)threshold: 0.9 escalation: manual -
4
Submit to compliance provider
submit-to-compliancewebhook if steps.review-application.outputs.decision == 'approve'Inputsbusiness_record ←steps.collect-business-info.outputs.business_recordOutputsentity_id (string) compliance_status (enum)url:${COMPLIANCE_PROVIDER_URL}/entitiesmethod:POSTmode:callback -
5
Create customer account
create-accountautomated if steps.submit-to-compliance.outputs.compliance_status == 'approved'Inputsbusiness_record ←steps.collect-business-info.outputs.business_record entity_id ←steps.submit-to-compliance.outputs.entity_idOutputsaccount_id (string) member_id (string)script:./examples/steps/create-account.rb -
6
Send welcome email
send-welcomenotificationInputscontact_email ←process.inputs.contact_email account_id ←steps.create-account.outputs.account_idOutputsemail_sent (boolean)
Raw definition
---
opensop: '0.1'
process:
sla:
target: 72h
warning: 48h
name: customer-onboarding
tags:
- banking
- onboarding
- compliance
- kyb
owner: banking-team
steps:
- id: collect-business-info
name: Collect business information
type: form
inputs:
- from: process.inputs.company_name
name: company_name
- from: process.inputs.contact_email
name: contact_email
outputs:
- name: business_record
type: object
schema:
rfc: string
industry: string
legal_name: string
annual_revenue: number
fiscal_address: string
timeout: 7d
on_timeout: notify-and-wait
description: Gather company details, ownership, fiscal address
- id: verify-documents
run: "./examples/steps/verify-documents.rb"
name: Verify KYB documents
type: automated
retry:
max: 3
backoff: exponential
inputs:
- from: steps.collect-business-info.outputs.business_record
name: business_record
outputs:
- name: verification_result
type: enum
values:
- complete
- incomplete
- invalid
- name: missing_documents
type: string[]
validation: lenient
description: Check uploaded documents against requirements
- id: review-application
name: Review application
type: judgment
inputs:
- from: steps.collect-business-info.outputs.business_record
name: business_record
- from: steps.verify-documents.outputs.verification_result
name: verification_result
outputs:
- name: decision
type: enum
values:
- approve
- reject
- request-more-info
- name: risk_notes
type: string
- name: rejection_reason
type: string
required_if: decision == 'reject'
judgment:
escalation: manual
allow_agent: true
confidence_threshold: 0.9
require_human_review: false
description: Assess risk and decide whether to approve
- id: submit-to-compliance
name: Submit to compliance provider
type: webhook
inputs:
- from: steps.collect-business-info.outputs.business_record
name: business_record
outputs:
- name: entity_id
type: string
- name: compliance_status
type: enum
values:
- pending
- approved
- rejected
webhook:
url: "${COMPLIANCE_PROVIDER_URL}/entities"
method: POST
headers:
Authorization: Bearer ${COMPLIANCE_API_KEY}
poll_timeout: 7d
callback_path: "/sop/webhooks/compliance"
response_mode: callback
condition: steps.review-application.outputs.decision == 'approve'
- id: create-account
run: "./examples/steps/create-account.rb"
name: Create customer account
type: automated
inputs:
- from: steps.collect-business-info.outputs.business_record
name: business_record
- from: steps.submit-to-compliance.outputs.entity_id
name: entity_id
outputs:
- name: account_id
type: string
- name: member_id
type: string
condition: steps.submit-to-compliance.outputs.compliance_status == 'approved'
validation: lenient
- id: send-welcome
name: Send welcome email
type: notification
inputs:
- from: process.inputs.contact_email
name: contact_email
- from: steps.create-account.outputs.account_id
name: account_id
outputs:
- name: email_sent
type: boolean
inputs:
- name: company_name
type: string
required: true
- name: contact_email
type: string
format: email
required: true
- name: country
type: enum
values:
- US
- MX
required: true
- name: source_channel
type: enum
values:
- website
- linkedin
- email
- referral
- cold-outbound
- name: deal_id
type: string
description: External CRM reference
outputs:
- from: steps.create-account.outputs.account_id
name: account_id
type: string
- from: steps.create-account.outputs.member_id
name: member_id
type: string
- from: steps.submit-to-compliance.outputs.compliance_status
name: status
type: enum
values:
- approved
- rejected
- from: steps.review-application.outputs.rejection_reason
name: rejection_reason
type: string
required_if: status == 'rejected'
trigger:
type: api
version: '1.0'
on_error:
notify:
target: "#banking-ops"
channel: slack
description: Onboard a new business customer for cross-border banking