Skip to content

Approving or rejecting a project

This is the funder-side counterpart to Submitting a project for approval. The funder receives the email, opens the project, and decides.

sequenceDiagram
    actor Funder
    participant App as Your app
    actor Producer

    Producer->>App: Submits project (see "Submitting for approval")
    App->>Funder: Email with link to project
    Funder->>App: Open link, view project
    Funder->>App: Click "Verify" or "Reject"
    alt Reject
        App-->>Funder: Modal asking for reason
        Funder->>App: Enter reason, confirm
    end
    App->>App: Status → APPROVED / REJECTED
    App->>Producer: Email with the outcome

The verification panel on the project page

Section titled “The verification panel on the project page”

When the funder opens the project (status: submitted), the project’s detail page shows a verification panel.

Visible textTranslation key
Panel headingProjects.request-verification.project-verification-required
Body (mentions company + project name)Projects.request-verification.project-verification-required-content
”Verify” buttonProjects.request-verification.verify
”Reject” buttonProjects.request-verification.reject

A modal opens asking for a reason.

Visible textTranslation key
Modal titleProjects.request-verification.reject-modal.title
Reason field labelProjects.request-verification.reject-modal.reason-label
Reason placeholderProjects.request-verification.reject-modal.reason-placeholder

The reason field is optional and capped at 1000 characters.

OutcomeTranslation key
Approved — headingProjects.request-verification.project-approved-title
Approved — bodyProjects.request-verification.project-approved-content
Approved — toastProjects.request-verification.verify-success
Rejected — headingProjects.request-verification.project-rejected-title
Rejected — bodyProjects.request-verification.project-rejected-content
Rejected — toastProjects.request-verification.reject-success

If a funder opens a project that’s already been approved or rejected, the panel shows the relevant past-tense outcome instead of action buttons — preventing double-approvals.

All approve/reject UI text lives under Projects.request-verification.* in tep-configuration/translations/{locale}/main/projects.json. Override per client.

The producer receives a project-verified email after the funder decides (the email is used for both approve and reject — it carries the outcome and any rejection reason). Override per client by providing {client}-project-verified.mjml.

The flow is the same across all clients. Differences are only in translations and the project-verified email template.

For the status-check rendering, the toolbar variant, and the mutation, see Approving or rejecting a project (engineering).