# Origamy playbook spec v1. Reference: /playbooks/spec-format/
spec_version: 1
id: nonprofits.volunteer-onboarding
title: Volunteer onboarding
sector: nonprofits
source:
  kind: synthesized
  notes: >-
    No charity has built this with us yet. Modelled on the church first-timer journey (a form,
    a welcome, a coordinator call task, a staff form that moves the person to the next stage)
    with the booking-form reminder pattern for the orientation, and a
    daily nudge from the date-rule pattern.
derived_from: church.first-timer-to-member
vocabulary:
  person: volunteer
  people: volunteers
  group: team
summary: >-
  Welcomes every new volunteer the moment they sign up, with a link to book an orientation, and
  gives your coordinator a call task. Orientations are confirmed and reminded the day before.
  Volunteers who haven't booked after two weeks get one nudge, and when you mark orientation
  done they are welcomed to the team. The coordinator gets a weekly summary.
when_to_use:
  - A charity, school club, community group or event team recruits volunteers by a form or a link on social media.
  - Sign-ups are collected, then lost: nobody calls, nobody books the orientation, nobody knows who is active.
  - A coordinator wants a weekly list of new sign-ups and how many orientations were done.

requires:
  data_in:
    - how: public_form
      what: "The Volunteer sign-up form this playbook creates. Share its link on Instagram, WhatsApp groups, flyers and your website, or print it as a QR code."
    - how: booking_form
      what: "The Book an orientation form it creates: a date and time slot question. Each booking saves the time on the volunteer."
    - how: staff_form
      what: "An Orientation done form the coordinator fills when a volunteer has attended, matched by phone."
  channels:
    - channel: sms
      for: Welcome, booking confirmation, reminder, nudge and the welcome to the team
      needs: An SMS provider, or Origamy managed SMS after business verification (KYC).
    - channel: email
      for: The welcome and the welcome to the team; the weekly report
      needs: A verified sending domain for {{ params.email_from }}.
  events:
    - onboarding.submitted
    - booking.created
    - booking.cancelled
  traits:
    - volunteer_status
    - signed_up_at
    - orientation_at
    - volunteer_call
    - volunteer_area

parameters:
  - key: org_name
    ask: true
    question: What should messages call your organisation?
    label: Organisation name
    type: string
    example: Northwind Community Trust
  - key: coordinator_team
    ask: true
    question: Who looks after new volunteers? (it can be just you)
    label: Volunteer coordinator team
    type: team_name
    default: Volunteer coordinators
  - key: skills
    ask: true
    question: What skills or kinds of help do you need?
    help: One per line. Volunteers tick all that apply.
    label: Skills and roles
    type: list
    default: [Teaching or tutoring, Cooking or catering, Driving, Admin and data entry, Fundraising and events, First aid]
  - key: areas
    ask: true
    question: Which areas do volunteers live in or serve?
    help: One per line. Leave a general one if you only work in one place.
    label: Areas
    type: list
    default: [Central, North, South]
  - key: orientation_place
    ask: true
    question: Where is the orientation, and what should volunteers bring?
    label: Orientation place
    type: text
    example: our office at 12 Example Road, ground floor. Bring a valid ID
  - key: email_from
    label: Sender address
    type: email
    default: "{{ workspace.default_sender }}"
  - key: coordinator_phone
    label: Number volunteers can call or message
    type: string
    default: "{{ workspace.phone }}"
  - key: call_due_hours
    label: Hours the coordinator has to call a new volunteer
    type: hours
    default: 48
  - key: nudge_after_days
    label: Days after sign-up before the nudge
    type: days
    default: 14
  - key: weekly_report_cron
    label: Weekly report (five-field cron, in the time zone below)
    type: cron
    default: "0 8 * * 1"
  - key: timezone
    label: Time zone
    type: timezone
    default: "{{ workspace.timezone }}"
  - key: default_country
    label: Default phone country on the forms
    type: country_code
    default: "{{ workspace.country }}"
  - key: greeting_fallback
    label: Greeting when a first name is missing
    type: string
    default: there

timings:
  - Welcome SMS and email straight after sign-up, with the orientation booking link.
  - A call task for {{ params.coordinator_team }} at the same time, due in {{ params.call_due_hours }} hours.
  - A booking is confirmed by SMS straight away. The reminder runs every hour and goes out when the orientation is less than a day away.
  - "{{ params.nudge_after_days }} days after sign-up, volunteers with no orientation booked get one SMS nudge (runs daily at 10:00)."
  - The welcome to the team goes out as soon as the Orientation done form is filled.
  - Weekly report on the schedule {{ params.weekly_report_cron }}.

customer_must:
  - "Open the Book an orientation form in the form builder and choose your orientation service (its length and the days it runs) on the date and time question. A booking form can't be published until it has a service."
  - Add people to the {{ params.coordinator_team }} team. A task assigned to an empty team reaches nobody.
  - "After each orientation, the coordinator fills the Orientation done form for every volunteer who came (phone number only). That marks them active and sends the welcome to the team."
  - Publish the three forms, verify the sending domain, connect an SMS provider or finish business verification, then switch the follow-ups and the report on. Test with your own phone.
  - If you work with children or vulnerable people, run your own checks and references before anyone is placed. This playbook only organises the first steps.

objects:
  - ref: team_coordinators
    kind: team
    about: Calls new volunteers, runs orientation and gets the weekly report.
    body: { name: "{{ params.coordinator_team }}" }

  - ref: form_signup
    kind: form
    about: The volunteer sign-up form. A hidden field marks every sign-up as an applicant.
    body:
      name: Volunteer sign-up
      slug: volunteer-sign-up
      description: Tell us how you'd like to help.
      draft_state:
        version: 1
        meta: { layout: classic, submit_label: Sign up, success_message: "Thank you for offering to volunteer with {{ params.org_name }}. Check your phone for the next step." }
        pages:
          - id: p1
            title: Volunteer with us
            description: A few details so we can welcome you.
            fields:
              - { id: f_first, key: first_name, type: short_text, label: First name, required: true, maps_to: { mode: custom, key: first_name, trait: true } }
              - { id: f_last, key: last_name, type: short_text, label: Last name, required: true, maps_to: { mode: custom, key: last_name, trait: true } }
              - { id: f_phone, key: phone, type: phone, label: Phone number (WhatsApp if you have it), required: true, maps_to: { mode: mapped, slot: profile.phone }, config: { country_picker: true, default_country: "{{ params.default_country }}", verify: "off" } }
              - { id: f_email, key: email, type: email, label: Email address, required: false, maps_to: { mode: mapped, slot: profile.email } }
              - id: f_area
                key: area
                type: single_select
                label: Which area are you in?
                required: true
                maps_to: { mode: custom, key: volunteer_area, trait: true }
                options:
                  - $each: params.areas
                    $value: { value: "{{ item }}", label: "{{ item }}" }
              - id: f_skills
                key: skills
                type: checkboxes
                label: How would you like to help? (tick all that apply)
                required: true
                maps_to: { mode: custom, key: skills }
                options:
                  - $each: params.skills
                    $value: { value: "{{ item }}", label: "{{ item }}" }
              - id: f_availability
                key: availability
                type: checkboxes
                label: When are you usually free?
                required: true
                maps_to: { mode: custom, key: availability }
                options: [{ value: weekday_mornings, label: Weekday mornings }, { value: weekday_afternoons, label: Weekday afternoons }, { value: weekday_evenings, label: Weekday evenings }, { value: weekends, label: Weekends }]
              - { id: f_status, key: stage, type: hidden, label: "", required: false, default: applicant, maps_to: { mode: custom, key: volunteer_status, trait: true } }
      verification_settings: { required: false }
  - ref: form_orientation
    kind: form
    about: The orientation booking form. Each booking sends booking.created with the slot time.
    body:
      name: Book an orientation
      slug: book-an-orientation
      description: Pick a time for your volunteer orientation.
      draft_state:
        version: 1
        meta: { layout: classic, submit_label: Book orientation, success_message: "Booked! We'll text you a confirmation." }
        pages:
          - id: p1
            title: Pick a time
            description: Choose a day and time that suits you.
            fields:
              - { id: f_first, key: first_name, type: short_text, label: First name, required: true, maps_to: { mode: custom, key: first_name, trait: true } }
              - { id: f_phone, key: phone, type: phone, label: Phone number, required: true, maps_to: { mode: mapped, slot: profile.phone }, config: { country_picker: true, default_country: "{{ params.default_country }}", verify: "off" } }
              - { id: f_slot, key: orientation_slot, type: date_slot, label: Which orientation would you like to attend?, required: true, maps_to: { mode: mapped, slot: booking.slot } }
      verification_settings: { required: false }
  - ref: form_done
    kind: form
    about: Coordinator form to record that a volunteer attended orientation. Matched by phone; sets the status to active.
    body:
      name: Orientation done
      slug: orientation-done
      description: Coordinator only. One entry for each volunteer who attended orientation.
      draft_state:
        version: 1
        meta: { layout: classic, submit_label: Mark as active, success_message: Saved. }
        pages:
          - id: p1
            title: Orientation done
            description: Use the phone number the volunteer signed up with.
            fields:
              - { id: f_phone, key: phone, type: phone, label: Volunteer's phone, required: true, maps_to: { mode: mapped, slot: profile.phone }, config: { country_picker: true, default_country: "{{ params.default_country }}", verify: "off" } }
              - { id: f_note, key: placement_note, type: long_text, label: Note (where they will help, nothing private), required: false, maps_to: { mode: custom, key: placement_note } }
              - { id: f_status, key: stage, type: hidden, label: "", required: false, default: active, maps_to: { mode: custom, key: volunteer_status, trait: true } }
      verification_settings: { required: false }

  - ref: seg_soon
    kind: segment
    about: An orientation within the next day.
    body:
      name: Orientation within a day
      description: orientation_at within the next 24 hours.
      segment_type: dynamic
      status: active
      definition:
        operator: and
        conditions:
          - { type: trait, trait_key: orientation_at, cond_operator: within_next, value: 1d }
  - ref: seg_nudge
    kind: segment
    about: Signed up two weeks ago or more and still no orientation booked.
    body:
      name: Signed up, no orientation booked
      description: Applicants who signed up more than the nudge delay ago (within 60 days) with no orientation booked.
      segment_type: dynamic
      status: active
      definition:
        operator: and
        conditions:
          - { type: trait, trait_key: volunteer_status, cond_operator: eq, value: applicant }
          - { type: trait, trait_key: signed_up_at, cond_operator: older_than, value: "{{ params.nudge_after_days }}d" }
          - { type: trait, trait_key: signed_up_at, cond_operator: within_last, value: 60d }
          - { type: trait, trait_key: orientation_at, cond_operator: not_exists }
  - ref: seg_applicants
    kind: segment
    about: Signed up, not yet through orientation (for the report).
    body:
      name: Applicants
      description: volunteer_status is applicant.
      segment_type: dynamic
      status: active
      definition:
        operator: and
        conditions:
          - { type: trait, trait_key: volunteer_status, cond_operator: eq, value: applicant }
  - ref: seg_active
    kind: segment
    about: Through orientation (for the report).
    body:
      name: Active volunteers
      description: volunteer_status is active.
      segment_type: dynamic
      status: active
      definition:
        operator: and
        conditions:
          - { type: trait, trait_key: volunteer_status, cond_operator: eq, value: active }

  - ref: tmpl_welcome_sms
    kind: template
    about: Welcome SMS with the orientation booking link.
    body:
      name: Volunteer welcome (SMS)
      channel: sms
      category: Volunteers
      style: text
      status: active
      subject: ""
      metadata: {}
      variables: {}
      body: "Hi {{ traits.first_name | default: \"{{ params.greeting_fallback }}\" }}, thank you for signing up to volunteer with {{ params.org_name }}! The next step is a short orientation. Pick a time here: {{ ref.form_orientation.url }} Reply STOP to opt out."
  - ref: tmpl_welcome_email
    kind: template
    about: Welcome email with the orientation booking link.
    body:
      name: Volunteer welcome (email)
      channel: email
      category: Volunteers
      style: html
      status: active
      subject: "Welcome, {{ traits.first_name | default: \"{{ params.greeting_fallback }}\" }}. Let's book your orientation"
      metadata: { email: { from: "{{ params.email_from }}", preview_text: "" } }
      variables: {}
      body: >-
        <p>Hi {{ traits.first_name | default: "{{ params.greeting_fallback }}" }},</p>
        <p>Thank you for offering your time to {{ params.org_name }}. We are glad to have you.</p>
        <p>The next step is a short orientation, where you will meet the team and learn how we work.
        <a href="{{ ref.form_orientation.url }}">Pick a time that suits you</a>.</p>
        <p>Our coordinator will also call you soon to say hello. You can reach us on {{ params.coordinator_phone }}.</p>
        <p>{{ params.org_name }}</p>
        <p style="font-size:12px;color:#6b6b80"><a href="{{ unsubscribe_url }}">Unsubscribe</a></p>
  - ref: tmpl_booked_sms
    kind: template
    about: Orientation booking confirmation.
    body:
      name: Orientation booked (SMS)
      channel: sms
      category: Volunteers
      style: text
      status: active
      subject: ""
      metadata: {}
      variables: {}
      body: "{{ params.org_name }}: your orientation is booked for {{ properties.slot_start_ts | date: \"%a %-d %b, %H:%M\" }} at {{ params.orientation_place }}. To change it, call {{ params.coordinator_phone }}. Reply STOP to opt out."
  - ref: tmpl_reminder_sms
    kind: template
    about: Orientation reminder the day before.
    body:
      name: Orientation tomorrow (SMS)
      channel: sms
      category: Volunteers
      style: text
      status: active
      subject: ""
      metadata: {}
      variables: {}
      body: "{{ params.org_name }}: see you at orientation on {{ traits.orientation_at | date: \"%a %-d %b, %H:%M\" }}, at {{ params.orientation_place }}. Can't make it? Call {{ params.coordinator_phone }}. Reply STOP to opt out."
  - ref: tmpl_nudge_sms
    kind: template
    about: A single nudge to book the orientation.
    body:
      name: Orientation nudge (SMS)
      channel: sms
      category: Volunteers
      style: text
      status: active
      subject: ""
      metadata: {}
      variables: {}
      body: "Hi {{ traits.first_name | default: \"{{ params.greeting_fallback }}\" }}, {{ params.org_name }} here. We'd still love to have you volunteer. Book your orientation when you're ready: {{ ref.form_orientation.url }} Reply STOP to opt out."
  - ref: tmpl_active_sms
    kind: template
    about: Welcome to the team after orientation.
    body:
      name: Welcome to the team (SMS)
      channel: sms
      category: Volunteers
      style: text
      status: active
      subject: ""
      metadata: {}
      variables: {}
      body: "Welcome to the team, {{ traits.first_name | default: \"{{ params.greeting_fallback }}\" }}! Thank you for joining {{ params.org_name }}. We'll be in touch about your first shift. Reply STOP to opt out."
  - ref: tmpl_active_email
    kind: template
    about: Welcome to the team email after orientation.
    body:
      name: Welcome to the team (email)
      channel: email
      category: Volunteers
      style: html
      status: active
      subject: "Welcome to the team, {{ traits.first_name | default: \"{{ params.greeting_fallback }}\" }}"
      metadata: { email: { from: "{{ params.email_from }}", preview_text: "" } }
      variables: {}
      body: >-
        <p>Hi {{ traits.first_name | default: "{{ params.greeting_fallback }}" }},</p>
        <p>Thank you for coming to orientation. You are now part of the {{ params.org_name }} volunteer
        team, and we are grateful for your time.</p>
        <p>Our coordinator will be in touch about your first shift. Any questions in the meantime,
        call {{ params.coordinator_phone }}.</p>
        <p>{{ params.org_name }}</p>
        <p style="font-size:12px;color:#6b6b80"><a href="{{ unsubscribe_url }}">Unsubscribe</a></p>

  - ref: q_signups
    kind: saved_question
    about: How many people signed up in the period.
    body:
      name: "Report: volunteer sign-ups"
      data_plane_id: default
      viz_type: number
      viz_settings: {}
      visibility: workspace
      query_ast:
        table: events
        filters:
          operator: and
          conditions:
            - { field: event_name, op: eq, value: onboarding.submitted }
            - { field: properties.form_id, op: eq, value: "{{ ref.form_signup.id }}" }
        aggregations: [{ fn: distinct, field: canonical_user_id, alias: people }]
  - ref: q_oriented
    kind: saved_question
    about: How many volunteers were marked as through orientation in the period.
    body:
      name: "Report: orientations done"
      data_plane_id: default
      viz_type: number
      viz_settings: {}
      visibility: workspace
      query_ast:
        table: events
        filters:
          operator: and
          conditions:
            - { field: event_name, op: eq, value: onboarding.submitted }
            - { field: properties.form_id, op: eq, value: "{{ ref.form_done.id }}" }
        aggregations: [{ fn: distinct, field: canonical_user_id, alias: people }]
  - ref: q_new_list
    kind: saved_question
    about: Table of the week's sign-ups with area and skills, for the coordinator.
    body:
      name: "Report: new volunteers (list)"
      data_plane_id: default
      viz_type: table
      viz_settings: {}
      visibility: workspace
      query_ast:
        table: events
        filters:
          operator: and
          conditions:
            - { field: event_name, op: eq, value: onboarding.submitted }
            - { field: properties.form_id, op: eq, value: "{{ ref.form_signup.id }}" }
        aggregations: [{ fn: count, alias: sign_ups }]
        breakouts: [{ field: properties.first_name }, { field: properties.last_name }, { field: properties.area }, { field: properties.skills }]
        limit: 200
  - ref: report_weekly
    kind: report
    about: The week's new volunteers and orientations done, to the coordinators.
    body:
      name: "Weekly: volunteers"
      description: New sign-ups and orientations done in the last 7 days, and where everyone is now.
      schedule_cron: "{{ params.weekly_report_cron }}"
      timezone: "{{ params.timezone }}"
      enabled: false
      spec:
        period: last_7_days
        compare: previous_period
        week_start: monday
        sections:
          - { id: signups, kind: saved_question, title: New sign-ups, viz: number, params: { question_id: "{{ ref.q_signups.id }}" } }
          - { id: oriented, kind: saved_question, title: Orientations done, viz: number, params: { question_id: "{{ ref.q_oriented.id }}" } }
          - { id: list, kind: saved_question, title: This week's sign-ups, viz: table, params: { question_id: "{{ ref.q_new_list.id }}" } }
          - id: sizes
            kind: segment_sizes
            title: Where volunteers are now
            params:
              segment_ids: ["{{ ref.seg_applicants.id }}", "{{ ref.seg_active.id }}"]
          - { id: tasks, kind: tasks_summary, title: Welcome calls, params: {} }
      recipients: [{ type: team, id: "{{ ref.team_coordinators.id }}" }]
      channel_policy: { mode: email_only, pii_in_email: true }

  - ref: wf_welcome
    kind: workflow
    about: Saves the sign-up date, then welcomes the volunteer by SMS and email with the orientation link.
    body:
      name: "Volunteer: welcome"
      description: When the sign-up form is submitted, the sign-up date is saved and the volunteer gets a welcome SMS and email.
      enabled: false
      trigger_type: event
      trigger_config: { event_name: onboarding.submitted, form_id: "{{ ref.form_signup.id }}" }
      steps:
        - { id: s1, type: action, config: { action_type: set_trait, traits: { signed_up_at: "{{ now }}" } } }
        - { id: s2, type: action, config: { action_type: send_message, channel_config: { mode: single, single: { channel: sms, template_id: "{{ ref.tmpl_welcome_sms.id }}" } } } }
        - { id: s3, type: action, config: { action_type: send_message, channel_config: { mode: single, single: { channel: email, template_id: "{{ ref.tmpl_welcome_email.id }}" } } } }
      re_entry_policy: once
      re_entry_cooldown_hours: 24
      goal: {}
      exit_conditions: []
  - ref: wf_call
    kind: workflow
    about: Call task for the coordinator; saves the outcome and note on the volunteer.
    body:
      name: "Volunteer: welcome call"
      description: A call task for the coordinator team. The outcome and note are saved on the volunteer.
      enabled: false
      trigger_type: event
      trigger_config: { event_name: onboarding.submitted, form_id: "{{ ref.form_signup.id }}" }
      steps:
        - id: s1
          type: human_task
          config:
            human_task:
              title: "Welcome call: {{ traits.first_name }} {{ traits.last_name }}"
              instructions: |-
                Please call {{ traits.first_name }} {{ traits.last_name }} on {{ traits.phone }}.
                Area: {{ properties.area }}
                Would like to help with: {{ properties.skills }}
                Free: {{ properties.availability }}

                Say hello, check the roles suit them and encourage them to book the orientation. Choose an outcome and add a short note.
              assignee_refs: [{ type: team, id: "{{ ref.team_coordinators.id }}" }]
              strategy: round_robin
              completion_policy: first_response_wins
              outcome_options:
                - { id: called, label: Called, intent: positive }
                - { id: not_a_fit, label: Not a fit for now, intent: neutral }
                - { id: not_reached, label: Could not reach, intent: negative }
              due_hours: "{{ params.call_due_hours }}"
              wait: true
              wait_timeout_hours: 168
              notify: immediate
        - { id: s2, type: action, config: { action_type: set_trait, traits: { volunteer_call: "{{ properties.task_outcome | default: \"unknown\" }}", volunteer_call_note: "{{ properties.task_note }}" } } }
      re_entry_policy: once
      re_entry_cooldown_hours: 24
      goal: {}
      exit_conditions: []
  - ref: wf_booked
    kind: workflow
    about: When an orientation is booked, save its time on the volunteer and send the confirmation.
    body:
      name: "Orientation booked"
      description: Copies each booking's time onto the volunteer and confirms it by SMS.
      enabled: false
      trigger_type: event
      trigger_config: { event_name: booking.created, form_id: "{{ ref.form_orientation.id }}" }
      steps:
        - { id: s1, type: action, config: { action_type: set_trait, traits: { orientation_at: "{{ properties.slot_start_ts }}" } } }
        - { id: s2, type: action, config: { action_type: send_message, channel_config: { mode: single, single: { channel: sms, template_id: "{{ ref.tmpl_booked_sms.id }}" } } } }
      re_entry_policy: every_time
      re_entry_cooldown_hours: 0
      goal: {}
      exit_conditions: []
  - ref: wf_cancelled
    kind: workflow
    about: A cancelled booking clears the saved time, so no reminder goes out.
    body:
      name: "Orientation cancelled"
      description: Clears the saved orientation time when a booking is cancelled.
      enabled: false
      trigger_type: event
      trigger_config: { event_name: booking.cancelled, form_id: "{{ ref.form_orientation.id }}" }
      steps:
        - { id: s1, type: action, config: { action_type: set_trait, traits: { orientation_at: "" } } }
      re_entry_policy: every_time
      re_entry_cooldown_hours: 0
      goal: {}
      exit_conditions: []
  - ref: wf_reminder
    kind: workflow
    about: Hourly run over "orientation within a day"; one reminder per orientation.
    body:
      name: "Orientation reminder"
      description: Every hour, an SMS to volunteers whose orientation is less than a day away.
      enabled: false
      trigger_type: schedule
      trigger_config: { segment_id: "{{ ref.seg_soon.id }}", rrule: FREQ=HOURLY, starts_at: "{{ workspace.tomorrow }}T07:00", timezone: "{{ params.timezone }}" }
      steps:
        - { id: s1, type: action, config: { action_type: send_message, channel_config: { mode: single, single: { channel: sms, template_id: "{{ ref.tmpl_reminder_sms.id }}" } } } }
      re_entry_policy: cooldown
      re_entry_cooldown_hours: 30
      goal: {}
      exit_conditions: []
  - ref: wf_nudge
    kind: workflow
    about: Daily run over "signed up, no orientation booked"; one nudge.
    body:
      name: "Volunteer: orientation nudge"
      description: Every day, one SMS to volunteers who signed up a while ago and still haven't booked an orientation.
      enabled: false
      trigger_type: schedule
      trigger_config: { segment_id: "{{ ref.seg_nudge.id }}", rrule: FREQ=DAILY, starts_at: "{{ workspace.tomorrow }}T10:00", timezone: "{{ params.timezone }}" }
      steps:
        - { id: s1, type: action, config: { action_type: send_message, channel_config: { mode: single, single: { channel: sms, template_id: "{{ ref.tmpl_nudge_sms.id }}" } } } }
      re_entry_policy: cooldown
      re_entry_cooldown_hours: 1440
      goal: {}
      exit_conditions: []
  - ref: wf_active
    kind: workflow
    about: Welcomes a volunteer to the team when the coordinator marks orientation done.
    body:
      name: "Volunteer: welcome to the team"
      description: When the Orientation done form is submitted, the volunteer gets a welcome to the team by SMS and email.
      enabled: false
      trigger_type: event
      trigger_config: { event_name: onboarding.submitted, form_id: "{{ ref.form_done.id }}" }
      steps:
        - { id: s1, type: action, config: { action_type: send_message, channel_config: { mode: single, single: { channel: sms, template_id: "{{ ref.tmpl_active_sms.id }}" } } } }
        - { id: s2, type: action, config: { action_type: send_message, channel_config: { mode: single, single: { channel: email, template_id: "{{ ref.tmpl_active_email.id }}" } } } }
      re_entry_policy: once
      re_entry_cooldown_hours: 24
      goal: {}
      exit_conditions: []

eval:
  name: 92_nonprofits_volunteer_onboarding
  mode: task
  vertical: ""
  prompt: >-
    We're a small charity that works with volunteers. Make a sign-up form that asks for skills,
    availability and area. When someone signs up, text and email them a link to book an
    orientation, and give our volunteer coordinator a task to call them within 2 days. Remind
    them by SMS the day before their orientation. If they haven't booked after 2 weeks, nudge
    them once. When we mark orientation done, welcome them to the team. Send the coordinator a
    weekly summary of sign-ups and orientations.
  expect_artifacts: [form, segment, workflow, message_template, report]
  forbid_terms: [discount, cart, checkout, purchase, revenue, customers, upsell]
