Write Workflows Using Code
Workflows can be written in code, allowing the creation of dynamic workflows that can't be pre-defined. Support for defining workflows using code is part of all the supported SDKs.
Creating workflows in code
The workflow in the following examples performs these steps:
- Get user details - Retrieves the user information based on the userIdprovided as the workflow input.
- Determine notification type - Uses a Switch task to check the preferred notification method from the input and determine how to notify the user.
- Send email - If the notification preference is email, send a message to the user’s email address.
- Send SMS - If the preference is SMS, send a text message to the phone number.

Use the code example for your preferred language to define and register the workflow in your Conductor environment.
- Java
- Python
- Go
- C#
- JavaScript
- Typescript
- Clojure
        ConductorWorkflow<WorkflowInput> workflow = new ConductorWorkflow<>(executor);
        workflow.setName("user_notification");
        workflow.setVersion(1);
        SimpleTask getUserDetails = new SimpleTask("get_user_info", "get_user_info");
        getUserDetails.input("userId", "${workflow.input.userId}");
        SimpleTask sendEmail = new SimpleTask("send_email", "send_email");
        // get user details user info, which contains the email field
        sendEmail.input("email", "${get_user_info.output.email}");
        SimpleTask sendSMS = new SimpleTask("send_sms", "send_sms");
        // get user details user info, which contains the phone Number field
        sendSMS.input("phoneNumber", "${get_user_info.output.phoneNumber}");
        Switch emailOrSMS = new Switch("emailorsms", "${workflow.input.notificationPref}")
                .switchCase(WorkflowInput.NotificationPreference.EMAIL.name(), sendEmail)
                .switchCase(WorkflowInput.NotificationPreference.SMS.name(), sendSMS);
        workflow.add(getUserDetails);
        workflow.add(emailOrSMS);
        //Execute the workflow and get the output
        WorkflowInput input = new WorkflowInput("userA");
        input.setNotificationPref(WorkflowInput.NotificationPreference.EMAIL);
        CompletableFuture<Workflow> workflowExecution = simpleWorkflow.executeDynamic(input);
        Workflow workflowRun = workflowExecution.get(10, TimeUnit.SECONDS);
    workflow = ConductorWorkflow(
        executor=workflow_executor,
        name='user_notification',
        version=1,
    )
    workflow.input_parameters = ['userId', 'notificationPref']
    get_user_info = SimpleTask('get_user_info', 'get_user_info').input('userId', '${workflow.input.userId}')
    decision_task = SwitchTask('emailorsms', '${workflow.input.notificationPref}')
    send_email = SimpleTask('send_email', 'send_email').input('email', '${get_user_info.output.email}')
    send_sms = SimpleTask('send_sms', 'send_sms').input('phoneNumber', '${get_user_info.output.phoneNumber}')
    decision_task.switch_case(NotificationPreference.EMAIL,send_email)
    decision_task.switch_case(NotificationPreference.SMS, send_sms)
    workflow >> get_user_info >> decision_task
    workflow.register(overwrite=True)  # register the workflow with the server
    workflow_run = workflow_executor.workflow_client.execute_workflow(
        body=StartWorkflowRequest(name=workflow.name,version=workflow.version),
        request_id=str(uuid.uuid4()),
        version=workflow.version,
        name=workflow.name,
        wait_until_task_ref='',
        _request_timeout= 60
    )
    getUserInfo := workflow.NewSimpleTask("get_user_info", "get_user_info").
		Input("userId", "${workflow.input.userId}")
	sendEmail := workflow.NewSimpleTask("send_email", "send_email").
		Input("email", "${get_user_info.output.email}")
	sendSMS := workflow.NewSimpleTask("send_sms", "send_sms").
		Input("phoneNumber", "${get_user_info.output.phoneNumber}")
	decision := workflow.NewSwitchTask("email_or_sms", "${workflow.input.notificationPref}").
		SwitchCase(Email, sendEmail).
		SwitchCase(Sms, sendSMS)
	executor.NewWorkflowExecutor(
		api.GetApiClientWithAuthentication(),
	)
	userNotificationWorkflow := workflow.NewConductorWorkflow(workflowExecutor).
		Name("user_notification").
		Version(1).
		InputParameters("userId", "notificationPref").
		Add(getUserInfo).
		Add(decision)
	userNotificationWorkflow.Register(true)
	//Execute workflow synchronously -- and wait for it to complete
	output, err := userNotificationWorkflow.ExecuteWorkflowWithInput(input, "")
	if err != nil {
		fmt.Errorf("error executing workflow %s", err.Error())
		return
	}
	fmt.Printf("Completed executing workflow with id %s and output %s\n", output.WorkflowId, output.Output)
	//Start workflow asynchronously, do not wait for it to complete
	//Get the execution id back which can be used to monitor the workflow execution state
	workflowId, err := userNotificationWorkflow.StartWorkflowWithInput(input)
	if err != nil {
		fmt.Errorf("error executing workflow %s", err.Error())
		return
	}
	fmt.Printf("Started workflow with id %s\n", workflowId)
    @WorkerTask("fraud-check")
    public String checkForFraud(@InputParam("amount") BigDecimal amount, @InputParam("accountId") String accountId) {
        boolean isFraud = fraudService.isFraudulentTxn(accountId, amount);
        if(isFraud) {
            return "This transaction cannot be processed as its flagged for review.";
        }
        return "Deposit of " + amount + " has processed successfully";
    }
const getUserDetailsTask = simpleTask(GET_USER_INFO, GET_USER_INFO, {
    userId: "${workflow.input.userId}",
  });
  const emailOrSmsTask = switchTask("emailorsms", "${workflow.input.notificationPref}", {
    emai: [
      simpleTask(SEND_EMAIL, SEND_EMAIL, {
        email: "${get_user_info.output.email}",
      }),
    ],
    sms:[
      simpleTask(SEND_SMS, SEND_SMS, {
        phoneNumber: "${get_user_info.output.phoneNumber}",
      }),
    ],
  });
  
  const wf = workflow(COMPLEX_WORKFLOW_NAME, [
    getUserDetailsTask,
    emailOrSmsTask,
  ]);
  wf.inputParameters = ['userId', 'notificationPref']
  
  const client = await clientPromise;
  client.metadataResource.create(wf, true);
return wf;
const getUserDetailsTask = simpleTask(GET_USER_INFO, GET_USER_INFO, {
    userId: "${workflow.input.userId}",
  });
  const emailOrSmsTask = switchTask(
    "emailorsms",
    "${workflow.input.notificationPref}",
    {
      email: [
        simpleTask(SEND_EMAIL, SEND_EMAIL, {
          email: "${get_user_info.output.email}",
        }),
      ],
      sms: [
        simpleTask(SEND_SMS, SEND_SMS, {
          phoneNumber: "${get_user_info.output.phoneNumber}",
        }),
      ],
    }
  );
  const wf = workflow(COMPLEX_WORKFLOW_NAME, [
    getUserDetailsTask,
    emailOrSmsTask,
  ]);
  wf.inputParameters = ["userId", "notificationPref"];
  
  const client = await clientPromise;
  client.metadataResource.create(wf, true);
return wf;
(defn create-tasks
  "Returns workflow tasks"
  []
  (vector (sdk/simple-task (:get-user-info constants) (:get-user-info constants) {:userId "${workflow.input.userId}"})
          (sdk/switch-task "emailorsms" "${workflow.input.notificationPref}" {"email" [(sdk/simple-task (:send-email constants) (:send-email constants) {"email" "${get_user_info.output.email}"})]
                                                                              "sms" [(sdk/simple-task (:send-sms constants) (:send-sms constants) {"phoneNumber" "${get_user_info.output.phoneNumber}"})]} [])))
(defn create-workflow
  "Returns a workflow with tasks"
  [tasks]
  (merge (sdk/workflow (:workflow-name constants) tasks) {:inputParameters ["userId" "notificationPref"]}))